@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.141

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/lib/features/agent-chat/NativeAgentChat.js +21 -4
  2. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  3. package/lib/features/chat/ApprovalCard.js +353 -0
  4. package/lib/features/chat/ApprovalCard.js.map +1 -0
  5. package/lib/features/chat/AskUserCard.js +9 -2
  6. package/lib/features/chat/AskUserCard.js.map +1 -1
  7. package/lib/features/chat/askUser.js +25 -3
  8. package/lib/features/chat/askUser.js.map +1 -1
  9. package/lib/features/chat/queuedFollowUpRows.js +13 -0
  10. package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
  11. package/lib/features/devices/bodyComposition.js +116 -0
  12. package/lib/features/devices/bodyComposition.js.map +1 -0
  13. package/lib/features/devices/readings.js.map +1 -1
  14. package/lib/features/devices/session.js +22 -2
  15. package/lib/features/devices/session.js.map +1 -1
  16. package/lib/features/discover/DiscoverArticle.js +105 -92
  17. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  18. package/lib/features/discover/DiscoverFeed.js +97 -48
  19. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  20. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  21. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  22. package/lib/features/discover/DiscoverSidebar.js +555 -0
  23. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  24. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  25. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  26. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  27. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  28. package/lib/features/discover/followUpQuery.js +42 -0
  29. package/lib/features/discover/followUpQuery.js.map +1 -0
  30. package/lib/features/discover/markets.js +37 -0
  31. package/lib/features/discover/markets.js.map +1 -0
  32. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  33. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  34. package/lib/features/discover/weather.js +42 -0
  35. package/lib/features/discover/weather.js.map +1 -0
  36. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  37. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  38. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  39. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  40. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  41. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  42. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  43. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  44. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  45. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  46. package/lib/features/notion/NotionBlockSheets.js +206 -0
  47. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  48. package/lib/features/notion/NotionBlockView.js +36 -0
  49. package/lib/features/notion/NotionBlockView.js.map +1 -0
  50. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  51. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  52. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  53. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  54. package/lib/features/notion/NotionHistorySheet.js +439 -0
  55. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  56. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  57. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  58. package/lib/features/notion/NotionMentionSheet.js +279 -0
  59. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  60. package/lib/features/notion/NotionPageMenu.js +585 -0
  61. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  62. package/lib/features/notion/NotionPageTree.js +220 -0
  63. package/lib/features/notion/NotionPageTree.js.map +1 -0
  64. package/lib/features/notion/NotionPageView.js +1253 -152
  65. package/lib/features/notion/NotionPageView.js.map +1 -1
  66. package/lib/features/notion/NotionShareSheet.js +606 -0
  67. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  68. package/lib/features/notion/NotionSheets.js +87 -15
  69. package/lib/features/notion/NotionSheets.js.map +1 -1
  70. package/lib/features/notion/NotionSidebarSections.js +492 -0
  71. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  72. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  73. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  74. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  75. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  76. package/lib/features/notion/database/DatabaseCells.js +554 -0
  77. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  78. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  79. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  80. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  81. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  82. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  83. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  84. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  85. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  86. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  87. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  88. package/lib/features/notion/database/chartData.js +89 -0
  89. package/lib/features/notion/database/chartData.js.map +1 -0
  90. package/lib/features/notion/database/chartView.js +112 -0
  91. package/lib/features/notion/database/chartView.js.map +1 -0
  92. package/lib/features/notion/database/connectorButton.js +33 -0
  93. package/lib/features/notion/database/connectorButton.js.map +1 -0
  94. package/lib/features/notion/database/databaseCalc.js +208 -0
  95. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  96. package/lib/features/notion/database/databaseCalendar.js +157 -0
  97. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  98. package/lib/features/notion/database/databaseCsv.js +98 -0
  99. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  100. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  101. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  102. package/lib/features/notion/database/databaseFilter.js +473 -0
  103. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  104. package/lib/features/notion/database/databaseFormula.js +1072 -0
  105. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  106. package/lib/features/notion/database/databaseGroup.js +151 -0
  107. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  108. package/lib/features/notion/database/databaseRollup.js +58 -0
  109. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  110. package/lib/features/notion/database/databaseTimeline.js +156 -0
  111. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  112. package/lib/features/notion/database/databaseView.js +1188 -0
  113. package/lib/features/notion/database/databaseView.js.map +1 -0
  114. package/lib/features/notion/database/databaseViews.js +310 -0
  115. package/lib/features/notion/database/databaseViews.js.map +1 -0
  116. package/lib/features/notion/database/relationSource.js +92 -0
  117. package/lib/features/notion/database/relationSource.js.map +1 -0
  118. package/lib/features/notion/database/uniqueId.js +17 -0
  119. package/lib/features/notion/database/uniqueId.js.map +1 -0
  120. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  121. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  122. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  123. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  124. package/lib/features/notion/notionCodeLanguages.js +112 -0
  125. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  126. package/lib/features/notion/notionComments.js +86 -0
  127. package/lib/features/notion/notionComments.js.map +1 -0
  128. package/lib/features/notion/notionConnections.js +74 -0
  129. package/lib/features/notion/notionConnections.js.map +1 -0
  130. package/lib/features/notion/notionDocuments.js +453 -1
  131. package/lib/features/notion/notionDocuments.js.map +1 -1
  132. package/lib/features/notion/notionEditorModel.js +142 -7
  133. package/lib/features/notion/notionEditorModel.js.map +1 -1
  134. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  135. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  136. package/lib/features/notion/notionMedia.js +119 -0
  137. package/lib/features/notion/notionMedia.js.map +1 -0
  138. package/lib/features/notion/notionMentionDate.js +32 -0
  139. package/lib/features/notion/notionMentionDate.js.map +1 -0
  140. package/lib/features/notion/notionMentionOptions.js +162 -0
  141. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  142. package/lib/features/notion/notionNotesAgent.js +445 -0
  143. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  144. package/lib/features/notion/notionPageAccess.js +168 -0
  145. package/lib/features/notion/notionPageAccess.js.map +1 -0
  146. package/lib/features/notion/notionPageActions.js +138 -0
  147. package/lib/features/notion/notionPageActions.js.map +1 -0
  148. package/lib/features/notion/notionPageHistory.js +154 -0
  149. package/lib/features/notion/notionPageHistory.js.map +1 -0
  150. package/lib/features/notion/notionPageKinds.js +200 -0
  151. package/lib/features/notion/notionPageKinds.js.map +1 -0
  152. package/lib/features/notion/notionRecents.js +48 -0
  153. package/lib/features/notion/notionRecents.js.map +1 -0
  154. package/lib/features/notion/notionRichText.js +177 -0
  155. package/lib/features/notion/notionRichText.js.map +1 -0
  156. package/lib/features/notion/notionRichTitle.js +336 -0
  157. package/lib/features/notion/notionRichTitle.js.map +1 -0
  158. package/lib/features/notion/useNotionWorkspace.js +272 -13
  159. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  160. package/lib/features/notion/usePageActions.js +155 -0
  161. package/lib/features/notion/usePageActions.js.map +1 -0
  162. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  163. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  164. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  165. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  166. package/lib/features/study/StudyAgentChatPane.js +1 -1
  167. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  168. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  169. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  170. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  171. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  172. package/lib/features/webbuilder/buildFragments.js +1 -1
  173. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  174. package/lib/features/webbuilder/codeFiles.js +302 -0
  175. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  176. package/lib/features/webbuilder/codeHighlight.js +209 -0
  177. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  178. package/lib/features/webbuilder/components/CodeView.js +682 -52
  179. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  180. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  181. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  182. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  183. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  184. package/lib/features/webbuilder/stepLabels.js +68 -0
  185. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  186. package/lib/hooks/useHostChatSteering.js +45 -0
  187. package/lib/hooks/useHostChatSteering.js.map +1 -0
  188. package/lib/screens/Chat/index.js +2 -12
  189. package/lib/screens/Chat/index.js.map +1 -1
  190. package/lib/screens/Devices/index.js +205 -3
  191. package/lib/screens/Devices/index.js.map +1 -1
  192. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  193. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  194. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  195. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  196. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  197. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  198. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  199. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  200. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  201. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  202. package/lib/screens/NotionPage/index.js +2 -2
  203. package/lib/screens/NotionPage/index.js.map +1 -1
  204. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  205. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  206. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  207. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  208. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  209. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  210. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  211. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  212. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  213. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  214. package/lib/screens/WebBuilderNative/index.js +1 -1
  215. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  216. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  217. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  218. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  219. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  220. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePageActions.js","sources":["../../../src/features/notion/usePageActions.tsx"],"sourcesContent":["/**\n * One place that owns the page actions UI (menu sheet, Rename, Move to…, toasts)\n * so the home rows, All pages and the editor all offer the same web actions:\n * Add to / Remove from Favorites, New subpage, Rename, Duplicate (Undo), Move to…,\n * Copy link, Move to trash (Undo).\n */\nimport React, { useCallback, useState } from 'react';\nimport { Alert, Clipboard } from 'react-native';\nimport { pageTitle, type NotionBlock } from './notionBlocks';\nimport { pageLinkUrl, serverErrorText } from './notionPageActions';\nimport type { NotionPalette } from './notionTheme';\nimport {\n MoveToSheet,\n NotionToast,\n PageActionsSheet,\n TextPromptDialog,\n useNotionToast,\n type MenuAction,\n type PageMenuSettings,\n} from './NotionPageMenu';\nimport type { NotionWorkspaceState } from './useNotionWorkspace';\nimport { config } from '../../config/env-config';\nimport { getPackagerHost, resolveMobileWebUrl } from '../../bridge/resolveMobileWebUrl';\n\nexport interface PageActionsOptions {\n notion: NotionWorkspaceState;\n palette: NotionPalette;\n onOpenPage: (id: string) => void;\n /** Called after the page itself was trashed (the editor leaves the page). */\n onTrashed?: (id: string) => void;\n /**\n * Extra groups / settings for a page, read on every render so the open sheet shows live\n * values (a snapshot taken at open made the font / switches look dead after a tap).\n */\n extrasFor?: (page: NotionBlock) => PageMenuExtras;\n /** After a rename (the editor takes the new title so its own save doesn't undo it). */\n onRenamed?: (id: string, title: string) => void;\n}\n\n/** Extra groups / settings the editor adds to the same sheet. */\nexport interface PageMenuExtras {\n groups?: MenuAction[][];\n pageSettings?: PageMenuSettings;\n subtitle?: string;\n}\n\nexport function webOrigin(): string {\n return resolveMobileWebUrl(config.CLIENT_URL, getPackagerHost());\n}\n\nexport function usePageActions({ notion, palette, onOpenPage, onTrashed, extrasFor, onRenamed }: PageActionsOptions) {\n const { toast, show, hide } = useNotionToast();\n const [target, setTarget] = useState<NotionBlock | null>(null);\n const [extras, setExtras] = useState<PageMenuExtras>({});\n const [menuOpen, setMenuOpen] = useState(false);\n const [renaming, setRenaming] = useState<NotionBlock | null>(null);\n const [moving, setMoving] = useState<NotionBlock | null>(null);\n\n const fail = useCallback(\n (what: string, err: unknown) => show({ message: `${what}. ${serverErrorText(err)}` }),\n [show],\n );\n\n const open = useCallback((page: NotionBlock, more: PageMenuExtras = {}) => {\n setTarget(page);\n setExtras(more);\n setMenuOpen(true);\n }, []);\n\n const actionsFor = (page: NotionBlock): MenuAction[][] => {\n const favorite = notion.favoriteIds.includes(page.id);\n return [\n [\n {\n key: 'favorite',\n label: favorite ? 'Remove from Favorites' : 'Add to Favorites',\n icon: favorite ? 'star' : 'star-outline',\n onPress: () =>\n notion\n .toggleFavoritePage(page.id)\n .then(() => show({ message: favorite ? 'Removed from Favorites' : 'Added to Favorites' }))\n .catch((e) => fail(\"Couldn't update Favorites\", e)),\n },\n {\n key: 'subpage',\n label: 'New subpage',\n icon: 'add-circle-outline',\n onPress: () =>\n notion\n .createSubPage(page.id)\n .then((created) => created?.id && onOpenPage(created.id))\n .catch((e) => fail(\"Couldn't create the subpage\", e)),\n },\n { key: 'rename', label: 'Rename', icon: 'create-outline', onPress: () => setRenaming(page) },\n {\n key: 'duplicate',\n label: 'Duplicate',\n icon: 'copy-outline',\n onPress: () =>\n notion\n .duplicatePage(page.id)\n .then((copy) =>\n show({\n message: `Duplicated “${pageTitle(page)}”`,\n ...(copy?.id\n ? {\n actionLabel: 'Undo',\n onAction: () => {\n notion.trashPage(copy.id).catch((e) => fail(\"Couldn't undo\", e));\n },\n }\n : {}),\n }),\n )\n .catch((e) => fail(\"Couldn't duplicate\", e)),\n },\n { key: 'move', label: 'Move to…', icon: 'return-up-forward-outline', onPress: () => setMoving(page) },\n ...(notion.teamspaces.length && notion.pages.some((p) => p.id === page.id)\n ? [\n {\n key: 'teamspace',\n label: 'Move to teamspace…',\n icon: 'people-outline' as const,\n onPress: () =>\n Alert.alert('Move to teamspace', pageTitle(page), [\n ...notion.teamspaces.map((t) => ({\n text: t.name,\n onPress: () => {\n notion\n .moveToSection([page.id], t.name)\n .then(() => show({ message: `Moved to ${t.name}` }))\n .catch((e) => fail(\"Couldn't move the page\", e));\n },\n })),\n {\n text: 'My pages',\n onPress: () => {\n notion\n .moveToSection([page.id], null)\n .then(() => show({ message: 'Moved to My pages' }))\n .catch((e) => fail(\"Couldn't move the page\", e));\n },\n },\n { text: 'Cancel', style: 'cancel' as const },\n ]),\n },\n ]\n : []),\n {\n key: 'link',\n label: 'Copy link',\n icon: 'link-outline',\n onPress: () => {\n Clipboard.setString(pageLinkUrl(webOrigin(), page.id));\n show({ message: 'Link copied' });\n },\n },\n ],\n ...(live.groups ?? []),\n [\n {\n key: 'trash',\n label: 'Move to trash',\n icon: 'trash-outline',\n destructive: true,\n onPress: () =>\n notion\n .trashPage(page.id)\n .then(() => {\n onTrashed?.(page.id);\n show({\n message: `Moved “${pageTitle(page)}” to Trash`,\n actionLabel: 'Undo',\n onAction: () => {\n notion.restorePage(page.id).catch((e) => fail(\"Couldn't restore\", e));\n },\n });\n })\n .catch((e) => fail(\"Couldn't move to Trash\", e)),\n },\n ],\n ];\n };\n\n const live = target ? (extrasFor?.(target) ?? extras) : extras;\n\n const element = (\n <>\n {target ? (\n <PageActionsSheet\n visible={menuOpen}\n palette={palette}\n title={pageTitle(target)}\n subtitle={live.subtitle}\n groups={actionsFor(target)}\n pageSettings={live.pageSettings}\n onClose={() => setMenuOpen(false)}\n />\n ) : null}\n <TextPromptDialog\n visible={Boolean(renaming)}\n palette={palette}\n title=\"Rename page\"\n initial={renaming ? pageTitle(renaming).replace(/^Untitled$/, '') : ''}\n placeholder=\"Untitled\"\n confirmLabel=\"Rename\"\n allowEmpty\n onClose={() => setRenaming(null)}\n onConfirm={async (title) => {\n if (!renaming) return;\n await notion.renamePage(renaming.id, title.trim());\n onRenamed?.(renaming.id, title.trim());\n }}\n />\n <MoveToSheet\n visible={Boolean(moving)}\n palette={palette}\n pageId={moving?.id ?? null}\n pages={notion.pages}\n workspaceName={notion.workspace?.name ?? 'Workspace'}\n workspaceId={notion.workspace?.id ?? null}\n onClose={() => setMoving(null)}\n onMove={async (to) => {\n if (!moving) return;\n await notion.movePage(moving.id, to);\n show({ message: `Moved “${pageTitle(moving)}”` });\n }}\n />\n <NotionToast toast={toast} palette={palette} onHide={hide} />\n </>\n );\n\n return { open, element, showToast: show };\n}\n"],"names":["_a"],"mappings":"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"}
@@ -67,7 +67,7 @@ function ResumeAgentChatPane({
67
67
  }], numberOfLines: 1, children: a.description })
68
68
  ] })
69
69
  ] }, a.id)) }) : null;
70
- return /* @__PURE__ */ jsx(NativeAgentChat, { title: titleHint ? `Resume \xB7 ${titleHint}` : "Resume assistant", visible, onClose, messages, onSend: (text, files) => wrapSend(text, files), renderConnectorCard: hostChat == null ? void 0 : hostChat.renderConnectorCard, onClear: onClearChat, busy: Boolean(hostChat == null ? void 0 : hostChat.busy), streamingContent: (_b = hostChat == null ? void 0 : hostChat.streaming) != null ? _b : null, error: (_c = hostChat == null ? void 0 : hostChat.error) != null ? _c : null, placeholder: "Ask to build, tailor, or edit\u2026", emptyTitle: "Resume assistant", emptyBody: "Build a new resume, tailor one to a job, or edit the open document.", suggestions: messages.length === 0 ? SUGGESTIONS : [], belowHeader: toolbox, isDark, ink, muted, screen, border });
70
+ return /* @__PURE__ */ jsx(NativeAgentChat, { title: titleHint ? `Resume \xB7 ${titleHint}` : "Resume assistant", visible, onClose, messages, onSend: (text, files) => wrapSend(text, files), renderConnectorCard: hostChat == null ? void 0 : hostChat.renderConnectorCard, onClear: onClearChat, busy: Boolean(hostChat == null ? void 0 : hostChat.busy), steering: hostChat, streamingContent: (_b = hostChat == null ? void 0 : hostChat.streaming) != null ? _b : null, error: (_c = hostChat == null ? void 0 : hostChat.error) != null ? _c : null, placeholder: "Ask to build, tailor, or edit\u2026", emptyTitle: "Resume assistant", emptyBody: "Build a new resume, tailor one to a job, or edit the open document.", suggestions: messages.length === 0 ? SUGGESTIONS : [], belowHeader: toolbox, isDark, ink, muted, screen, border });
71
71
  }
72
72
  const styles = StyleSheet.create({
73
73
  toolRow: {
@@ -1 +1 @@
1
- {"version":3,"file":"ResumeAgentChatPane.js","sources":["../../../src/features/resume/ResumeAgentChatPane.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { NativeAgentChat, type AgentChatSuggestion } from '../agent-chat';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport type { ResumeHostChat } from './hostChat';\nimport { composeEditContext, RESUME_TOOLBOX_ACTIONS } from './resumeToolbox';\nimport { resumeTitle } from './draft';\nimport type { ResumeData } from './types';\n\nconst SUGGESTIONS: AgentChatSuggestion[] = [\n { id: 'build', label: 'Build a resume', prompt: 'Build me a resume - ask me for my background.' },\n {\n id: 'tailor',\n label: 'Tailor to a job',\n prompt: 'Tailor my resume to a job description - ask me for the posting.',\n },\n { id: 'ats', label: 'ATS pass', prompt: 'Make this resume parse cleanly through ATS systems.' },\n { id: 'proof', label: 'Proofread', prompt: 'Proofread the whole resume and list what you changed.' },\n];\n\nexport function ResumeAgentChatPane({\n visible,\n onClose,\n hostChat,\n activeResume,\n seedTurn = null,\n onClearChat,\n isDark,\n ink,\n muted,\n screen,\n border,\n card,\n accent,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: ResumeHostChat;\n activeResume?: ResumeData | null;\n seedTurn?: { text: string; files?: MessageAttachment[]; id?: string } | null;\n onClearChat?: () => void;\n isDark: boolean;\n ink: string;\n muted: string;\n screen: string;\n border: string;\n card: string;\n accent: string;\n}) {\n const seededKey = useRef<string | null>(null);\n const messages = hostChat?.messages ?? [];\n const titleHint = activeResume ? resumeTitle(activeResume) : null;\n\n const wrapSend = (text: string, attachments?: MessageAttachment[]) => {\n if (!hostChat) return;\n if (activeResume) {\n const json = JSON.stringify(activeResume, null, 2);\n hostChat.send(composeEditContext(resumeTitle(activeResume), json, text), attachments);\n return;\n }\n hostChat.send(text, attachments);\n };\n\n useEffect(() => {\n if (!visible || !seedTurn) return;\n const key = seedTurn.id ?? seedTurn.text;\n if (seededKey.current === key) return;\n seededKey.current = key;\n wrapSend(seedTurn.text, seedTurn.files);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, seedTurn?.id, seedTurn?.text]);\n\n const toolbox = activeResume ? (\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.toolRow}>\n {RESUME_TOOLBOX_ACTIONS.map((a) => (\n <Pressable\n key={a.id}\n onPress={() => wrapSend(a.prompt)}\n style={[styles.tool, { borderColor: border, backgroundColor: card }]}\n disabled={hostChat?.busy}\n >\n <MaterialCommunityIcons name={a.icon as never} size={16} color={accent} />\n <View style={{ flex: 1 }}>\n <Text style={[styles.toolTitle, { color: ink }]}>{a.title}</Text>\n <Text style={[styles.toolDesc, { color: muted }]} numberOfLines={1}>\n {a.description}\n </Text>\n </View>\n </Pressable>\n ))}\n </ScrollView>\n ) : null;\n\n return (\n <NativeAgentChat\n title={titleHint ? `Resume · ${titleHint}` : 'Resume assistant'}\n visible={visible}\n onClose={onClose}\n messages={messages}\n onSend={(text, files) => wrapSend(text, files)}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onClear={onClearChat}\n busy={Boolean(hostChat?.busy)}\n streamingContent={hostChat?.streaming ?? null}\n error={hostChat?.error ?? null}\n placeholder=\"Ask to build, tailor, or edit…\"\n emptyTitle=\"Resume assistant\"\n emptyBody=\"Build a new resume, tailor one to a job, or edit the open document.\"\n suggestions={messages.length === 0 ? SUGGESTIONS : []}\n belowHeader={toolbox}\n isDark={isDark}\n ink={ink}\n muted={muted}\n screen={screen}\n border={border}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n toolRow: { paddingHorizontal: 12, paddingVertical: 8, gap: 8 },\n tool: {\n width: 180,\n borderWidth: StyleSheet.hairlineWidth,\n borderRadius: 10,\n padding: 10,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n },\n toolTitle: { fontSize: 12, fontWeight: '600' },\n toolDesc: { fontSize: 10, marginTop: 1 },\n});\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"ResumeAgentChatPane.js","sources":["../../../src/features/resume/ResumeAgentChatPane.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { NativeAgentChat, type AgentChatSuggestion } from '../agent-chat';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport type { ResumeHostChat } from './hostChat';\nimport { composeEditContext, RESUME_TOOLBOX_ACTIONS } from './resumeToolbox';\nimport { resumeTitle } from './draft';\nimport type { ResumeData } from './types';\n\nconst SUGGESTIONS: AgentChatSuggestion[] = [\n { id: 'build', label: 'Build a resume', prompt: 'Build me a resume - ask me for my background.' },\n {\n id: 'tailor',\n label: 'Tailor to a job',\n prompt: 'Tailor my resume to a job description - ask me for the posting.',\n },\n { id: 'ats', label: 'ATS pass', prompt: 'Make this resume parse cleanly through ATS systems.' },\n { id: 'proof', label: 'Proofread', prompt: 'Proofread the whole resume and list what you changed.' },\n];\n\nexport function ResumeAgentChatPane({\n visible,\n onClose,\n hostChat,\n activeResume,\n seedTurn = null,\n onClearChat,\n isDark,\n ink,\n muted,\n screen,\n border,\n card,\n accent,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: ResumeHostChat;\n activeResume?: ResumeData | null;\n seedTurn?: { text: string; files?: MessageAttachment[]; id?: string } | null;\n onClearChat?: () => void;\n isDark: boolean;\n ink: string;\n muted: string;\n screen: string;\n border: string;\n card: string;\n accent: string;\n}) {\n const seededKey = useRef<string | null>(null);\n const messages = hostChat?.messages ?? [];\n const titleHint = activeResume ? resumeTitle(activeResume) : null;\n\n const wrapSend = (text: string, attachments?: MessageAttachment[]) => {\n if (!hostChat) return;\n if (activeResume) {\n const json = JSON.stringify(activeResume, null, 2);\n hostChat.send(composeEditContext(resumeTitle(activeResume), json, text), attachments);\n return;\n }\n hostChat.send(text, attachments);\n };\n\n useEffect(() => {\n if (!visible || !seedTurn) return;\n const key = seedTurn.id ?? seedTurn.text;\n if (seededKey.current === key) return;\n seededKey.current = key;\n wrapSend(seedTurn.text, seedTurn.files);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, seedTurn?.id, seedTurn?.text]);\n\n const toolbox = activeResume ? (\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.toolRow}>\n {RESUME_TOOLBOX_ACTIONS.map((a) => (\n <Pressable\n key={a.id}\n onPress={() => wrapSend(a.prompt)}\n style={[styles.tool, { borderColor: border, backgroundColor: card }]}\n disabled={hostChat?.busy}\n >\n <MaterialCommunityIcons name={a.icon as never} size={16} color={accent} />\n <View style={{ flex: 1 }}>\n <Text style={[styles.toolTitle, { color: ink }]}>{a.title}</Text>\n <Text style={[styles.toolDesc, { color: muted }]} numberOfLines={1}>\n {a.description}\n </Text>\n </View>\n </Pressable>\n ))}\n </ScrollView>\n ) : null;\n\n return (\n <NativeAgentChat\n title={titleHint ? `Resume · ${titleHint}` : 'Resume assistant'}\n visible={visible}\n onClose={onClose}\n messages={messages}\n onSend={(text, files) => wrapSend(text, files)}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onClear={onClearChat}\n busy={Boolean(hostChat?.busy)}\n steering={hostChat}\n streamingContent={hostChat?.streaming ?? null}\n error={hostChat?.error ?? null}\n placeholder=\"Ask to build, tailor, or edit…\"\n emptyTitle=\"Resume assistant\"\n emptyBody=\"Build a new resume, tailor one to a job, or edit the open document.\"\n suggestions={messages.length === 0 ? SUGGESTIONS : []}\n belowHeader={toolbox}\n isDark={isDark}\n ink={ink}\n muted={muted}\n screen={screen}\n border={border}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n toolRow: { paddingHorizontal: 12, paddingVertical: 8, gap: 8 },\n tool: {\n width: 180,\n borderWidth: StyleSheet.hairlineWidth,\n borderRadius: 10,\n padding: 10,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n },\n toolTitle: { fontSize: 12, fontWeight: '600' },\n toolDesc: { fontSize: 10, marginTop: 1 },\n});\n"],"names":["_a"],"mappings":"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"}
@@ -430,7 +430,7 @@ ${(_b = hostChat == null ? void 0 : hostChat.streaming) != null ? _b : ""}`;
430
430
  setShopStream(null);
431
431
  pendingVisionShop.current = false;
432
432
  (_a2 = hostChat == null ? void 0 : hostChat.clear) == null ? void 0 : _a2.call(hostChat);
433
- }, busy: busy || Boolean(hostChat == null ? void 0 : hostChat.busy), streamingContent: shopStream || (hostChat == null ? void 0 : hostChat.streaming), error: hostChat == null ? void 0 : hostChat.error, placeholder: 'What are you looking for? e.g. "running shoes under $120"', emptyTitle: "What are you shopping for?", emptyBody: "Ask for a product in plain language, or send a photo \u2014 I'll look at it the same way as web Shop.", suggestions: [{
433
+ }, busy: busy || Boolean(hostChat == null ? void 0 : hostChat.busy), steering: hostChat, streamingContent: shopStream || (hostChat == null ? void 0 : hostChat.streaming), error: hostChat == null ? void 0 : hostChat.error, placeholder: 'What are you looking for? e.g. "running shoes under $120"', emptyTitle: "What are you shopping for?", emptyBody: "Ask for a product in plain language, or send a photo \u2014 I'll look at it the same way as web Shop.", suggestions: [{
434
434
  id: "shoes",
435
435
  label: "Running shoes under $120",
436
436
  prompt: "running shoes under $120"
@@ -1 +1 @@
1
- {"version":3,"file":"ShoppingAgentChatPane.js","sources":["../../../src/features/shopping/ShoppingAgentChatPane.tsx"],"sourcesContent":["/**\n * Shopping Agent adapter — same role as web HostedShoppingChatPane:\n * product asks fill the shop grid; images and open questions go on host chat\n * (vision + tools). \"Find products\" + a photo still runs native shop search\n * once the agent names the item.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { NativeAgentChat, type AgentChatMessage } from '../agent-chat';\nimport { departmentBadge, isProductSource, type Product, type ProductSource } from './catalog';\nimport { ShoppingChatResultCard } from './chat/ShoppingChatResultCard';\nimport {\n buildShoppingWidgetMessage,\n extractProductQueryFromAssistant,\n extractShoppingAttachment,\n isGenericProductFindAsk,\n isShoppingConversation,\n isVisualIdentifyQuery,\n shouldRunNativeShopSearch,\n shouldUseHostLane,\n visibleAssistantContent,\n type ShoppingChatAttachment,\n} from './chat/widgetContent';\nimport { delayMs, searchingLead, splitReplyChunks } from './chat/streamAssistantReply';\nimport {\n keepShownOrder,\n listsProducts,\n namedRetailer,\n refersToAttachment,\n retailerLabel,\n scopeToRetailer,\n} from './chat/searchScope';\nimport { parsePriceCheckIntent, parsePriceCheckStop } from './services/parsePriceCheckIntent';\nimport { replyToNonShoppingTurn, SHOPPING_AGENT_FALLBACK } from './services/shoppingChatReply';\nimport { classifyShoppingViaBrain } from '../../services/brainQuickReply';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport type {\n ApplyFromChatResult,\n ShoppingSearchProgress,\n ShoppingSearchRunResult,\n ShoppingUiSearchTurn,\n} from './useShoppingSearch';\nimport type { ShoppingHostChat } from './hostChat';\n\nconst STREAM_TICK_MS = 16;\n\nfunction productsFromAttachment(attachment: ShoppingChatAttachment): Product[] {\n const dept = departmentBadge();\n return attachment.properties.map((item, index) => ({\n id: item.id ?? `attach-${index}`,\n name: item.title,\n departmentId: dept.id,\n price: typeof item.price === 'number' ? item.price : 0,\n rating: typeof item.rating === 'number' ? item.rating : 0,\n reviews: typeof item.reviews === 'number' ? item.reviews : 0,\n icon: dept.icon,\n accent: dept.accent,\n ...(item.imageUrl ? { imageUrl: item.imageUrl } : {}),\n ...(item.url ? { url: item.url } : {}),\n ...(item.source && isProductSource(item.source) ? { source: item.source } : {}),\n ...(typeof item.inStock === 'boolean' ? { inStock: item.inStock } : {}),\n }));\n}\n\nfunction priceMonitorReply(kind: 'watch' | 'stop', query: string, targetPrice?: number): string {\n if (kind === 'stop') {\n return 'Price checks on this phone use the Watchlist tab. Open Watchlist and refresh — live browser checks still run on Computer, not here.';\n }\n const target =\n typeof targetPrice === 'number' && targetPrice > 0 ? ` (alert below $${Math.round(targetPrice)})` : '';\n const named = query.trim() ? `I can watch **${query.trim()}**${target}.` : `I can watch prices for you${target}.`;\n return `${named} Search the product first, open it, then tap **Watch this price**. Live hourly checks run on Computer; this phone shows the indexed watchlist.`;\n}\n\nexport function ShoppingAgentChatPane({\n visible,\n onClose,\n hostChat,\n applyFromChat,\n products,\n onViewProducts,\n onOpenProduct,\n isDark,\n ink,\n muted,\n screen,\n border,\n card,\n seedTurn = null,\n uiSearchTurn = null,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: ShoppingHostChat;\n applyFromChat: (\n text: string,\n onProgress?: (progress: ShoppingSearchProgress) => void,\n ) => Promise<ApplyFromChatResult>;\n products: Product[];\n onViewProducts: () => void;\n onOpenProduct: (product: Product) => void;\n isDark: boolean;\n ink: string;\n muted: string;\n screen: string;\n border: string;\n card: string;\n seedTurn?: { text: string; files?: MessageAttachment[] } | null;\n /** Page search box turn — mirrored into this pane like web HostedShoppingChatPane. */\n uiSearchTurn?: ShoppingUiSearchTurn | null;\n}) {\n const [localMessages, setLocalMessages] = useState<AgentChatMessage[]>([]);\n const [busy, setBusy] = useState(false);\n const [cardAttachment, setCardAttachment] = useState<ShoppingChatAttachment | null>(null);\n const [cardProducts, setCardProducts] = useState<Product[]>([]);\n const [shopStream, setShopStream] = useState<string | null>(null);\n const inFlight = useRef(false);\n const pendingVisionShop = useRef(false);\n const wasHostBusy = useRef(false);\n const seededKey = useRef<string | null>(null);\n const streamGen = useRef(0);\n const liveRef = useRef('');\n const pumpChain = useRef(Promise.resolve());\n const committedShopRef = useRef(false);\n const resultPumpStartedRef = useRef(false);\n const latestResultRef = useRef<ShoppingSearchRunResult | null>(null);\n const mirroredUiTurnRef = useRef<{ id: number; phase: string } | null>(null);\n /** The retailer the current ask named (\"in amazon\"); its search is scoped to it. */\n const turnRetailerRef = useRef<ProductSource | null>(null);\n\n const hostMessages = hostChat?.messages ?? [];\n const shopTurns = localMessages.filter((m) => m.id.startsWith('shop-'));\n const messages = hostMessages.length > 0 ? [...hostMessages, ...shopTurns] : localMessages;\n\n const pumpTo = async (gen: number, target: string) => {\n if (streamGen.current !== gen) return;\n let current = liveRef.current;\n if (target === current) return;\n if (!target.startsWith(current)) {\n current = '';\n liveRef.current = '';\n }\n const rest = target.slice(current.length);\n for (const chunk of splitReplyChunks(rest)) {\n if (streamGen.current !== gen) return;\n liveRef.current += chunk;\n setShopStream(liveRef.current);\n await delayMs(STREAM_TICK_MS);\n }\n };\n\n const enqueuePump = (gen: number, target: string) => {\n pumpChain.current = pumpChain.current.then(() => pumpTo(gen, target)).catch(() => undefined);\n return pumpChain.current;\n };\n\n const bodyFromResult = (result: ShoppingSearchRunResult) => {\n const raw =\n result.products.length > 0\n ? buildShoppingWidgetMessage(result.products, result.query)\n : result.error || SHOPPING_AGENT_FALLBACK;\n const shopBody = visibleAssistantContent(raw) || result.error || SHOPPING_AGENT_FALLBACK;\n return { shopBody, attachment: extractShoppingAttachment(raw) };\n };\n\n const applyShopCard = (result: ShoppingSearchRunResult) => {\n const { shopBody, attachment } = bodyFromResult(result);\n if (attachment) {\n setCardAttachment(attachment);\n setCardProducts(productsFromAttachment(attachment));\n }\n if (committedShopRef.current) {\n setLocalMessages((prev) =>\n prev.map((row) => (row.id.startsWith('shop-') ? { ...row, content: shopBody } : row)),\n );\n }\n return shopBody;\n };\n\n const commitShopTurn = (gen: number, shopBody: string) => {\n if (streamGen.current !== gen || committedShopRef.current) return;\n committedShopRef.current = true;\n setLocalMessages((prev) => [\n ...prev.filter((row) => !row.id.startsWith('shop-')),\n { id: `shop-${Date.now()}`, role: 'assistant', content: shopBody },\n ]);\n setShopStream(null);\n liveRef.current = '';\n };\n\n const replyLocalAssistant = async (gen: number, body: string) => {\n await enqueuePump(gen, body);\n if (streamGen.current !== gen) return;\n setLocalMessages((prev) => [...prev, { id: `a-${Date.now()}`, role: 'assistant', content: body }]);\n setShopStream(null);\n liveRef.current = '';\n };\n\n /**\n * Give the turn to the agent instead of answering it here.\n *\n * This pane can search a catalog and keep a cart, and that is all. A turn\n * about a PAGE - their Computer, a retailer's own site, the cart on their\n * account, checkout, or an item already on screen - needs the connectors\n * the host chat has and this pane does not. Answering it from here is what\n * produced \"I don't use your computer to add items\" and then five rounds\n * of \"I don't see a specific product mentioned yet\" while the person was\n * looking at the product on their Computer.\n *\n * Returns false when there is no agent to hand to, so the caller can fall\n * back to its own reply rather than swallowing the turn.\n */\n const handOffToAgent = (gen: number, text: string, files?: MessageAttachment[], userId?: string) => {\n if (!hostChat?.connected) return false;\n // The host transcript renders the user's turn itself; drop the local\n // echo so the question is not asked twice on screen.\n if (userId) setLocalMessages((prev) => prev.filter((m) => m.id !== userId));\n streamGen.current = gen;\n setShopStream(null);\n liveRef.current = '';\n hostChat.send(text, files);\n return true;\n };\n\n const replyConversation = async (gen: number, text: string) => {\n const history = messages\n .filter((m) => m.role === 'user' || m.role === 'assistant')\n .map((m) => ({ role: m.role as 'user' | 'assistant', content: m.content }));\n const brain = await replyToNonShoppingTurn(text, history);\n await replyLocalAssistant(gen, brain || SHOPPING_AGENT_FALLBACK);\n };\n\n const runNativeShop = (query: string, showLocalTurns: boolean) => {\n const gen = ++streamGen.current;\n const retailer = turnRetailerRef.current;\n committedShopRef.current = false;\n resultPumpStartedRef.current = false;\n latestResultRef.current = null;\n // Each phase is scoped to the retailer the ask named and keeps the rows\n // already shown where they are, so the cross-retailer phase grows the\n // card instead of rewriting the reply under the person's eyes.\n const shaped = (result: ShoppingSearchRunResult): ShoppingSearchRunResult => ({\n ...result,\n products: keepShownOrder(\n latestResultRef.current?.products ?? [],\n scopeToRetailer(result.products, retailer),\n ),\n });\n liveRef.current = searchingLead(query, retailer ? retailerLabel(retailer) : null);\n setBusy(true);\n setCardAttachment(null);\n setCardProducts([]);\n setShopStream(liveRef.current);\n void applyFromChat(query, (partial) => {\n if (streamGen.current !== gen) return;\n if (!partial.products.length && !partial.error) return;\n latestResultRef.current = shaped(partial);\n const shopBody = applyShopCard(latestResultRef.current);\n if (committedShopRef.current || resultPumpStartedRef.current) return;\n resultPumpStartedRef.current = true;\n void enqueuePump(gen, shopBody);\n })\n .then(async (result) => {\n if (streamGen.current !== gen) return;\n // `in`, not `result.conversation`: without strictNullChecks a boolean\n // discriminant does not narrow the union.\n if (!('products' in result)) {\n if (showLocalTurns) await replyConversation(gen, query);\n return;\n }\n if (!resultPumpStartedRef.current) {\n resultPumpStartedRef.current = true;\n latestResultRef.current = shaped(result);\n await enqueuePump(gen, applyShopCard(latestResultRef.current));\n } else {\n await pumpChain.current;\n }\n if (streamGen.current !== gen) return;\n const latest = latestResultRef.current || shaped(result);\n commitShopTurn(gen, liveRef.current || bodyFromResult(latest).shopBody);\n applyShopCard(latest);\n })\n .catch(async (err) => {\n if (streamGen.current !== gen || !showLocalTurns) return;\n const message = err instanceof Error ? err.message : 'Shopping search failed.';\n await replyLocalAssistant(gen, message);\n })\n .finally(() => {\n if (streamGen.current !== gen) return;\n inFlight.current = false;\n setBusy(false);\n });\n };\n\n useEffect(() => {\n const hostBusy = Boolean(hostChat?.busy);\n const finished = wasHostBusy.current && !hostBusy;\n wasHostBusy.current = hostBusy;\n if (!finished || !pendingVisionShop.current) return;\n const last = [...hostMessages].reverse().find((m) => m.role === 'assistant');\n const text = `${last?.content ?? ''}\\n${hostChat?.streaming ?? ''}`;\n const widget = extractShoppingAttachment(text);\n if (widget) {\n setCardAttachment(widget);\n pendingVisionShop.current = false;\n return;\n }\n // An agent that already searched answers with linked products. A second,\n // native search on a query guessed from that prose only adds a weaker answer\n // under the real one.\n const query = listsProducts(text) ? null : extractProductQueryFromAssistant(text);\n if (!query) {\n pendingVisionShop.current = false;\n return;\n }\n pendingVisionShop.current = false;\n runNativeShop(query, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- fire once when the host turn ends\n }, [hostChat?.busy, hostMessages, hostChat?.streaming]);\n\n useEffect(() => {\n if (!uiSearchTurn || !visible) return;\n if (\n mirroredUiTurnRef.current?.id === uiSearchTurn.id &&\n mirroredUiTurnRef.current.phase === uiSearchTurn.status\n ) {\n return;\n }\n mirroredUiTurnRef.current = { id: uiSearchTurn.id, phase: uiSearchTurn.status };\n\n if (uiSearchTurn.status === 'running') {\n streamGen.current += 1;\n setShopStream(null);\n liveRef.current = '';\n setCardAttachment(null);\n setCardProducts([]);\n setBusy(true);\n setLocalMessages((prev) => [\n ...prev.filter((m) => !m.id.startsWith('ui-')),\n {\n id: `ui-u-${uiSearchTurn.id}`,\n role: 'user',\n content: uiSearchTurn.query,\n createdAt: new Date().toISOString(),\n },\n ]);\n return;\n }\n\n setBusy(false);\n const raw = uiSearchTurn.messageContent ?? '';\n const visibleProse = visibleAssistantContent(raw) || raw;\n if (visibleProse.trim()) {\n setLocalMessages((prev) => [\n ...prev.filter((m) => m.id !== `ui-a-${uiSearchTurn.id}`),\n {\n id: `ui-a-${uiSearchTurn.id}`,\n role: 'assistant',\n content: visibleProse,\n createdAt: new Date().toISOString(),\n },\n ]);\n }\n if (uiSearchTurn.attachment?.properties?.length) {\n setCardAttachment(uiSearchTurn.attachment);\n setCardProducts(productsFromAttachment(uiSearchTurn.attachment));\n }\n }, [uiSearchTurn, visible]);\n\n const send = (text: string, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n if (!trimmed && !files?.length) return;\n streamGen.current += 1;\n setShopStream(null);\n inFlight.current = true;\n turnRetailerRef.current = namedRetailer(trimmed);\n const fileCount = files?.length ?? 0;\n const useHost = Boolean(hostChat) && shouldUseHostLane(trimmed, fileCount);\n const fillShop = shouldRunNativeShopSearch(trimmed);\n\n if (useHost && hostChat) {\n if (!hostChat.connected) {\n setLocalMessages((prev) => [\n ...prev,\n {\n id: `u-${Date.now()}`,\n role: 'user',\n content: trimmed,\n ...(files?.length ? { attachments: files } : {}),\n },\n {\n id: `a-${Date.now()}`,\n role: 'assistant',\n content:\n hostChat.error ||\n 'CDeCLI is not connected yet. Check gateway status in the header, then send the image again.',\n },\n ]);\n inFlight.current = false;\n return;\n }\n hostChat.send(trimmed, files);\n setLocalMessages((prev) => prev.filter((m) => !m.id.startsWith('shop-')));\n // With photos, \"find a replacement for this\" names no product: the photo\n // is the query, so search once the agent has said what is in it.\n if (fillShop && (isGenericProductFindAsk(trimmed) || (fileCount > 0 && refersToAttachment(trimmed)))) {\n pendingVisionShop.current = true;\n inFlight.current = false;\n return;\n }\n if (fillShop) {\n runNativeShop(trimmed, false);\n return;\n }\n inFlight.current = false;\n return;\n }\n\n const user: AgentChatMessage = {\n id: `u-${Date.now()}`,\n role: 'user',\n content: trimmed,\n createdAt: new Date().toISOString(),\n ...(files?.length ? { attachments: files } : {}),\n };\n setLocalMessages((prev) => [...prev, user]);\n setCardAttachment(null);\n setCardProducts([]);\n\n if (fileCount > 0 || isVisualIdentifyQuery(trimmed)) {\n setLocalMessages((prev) => [\n ...prev,\n {\n id: `a-${Date.now()}`,\n role: 'assistant',\n content:\n 'I received the image, but this shop session is not connected to the agent yet. Connect CDeCLI in the header and send again — same as web Shopping Agent.',\n },\n ]);\n inFlight.current = false;\n return;\n }\n\n const gen = ++streamGen.current;\n setBusy(true);\n void (async () => {\n try {\n if (parsePriceCheckStop(trimmed)) {\n await replyLocalAssistant(gen, priceMonitorReply('stop', ''));\n return;\n }\n const priceCheck = parsePriceCheckIntent(trimmed);\n if (priceCheck) {\n await replyLocalAssistant(\n gen,\n priceMonitorReply('watch', priceCheck.query, priceCheck.targetPrice),\n );\n return;\n }\n\n let brainQuery: string | null = null;\n try {\n const verdict = await classifyShoppingViaBrain(trimmed, { timeoutMs: 2500 });\n if (verdict.status === 'ok' && verdict.monitor === 'stop') {\n await replyLocalAssistant(gen, priceMonitorReply('stop', ''));\n return;\n }\n if (verdict.status === 'ok' && verdict.monitor === 'watch') {\n await replyLocalAssistant(gen, priceMonitorReply('watch', verdict.query, verdict.targetPrice));\n return;\n }\n if (isShoppingConversation(trimmed)) {\n await replyConversation(gen, trimmed);\n return;\n }\n if (verdict.status === 'declined') {\n // The brain declined to read this as a product search.\n // That verdict is the routing decision - the pane does\n // not second-guess it with a regex - and what is left\n // is almost always a page the person is looking at.\n if (handOffToAgent(gen, trimmed, files, user.id)) return;\n await replyConversation(gen, trimmed);\n return;\n }\n if (verdict.status === 'ok' && verdict.query) brainQuery = verdict.query;\n } catch {\n if (isShoppingConversation(trimmed)) {\n await replyConversation(gen, trimmed);\n return;\n }\n }\n\n if (isShoppingConversation(trimmed)) {\n await replyConversation(gen, trimmed);\n return;\n }\n\n // Hand off to search — it owns busy/streamGen from here.\n inFlight.current = false;\n runNativeShop(brainQuery || trimmed, true);\n } finally {\n // Only clear busy when we did not hand off to runNativeShop\n // (runNativeShop bumps streamGen and manages its own busy flag).\n if (streamGen.current === gen) {\n inFlight.current = false;\n setBusy(false);\n }\n }\n })();\n };\n\n useEffect(() => {\n inFlight.current = false;\n streamGen.current += 1;\n setShopStream(null);\n }, [visible]);\n\n useEffect(() => {\n if (!visible || !seedTurn) return;\n const key = `${seedTurn.text}\\0${(seedTurn.files ?? []).map((file) => file.id ?? file.name ?? '').join(',')}`;\n if (seededKey.current === key) return;\n seededKey.current = key;\n const timer = setTimeout(() => send(seedTurn.text, seedTurn.files), 50);\n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- seed once per handoff\n }, [visible, seedTurn]);\n\n return (\n <NativeAgentChat\n title=\"Shopping Agent\"\n visible={visible}\n onClose={onClose}\n onSwipeLeft={onClose}\n messages={messages}\n onSend={send}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onClear={() => {\n streamGen.current += 1;\n setLocalMessages([]);\n setCardAttachment(null);\n setCardProducts([]);\n setShopStream(null);\n pendingVisionShop.current = false;\n hostChat?.clear?.();\n }}\n busy={busy || Boolean(hostChat?.busy)}\n streamingContent={shopStream || hostChat?.streaming}\n error={hostChat?.error}\n placeholder={'What are you looking for? e.g. \"running shoes under $120\"'}\n emptyTitle=\"What are you shopping for?\"\n emptyBody=\"Ask for a product in plain language, or send a photo — I'll look at it the same way as web Shop.\"\n suggestions={[\n { id: 'shoes', label: 'Running shoes under $120', prompt: 'running shoes under $120' },\n { id: 'laptop', label: 'Apple laptop', prompt: 'apple laptop' },\n { id: 'iphone', label: 'iPhone 17', prompt: 'buy iPhone 17' },\n ]}\n isDark={isDark}\n ink={ink}\n muted={muted}\n screen={screen}\n border={border}\n composerLead={\n cardAttachment ? (\n <ShoppingChatResultCard\n attachment={cardAttachment}\n products={[...products, ...cardProducts]}\n ink={ink}\n muted={muted}\n border={border}\n card={card}\n onViewProducts={onViewProducts}\n onOpenItem={onOpenProduct}\n />\n ) : null\n }\n />\n );\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"ShoppingAgentChatPane.js","sources":["../../../src/features/shopping/ShoppingAgentChatPane.tsx"],"sourcesContent":["/**\n * Shopping Agent adapter — same role as web HostedShoppingChatPane:\n * product asks fill the shop grid; images and open questions go on host chat\n * (vision + tools). \"Find products\" + a photo still runs native shop search\n * once the agent names the item.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { NativeAgentChat, type AgentChatMessage } from '../agent-chat';\nimport { departmentBadge, isProductSource, type Product, type ProductSource } from './catalog';\nimport { ShoppingChatResultCard } from './chat/ShoppingChatResultCard';\nimport {\n buildShoppingWidgetMessage,\n extractProductQueryFromAssistant,\n extractShoppingAttachment,\n isGenericProductFindAsk,\n isShoppingConversation,\n isVisualIdentifyQuery,\n shouldRunNativeShopSearch,\n shouldUseHostLane,\n visibleAssistantContent,\n type ShoppingChatAttachment,\n} from './chat/widgetContent';\nimport { delayMs, searchingLead, splitReplyChunks } from './chat/streamAssistantReply';\nimport {\n keepShownOrder,\n listsProducts,\n namedRetailer,\n refersToAttachment,\n retailerLabel,\n scopeToRetailer,\n} from './chat/searchScope';\nimport { parsePriceCheckIntent, parsePriceCheckStop } from './services/parsePriceCheckIntent';\nimport { replyToNonShoppingTurn, SHOPPING_AGENT_FALLBACK } from './services/shoppingChatReply';\nimport { classifyShoppingViaBrain } from '../../services/brainQuickReply';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport type {\n ApplyFromChatResult,\n ShoppingSearchProgress,\n ShoppingSearchRunResult,\n ShoppingUiSearchTurn,\n} from './useShoppingSearch';\nimport type { ShoppingHostChat } from './hostChat';\n\nconst STREAM_TICK_MS = 16;\n\nfunction productsFromAttachment(attachment: ShoppingChatAttachment): Product[] {\n const dept = departmentBadge();\n return attachment.properties.map((item, index) => ({\n id: item.id ?? `attach-${index}`,\n name: item.title,\n departmentId: dept.id,\n price: typeof item.price === 'number' ? item.price : 0,\n rating: typeof item.rating === 'number' ? item.rating : 0,\n reviews: typeof item.reviews === 'number' ? item.reviews : 0,\n icon: dept.icon,\n accent: dept.accent,\n ...(item.imageUrl ? { imageUrl: item.imageUrl } : {}),\n ...(item.url ? { url: item.url } : {}),\n ...(item.source && isProductSource(item.source) ? { source: item.source } : {}),\n ...(typeof item.inStock === 'boolean' ? { inStock: item.inStock } : {}),\n }));\n}\n\nfunction priceMonitorReply(kind: 'watch' | 'stop', query: string, targetPrice?: number): string {\n if (kind === 'stop') {\n return 'Price checks on this phone use the Watchlist tab. Open Watchlist and refresh — live browser checks still run on Computer, not here.';\n }\n const target =\n typeof targetPrice === 'number' && targetPrice > 0 ? ` (alert below $${Math.round(targetPrice)})` : '';\n const named = query.trim() ? `I can watch **${query.trim()}**${target}.` : `I can watch prices for you${target}.`;\n return `${named} Search the product first, open it, then tap **Watch this price**. Live hourly checks run on Computer; this phone shows the indexed watchlist.`;\n}\n\nexport function ShoppingAgentChatPane({\n visible,\n onClose,\n hostChat,\n applyFromChat,\n products,\n onViewProducts,\n onOpenProduct,\n isDark,\n ink,\n muted,\n screen,\n border,\n card,\n seedTurn = null,\n uiSearchTurn = null,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: ShoppingHostChat;\n applyFromChat: (\n text: string,\n onProgress?: (progress: ShoppingSearchProgress) => void,\n ) => Promise<ApplyFromChatResult>;\n products: Product[];\n onViewProducts: () => void;\n onOpenProduct: (product: Product) => void;\n isDark: boolean;\n ink: string;\n muted: string;\n screen: string;\n border: string;\n card: string;\n seedTurn?: { text: string; files?: MessageAttachment[] } | null;\n /** Page search box turn — mirrored into this pane like web HostedShoppingChatPane. */\n uiSearchTurn?: ShoppingUiSearchTurn | null;\n}) {\n const [localMessages, setLocalMessages] = useState<AgentChatMessage[]>([]);\n const [busy, setBusy] = useState(false);\n const [cardAttachment, setCardAttachment] = useState<ShoppingChatAttachment | null>(null);\n const [cardProducts, setCardProducts] = useState<Product[]>([]);\n const [shopStream, setShopStream] = useState<string | null>(null);\n const inFlight = useRef(false);\n const pendingVisionShop = useRef(false);\n const wasHostBusy = useRef(false);\n const seededKey = useRef<string | null>(null);\n const streamGen = useRef(0);\n const liveRef = useRef('');\n const pumpChain = useRef(Promise.resolve());\n const committedShopRef = useRef(false);\n const resultPumpStartedRef = useRef(false);\n const latestResultRef = useRef<ShoppingSearchRunResult | null>(null);\n const mirroredUiTurnRef = useRef<{ id: number; phase: string } | null>(null);\n /** The retailer the current ask named (\"in amazon\"); its search is scoped to it. */\n const turnRetailerRef = useRef<ProductSource | null>(null);\n\n const hostMessages = hostChat?.messages ?? [];\n const shopTurns = localMessages.filter((m) => m.id.startsWith('shop-'));\n const messages = hostMessages.length > 0 ? [...hostMessages, ...shopTurns] : localMessages;\n\n const pumpTo = async (gen: number, target: string) => {\n if (streamGen.current !== gen) return;\n let current = liveRef.current;\n if (target === current) return;\n if (!target.startsWith(current)) {\n current = '';\n liveRef.current = '';\n }\n const rest = target.slice(current.length);\n for (const chunk of splitReplyChunks(rest)) {\n if (streamGen.current !== gen) return;\n liveRef.current += chunk;\n setShopStream(liveRef.current);\n await delayMs(STREAM_TICK_MS);\n }\n };\n\n const enqueuePump = (gen: number, target: string) => {\n pumpChain.current = pumpChain.current.then(() => pumpTo(gen, target)).catch(() => undefined);\n return pumpChain.current;\n };\n\n const bodyFromResult = (result: ShoppingSearchRunResult) => {\n const raw =\n result.products.length > 0\n ? buildShoppingWidgetMessage(result.products, result.query)\n : result.error || SHOPPING_AGENT_FALLBACK;\n const shopBody = visibleAssistantContent(raw) || result.error || SHOPPING_AGENT_FALLBACK;\n return { shopBody, attachment: extractShoppingAttachment(raw) };\n };\n\n const applyShopCard = (result: ShoppingSearchRunResult) => {\n const { shopBody, attachment } = bodyFromResult(result);\n if (attachment) {\n setCardAttachment(attachment);\n setCardProducts(productsFromAttachment(attachment));\n }\n if (committedShopRef.current) {\n setLocalMessages((prev) =>\n prev.map((row) => (row.id.startsWith('shop-') ? { ...row, content: shopBody } : row)),\n );\n }\n return shopBody;\n };\n\n const commitShopTurn = (gen: number, shopBody: string) => {\n if (streamGen.current !== gen || committedShopRef.current) return;\n committedShopRef.current = true;\n setLocalMessages((prev) => [\n ...prev.filter((row) => !row.id.startsWith('shop-')),\n { id: `shop-${Date.now()}`, role: 'assistant', content: shopBody },\n ]);\n setShopStream(null);\n liveRef.current = '';\n };\n\n const replyLocalAssistant = async (gen: number, body: string) => {\n await enqueuePump(gen, body);\n if (streamGen.current !== gen) return;\n setLocalMessages((prev) => [...prev, { id: `a-${Date.now()}`, role: 'assistant', content: body }]);\n setShopStream(null);\n liveRef.current = '';\n };\n\n /**\n * Give the turn to the agent instead of answering it here.\n *\n * This pane can search a catalog and keep a cart, and that is all. A turn\n * about a PAGE - their Computer, a retailer's own site, the cart on their\n * account, checkout, or an item already on screen - needs the connectors\n * the host chat has and this pane does not. Answering it from here is what\n * produced \"I don't use your computer to add items\" and then five rounds\n * of \"I don't see a specific product mentioned yet\" while the person was\n * looking at the product on their Computer.\n *\n * Returns false when there is no agent to hand to, so the caller can fall\n * back to its own reply rather than swallowing the turn.\n */\n const handOffToAgent = (gen: number, text: string, files?: MessageAttachment[], userId?: string) => {\n if (!hostChat?.connected) return false;\n // The host transcript renders the user's turn itself; drop the local\n // echo so the question is not asked twice on screen.\n if (userId) setLocalMessages((prev) => prev.filter((m) => m.id !== userId));\n streamGen.current = gen;\n setShopStream(null);\n liveRef.current = '';\n hostChat.send(text, files);\n return true;\n };\n\n const replyConversation = async (gen: number, text: string) => {\n const history = messages\n .filter((m) => m.role === 'user' || m.role === 'assistant')\n .map((m) => ({ role: m.role as 'user' | 'assistant', content: m.content }));\n const brain = await replyToNonShoppingTurn(text, history);\n await replyLocalAssistant(gen, brain || SHOPPING_AGENT_FALLBACK);\n };\n\n const runNativeShop = (query: string, showLocalTurns: boolean) => {\n const gen = ++streamGen.current;\n const retailer = turnRetailerRef.current;\n committedShopRef.current = false;\n resultPumpStartedRef.current = false;\n latestResultRef.current = null;\n // Each phase is scoped to the retailer the ask named and keeps the rows\n // already shown where they are, so the cross-retailer phase grows the\n // card instead of rewriting the reply under the person's eyes.\n const shaped = (result: ShoppingSearchRunResult): ShoppingSearchRunResult => ({\n ...result,\n products: keepShownOrder(\n latestResultRef.current?.products ?? [],\n scopeToRetailer(result.products, retailer),\n ),\n });\n liveRef.current = searchingLead(query, retailer ? retailerLabel(retailer) : null);\n setBusy(true);\n setCardAttachment(null);\n setCardProducts([]);\n setShopStream(liveRef.current);\n void applyFromChat(query, (partial) => {\n if (streamGen.current !== gen) return;\n if (!partial.products.length && !partial.error) return;\n latestResultRef.current = shaped(partial);\n const shopBody = applyShopCard(latestResultRef.current);\n if (committedShopRef.current || resultPumpStartedRef.current) return;\n resultPumpStartedRef.current = true;\n void enqueuePump(gen, shopBody);\n })\n .then(async (result) => {\n if (streamGen.current !== gen) return;\n // `in`, not `result.conversation`: without strictNullChecks a boolean\n // discriminant does not narrow the union.\n if (!('products' in result)) {\n if (showLocalTurns) await replyConversation(gen, query);\n return;\n }\n if (!resultPumpStartedRef.current) {\n resultPumpStartedRef.current = true;\n latestResultRef.current = shaped(result);\n await enqueuePump(gen, applyShopCard(latestResultRef.current));\n } else {\n await pumpChain.current;\n }\n if (streamGen.current !== gen) return;\n const latest = latestResultRef.current || shaped(result);\n commitShopTurn(gen, liveRef.current || bodyFromResult(latest).shopBody);\n applyShopCard(latest);\n })\n .catch(async (err) => {\n if (streamGen.current !== gen || !showLocalTurns) return;\n const message = err instanceof Error ? err.message : 'Shopping search failed.';\n await replyLocalAssistant(gen, message);\n })\n .finally(() => {\n if (streamGen.current !== gen) return;\n inFlight.current = false;\n setBusy(false);\n });\n };\n\n useEffect(() => {\n const hostBusy = Boolean(hostChat?.busy);\n const finished = wasHostBusy.current && !hostBusy;\n wasHostBusy.current = hostBusy;\n if (!finished || !pendingVisionShop.current) return;\n const last = [...hostMessages].reverse().find((m) => m.role === 'assistant');\n const text = `${last?.content ?? ''}\\n${hostChat?.streaming ?? ''}`;\n const widget = extractShoppingAttachment(text);\n if (widget) {\n setCardAttachment(widget);\n pendingVisionShop.current = false;\n return;\n }\n // An agent that already searched answers with linked products. A second,\n // native search on a query guessed from that prose only adds a weaker answer\n // under the real one.\n const query = listsProducts(text) ? null : extractProductQueryFromAssistant(text);\n if (!query) {\n pendingVisionShop.current = false;\n return;\n }\n pendingVisionShop.current = false;\n runNativeShop(query, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- fire once when the host turn ends\n }, [hostChat?.busy, hostMessages, hostChat?.streaming]);\n\n useEffect(() => {\n if (!uiSearchTurn || !visible) return;\n if (\n mirroredUiTurnRef.current?.id === uiSearchTurn.id &&\n mirroredUiTurnRef.current.phase === uiSearchTurn.status\n ) {\n return;\n }\n mirroredUiTurnRef.current = { id: uiSearchTurn.id, phase: uiSearchTurn.status };\n\n if (uiSearchTurn.status === 'running') {\n streamGen.current += 1;\n setShopStream(null);\n liveRef.current = '';\n setCardAttachment(null);\n setCardProducts([]);\n setBusy(true);\n setLocalMessages((prev) => [\n ...prev.filter((m) => !m.id.startsWith('ui-')),\n {\n id: `ui-u-${uiSearchTurn.id}`,\n role: 'user',\n content: uiSearchTurn.query,\n createdAt: new Date().toISOString(),\n },\n ]);\n return;\n }\n\n setBusy(false);\n const raw = uiSearchTurn.messageContent ?? '';\n const visibleProse = visibleAssistantContent(raw) || raw;\n if (visibleProse.trim()) {\n setLocalMessages((prev) => [\n ...prev.filter((m) => m.id !== `ui-a-${uiSearchTurn.id}`),\n {\n id: `ui-a-${uiSearchTurn.id}`,\n role: 'assistant',\n content: visibleProse,\n createdAt: new Date().toISOString(),\n },\n ]);\n }\n if (uiSearchTurn.attachment?.properties?.length) {\n setCardAttachment(uiSearchTurn.attachment);\n setCardProducts(productsFromAttachment(uiSearchTurn.attachment));\n }\n }, [uiSearchTurn, visible]);\n\n const send = (text: string, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n if (!trimmed && !files?.length) return;\n streamGen.current += 1;\n setShopStream(null);\n inFlight.current = true;\n turnRetailerRef.current = namedRetailer(trimmed);\n const fileCount = files?.length ?? 0;\n const useHost = Boolean(hostChat) && shouldUseHostLane(trimmed, fileCount);\n const fillShop = shouldRunNativeShopSearch(trimmed);\n\n if (useHost && hostChat) {\n if (!hostChat.connected) {\n setLocalMessages((prev) => [\n ...prev,\n {\n id: `u-${Date.now()}`,\n role: 'user',\n content: trimmed,\n ...(files?.length ? { attachments: files } : {}),\n },\n {\n id: `a-${Date.now()}`,\n role: 'assistant',\n content:\n hostChat.error ||\n 'CDeCLI is not connected yet. Check gateway status in the header, then send the image again.',\n },\n ]);\n inFlight.current = false;\n return;\n }\n hostChat.send(trimmed, files);\n setLocalMessages((prev) => prev.filter((m) => !m.id.startsWith('shop-')));\n // With photos, \"find a replacement for this\" names no product: the photo\n // is the query, so search once the agent has said what is in it.\n if (fillShop && (isGenericProductFindAsk(trimmed) || (fileCount > 0 && refersToAttachment(trimmed)))) {\n pendingVisionShop.current = true;\n inFlight.current = false;\n return;\n }\n if (fillShop) {\n runNativeShop(trimmed, false);\n return;\n }\n inFlight.current = false;\n return;\n }\n\n const user: AgentChatMessage = {\n id: `u-${Date.now()}`,\n role: 'user',\n content: trimmed,\n createdAt: new Date().toISOString(),\n ...(files?.length ? { attachments: files } : {}),\n };\n setLocalMessages((prev) => [...prev, user]);\n setCardAttachment(null);\n setCardProducts([]);\n\n if (fileCount > 0 || isVisualIdentifyQuery(trimmed)) {\n setLocalMessages((prev) => [\n ...prev,\n {\n id: `a-${Date.now()}`,\n role: 'assistant',\n content:\n 'I received the image, but this shop session is not connected to the agent yet. Connect CDeCLI in the header and send again — same as web Shopping Agent.',\n },\n ]);\n inFlight.current = false;\n return;\n }\n\n const gen = ++streamGen.current;\n setBusy(true);\n void (async () => {\n try {\n if (parsePriceCheckStop(trimmed)) {\n await replyLocalAssistant(gen, priceMonitorReply('stop', ''));\n return;\n }\n const priceCheck = parsePriceCheckIntent(trimmed);\n if (priceCheck) {\n await replyLocalAssistant(\n gen,\n priceMonitorReply('watch', priceCheck.query, priceCheck.targetPrice),\n );\n return;\n }\n\n let brainQuery: string | null = null;\n try {\n const verdict = await classifyShoppingViaBrain(trimmed, { timeoutMs: 2500 });\n if (verdict.status === 'ok' && verdict.monitor === 'stop') {\n await replyLocalAssistant(gen, priceMonitorReply('stop', ''));\n return;\n }\n if (verdict.status === 'ok' && verdict.monitor === 'watch') {\n await replyLocalAssistant(gen, priceMonitorReply('watch', verdict.query, verdict.targetPrice));\n return;\n }\n if (isShoppingConversation(trimmed)) {\n await replyConversation(gen, trimmed);\n return;\n }\n if (verdict.status === 'declined') {\n // The brain declined to read this as a product search.\n // That verdict is the routing decision - the pane does\n // not second-guess it with a regex - and what is left\n // is almost always a page the person is looking at.\n if (handOffToAgent(gen, trimmed, files, user.id)) return;\n await replyConversation(gen, trimmed);\n return;\n }\n if (verdict.status === 'ok' && verdict.query) brainQuery = verdict.query;\n } catch {\n if (isShoppingConversation(trimmed)) {\n await replyConversation(gen, trimmed);\n return;\n }\n }\n\n if (isShoppingConversation(trimmed)) {\n await replyConversation(gen, trimmed);\n return;\n }\n\n // Hand off to search — it owns busy/streamGen from here.\n inFlight.current = false;\n runNativeShop(brainQuery || trimmed, true);\n } finally {\n // Only clear busy when we did not hand off to runNativeShop\n // (runNativeShop bumps streamGen and manages its own busy flag).\n if (streamGen.current === gen) {\n inFlight.current = false;\n setBusy(false);\n }\n }\n })();\n };\n\n useEffect(() => {\n inFlight.current = false;\n streamGen.current += 1;\n setShopStream(null);\n }, [visible]);\n\n useEffect(() => {\n if (!visible || !seedTurn) return;\n const key = `${seedTurn.text}\\0${(seedTurn.files ?? []).map((file) => file.id ?? file.name ?? '').join(',')}`;\n if (seededKey.current === key) return;\n seededKey.current = key;\n const timer = setTimeout(() => send(seedTurn.text, seedTurn.files), 50);\n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- seed once per handoff\n }, [visible, seedTurn]);\n\n return (\n <NativeAgentChat\n title=\"Shopping Agent\"\n visible={visible}\n onClose={onClose}\n onSwipeLeft={onClose}\n messages={messages}\n onSend={send}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onClear={() => {\n streamGen.current += 1;\n setLocalMessages([]);\n setCardAttachment(null);\n setCardProducts([]);\n setShopStream(null);\n pendingVisionShop.current = false;\n hostChat?.clear?.();\n }}\n busy={busy || Boolean(hostChat?.busy)}\n steering={hostChat}\n streamingContent={shopStream || hostChat?.streaming}\n error={hostChat?.error}\n placeholder={'What are you looking for? e.g. \"running shoes under $120\"'}\n emptyTitle=\"What are you shopping for?\"\n emptyBody=\"Ask for a product in plain language, or send a photo — I'll look at it the same way as web Shop.\"\n suggestions={[\n { id: 'shoes', label: 'Running shoes under $120', prompt: 'running shoes under $120' },\n { id: 'laptop', label: 'Apple laptop', prompt: 'apple laptop' },\n { id: 'iphone', label: 'iPhone 17', prompt: 'buy iPhone 17' },\n ]}\n isDark={isDark}\n ink={ink}\n muted={muted}\n screen={screen}\n border={border}\n composerLead={\n cardAttachment ? (\n <ShoppingChatResultCard\n attachment={cardAttachment}\n products={[...products, ...cardProducts]}\n ink={ink}\n muted={muted}\n border={border}\n card={card}\n onViewProducts={onViewProducts}\n onOpenItem={onOpenProduct}\n />\n ) : null\n }\n />\n );\n}\n"],"names":["_a"],"mappings":"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"}
@@ -63,5 +63,5 @@ function StudyAgentChatPane({
63
63
  setLocalMessages([]);
64
64
  seeded.current = null;
65
65
  (_a2 = hostChat == null ? void 0 : hostChat.clear) == null ? void 0 : _a2.call(hostChat);
66
- }, busy: Boolean(hostChat == null ? void 0 : hostChat.busy), streamingContent: (_b = hostChat == null ? void 0 : hostChat.streaming) != null ? _b : null, error: (_c = hostChat == null ? void 0 : hostChat.error) != null ? _c : null, placeholder: "Ask about your notebook\u2026 e.g. \u201Cquiz me on chapter 2\u201D", emptyTitle: "What are we studying?", emptyBody: notebook ? "Ask anything about your notebook: summaries, quizzes, flashcards, or a plan to master the material." : "Start a notebook, or ask how to study anything: summaries, quizzes, flashcards, or a plan.", suggestions: messages.length === 0 ? STUDY_AGENT_SUGGESTIONS : [], isDark: theme.isDark, ink: theme.ink, muted: theme.muted, screen: theme.screen, border: theme.border });
66
+ }, busy: Boolean(hostChat == null ? void 0 : hostChat.busy), steering: hostChat, streamingContent: (_b = hostChat == null ? void 0 : hostChat.streaming) != null ? _b : null, error: (_c = hostChat == null ? void 0 : hostChat.error) != null ? _c : null, placeholder: "Ask about your notebook\u2026 e.g. \u201Cquiz me on chapter 2\u201D", emptyTitle: "What are we studying?", emptyBody: notebook ? "Ask anything about your notebook: summaries, quizzes, flashcards, or a plan to master the material." : "Start a notebook, or ask how to study anything: summaries, quizzes, flashcards, or a plan.", suggestions: messages.length === 0 ? STUDY_AGENT_SUGGESTIONS : [], isDark: theme.isDark, ink: theme.ink, muted: theme.muted, screen: theme.screen, border: theme.border });
67
67
  }export{STUDY_AGENT_SUGGESTIONS,StudyAgentChatPane};//# sourceMappingURL=StudyAgentChatPane.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StudyAgentChatPane.js","sources":["../../../src/features/study/StudyAgentChatPane.tsx"],"sourcesContent":["/**\n * The Yantra agent, over the notebook on screen: the web Study's \"Study agent\"\n * pane. Every turn goes to the host's gateway chat (the same agent and skills\n * as main chat); the first turn of a thread carries the study context line, so\n * the agent can open this notebook through yantra-notebook.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { NativeAgentChat, type AgentChatMessage, type AgentChatSuggestion } from '../agent-chat';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport type { StudyHostChat } from './hostChat';\nimport { withStudyContext } from './studyContext';\nimport type { StudyTheme } from './studyTheme';\nimport type { StudyNotebook } from './types';\n\n/** The web Study agent's suggestions, word for word. */\nexport const STUDY_AGENT_SUGGESTIONS: AgentChatSuggestion[] = [\n {\n id: 'summarize',\n label: 'Summarize my sources',\n prompt: 'Summarize the sources in my notebook into the key points I should master.',\n },\n {\n id: 'quiz',\n label: 'Quiz me',\n prompt: 'Quiz me on this notebook, one question at a time, and grade my answers.',\n },\n {\n id: 'flashcards',\n label: 'Make flashcards',\n prompt: 'Turn my notebook into a set of flashcards (question on the front, answer on the back).',\n },\n {\n id: 'simple',\n label: 'Explain it simply',\n prompt: 'Explain the main topic of my notebook in simple terms, like I am new to it.',\n },\n {\n id: 'plan',\n label: 'Build a study plan',\n prompt: 'Build me a one-week study plan for this notebook, with a short daily goal.',\n },\n];\n\nconst NOT_CONNECTED = 'Yantra is not connected yet. Check the connection in Home, then send again.';\n\nexport interface StudyAgentSeed {\n id: string;\n text: string;\n}\n\nexport function StudyAgentChatPane({\n visible,\n onClose,\n hostChat,\n notebook,\n orgName,\n seed,\n theme,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: StudyHostChat;\n notebook: StudyNotebook | null;\n orgName?: string;\n /** A turn to send as the pane opens. */\n seed: StudyAgentSeed | null;\n theme: StudyTheme;\n}) {\n const [localMessages, setLocalMessages] = useState<AgentChatMessage[]>([]);\n const seeded = useRef<string | null>(null);\n const hostMessages = hostChat?.messages ?? [];\n const messages = hostMessages.length > 0 ? hostMessages : localMessages;\n\n const send = (text: string, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n if (!trimmed && !files?.length) return;\n if (!hostChat || !hostChat.connected) {\n setLocalMessages((prev) => [\n ...prev,\n { id: `u-${Date.now()}`, role: 'user', content: trimmed },\n { id: `a-${Date.now()}`, role: 'assistant', content: hostChat?.error || NOT_CONNECTED },\n ]);\n return;\n }\n setLocalMessages([]);\n // A fresh thread learns which notebook it is about; later turns go verbatim.\n const firstTurn = hostMessages.length === 0;\n hostChat.send(firstTurn ? withStudyContext(trimmed, notebook, orgName) : trimmed, files);\n };\n\n useEffect(() => {\n if (!visible || !seed || seeded.current === seed.id) return;\n seeded.current = seed.id;\n send(seed.text);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, seed]);\n\n return (\n <NativeAgentChat\n title=\"Study agent\"\n visible={visible}\n onClose={onClose}\n onSwipeLeft={onClose}\n messages={messages}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onSend={send}\n onClear={() => {\n setLocalMessages([]);\n seeded.current = null;\n hostChat?.clear?.();\n }}\n busy={Boolean(hostChat?.busy)}\n streamingContent={hostChat?.streaming ?? null}\n error={hostChat?.error ?? null}\n placeholder=\"Ask about your notebook… e.g. “quiz me on chapter 2”\"\n emptyTitle=\"What are we studying?\"\n emptyBody={\n notebook\n ? 'Ask anything about your notebook: summaries, quizzes, flashcards, or a plan to master the material.'\n : 'Start a notebook, or ask how to study anything: summaries, quizzes, flashcards, or a plan.'\n }\n suggestions={messages.length === 0 ? STUDY_AGENT_SUGGESTIONS : []}\n isDark={theme.isDark}\n ink={theme.ink}\n muted={theme.muted}\n screen={theme.screen}\n border={theme.border}\n />\n );\n}\n"],"names":["_a"],"mappings":"kMAeO,MAAM,0BAAiD,CAAC;AAAA,EAC7D,EAAI,EAAA,WAAA;AAAA,EACJ,KAAO,EAAA,sBAAA;AAAA,EACP,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,SAAA;AAAA,EACP,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,YAAA;AAAA,EACJ,KAAO,EAAA,iBAAA;AAAA,EACP,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA,mBAAA;AAAA,EACP,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,oBAAA;AAAA,EACP,MAAQ,EAAA;AACV,CAAC;AACD,MAAM,aAAgB,GAAA,6EAAA;AAKf,SAAS,kBAAmB,CAAA;AAAA,EACjC,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CASG,EAAA;AA1DH,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA2DE,EAAA,MAAM,CAAC,aAAe,EAAA,gBAAgB,CAAI,GAAA,QAAA,CAA6B,EAAE,CAAA;AACzE,EAAM,MAAA,MAAA,GAAS,OAAsB,IAAI,CAAA;AACzC,EAAA,MAAM,YAAe,GAAA,CAAA,EAAA,GAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,QAAV,KAAA,IAAA,GAAA,EAAA,GAAsB,EAAC;AAC5C,EAAA,MAAM,QAAW,GAAA,YAAA,CAAa,MAAS,GAAA,CAAA,GAAI,YAAe,GAAA,aAAA;AAC1D,EAAM,MAAA,IAAA,GAAO,CAAC,IAAA,EAAc,KAAgC,KAAA;AAC1D,IAAM,MAAA,OAAA,GAAU,KAAK,IAAK,EAAA;AAC1B,IAAA,IAAI,CAAC,OAAA,IAAW,EAAC,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,MAAQ,CAAA,EAAA;AAChC,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,CAAS,SAAW,EAAA;AACpC,MAAiB,gBAAA,CAAA,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAM,EAAA;AAAA,QACjC,EAAI,EAAA,CAAA,EAAA,EAAK,IAAK,CAAA,GAAA,EAAK,CAAA,CAAA;AAAA,QACnB,IAAM,EAAA,MAAA;AAAA,QACN,OAAS,EAAA;AAAA,OACR,EAAA;AAAA,QACD,EAAI,EAAA,CAAA,EAAA,EAAK,IAAK,CAAA,GAAA,EAAK,CAAA,CAAA;AAAA,QACnB,IAAM,EAAA,WAAA;AAAA,QACN,OAAA,EAAA,CAAS,qCAAU,KAAS,KAAA;AAAA,OAC7B,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAA,gBAAA,CAAiB,EAAE,CAAA;AAEnB,IAAM,MAAA,SAAA,GAAY,aAAa,MAAW,KAAA,CAAA;AAC1C,IAAS,QAAA,CAAA,IAAA,CAAK,YAAY,gBAAiB,CAAA,OAAA,EAAS,UAAU,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AAAA,GACzF;AACA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAW,IAAA,CAAC,QAAQ,MAAO,CAAA,OAAA,KAAY,KAAK,EAAI,EAAA;AACrD,IAAA,MAAA,CAAO,UAAU,IAAK,CAAA,EAAA;AACtB,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,GAEb,EAAA,CAAC,OAAS,EAAA,IAAI,CAAC,CAAA;AAClB,EAAA,uBAAQ,GAAA,CAAA,eAAA,EAAA,EAAgB,KAAM,EAAA,aAAA,EAAc,SAAkB,OAAkB,EAAA,WAAA,EAAa,OAAS,EAAA,QAAA,EAAoB,qBAAqB,QAAU,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAA,mBAAA,EAAqB,MAAQ,EAAA,IAAA,EAAM,SAAS,MAAM;AAzF7M,IAAAA,IAAAA,GAAAA;AA0FI,IAAA,gBAAA,CAAiB,EAAE,CAAA;AACnB,IAAA,MAAA,CAAO,OAAU,GAAA,IAAA;AACjB,IAAA,CAAAA,GAAA,GAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,KAAV,KAAA,IAAA,GAAA,MAAA,GAAAA,GAAA,CAAA,IAAA,CAAA,QAAA,CAAA;AAAA,GACF,EAAG,MAAM,OAAQ,CAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,IAAI,CAAG,EAAA,gBAAA,EAAA,CAAkB,0CAAU,SAAV,KAAA,IAAA,GAAA,EAAA,GAAuB,MAAM,KAAO,EAAA,CAAA,EAAA,GAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,UAAV,IAAmB,GAAA,EAAA,GAAA,IAAA,EAAM,aAAY,qEAAuD,EAAA,UAAA,EAAW,yBAAwB,SAAW,EAAA,QAAA,GAAW,wGAAwG,4FAA8F,EAAA,WAAA,EAAa,SAAS,MAAW,KAAA,CAAA,GAAI,0BAA0B,EAAC,EAAG,QAAQ,KAAM,CAAA,MAAA,EAAQ,KAAK,KAAM,CAAA,GAAA,EAAK,OAAO,KAAM,CAAA,KAAA,EAAO,QAAQ,KAAM,CAAA,MAAA,EAAQ,MAAQ,EAAA,KAAA,CAAM,MAAQ,EAAA,CAAA;AAC9lB"}
1
+ {"version":3,"file":"StudyAgentChatPane.js","sources":["../../../src/features/study/StudyAgentChatPane.tsx"],"sourcesContent":["/**\n * The Yantra agent, over the notebook on screen: the web Study's \"Study agent\"\n * pane. Every turn goes to the host's gateway chat (the same agent and skills\n * as main chat); the first turn of a thread carries the study context line, so\n * the agent can open this notebook through yantra-notebook.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { NativeAgentChat, type AgentChatMessage, type AgentChatSuggestion } from '../agent-chat';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport type { StudyHostChat } from './hostChat';\nimport { withStudyContext } from './studyContext';\nimport type { StudyTheme } from './studyTheme';\nimport type { StudyNotebook } from './types';\n\n/** The web Study agent's suggestions, word for word. */\nexport const STUDY_AGENT_SUGGESTIONS: AgentChatSuggestion[] = [\n {\n id: 'summarize',\n label: 'Summarize my sources',\n prompt: 'Summarize the sources in my notebook into the key points I should master.',\n },\n {\n id: 'quiz',\n label: 'Quiz me',\n prompt: 'Quiz me on this notebook, one question at a time, and grade my answers.',\n },\n {\n id: 'flashcards',\n label: 'Make flashcards',\n prompt: 'Turn my notebook into a set of flashcards (question on the front, answer on the back).',\n },\n {\n id: 'simple',\n label: 'Explain it simply',\n prompt: 'Explain the main topic of my notebook in simple terms, like I am new to it.',\n },\n {\n id: 'plan',\n label: 'Build a study plan',\n prompt: 'Build me a one-week study plan for this notebook, with a short daily goal.',\n },\n];\n\nconst NOT_CONNECTED = 'Yantra is not connected yet. Check the connection in Home, then send again.';\n\nexport interface StudyAgentSeed {\n id: string;\n text: string;\n}\n\nexport function StudyAgentChatPane({\n visible,\n onClose,\n hostChat,\n notebook,\n orgName,\n seed,\n theme,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: StudyHostChat;\n notebook: StudyNotebook | null;\n orgName?: string;\n /** A turn to send as the pane opens. */\n seed: StudyAgentSeed | null;\n theme: StudyTheme;\n}) {\n const [localMessages, setLocalMessages] = useState<AgentChatMessage[]>([]);\n const seeded = useRef<string | null>(null);\n const hostMessages = hostChat?.messages ?? [];\n const messages = hostMessages.length > 0 ? hostMessages : localMessages;\n\n const send = (text: string, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n if (!trimmed && !files?.length) return;\n if (!hostChat || !hostChat.connected) {\n setLocalMessages((prev) => [\n ...prev,\n { id: `u-${Date.now()}`, role: 'user', content: trimmed },\n { id: `a-${Date.now()}`, role: 'assistant', content: hostChat?.error || NOT_CONNECTED },\n ]);\n return;\n }\n setLocalMessages([]);\n // A fresh thread learns which notebook it is about; later turns go verbatim.\n const firstTurn = hostMessages.length === 0;\n hostChat.send(firstTurn ? withStudyContext(trimmed, notebook, orgName) : trimmed, files);\n };\n\n useEffect(() => {\n if (!visible || !seed || seeded.current === seed.id) return;\n seeded.current = seed.id;\n send(seed.text);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, seed]);\n\n return (\n <NativeAgentChat\n title=\"Study agent\"\n visible={visible}\n onClose={onClose}\n onSwipeLeft={onClose}\n messages={messages}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onSend={send}\n onClear={() => {\n setLocalMessages([]);\n seeded.current = null;\n hostChat?.clear?.();\n }}\n busy={Boolean(hostChat?.busy)}\n steering={hostChat}\n streamingContent={hostChat?.streaming ?? null}\n error={hostChat?.error ?? null}\n placeholder=\"Ask about your notebook… e.g. “quiz me on chapter 2”\"\n emptyTitle=\"What are we studying?\"\n emptyBody={\n notebook\n ? 'Ask anything about your notebook: summaries, quizzes, flashcards, or a plan to master the material.'\n : 'Start a notebook, or ask how to study anything: summaries, quizzes, flashcards, or a plan.'\n }\n suggestions={messages.length === 0 ? STUDY_AGENT_SUGGESTIONS : []}\n isDark={theme.isDark}\n ink={theme.ink}\n muted={theme.muted}\n screen={theme.screen}\n border={theme.border}\n />\n );\n}\n"],"names":["_a"],"mappings":"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"}
@@ -270,7 +270,7 @@ function TravelAgentChatPane({
270
270
  setCardAttachment(null);
271
271
  setTravelStream(null);
272
272
  (_a2 = hostChat == null ? void 0 : hostChat.clear) == null ? void 0 : _a2.call(hostChat);
273
- }, busy: busy || Boolean(hostChat == null ? void 0 : hostChat.busy), streamingContent: travelStream || (hostChat == null ? void 0 : hostChat.streaming), error: hostChat == null ? void 0 : hostChat.error, placeholder: 'Where to? e.g. "stays in Lisbon next weekend"', emptyTitle: "Where are we going?", emptyBody: "Search stays, flights and cars in plain language \u2014 or ask about plans, policy and expenses.", suggestions: templatesOpen ? suggestions : [], headerTrailing: /* @__PURE__ */ jsx(Pressable, { onPress: () => setTemplatesOpen((open) => !open), hitSlop: 8, accessibilityRole: "button", accessibilityLabel: "Templates", children: /* @__PURE__ */ jsx(Text, { style: styles.templates, children: "Templates" }) }), belowHeader: templatesOpen && messages.length > 0 ? /* @__PURE__ */ jsx(View, { style: styles.templateRow, children: suggestions.map((chip) => /* @__PURE__ */ jsx(Pressable, { onPress: () => {
273
+ }, busy: busy || Boolean(hostChat == null ? void 0 : hostChat.busy), steering: hostChat, streamingContent: travelStream || (hostChat == null ? void 0 : hostChat.streaming), error: hostChat == null ? void 0 : hostChat.error, placeholder: 'Where to? e.g. "stays in Lisbon next weekend"', emptyTitle: "Where are we going?", emptyBody: "Search stays, flights and cars in plain language \u2014 or ask about plans, policy and expenses.", suggestions: templatesOpen ? suggestions : [], headerTrailing: /* @__PURE__ */ jsx(Pressable, { onPress: () => setTemplatesOpen((open) => !open), hitSlop: 8, accessibilityRole: "button", accessibilityLabel: "Templates", children: /* @__PURE__ */ jsx(Text, { style: styles.templates, children: "Templates" }) }), belowHeader: templatesOpen && messages.length > 0 ? /* @__PURE__ */ jsx(View, { style: styles.templateRow, children: suggestions.map((chip) => /* @__PURE__ */ jsx(Pressable, { onPress: () => {
274
274
  var _a2;
275
275
  return send((_a2 = chip.prompt) != null ? _a2 : chip.label);
276
276
  }, style: styles.templateChip, children: /* @__PURE__ */ jsx(Text, { style: styles.templateChipText, children: chip.label }) }, chip.id)) }) : null, composerLead: cardAttachment ? /* @__PURE__ */ jsx(TravelChatResultCard, { attachment: cardAttachment, properties, ink: "#0f172a", muted: "#64748b", border: "#e8ecf1", card: "#fff", onViewResults, onOpenItem: onOpenProperty }) : null });
@@ -1 +1 @@
1
- {"version":3,"file":"TravelAgentChatPane.js","sources":["../../../src/features/travel/TravelAgentChatPane.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\nimport { NativeAgentChat, type AgentChatMessage, type AgentChatSuggestion } from '../agent-chat';\nimport type { TravelProperty } from './types';\nimport { TravelChatResultCard } from './chat/TravelChatResultCard';\nimport {\n buildTravelWidgetMessage,\n extractTravelAttachment,\n isTravelConversation,\n shouldUseHostLane,\n visibleAssistantContent,\n type TravelChatAttachment,\n} from './chat/widgetContent';\nimport { delayMs, splitReplyChunks } from '../shopping/chat/streamAssistantReply';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport type { ApplyFromChatResult, TravelSearchProgress, TravelSearchRunResult } from './useTravelSearch';\nimport type { TravelHostChat } from './hostChat';\nimport { listTravelTemplatesViaConnector } from './services/resortifiConnectorClient';\n\nconst FALLBACK_SUGGESTIONS: AgentChatSuggestion[] = [\n { id: 'lisbon', label: 'Stays in Lisbon', prompt: 'Find hotels in Lisbon for 4 nights' },\n { id: 'berlin', label: 'Flight to Berlin', prompt: 'Flights from JFK to BER' },\n { id: 'live', label: 'Live fares in my browser', prompt: 'Search live fares in my browser' },\n { id: 'madrid', label: 'Car in Madrid', prompt: 'Rent a car in Madrid' },\n { id: 'policy', label: 'Policy: business class', prompt: 'What is the business class travel policy?' },\n];\nconst STREAM_TICK_MS = 16;\nconst CONVERSATION_REPLY =\n 'Tell me where to look — a city for hotels, a pickup city for cars, or airports for flights. For example: hotels in Lisbon for 4 nights.';\n\nfunction searchingLead(query: string): string {\n const q = query.trim();\n return q ? `Searching travel options for **${q}**…` : 'Searching travel options…';\n}\n\nexport function TravelAgentChatPane({\n visible,\n onClose,\n hostChat,\n applyFromChat,\n properties,\n onViewResults,\n onOpenProperty,\n seedTurn = null,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: TravelHostChat;\n applyFromChat: (\n text: string,\n onProgress?: (progress: TravelSearchProgress) => void,\n ) => Promise<ApplyFromChatResult>;\n properties: TravelProperty[];\n onViewResults: () => void;\n onOpenProperty: (property: TravelProperty) => void;\n seedTurn?: { text: string; files?: MessageAttachment[] } | null;\n}) {\n const [localMessages, setLocalMessages] = useState<AgentChatMessage[]>([]);\n const [busy, setBusy] = useState(false);\n const [cardAttachment, setCardAttachment] = useState<TravelChatAttachment | null>(null);\n const [travelStream, setTravelStream] = useState<string | null>(null);\n const [suggestions, setSuggestions] = useState<AgentChatSuggestion[]>(FALLBACK_SUGGESTIONS);\n const [templatesOpen, setTemplatesOpen] = useState(true);\n const inFlight = useRef(false);\n const seededKey = useRef<string | null>(null);\n const streamGen = useRef(0);\n const liveRef = useRef('');\n const pumpChain = useRef(Promise.resolve());\n const committedRef = useRef(false);\n const resultPumpStartedRef = useRef(false);\n const latestResultRef = useRef<TravelSearchRunResult | null>(null);\n\n const hostMessages = hostChat?.messages ?? [];\n const travelTurns = localMessages.filter((m) => m.id.startsWith('travel-'));\n const messages = hostMessages.length > 0 ? [...hostMessages, ...travelTurns] : localMessages;\n\n const pumpTo = async (gen: number, target: string) => {\n if (streamGen.current !== gen) return;\n let current = liveRef.current;\n if (target === current) return;\n if (!target.startsWith(current)) {\n current = '';\n liveRef.current = '';\n }\n const rest = target.slice(current.length);\n for (const chunk of splitReplyChunks(rest)) {\n if (streamGen.current !== gen) return;\n liveRef.current += chunk;\n setTravelStream(liveRef.current);\n await delayMs(STREAM_TICK_MS);\n }\n };\n\n const enqueuePump = (gen: number, target: string) => {\n pumpChain.current = pumpChain.current.then(() => pumpTo(gen, target)).catch(() => undefined);\n return pumpChain.current;\n };\n\n const bodyFromResult = (result: TravelSearchRunResult) => {\n const raw =\n result.properties.length > 0\n ? buildTravelWidgetMessage(result.properties, result.query)\n : result.error || CONVERSATION_REPLY;\n const body = visibleAssistantContent(raw) || result.error || CONVERSATION_REPLY;\n return { body, attachment: extractTravelAttachment(raw) };\n };\n\n const applyCard = (result: TravelSearchRunResult) => {\n const { body, attachment } = bodyFromResult(result);\n if (attachment) setCardAttachment(attachment);\n if (committedRef.current) {\n setLocalMessages((prev) =>\n prev.map((row) => (row.id.startsWith('travel-') ? { ...row, content: body } : row)),\n );\n }\n return body;\n };\n\n const commitTurn = (gen: number, body: string) => {\n if (streamGen.current !== gen || committedRef.current) return;\n committedRef.current = true;\n setLocalMessages((prev) => [\n ...prev.filter((row) => !row.id.startsWith('travel-')),\n { id: `travel-${Date.now()}`, role: 'assistant', content: body },\n ]);\n setTravelStream(null);\n liveRef.current = '';\n };\n\n const runNativeTravel = (query: string, showLocalTurns: boolean) => {\n const gen = ++streamGen.current;\n committedRef.current = false;\n resultPumpStartedRef.current = false;\n latestResultRef.current = null;\n liveRef.current = searchingLead(query);\n setBusy(true);\n setCardAttachment(null);\n setTravelStream(liveRef.current);\n void applyFromChat(query, (partial) => {\n if (streamGen.current !== gen) return;\n if (!partial.properties.length && !partial.error) return;\n latestResultRef.current = partial;\n const body = applyCard(partial);\n if (committedRef.current || resultPumpStartedRef.current) return;\n resultPumpStartedRef.current = true;\n void enqueuePump(gen, body);\n })\n .then(async (result) => {\n if (streamGen.current !== gen) return;\n // `in`, not `result.conversation`: without strictNullChecks a boolean\n // discriminant does not narrow the union.\n if (!('properties' in result)) {\n if (showLocalTurns) {\n await enqueuePump(gen, CONVERSATION_REPLY);\n if (streamGen.current !== gen) return;\n setLocalMessages((prev) => [\n ...prev,\n { id: `a-${Date.now()}`, role: 'assistant', content: CONVERSATION_REPLY },\n ]);\n setTravelStream(null);\n liveRef.current = '';\n }\n return;\n }\n if (!resultPumpStartedRef.current) {\n resultPumpStartedRef.current = true;\n await enqueuePump(gen, applyCard(result));\n } else {\n await pumpChain.current;\n }\n if (streamGen.current !== gen) return;\n const latest = latestResultRef.current || result;\n commitTurn(gen, liveRef.current || bodyFromResult(latest).body);\n applyCard(latest);\n })\n .catch(async (err) => {\n if (streamGen.current !== gen || !showLocalTurns) return;\n const message = err instanceof Error ? err.message : 'Travel search failed.';\n await enqueuePump(gen, message);\n if (streamGen.current !== gen) return;\n setLocalMessages((prev) => [...prev, { id: `a-${Date.now()}`, role: 'assistant', content: message }]);\n setTravelStream(null);\n liveRef.current = '';\n })\n .finally(() => {\n if (streamGen.current !== gen) return;\n inFlight.current = false;\n setBusy(false);\n });\n };\n\n const send = (text: string, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n if (!trimmed && !files?.length) return;\n // The conversation needs the room now; \"Templates\" in the header brings them back.\n setTemplatesOpen(false);\n streamGen.current += 1;\n setTravelStream(null);\n inFlight.current = true;\n const fileCount = files?.length ?? 0;\n const useHost = Boolean(hostChat) && shouldUseHostLane(trimmed, fileCount);\n\n if (useHost && hostChat) {\n if (!hostChat.connected) {\n setLocalMessages((prev) => [\n ...prev,\n { id: `u-${Date.now()}`, role: 'user', content: trimmed },\n {\n id: `a-${Date.now()}`,\n role: 'assistant',\n content:\n hostChat.error ||\n 'CDeCLI is not connected yet. Check gateway status in the header, then send again.',\n },\n ]);\n inFlight.current = false;\n return;\n }\n hostChat.send(trimmed, files);\n setLocalMessages((prev) => prev.filter((m) => !m.id.startsWith('travel-')));\n if (!isTravelConversation(trimmed) && trimmed) {\n runNativeTravel(trimmed, false);\n return;\n }\n inFlight.current = false;\n return;\n }\n\n const user: AgentChatMessage = {\n id: `u-${Date.now()}`,\n role: 'user',\n content: trimmed,\n createdAt: new Date().toISOString(),\n ...(files?.length ? { attachments: files } : {}),\n };\n setLocalMessages((prev) => [...prev, user]);\n setCardAttachment(null);\n runNativeTravel(trimmed, true);\n };\n\n useEffect(() => {\n inFlight.current = false;\n streamGen.current += 1;\n setTravelStream(null);\n if (!visible) {\n setTemplatesOpen(true);\n return;\n }\n let cancelled = false;\n void listTravelTemplatesViaConnector()\n .then((templates) => {\n if (cancelled || !templates.length) return;\n setSuggestions(\n templates.slice(0, 8).map((row) => ({\n id: row.id,\n label: row.title,\n prompt: row.prompt || row.title,\n })),\n );\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [visible]);\n\n useEffect(() => {\n if (!visible || !seedTurn) return;\n const key = `${seedTurn.text}\\0${(seedTurn.files ?? []).map((file) => file.id ?? file.name ?? '').join(',')}`;\n if (seededKey.current === key) return;\n seededKey.current = key;\n const timer = setTimeout(() => send(seedTurn.text, seedTurn.files), 50);\n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, seedTurn]);\n\n return (\n <NativeAgentChat\n title=\"Travel Agent\"\n visible={visible}\n onClose={onClose}\n onSwipeLeft={onClose}\n messages={messages}\n onSend={send}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onClear={() => {\n streamGen.current += 1;\n setLocalMessages([]);\n setCardAttachment(null);\n setTravelStream(null);\n hostChat?.clear?.();\n }}\n busy={busy || Boolean(hostChat?.busy)}\n streamingContent={travelStream || hostChat?.streaming}\n error={hostChat?.error}\n placeholder={'Where to? e.g. \"stays in Lisbon next weekend\"'}\n emptyTitle=\"Where are we going?\"\n emptyBody=\"Search stays, flights and cars in plain language — or ask about plans, policy and expenses.\"\n suggestions={templatesOpen ? suggestions : []}\n headerTrailing={\n <Pressable\n onPress={() => setTemplatesOpen((open) => !open)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Templates\"\n >\n <Text style={styles.templates}>Templates</Text>\n </Pressable>\n }\n belowHeader={\n templatesOpen && messages.length > 0 ? (\n <View style={styles.templateRow}>\n {suggestions.map((chip) => (\n <Pressable\n key={chip.id}\n onPress={() => send(chip.prompt ?? chip.label)}\n style={styles.templateChip}\n >\n <Text style={styles.templateChipText}>{chip.label}</Text>\n </Pressable>\n ))}\n </View>\n ) : null\n }\n composerLead={\n cardAttachment ? (\n <TravelChatResultCard\n attachment={cardAttachment}\n properties={properties}\n ink=\"#0f172a\"\n muted=\"#64748b\"\n border=\"#e8ecf1\"\n card=\"#fff\"\n onViewResults={onViewResults}\n onOpenItem={onOpenProperty}\n />\n ) : null\n }\n />\n );\n}\n\nconst styles = StyleSheet.create({\n templates: { fontSize: 13, fontWeight: '700', color: '#2563eb' },\n templateRow: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n paddingHorizontal: 16,\n paddingBottom: 10,\n },\n templateChip: {\n borderWidth: 1,\n borderColor: '#e2e8f0',\n borderRadius: 999,\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: '#fff',\n },\n templateChipText: { fontSize: 13, fontWeight: '600', color: '#0f172a' },\n});\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"TravelAgentChatPane.js","sources":["../../../src/features/travel/TravelAgentChatPane.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\nimport { NativeAgentChat, type AgentChatMessage, type AgentChatSuggestion } from '../agent-chat';\nimport type { TravelProperty } from './types';\nimport { TravelChatResultCard } from './chat/TravelChatResultCard';\nimport {\n buildTravelWidgetMessage,\n extractTravelAttachment,\n isTravelConversation,\n shouldUseHostLane,\n visibleAssistantContent,\n type TravelChatAttachment,\n} from './chat/widgetContent';\nimport { delayMs, splitReplyChunks } from '../shopping/chat/streamAssistantReply';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport type { ApplyFromChatResult, TravelSearchProgress, TravelSearchRunResult } from './useTravelSearch';\nimport type { TravelHostChat } from './hostChat';\nimport { listTravelTemplatesViaConnector } from './services/resortifiConnectorClient';\n\nconst FALLBACK_SUGGESTIONS: AgentChatSuggestion[] = [\n { id: 'lisbon', label: 'Stays in Lisbon', prompt: 'Find hotels in Lisbon for 4 nights' },\n { id: 'berlin', label: 'Flight to Berlin', prompt: 'Flights from JFK to BER' },\n { id: 'live', label: 'Live fares in my browser', prompt: 'Search live fares in my browser' },\n { id: 'madrid', label: 'Car in Madrid', prompt: 'Rent a car in Madrid' },\n { id: 'policy', label: 'Policy: business class', prompt: 'What is the business class travel policy?' },\n];\nconst STREAM_TICK_MS = 16;\nconst CONVERSATION_REPLY =\n 'Tell me where to look — a city for hotels, a pickup city for cars, or airports for flights. For example: hotels in Lisbon for 4 nights.';\n\nfunction searchingLead(query: string): string {\n const q = query.trim();\n return q ? `Searching travel options for **${q}**…` : 'Searching travel options…';\n}\n\nexport function TravelAgentChatPane({\n visible,\n onClose,\n hostChat,\n applyFromChat,\n properties,\n onViewResults,\n onOpenProperty,\n seedTurn = null,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: TravelHostChat;\n applyFromChat: (\n text: string,\n onProgress?: (progress: TravelSearchProgress) => void,\n ) => Promise<ApplyFromChatResult>;\n properties: TravelProperty[];\n onViewResults: () => void;\n onOpenProperty: (property: TravelProperty) => void;\n seedTurn?: { text: string; files?: MessageAttachment[] } | null;\n}) {\n const [localMessages, setLocalMessages] = useState<AgentChatMessage[]>([]);\n const [busy, setBusy] = useState(false);\n const [cardAttachment, setCardAttachment] = useState<TravelChatAttachment | null>(null);\n const [travelStream, setTravelStream] = useState<string | null>(null);\n const [suggestions, setSuggestions] = useState<AgentChatSuggestion[]>(FALLBACK_SUGGESTIONS);\n const [templatesOpen, setTemplatesOpen] = useState(true);\n const inFlight = useRef(false);\n const seededKey = useRef<string | null>(null);\n const streamGen = useRef(0);\n const liveRef = useRef('');\n const pumpChain = useRef(Promise.resolve());\n const committedRef = useRef(false);\n const resultPumpStartedRef = useRef(false);\n const latestResultRef = useRef<TravelSearchRunResult | null>(null);\n\n const hostMessages = hostChat?.messages ?? [];\n const travelTurns = localMessages.filter((m) => m.id.startsWith('travel-'));\n const messages = hostMessages.length > 0 ? [...hostMessages, ...travelTurns] : localMessages;\n\n const pumpTo = async (gen: number, target: string) => {\n if (streamGen.current !== gen) return;\n let current = liveRef.current;\n if (target === current) return;\n if (!target.startsWith(current)) {\n current = '';\n liveRef.current = '';\n }\n const rest = target.slice(current.length);\n for (const chunk of splitReplyChunks(rest)) {\n if (streamGen.current !== gen) return;\n liveRef.current += chunk;\n setTravelStream(liveRef.current);\n await delayMs(STREAM_TICK_MS);\n }\n };\n\n const enqueuePump = (gen: number, target: string) => {\n pumpChain.current = pumpChain.current.then(() => pumpTo(gen, target)).catch(() => undefined);\n return pumpChain.current;\n };\n\n const bodyFromResult = (result: TravelSearchRunResult) => {\n const raw =\n result.properties.length > 0\n ? buildTravelWidgetMessage(result.properties, result.query)\n : result.error || CONVERSATION_REPLY;\n const body = visibleAssistantContent(raw) || result.error || CONVERSATION_REPLY;\n return { body, attachment: extractTravelAttachment(raw) };\n };\n\n const applyCard = (result: TravelSearchRunResult) => {\n const { body, attachment } = bodyFromResult(result);\n if (attachment) setCardAttachment(attachment);\n if (committedRef.current) {\n setLocalMessages((prev) =>\n prev.map((row) => (row.id.startsWith('travel-') ? { ...row, content: body } : row)),\n );\n }\n return body;\n };\n\n const commitTurn = (gen: number, body: string) => {\n if (streamGen.current !== gen || committedRef.current) return;\n committedRef.current = true;\n setLocalMessages((prev) => [\n ...prev.filter((row) => !row.id.startsWith('travel-')),\n { id: `travel-${Date.now()}`, role: 'assistant', content: body },\n ]);\n setTravelStream(null);\n liveRef.current = '';\n };\n\n const runNativeTravel = (query: string, showLocalTurns: boolean) => {\n const gen = ++streamGen.current;\n committedRef.current = false;\n resultPumpStartedRef.current = false;\n latestResultRef.current = null;\n liveRef.current = searchingLead(query);\n setBusy(true);\n setCardAttachment(null);\n setTravelStream(liveRef.current);\n void applyFromChat(query, (partial) => {\n if (streamGen.current !== gen) return;\n if (!partial.properties.length && !partial.error) return;\n latestResultRef.current = partial;\n const body = applyCard(partial);\n if (committedRef.current || resultPumpStartedRef.current) return;\n resultPumpStartedRef.current = true;\n void enqueuePump(gen, body);\n })\n .then(async (result) => {\n if (streamGen.current !== gen) return;\n // `in`, not `result.conversation`: without strictNullChecks a boolean\n // discriminant does not narrow the union.\n if (!('properties' in result)) {\n if (showLocalTurns) {\n await enqueuePump(gen, CONVERSATION_REPLY);\n if (streamGen.current !== gen) return;\n setLocalMessages((prev) => [\n ...prev,\n { id: `a-${Date.now()}`, role: 'assistant', content: CONVERSATION_REPLY },\n ]);\n setTravelStream(null);\n liveRef.current = '';\n }\n return;\n }\n if (!resultPumpStartedRef.current) {\n resultPumpStartedRef.current = true;\n await enqueuePump(gen, applyCard(result));\n } else {\n await pumpChain.current;\n }\n if (streamGen.current !== gen) return;\n const latest = latestResultRef.current || result;\n commitTurn(gen, liveRef.current || bodyFromResult(latest).body);\n applyCard(latest);\n })\n .catch(async (err) => {\n if (streamGen.current !== gen || !showLocalTurns) return;\n const message = err instanceof Error ? err.message : 'Travel search failed.';\n await enqueuePump(gen, message);\n if (streamGen.current !== gen) return;\n setLocalMessages((prev) => [...prev, { id: `a-${Date.now()}`, role: 'assistant', content: message }]);\n setTravelStream(null);\n liveRef.current = '';\n })\n .finally(() => {\n if (streamGen.current !== gen) return;\n inFlight.current = false;\n setBusy(false);\n });\n };\n\n const send = (text: string, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n if (!trimmed && !files?.length) return;\n // The conversation needs the room now; \"Templates\" in the header brings them back.\n setTemplatesOpen(false);\n streamGen.current += 1;\n setTravelStream(null);\n inFlight.current = true;\n const fileCount = files?.length ?? 0;\n const useHost = Boolean(hostChat) && shouldUseHostLane(trimmed, fileCount);\n\n if (useHost && hostChat) {\n if (!hostChat.connected) {\n setLocalMessages((prev) => [\n ...prev,\n { id: `u-${Date.now()}`, role: 'user', content: trimmed },\n {\n id: `a-${Date.now()}`,\n role: 'assistant',\n content:\n hostChat.error ||\n 'CDeCLI is not connected yet. Check gateway status in the header, then send again.',\n },\n ]);\n inFlight.current = false;\n return;\n }\n hostChat.send(trimmed, files);\n setLocalMessages((prev) => prev.filter((m) => !m.id.startsWith('travel-')));\n if (!isTravelConversation(trimmed) && trimmed) {\n runNativeTravel(trimmed, false);\n return;\n }\n inFlight.current = false;\n return;\n }\n\n const user: AgentChatMessage = {\n id: `u-${Date.now()}`,\n role: 'user',\n content: trimmed,\n createdAt: new Date().toISOString(),\n ...(files?.length ? { attachments: files } : {}),\n };\n setLocalMessages((prev) => [...prev, user]);\n setCardAttachment(null);\n runNativeTravel(trimmed, true);\n };\n\n useEffect(() => {\n inFlight.current = false;\n streamGen.current += 1;\n setTravelStream(null);\n if (!visible) {\n setTemplatesOpen(true);\n return;\n }\n let cancelled = false;\n void listTravelTemplatesViaConnector()\n .then((templates) => {\n if (cancelled || !templates.length) return;\n setSuggestions(\n templates.slice(0, 8).map((row) => ({\n id: row.id,\n label: row.title,\n prompt: row.prompt || row.title,\n })),\n );\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [visible]);\n\n useEffect(() => {\n if (!visible || !seedTurn) return;\n const key = `${seedTurn.text}\\0${(seedTurn.files ?? []).map((file) => file.id ?? file.name ?? '').join(',')}`;\n if (seededKey.current === key) return;\n seededKey.current = key;\n const timer = setTimeout(() => send(seedTurn.text, seedTurn.files), 50);\n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, seedTurn]);\n\n return (\n <NativeAgentChat\n title=\"Travel Agent\"\n visible={visible}\n onClose={onClose}\n onSwipeLeft={onClose}\n messages={messages}\n onSend={send}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onClear={() => {\n streamGen.current += 1;\n setLocalMessages([]);\n setCardAttachment(null);\n setTravelStream(null);\n hostChat?.clear?.();\n }}\n busy={busy || Boolean(hostChat?.busy)}\n steering={hostChat}\n streamingContent={travelStream || hostChat?.streaming}\n error={hostChat?.error}\n placeholder={'Where to? e.g. \"stays in Lisbon next weekend\"'}\n emptyTitle=\"Where are we going?\"\n emptyBody=\"Search stays, flights and cars in plain language — or ask about plans, policy and expenses.\"\n suggestions={templatesOpen ? suggestions : []}\n headerTrailing={\n <Pressable\n onPress={() => setTemplatesOpen((open) => !open)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Templates\"\n >\n <Text style={styles.templates}>Templates</Text>\n </Pressable>\n }\n belowHeader={\n templatesOpen && messages.length > 0 ? (\n <View style={styles.templateRow}>\n {suggestions.map((chip) => (\n <Pressable\n key={chip.id}\n onPress={() => send(chip.prompt ?? chip.label)}\n style={styles.templateChip}\n >\n <Text style={styles.templateChipText}>{chip.label}</Text>\n </Pressable>\n ))}\n </View>\n ) : null\n }\n composerLead={\n cardAttachment ? (\n <TravelChatResultCard\n attachment={cardAttachment}\n properties={properties}\n ink=\"#0f172a\"\n muted=\"#64748b\"\n border=\"#e8ecf1\"\n card=\"#fff\"\n onViewResults={onViewResults}\n onOpenItem={onOpenProperty}\n />\n ) : null\n }\n />\n );\n}\n\nconst styles = StyleSheet.create({\n templates: { fontSize: 13, fontWeight: '700', color: '#2563eb' },\n templateRow: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n paddingHorizontal: 16,\n paddingBottom: 10,\n },\n templateChip: {\n borderWidth: 1,\n borderColor: '#e2e8f0',\n borderRadius: 999,\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: '#fff',\n },\n templateChipText: { fontSize: 13, fontWeight: '600', color: '#0f172a' },\n});\n"],"names":["_a"],"mappings":"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"}