@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":"notionPageHistory.js","sources":["../../../src/features/notion/notionPageHistory.ts"],"sourcesContent":["// Ported verbatim from forms-stack packages/notion-api/browser/src/utils/pageHistory.ts (develop),\n// plus outlineOf / PageVersion from components/api/pageHistory.ts.\n/* eslint-disable */\n/**\n * Pure helpers for the page history (activity timeline) panel.\n *\n * The server's `getVersionHistory` is the block's transaction log: one entry per\n * create/update/delete/move of the PAGE block itself (title, icon, cover…), carrying only\n * `{ version, timestamp, userId }` — no snapshots. So the panel shows *who edited and when*,\n * grouped by day, newest first, with bursts of edits by the same person collapsed.\n */\n\nexport interface HistoryEntryLike {\n version?: number | null;\n timestamp: string | Date | number | null | undefined;\n userId?: string | null;\n}\n\nexport interface HistoryItem {\n key: string;\n kind: 'edit' | 'created';\n userId: string;\n /** Number of log entries collapsed into this item (1 for a single edit / creation). */\n count: number;\n /** Most recent timestamp in the burst. */\n latest: Date;\n /** Oldest timestamp in the burst. */\n earliest: Date;\n /** Version of the most recent entry in the burst (what \"Restore\" goes back to). */\n version?: number;\n}\n\nexport interface HistoryGroup {\n /** Local calendar day, `YYYY-MM-DD`. */\n key: string;\n /** \"Today\" | \"Yesterday\" | localized date. */\n label: string;\n items: HistoryItem[];\n}\n\nexport interface BuildHistoryOptions {\n now?: Date;\n /** Page creation time; when given, a \"Created\" item is appended as the oldest entry. */\n createdTime?: string | Date | null;\n createdBy?: string | null;\n /** Max gap between consecutive edits by the same user to merge them. Default 10 minutes. */\n collapseWindowMs?: number;\n locale?: string;\n}\n\nexport const COLLAPSE_WINDOW_MS = 10 * 60 * 1000;\n/** Log entries this close to `createdTime` are the page's own \"create\" transaction. */\nconst CREATE_DEDUPE_MS = 5 * 1000;\n\nexport function toDate(v: string | Date | number | null | undefined): Date | null {\n if (v == null || v === '') return null;\n const d = v instanceof Date ? new Date(v.getTime()) : new Date(v);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nexport function dayKey(d: Date): string {\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\nfunction startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n}\n\n/** \"Today\" / \"Yesterday\" / \"Monday, September 28\" (+ year when not the current year). */\nexport function dayLabel(d: Date, now: Date = new Date(), locale?: string): string {\n const diffDays = Math.round((startOfDay(now).getTime() - startOfDay(d).getTime()) / 86_400_000);\n if (diffDays === 0) return 'Today';\n if (diffDays === 1) return 'Yesterday';\n return d.toLocaleDateString(locale, {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n ...(d.getFullYear() !== now.getFullYear() ? { year: 'numeric' } : {}),\n });\n}\n\n/** Time shown on an item: relative within the last hour, otherwise a clock time. */\nexport function formatItemTime(d: Date, now: Date = new Date(), locale?: string): string {\n const ms = Math.max(0, now.getTime() - d.getTime());\n const min = Math.floor(ms / 60_000);\n if (min < 1) return 'Just now';\n if (min < 60) return `${min} min ago`;\n return d.toLocaleTimeString(locale, { hour: 'numeric', minute: '2-digit' });\n}\n\n/** Full timestamp for `title` / `dateTime` tooltips. */\nexport function formatFullTimestamp(d: Date, locale?: string): string {\n return d.toLocaleString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n}\n\nexport function describeItem(item: Pick<HistoryItem, 'kind' | 'count'>): string {\n if (item.kind === 'created') return 'Created the page';\n return item.count > 1 ? `Edited ${item.count} times` : 'Edited the page';\n}\n\n/** \"You\" for the current user, emails as-is, short ids as-is, long ids shortened. */\nexport function userLabel(userId: string | null | undefined, currentUserId?: string | null): string {\n const id = (userId ?? '').trim();\n if (!id) return 'Someone';\n if (currentUserId && id === currentUserId) return 'You';\n if (id.includes('@')) return id;\n if (id.length <= 16) return id;\n return `User ${id.slice(0, 6)}…`;\n}\n\n/**\n * Sort newest first, collapse same-user bursts (consecutive, same day, gap ≤ window),\n * group by local day, and append the creation item when `createdTime` is known.\n */\nexport function buildHistoryGroups(\n entries: ReadonlyArray<HistoryEntryLike> | null | undefined,\n opts: BuildHistoryOptions = {},\n): HistoryGroup[] {\n const now = opts.now ?? new Date();\n const windowMs = opts.collapseWindowMs ?? COLLAPSE_WINDOW_MS;\n const created = toDate(opts.createdTime ?? null);\n\n const parsed = (entries ?? [])\n .map((e) => ({\n at: toDate(e?.timestamp),\n userId: (e?.userId ?? '').trim(),\n version: typeof e?.version === 'number' ? e.version : undefined,\n }))\n .filter((e): e is { at: Date; userId: string; version: number | undefined } => e.at !== null)\n // The page's own create transaction duplicates the \"Created\" item.\n .filter((e) => !created || Math.abs(e.at.getTime() - created.getTime()) > CREATE_DEDUPE_MS)\n .sort((a, b) => b.at.getTime() - a.at.getTime());\n\n const items: HistoryItem[] = [];\n for (const e of parsed) {\n const prev = items[items.length - 1];\n if (\n prev &&\n prev.kind === 'edit' &&\n prev.userId === e.userId &&\n dayKey(prev.earliest) === dayKey(e.at) &&\n prev.earliest.getTime() - e.at.getTime() <= windowMs\n ) {\n prev.count += 1;\n prev.earliest = e.at;\n continue;\n }\n items.push({\n key: `edit-${e.at.getTime()}-${e.userId}-${items.length}`,\n kind: 'edit',\n userId: e.userId,\n count: 1,\n latest: e.at,\n earliest: e.at,\n ...(e.version !== undefined ? { version: e.version } : {}),\n });\n }\n\n if (created) {\n items.push({\n key: `created-${created.getTime()}`,\n kind: 'created',\n userId: (opts.createdBy ?? '').trim(),\n count: 1,\n latest: created,\n earliest: created,\n });\n }\n\n const groups: HistoryGroup[] = [];\n for (const item of items) {\n const k = dayKey(item.latest);\n const last = groups[groups.length - 1];\n if (last && dayKey(last.items[0].latest) === k) last.items.push(item);\n else {\n // Out-of-order data (edits older than createdTime) can revisit a day; keep keys unique.\n const key = groups.some((g) => g.key === k) ? `${k}~${groups.length}` : k;\n groups.push({ key, label: dayLabel(item.latest, now, opts.locale), items: [item] });\n }\n }\n return groups;\n}\n\n/**\n * Can this item be restored? Needs a version, and not the newest edit (that IS the current state).\n * `newestVersion`: the highest version in the log.\n */\nexport function canRestoreItem(item: Pick<HistoryItem, 'kind' | 'version'>, newestVersion: number | null): boolean {\n if (item.kind !== 'edit' || typeof item.version !== 'number') return false;\n return newestVersion === null || item.version < newestVersion;\n}\n\n/** Count of underlying log entries (excludes the synthetic \"Created\" item). */\nexport function countEdits(groups: ReadonlyArray<HistoryGroup>): number {\n return groups.reduce((n, g) => n + g.items.reduce((m, i) => m + (i.kind === 'edit' ? i.count : 0), 0), 0);\n}\n\nexport interface PageVersion {\n id: string;\n createdAt: string;\n userIds: string[];\n blockCount: number;\n /** 'edit' | 'before-restore' | 'restore' */\n reason: string;\n}\n\nexport interface PageVersionBlock {\n id: string;\n type: string;\n properties: Record<string, any>;\n content: string[];\n}\n\nexport function outlineOf(\n blocks: PageVersionBlock[],\n): Array<{ id: string; type: string; depth: number; text: string }> {\n const byId = new Map(blocks.map((b) => [b.id, b]));\n const root = blocks[0];\n if (!root) return [];\n const plain = (b: PageVersionBlock) => {\n const t = b.properties?.title;\n if (Array.isArray(t)) return t.map((s: any) => s?.plainText ?? s?.text?.content ?? s?.content ?? '').join('');\n return typeof t === 'string' ? t : '';\n };\n const out: Array<{ id: string; type: string; depth: number; text: string }> = [];\n const seen = new Set<string>();\n const walk = (b: PageVersionBlock, depth: number) => {\n if (seen.has(b.id)) return;\n seen.add(b.id);\n out.push({ id: b.id, type: b.type, depth, text: plain(b) });\n if (depth > 0 && (b.type === 'page' || b.type === 'database' || b.type === 'database_row')) return;\n for (const id of b.content ?? []) {\n const c = byId.get(id);\n if (c) walk(c, depth + 1);\n }\n };\n walk(root, 0);\n return out;\n}\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,200 @@
1
+ import'./notionTemplates.js';import {titlePlainText,textTitle}from'./notionRichTitle.js';import {isAgentRunStatus,effectiveRunStatus}from'./notionAgentRunStatus.js';var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const NOTES_SETTINGS_FLAG = "notesSettings";
21
+ const TEAMSPACES_KEY = "notesTeamspaces";
22
+ const TILE_COLOR_NAMES = ["gray", "brown", "orange", "yellow", "green", "blue", "purple", "pink", "red"];
23
+ function colorForName(name) {
24
+ let h = 0;
25
+ for (let i = 0; i < name.length; i++) h = h * 31 + name.charCodeAt(i) >>> 0;
26
+ const palette = TILE_COLOR_NAMES.slice(2);
27
+ return palette[h % palette.length];
28
+ }
29
+ function pageKindOf(properties) {
30
+ const k = properties == null ? void 0 : properties.kind;
31
+ return k === "agent" || k === "meeting" ? k : "page";
32
+ }
33
+ function pageColorOf(properties) {
34
+ const own = properties == null ? void 0 : properties.color;
35
+ if (typeof own === "string" && own.trim()) return own.trim();
36
+ const agent = properties == null ? void 0 : properties.agent;
37
+ return typeof (agent == null ? void 0 : agent.color) === "string" && agent.color.trim() ? agent.color.trim() : void 0;
38
+ }
39
+ function readTeamspaces(properties) {
40
+ const raw = properties == null ? void 0 : properties[TEAMSPACES_KEY];
41
+ if (!Array.isArray(raw)) return [];
42
+ const seen = /* @__PURE__ */ new Set();
43
+ const out = [];
44
+ for (const e of raw) {
45
+ if (!e || typeof e !== "object") continue;
46
+ const r = e;
47
+ const name = typeof r.name === "string" ? r.name.trim() : "";
48
+ if (!name || seen.has(name.toLowerCase())) continue;
49
+ seen.add(name.toLowerCase());
50
+ out.push(__spreadProps(__spreadValues({
51
+ id: typeof r.id === "string" && r.id ? r.id : `ts-${name.toLowerCase().replace(/\s+/g, "-")}`,
52
+ name
53
+ }, typeof r.icon === "string" && r.icon ? {
54
+ icon: r.icon
55
+ } : {}), {
56
+ color: typeof r.color === "string" && r.color ? r.color : colorForName(name)
57
+ }));
58
+ }
59
+ return out;
60
+ }
61
+ function addTeamspace(list, entry, newId = () => `ts-${Date.now().toString(36)}${Math.random().toString(36).slice(2, 6)}`) {
62
+ const name = entry.name.trim();
63
+ if (!name || list.some((t) => t.name.toLowerCase() === name.toLowerCase())) return [...list];
64
+ return [...list, __spreadValues({
65
+ id: newId(),
66
+ name,
67
+ color: entry.color || colorForName(name)
68
+ }, entry.icon ? {
69
+ icon: entry.icon
70
+ } : {})];
71
+ }
72
+ function removeTeamspace(list, id) {
73
+ return list.filter((t) => t.id !== id);
74
+ }
75
+ function sectionPatch(teamspace) {
76
+ const name = teamspace == null ? void 0 : teamspace.trim();
77
+ return name ? {
78
+ section: "teamspace",
79
+ teamspace: name
80
+ } : {
81
+ section: "private",
82
+ teamspace: null
83
+ };
84
+ }
85
+ function newAgentProperties(opts = {}) {
86
+ var _a;
87
+ const name = ((_a = opts.name) == null ? void 0 : _a.trim()) || "New agent";
88
+ const color = opts.color || colorForName(`${name}${Date.now()}`);
89
+ const agent = {
90
+ version: 1,
91
+ enabled: false,
92
+ color,
93
+ triggers: [{
94
+ type: "manual"
95
+ }],
96
+ tools: [{
97
+ kind: "yantra-notion",
98
+ connector: "yantra-notion"
99
+ }],
100
+ scope: {
101
+ pageIds: [],
102
+ databaseIds: []
103
+ }
104
+ };
105
+ return __spreadProps(__spreadValues({
106
+ title: textTitle(name),
107
+ icon: {
108
+ type: "emoji",
109
+ emoji: "\u{1F916}"
110
+ },
111
+ kind: "agent",
112
+ color
113
+ }, sectionPatch(opts.teamspace)), {
114
+ agent
115
+ });
116
+ }
117
+ function newSectionPageProperties(teamspace, title = "") {
118
+ return __spreadValues({
119
+ title: title ? textTitle(title) : [],
120
+ kind: "page"
121
+ }, sectionPatch(teamspace));
122
+ }
123
+ function newSettingsPageProperties(teamspaces = []) {
124
+ return {
125
+ title: textTitle("Workspace settings"),
126
+ icon: {
127
+ type: "emoji",
128
+ emoji: "\u2699\uFE0F"
129
+ },
130
+ [NOTES_SETTINGS_FLAG]: true,
131
+ [TEAMSPACES_KEY]: teamspaces
132
+ };
133
+ }
134
+ function classifyRootNodes(nodes, catalog) {
135
+ var _a;
136
+ const agents = [];
137
+ const meetings = [];
138
+ const myPages = [];
139
+ const groups = /* @__PURE__ */ new Map();
140
+ for (const t of catalog) groups.set(t.name.toLowerCase(), {
141
+ teamspace: t,
142
+ nodes: [],
143
+ implicit: false
144
+ });
145
+ for (const n of nodes) {
146
+ if (n.kind === "agent") agents.push(n);
147
+ else if (n.kind === "meeting") meetings.push(n);
148
+ else if (n.section === "teamspace" && ((_a = n.teamspace) == null ? void 0 : _a.trim())) {
149
+ const key = n.teamspace.trim().toLowerCase();
150
+ let g = groups.get(key);
151
+ if (!g) {
152
+ const name = n.teamspace.trim();
153
+ g = {
154
+ teamspace: {
155
+ id: `implicit-${key}`,
156
+ name,
157
+ color: colorForName(name)
158
+ },
159
+ nodes: [],
160
+ implicit: true
161
+ };
162
+ groups.set(key, g);
163
+ }
164
+ g.nodes.push(n);
165
+ } else myPages.push(n);
166
+ }
167
+ return {
168
+ agents,
169
+ meetings,
170
+ teamspaces: [...groups.values()],
171
+ myPages
172
+ };
173
+ }
174
+ const plainTitle = (properties) => titlePlainText(properties).trim();
175
+ function agentRowOf(block, now = Date.now()) {
176
+ var _a, _b, _c, _d, _e;
177
+ if (!(block == null ? void 0 : block.id) || pageKindOf(block.properties) !== "agent" || block.inTrash) return null;
178
+ const agent = (_b = (_a = block.properties) == null ? void 0 : _a.agent) != null ? _b : {};
179
+ const run = agent.lastRun;
180
+ const icon = (_d = (_c = block.properties) == null ? void 0 : _c.icon) == null ? void 0 : _d.emoji;
181
+ const color = pageColorOf(block.properties);
182
+ const lastRun = run && isAgentRunStatus(run.status) ? __spreadValues({
183
+ at: Date.parse((_e = run.at) != null ? _e : "") || 0,
184
+ status: effectiveRunStatus(run.status, run.at, now)
185
+ }, typeof run.summary === "string" && run.summary ? {
186
+ summary: run.summary
187
+ } : {}) : void 0;
188
+ return __spreadValues(__spreadProps(__spreadValues(__spreadValues({
189
+ id: String(block.id),
190
+ title: plainTitle(block.properties) || "Untitled agent"
191
+ }, icon ? {
192
+ icon
193
+ } : {}), color ? {
194
+ color
195
+ } : {}), {
196
+ enabled: agent.enabled === true
197
+ }), lastRun ? {
198
+ lastRun
199
+ } : {});
200
+ }export{NOTES_SETTINGS_FLAG,TEAMSPACES_KEY,TILE_COLOR_NAMES,addTeamspace,agentRowOf,classifyRootNodes,colorForName,newAgentProperties,newSectionPageProperties,newSettingsPageProperties,pageColorOf,pageKindOf,readTeamspaces,removeTeamspace,sectionPatch};//# sourceMappingURL=notionPageKinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notionPageKinds.js","sources":["../../../src/features/notion/notionPageKinds.ts"],"sourcesContent":["// Ported from forms-stack packages/notion-api/browser/src/utils/pageKinds.ts (develop); only import paths changed.\n/* eslint-disable */\n/**\n * pageKinds — how a page is classified in the sidebar (Agents / Meetings / Teamspaces / My pages).\n *\n * No new block types and no server change: `properties` is Mongo `Mixed` and `updateBlock` merges\n * it shallowly, so a page's place in the shell is three plain properties:\n *\n * properties.kind 'page' | 'agent' | 'meeting' (default 'page')\n * properties.section 'private' | 'teamspace' (default 'private' → \"My pages\")\n * properties.teamspace teamspace NAME when section === 'teamspace'\n * properties.color optional tile colour (agents; teamspaces keep theirs in the catalog)\n *\n * The teamspace catalog lives on a hidden root \"settings\" page (`properties.notesSettings: true`,\n * `properties.notesTeamspaces: TeamspaceDef[]`) — the same trick as the hidden template library\n * (`notesTemplateLibrary`, utils/pageTemplates.ts). Both are hidden everywhere pages are listed.\n *\n * Pure helpers only (tested in pageKinds.test.ts); the GraphQL side is components/api/notesSettings.ts.\n */\nimport { isTemplateLibrary } from './notionTemplates';\nimport { textTitle, titlePlainText } from './notionRichTitle';\nimport { AGENT_RUN_LABEL, effectiveRunStatus, isAgentRunStatus, type AgentRunStatus } from './notionAgentRunStatus';\nimport type { NotesAgent } from './notionNotesAgent';\n\nexport { AGENT_RUN_LABEL };\nexport type { AgentRunStatus };\n\nexport type PageKind = 'page' | 'agent' | 'meeting';\nexport type PageSection = 'private' | 'teamspace';\n\n/** One teamspace in the catalog. `name` is what pages reference (`properties.teamspace`). */\nexport interface TeamspaceDef {\n id: string;\n name: string;\n /** Optional emoji shown instead of the colour tile. */\n icon?: string;\n /** A palette name (see TILE_COLORS) or a CSS colour (#hex / rgb()). */\n color: string;\n}\n\n/** Flag on the hidden settings page (holds the teamspace catalog). */\nexport const NOTES_SETTINGS_FLAG = 'notesSettings';\n/** Catalog key on the settings page. */\nexport const TEAMSPACES_KEY = 'notesTeamspaces';\n\n/** Notion's colour names — the tile palette for agents and teamspaces. */\nexport const TILE_COLOR_NAMES = [\n 'gray',\n 'brown',\n 'orange',\n 'yellow',\n 'green',\n 'blue',\n 'purple',\n 'pink',\n 'red',\n] as const;\nexport type TileColorName = (typeof TILE_COLOR_NAMES)[number];\n\n/**\n * Tile classes per palette name. Literal strings so Tailwind's JIT sees them. `solid` is the\n * saturated agent tile, `soft` the pale teamspace tile (the demo's sidebar).\n */\nexport const TILE_COLORS: Record<TileColorName, { solid: string; soft: string }> = {\n gray: { solid: 'bg-zinc-400 dark:bg-zinc-500', soft: 'bg-zinc-200 dark:bg-zinc-600/60' },\n brown: { solid: 'bg-amber-700 dark:bg-amber-700', soft: 'bg-amber-200/70 dark:bg-amber-800/60' },\n orange: { solid: 'bg-orange-400 dark:bg-orange-500', soft: 'bg-orange-200 dark:bg-orange-700/60' },\n yellow: { solid: 'bg-amber-400 dark:bg-amber-500', soft: 'bg-amber-100 dark:bg-amber-600/50' },\n green: { solid: 'bg-emerald-500 dark:bg-emerald-500', soft: 'bg-emerald-100 dark:bg-emerald-700/60' },\n blue: { solid: 'bg-sky-500 dark:bg-sky-500', soft: 'bg-sky-100 dark:bg-sky-700/60' },\n purple: { solid: 'bg-violet-500 dark:bg-violet-500', soft: 'bg-violet-100 dark:bg-violet-700/60' },\n pink: { solid: 'bg-pink-400 dark:bg-pink-500', soft: 'bg-pink-100 dark:bg-pink-700/60' },\n red: { solid: 'bg-rose-500 dark:bg-rose-500', soft: 'bg-rose-100 dark:bg-rose-700/60' },\n};\n\nexport function isTileColorName(c: unknown): c is TileColorName {\n return typeof c === 'string' && (TILE_COLOR_NAMES as readonly string[]).includes(c);\n}\n\n/** Tile class + inline style for a colour (palette name → class; CSS colour → inline style). */\nexport function tileColor(\n color: string | undefined | null,\n variant: 'solid' | 'soft' = 'solid',\n): { className: string; style?: { backgroundColor: string } } {\n if (isTileColorName(color)) return { className: TILE_COLORS[color][variant] };\n if (typeof color === 'string' && /^(#[0-9a-f]{3,8}|rgba?\\(|hsla?\\()/i.test(color.trim())) {\n return { className: '', style: { backgroundColor: color.trim() } };\n }\n return { className: TILE_COLORS.gray[variant] };\n}\n\n/** A stable palette colour for a name (so an un-coloured agent/teamspace keeps one colour). */\nexport function colorForName(name: string): TileColorName {\n let h = 0;\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) >>> 0;\n // Skip gray/brown: they read as \"no colour\".\n const palette = TILE_COLOR_NAMES.slice(2);\n return palette[h % palette.length];\n}\n\n// ============================================================================\n// READ\n// ============================================================================\n\ntype Props = Record<string, unknown> | null | undefined;\n\nexport function pageKindOf(properties: Props): PageKind {\n const k = properties?.kind;\n return k === 'agent' || k === 'meeting' ? k : 'page';\n}\n\nexport function pageSectionOf(properties: Props): { section: PageSection; teamspace?: string } {\n const name = typeof properties?.teamspace === 'string' ? properties.teamspace.trim() : '';\n if (properties?.section === 'teamspace' && name) return { section: 'teamspace', teamspace: name };\n return { section: 'private' };\n}\n\n/** Tile colour of a page (agents): `properties.color`, else `properties.agent.color`. */\nexport function pageColorOf(properties: Props): string | undefined {\n const own = properties?.color;\n if (typeof own === 'string' && own.trim()) return own.trim();\n const agent = properties?.agent as { color?: unknown } | undefined;\n return typeof agent?.color === 'string' && agent.color.trim() ? agent.color.trim() : undefined;\n}\n\nexport function isSettingsPage(properties: Props): boolean {\n return !!properties && properties[NOTES_SETTINGS_FLAG] === true;\n}\n\n/** Root pages the shell keeps out of every listing (template library, settings). */\nexport function isHiddenRootPage(properties: Props): boolean {\n return isTemplateLibrary(properties ?? undefined) || isSettingsPage(properties);\n}\n\n/** Marks an internal block (an agent's Runs database): kept out of the sidebar, page body and listings. */\nexport const HIDDEN_FLAG = 'hidden';\n\nexport function isHiddenBlock(properties: Props): boolean {\n return !!properties && properties[HIDDEN_FLAG] === true;\n}\n\n/** Anything the shell never lists: a hidden root page (template library, settings) or a hidden block. */\nexport function isHiddenListingBlock(properties: Props): boolean {\n return isHiddenBlock(properties) || isHiddenRootPage(properties);\n}\n\n/** Tree node shape of the workspace block tree (only what pruning reads). */\nexport interface PrunableTreeNode {\n block?: { properties?: Props } | null;\n children?: PrunableTreeNode[];\n}\n\n/**\n * The workspace tree without hidden blocks (and their subtrees) at ANY depth — built once where the\n * tree is handed to listings (sidebar, pickers, All pages, search titles). Returns the SAME array /\n * nodes when nothing is hidden, so memoised consumers don't re-render.\n */\nexport function pruneHiddenNodes<N extends PrunableTreeNode>(nodes: readonly N[] | undefined): N[] | undefined {\n if (!nodes) return nodes as undefined;\n let changed = false;\n const out: N[] = [];\n for (const n of nodes) {\n if (isHiddenListingBlock(n?.block?.properties)) {\n changed = true;\n continue;\n }\n const kids = n.children ? pruneHiddenNodes(n.children as N[]) : n.children;\n if (kids !== n.children) {\n changed = true;\n out.push({ ...n, children: kids });\n } else out.push(n);\n }\n return changed ? out : (nodes as N[]);\n}\n\n/** The catalog on the settings page, sanitized (bad entries dropped, names de-duplicated). */\nexport function readTeamspaces(properties: Props): TeamspaceDef[] {\n const raw = properties?.[TEAMSPACES_KEY];\n if (!Array.isArray(raw)) return [];\n const seen = new Set<string>();\n const out: TeamspaceDef[] = [];\n for (const e of raw) {\n if (!e || typeof e !== 'object') continue;\n const r = e as Record<string, unknown>;\n const name = typeof r.name === 'string' ? r.name.trim() : '';\n if (!name || seen.has(name.toLowerCase())) continue;\n seen.add(name.toLowerCase());\n out.push({\n id: typeof r.id === 'string' && r.id ? r.id : `ts-${name.toLowerCase().replace(/\\s+/g, '-')}`,\n name,\n ...(typeof r.icon === 'string' && r.icon ? { icon: r.icon } : {}),\n color: typeof r.color === 'string' && r.color ? r.color : colorForName(name),\n });\n }\n return out;\n}\n\n// ============================================================================\n// WRITE (property patches for updateBlock / createBlock)\n// ============================================================================\n\n/** Add a teamspace (case-insensitive unique name). Returns the same list when it already exists. */\nexport function addTeamspace(\n list: readonly TeamspaceDef[],\n entry: { name: string; color?: string; icon?: string },\n newId: () => string = () => `ts-${Date.now().toString(36)}${Math.random().toString(36).slice(2, 6)}`,\n): TeamspaceDef[] {\n const name = entry.name.trim();\n if (!name || list.some((t) => t.name.toLowerCase() === name.toLowerCase())) return [...list];\n return [\n ...list,\n {\n id: newId(),\n name,\n color: entry.color || colorForName(name),\n ...(entry.icon ? { icon: entry.icon } : {}),\n },\n ];\n}\n\nexport function removeTeamspace(list: readonly TeamspaceDef[], id: string): TeamspaceDef[] {\n return list.filter((t) => t.id !== id);\n}\n\n/** Patch that puts a page in a section (`teamspace` null/'' = My pages). */\nexport function sectionPatch(teamspace?: string | null): { section: PageSection; teamspace: string | null } {\n const name = teamspace?.trim();\n return name ? { section: 'teamspace', teamspace: name } : { section: 'private', teamspace: null };\n}\n\n/** @deprecated The agent config type lives in utils/notesAgent (`NotesAgent`); kept as an alias. */\nexport type NotesAgentConfig = NotesAgent;\n\n/** Properties of a new agent page (the agents feature builds the agent UI on top). */\nexport function newAgentProperties(opts: { name?: string; color?: string; teamspace?: string | null } = {}) {\n const name = opts.name?.trim() || 'New agent';\n const color = opts.color || colorForName(`${name}${Date.now()}`);\n const agent: NotesAgent = {\n version: 1,\n enabled: false,\n color,\n triggers: [{ type: 'manual' }],\n tools: [{ kind: 'yantra-notion', connector: 'yantra-notion' }],\n scope: { pageIds: [], databaseIds: [] },\n };\n return {\n title: textTitle(name),\n icon: { type: 'emoji', emoji: '🤖' },\n kind: 'agent' as const,\n color,\n ...sectionPatch(opts.teamspace),\n agent,\n };\n}\n\nexport type MeetingStatus = 'scheduled' | 'live' | 'ended';\n\nexport interface NotesMeetingMeta {\n /** ISO start time. */\n startsAt?: string;\n endsAt?: string;\n /** Free-text attendee names. */\n attendees?: string[];\n status?: MeetingStatus;\n [k: string]: unknown;\n}\n\n/** Properties of a new meeting page. */\nexport function newMeetingProperties(opts: { title?: string; startsAt?: Date; attendees?: string[] } = {}) {\n const start = opts.startsAt ?? new Date();\n const title =\n opts.title?.trim() || `Meeting — ${start.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })}`;\n const meeting: NotesMeetingMeta = {\n startsAt: start.toISOString(),\n attendees: (opts.attendees ?? []).map((a) => a.trim()).filter(Boolean),\n status: 'scheduled',\n };\n return {\n title: textTitle(title),\n icon: { type: 'emoji', emoji: '🗓️' },\n kind: 'meeting' as const,\n section: 'private' as const,\n meeting,\n };\n}\n\n/** Properties of a plain page created inside a teamspace / My pages. */\nexport function newSectionPageProperties(teamspace?: string | null, title = '') {\n return { title: title ? textTitle(title) : [], kind: 'page' as const, ...sectionPatch(teamspace) };\n}\n\n/** Properties of the hidden settings page. */\nexport function newSettingsPageProperties(teamspaces: TeamspaceDef[] = []) {\n return {\n title: textTitle('Workspace settings'),\n icon: { type: 'emoji', emoji: '⚙️' },\n [NOTES_SETTINGS_FLAG]: true,\n [TEAMSPACES_KEY]: teamspaces,\n };\n}\n\n// ============================================================================\n// CLASSIFY (sidebar sections)\n// ============================================================================\n\nexport interface ClassifiableNode {\n id: string;\n kind?: PageKind;\n section?: PageSection;\n teamspace?: string;\n}\n\nexport interface SidebarSections<N> {\n agents: N[];\n meetings: N[];\n /** One group per catalog teamspace (catalog order), then any unknown names pages reference. */\n teamspaces: Array<{ teamspace: TeamspaceDef; nodes: N[]; implicit: boolean }>;\n /** Everything else (today's \"Pages\" tree). */\n myPages: N[];\n}\n\n/** Split ROOT nodes into the sidebar's sections. Pages keep their tree order inside a section. */\nexport function classifyRootNodes<N extends ClassifiableNode>(\n nodes: readonly N[],\n catalog: readonly TeamspaceDef[],\n): SidebarSections<N> {\n const agents: N[] = [];\n const meetings: N[] = [];\n const myPages: N[] = [];\n const groups = new Map<string, { teamspace: TeamspaceDef; nodes: N[]; implicit: boolean }>();\n for (const t of catalog) groups.set(t.name.toLowerCase(), { teamspace: t, nodes: [], implicit: false });\n for (const n of nodes) {\n if (n.kind === 'agent') agents.push(n);\n else if (n.kind === 'meeting') meetings.push(n);\n else if (n.section === 'teamspace' && n.teamspace?.trim()) {\n const key = n.teamspace.trim().toLowerCase();\n let g = groups.get(key);\n if (!g) {\n // A page names a teamspace the catalog doesn't have (e.g. set by the AI): show it\n // as its own group rather than silently dropping it into My pages.\n const name = n.teamspace.trim();\n g = {\n teamspace: { id: `implicit-${key}`, name, color: colorForName(name) },\n nodes: [],\n implicit: true,\n };\n groups.set(key, g);\n }\n g.nodes.push(n);\n } else myPages.push(n);\n }\n return { agents, meetings, teamspaces: [...groups.values()], myPages };\n}\n\n// ============================================================================\n// MEETINGS\n// ============================================================================\n\n/** The block fields meeting/agent summaries read (raw tree block). */\nexport interface RawPageBlock {\n id?: string;\n type?: string;\n properties?: Record<string, unknown> | null;\n createdTime?: string | null;\n lastEditedTime?: string | null;\n inTrash?: boolean | null;\n}\n\nexport interface MeetingSummaryRow {\n id: string;\n title: string;\n icon?: string;\n /** ms since epoch: meeting.startsAt, else the page's createdTime, else 0. */\n startsAt: number;\n attendees: string[];\n status: MeetingStatus;\n}\n\nconst plainTitle = (properties: Props): string => titlePlainText(properties).trim();\n\n/** Explicit status wins; otherwise future → scheduled, else ended. */\nexport function meetingStatusOf(meta: NotesMeetingMeta | undefined, startsAt: number, now: number): MeetingStatus {\n const s = meta?.status;\n if (s === 'live' || s === 'ended') return s;\n if (s === 'scheduled' && startsAt > now) return 'scheduled';\n return startsAt > now ? 'scheduled' : 'ended';\n}\n\nexport function meetingRowOf(block: RawPageBlock, now: number = Date.now()): MeetingSummaryRow | null {\n if (!block?.id || pageKindOf(block.properties) !== 'meeting' || block.inTrash) return null;\n const meta = (block.properties?.meeting ?? undefined) as NotesMeetingMeta | undefined;\n const startsAt = Date.parse(meta?.startsAt ?? '') || Date.parse(block.createdTime ?? '') || 0;\n const attendees = Array.isArray(meta?.attendees)\n ? (meta!.attendees as unknown[]).filter((a): a is string => typeof a === 'string' && !!a.trim())\n : [];\n const icon = (block.properties?.icon as { emoji?: string } | undefined)?.emoji;\n return {\n id: String(block.id),\n title: plainTitle(block.properties) || 'Untitled meeting',\n ...(icon ? { icon } : {}),\n startsAt,\n attendees,\n status: meetingStatusOf(meta, startsAt, now),\n };\n}\n\nfunction startOfDay(ms: number): number {\n const d = new Date(ms);\n return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n}\n\n/**\n * Upcoming (after today, soonest first) / Today (any time today, by time) / Past (before today,\n * newest first). A live meeting is always \"Today\".\n */\nexport function groupMeetings(\n rows: readonly MeetingSummaryRow[],\n now: number = Date.now(),\n): { upcoming: MeetingSummaryRow[]; today: MeetingSummaryRow[]; past: MeetingSummaryRow[] } {\n const dayStart = startOfDay(now);\n const dayEnd = dayStart + 24 * 60 * 60 * 1000;\n const upcoming: MeetingSummaryRow[] = [];\n const today: MeetingSummaryRow[] = [];\n const past: MeetingSummaryRow[] = [];\n for (const r of rows) {\n if (r.status === 'live' || (r.startsAt >= dayStart && r.startsAt < dayEnd)) today.push(r);\n else if (r.startsAt >= dayEnd) upcoming.push(r);\n else past.push(r);\n }\n upcoming.sort((a, b) => a.startsAt - b.startsAt);\n today.sort((a, b) => a.startsAt - b.startsAt);\n past.sort((a, b) => b.startsAt - a.startsAt);\n return { upcoming, today, past };\n}\n\n/** Next `limit` meetings that haven't ended (today's still-to-come + live + future), soonest first. */\nexport function nextMeetings(\n rows: readonly MeetingSummaryRow[],\n now: number = Date.now(),\n limit = 5,\n): MeetingSummaryRow[] {\n return rows\n .filter((r) => r.status === 'live' || r.startsAt >= now)\n .sort((a, b) => a.startsAt - b.startsAt)\n .slice(0, limit);\n}\n\n// ============================================================================\n// AGENTS\n// ============================================================================\n\nexport interface AgentSummaryRow {\n id: string;\n title: string;\n icon?: string;\n color?: string;\n enabled: boolean;\n lastRun?: { at: number; status: AgentRunStatus; summary?: string };\n}\n\n/** Home / Agents list row. `lastRun.status` is the EFFECTIVE status (a stale \"running\" → failed). */\nexport function agentRowOf(block: RawPageBlock, now: number = Date.now()): AgentSummaryRow | null {\n if (!block?.id || pageKindOf(block.properties) !== 'agent' || block.inTrash) return null;\n const agent = (block.properties?.agent ?? {}) as Partial<NotesAgent>;\n const run = agent.lastRun;\n const icon = (block.properties?.icon as { emoji?: string } | undefined)?.emoji;\n const color = pageColorOf(block.properties);\n const lastRun =\n run && isAgentRunStatus(run.status)\n ? {\n at: Date.parse(run.at ?? '') || 0,\n status: effectiveRunStatus(run.status, run.at, now),\n ...(typeof run.summary === 'string' && run.summary ? { summary: run.summary } : {}),\n }\n : undefined;\n return {\n id: String(block.id),\n title: plainTitle(block.properties) || 'Untitled agent',\n ...(icon ? { icon } : {}),\n ...(color ? { color } : {}),\n enabled: agent.enabled === true,\n ...(lastRun ? { lastRun } : {}),\n };\n}\n\n/** \"Today · 3:00 PM\", \"Tomorrow · 9:30 AM\", \"Tue, Oct 14 · 3:00 PM\" (year added when not this year). */\nexport function formatMeetingWhen(ms: number, now: number = Date.now()): string {\n if (!ms) return 'No date';\n const d = new Date(ms);\n const time = d.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n const dayDiff = Math.round((startOfDay(ms) - startOfDay(now)) / (24 * 60 * 60 * 1000));\n if (dayDiff === 0) return `Today · ${time}`;\n if (dayDiff === 1) return `Tomorrow · ${time}`;\n if (dayDiff === -1) return `Yesterday · ${time}`;\n const sameYear = d.getFullYear() === new Date(now).getFullYear();\n const date = d.toLocaleDateString(undefined, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n ...(sameYear ? {} : { year: 'numeric' }),\n });\n return `${date} · ${time}`;\n}\n\nexport const MEETING_STATUS_LABEL: Record<MeetingStatus, string> = {\n scheduled: 'Scheduled',\n live: 'Live',\n ended: 'Ended',\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAuCO,MAAM,mBAAsB,GAAA;AAE5B,MAAM,cAAiB,GAAA;AAGjB,MAAA,gBAAA,GAAmB,CAAC,MAAA,EAAQ,OAAS,EAAA,QAAA,EAAU,UAAU,OAAS,EAAA,MAAA,EAAQ,QAAU,EAAA,MAAA,EAAQ,KAAK;AA4EvG,SAAS,aAAa,IAA6B,EAAA;AACxD,EAAA,IAAI,CAAI,GAAA,CAAA;AACR,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,CAAK,MAAQ,EAAA,CAAA,EAAA,EAAS,CAAA,GAAA,CAAA,GAAI,EAAK,GAAA,IAAA,CAAK,UAAW,CAAA,CAAC,CAAM,KAAA,CAAA;AAE1E,EAAM,MAAA,OAAA,GAAU,gBAAiB,CAAA,KAAA,CAAM,CAAC,CAAA;AACxC,EAAO,OAAA,OAAA,CAAQ,CAAI,GAAA,OAAA,CAAQ,MAAM,CAAA;AACnC;AAOO,SAAS,WAAW,UAA6B,EAAA;AACtD,EAAA,MAAM,IAAI,UAAY,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAA,IAAA;AACtB,EAAA,OAAO,CAAM,KAAA,OAAA,IAAW,CAAM,KAAA,SAAA,GAAY,CAAI,GAAA,MAAA;AAChD;AAgBO,SAAS,YAAY,UAAuC,EAAA;AACjE,EAAA,MAAM,MAAM,UAAY,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAA,KAAA;AACxB,EAAI,IAAA,OAAO,QAAQ,QAAY,IAAA,GAAA,CAAI,MAAQ,EAAA,OAAO,IAAI,IAAK,EAAA;AAC3D,EAAA,MAAM,QAAQ,UAAY,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAA,KAAA;AAG1B,EAAO,OAAA,QAAO,KAAO,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,KAAA,CAAA,KAAU,QAAY,IAAA,KAAA,CAAM,KAAM,CAAA,IAAA,EAAS,GAAA,KAAA,CAAM,KAAM,CAAA,IAAA,EAAS,GAAA,MAAA;AACvF;AAwDO,SAAS,eAAe,UAAmC,EAAA;AAChE,EAAA,MAAM,MAAM,UAAa,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAA,cAAA,CAAA;AACzB,EAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA,SAAU,EAAC;AACjC,EAAM,MAAA,IAAA,uBAAW,GAAY,EAAA;AAC7B,EAAA,MAAM,MAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,KAAK,GAAK,EAAA;AACnB,IAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAU,EAAA;AACjC,IAAA,MAAM,CAAI,GAAA,CAAA;AACV,IAAM,MAAA,IAAA,GAAO,OAAO,CAAE,CAAA,IAAA,KAAS,WAAW,CAAE,CAAA,IAAA,CAAK,MAAS,GAAA,EAAA;AAC1D,IAAA,IAAI,CAAC,IAAQ,IAAA,IAAA,CAAK,IAAI,IAAK,CAAA,WAAA,EAAa,CAAG,EAAA;AAC3C,IAAK,IAAA,CAAA,GAAA,CAAI,IAAK,CAAA,WAAA,EAAa,CAAA;AAC3B,IAAA,GAAA,CAAI,IAAK,CAAA,aAAA,CAAA,cAAA,CAAA;AAAA,MACP,IAAI,OAAO,CAAA,CAAE,EAAO,KAAA,QAAA,IAAY,EAAE,EAAK,GAAA,CAAA,CAAE,EAAK,GAAA,CAAA,GAAA,EAAM,KAAK,WAAY,EAAA,CAAE,OAAQ,CAAA,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA;AAAA,MAC3F;AAAA,KAAA,EACI,OAAO,CAAA,CAAE,IAAS,KAAA,QAAA,IAAY,EAAE,IAAO,GAAA;AAAA,MACzC,MAAM,CAAE,CAAA;AAAA,KACV,GAAI,EALG,CAAA,EAAA;AAAA,MAMP,KAAA,EAAO,OAAO,CAAA,CAAE,KAAU,KAAA,QAAA,IAAY,EAAE,KAAQ,GAAA,CAAA,CAAE,KAAQ,GAAA,YAAA,CAAa,IAAI;AAAA,KAC5E,CAAA,CAAA;AAAA;AAEH,EAAO,OAAA,GAAA;AACT;AAOgB,SAAA,YAAA,CAAa,MAA+B,KAIzD,EAAA,KAAA,GAAsB,MAAM,CAAM,GAAA,EAAA,IAAA,CAAK,GAAI,EAAA,CAAE,QAAS,CAAA,EAAE,CAAC,CAAG,EAAA,IAAA,CAAK,MAAO,EAAA,CAAE,QAAS,CAAA,EAAE,EAAE,KAAM,CAAA,CAAA,EAAG,CAAC,CAAC,CAAoB,CAAA,EAAA;AACvH,EAAM,MAAA,IAAA,GAAO,KAAM,CAAA,IAAA,CAAK,IAAK,EAAA;AAC7B,EAAA,IAAI,CAAC,IAAQ,IAAA,IAAA,CAAK,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,IAAK,CAAA,WAAA,EAAkB,KAAA,IAAA,CAAK,aAAa,CAAA,EAAU,OAAA,CAAC,GAAG,IAAI,CAAA;AACzF,EAAO,OAAA,CAAC,GAAG,IAAM,EAAA,cAAA,CAAA;AAAA,IACf,IAAI,KAAM,EAAA;AAAA,IACV,IAAA;AAAA,IACA,KAAO,EAAA,KAAA,CAAM,KAAS,IAAA,YAAA,CAAa,IAAI;AAAA,GAAA,EACnC,MAAM,IAAO,GAAA;AAAA,IACf,MAAM,KAAM,CAAA;AAAA,GACd,GAAI,EACL,CAAA,CAAA;AACH;AACgB,SAAA,eAAA,CAAgB,MAA+B,EAA4B,EAAA;AACzF,EAAA,OAAO,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,EAAE,CAAA;AACrC;AAGO,SAAS,aAAa,SAG3B,EAAA;AACA,EAAA,MAAM,OAAO,SAAW,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAA,IAAA,EAAA;AACxB,EAAA,OAAO,IAAO,GAAA;AAAA,IACZ,OAAS,EAAA,WAAA;AAAA,IACT,SAAW,EAAA;AAAA,GACT,GAAA;AAAA,IACF,OAAS,EAAA,SAAA;AAAA,IACT,SAAW,EAAA;AAAA,GACb;AACF;AAMgB,SAAA,kBAAA,CAAmB,IAI/B,GAAA,EAAI,EAAA;AA9RR,EAAA,IAAA,EAAA;AA+RE,EAAA,MAAM,IAAO,GAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAK,IAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAW,IAAU,EAAA,KAAA,WAAA;AAClC,EAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,IAAS,YAAa,CAAA,CAAA,EAAG,IAAI,CAAG,EAAA,IAAA,CAAK,GAAI,EAAC,CAAE,CAAA,CAAA;AAC/D,EAAA,MAAM,KAAoB,GAAA;AAAA,IACxB,OAAS,EAAA,CAAA;AAAA,IACT,OAAS,EAAA,KAAA;AAAA,IACT,KAAA;AAAA,IACA,UAAU,CAAC;AAAA,MACT,IAAM,EAAA;AAAA,KACP,CAAA;AAAA,IACD,OAAO,CAAC;AAAA,MACN,IAAM,EAAA,eAAA;AAAA,MACN,SAAW,EAAA;AAAA,KACZ,CAAA;AAAA,IACD,KAAO,EAAA;AAAA,MACL,SAAS,EAAC;AAAA,MACV,aAAa;AAAC;AAChB,GACF;AACA,EAAO,OAAA,aAAA,CAAA,cAAA,CAAA;AAAA,IACL,KAAA,EAAO,UAAU,IAAI,CAAA;AAAA,IACrB,IAAM,EAAA;AAAA,MACJ,IAAM,EAAA,OAAA;AAAA,MACN,KAAO,EAAA;AAAA,KACT;AAAA,IACA,IAAM,EAAA,OAAA;AAAA,IACN;AAAA,GACG,EAAA,YAAA,CAAa,IAAK,CAAA,SAAS,CARzB,CAAA,EAAA;AAAA,IASL;AAAA,GACF,CAAA;AACF;AAyCgB,SAAA,wBAAA,CAAyB,SAA2B,EAAA,KAAA,GAAQ,EAAI,EAAA;AAC9E,EAAO,OAAA,cAAA,CAAA;AAAA,IACL,KAAO,EAAA,KAAA,GAAQ,SAAU,CAAA,KAAK,IAAI,EAAC;AAAA,IACnC,IAAM,EAAA;AAAA,GAAA,EACH,aAAa,SAAS,CAAA,CAAA;AAE7B;AAGgB,SAAA,yBAAA,CAA0B,UAA6B,GAAA,EAAI,EAAA;AACzE,EAAO,OAAA;AAAA,IACL,KAAA,EAAO,UAAU,oBAAoB,CAAA;AAAA,IACrC,IAAM,EAAA;AAAA,MACJ,IAAM,EAAA,OAAA;AAAA,MACN,KAAO,EAAA;AAAA,KACT;AAAA,IACA,CAAC,mBAAmB,GAAG,IAAA;AAAA,IACvB,CAAC,cAAc,GAAG;AAAA,GACpB;AACF;AA0BgB,SAAA,iBAAA,CAA8C,OAAqB,OAAsD,EAAA;AAlZzI,EAAA,IAAA,EAAA;AAmZE,EAAA,MAAM,SAAc,EAAC;AACrB,EAAA,MAAM,WAAgB,EAAC;AACvB,EAAA,MAAM,UAAe,EAAC;AACtB,EAAM,MAAA,MAAA,uBAAa,GAIhB,EAAA;AACH,EAAA,KAAA,MAAW,KAAK,OAAS,EAAA,MAAA,CAAO,IAAI,CAAE,CAAA,IAAA,CAAK,aAAe,EAAA;AAAA,IACxD,SAAW,EAAA,CAAA;AAAA,IACX,OAAO,EAAC;AAAA,IACR,QAAU,EAAA;AAAA,GACX,CAAA;AACD,EAAA,KAAA,MAAW,KAAK,KAAO,EAAA;AACrB,IAAA,IAAI,CAAE,CAAA,IAAA,KAAS,OAAS,EAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAAA,IAAW,CAAE,CAAA,IAAA,KAAS,SAAW,EAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,SAAA,IAAW,EAAE,OAAY,KAAA,WAAA,KAAA,CAAe,EAAE,GAAA,CAAA,CAAA,SAAA,KAAF,mBAAa,IAAQ,EAAA,CAAA,EAAA;AAChJ,MAAA,MAAM,GAAM,GAAA,CAAA,CAAE,SAAU,CAAA,IAAA,GAAO,WAAY,EAAA;AAC3C,MAAI,IAAA,CAAA,GAAI,MAAO,CAAA,GAAA,CAAI,GAAG,CAAA;AACtB,MAAA,IAAI,CAAC,CAAG,EAAA;AAGN,QAAM,MAAA,IAAA,GAAO,CAAE,CAAA,SAAA,CAAU,IAAK,EAAA;AAC9B,QAAI,CAAA,GAAA;AAAA,UACF,SAAW,EAAA;AAAA,YACT,EAAA,EAAI,YAAY,GAAG,CAAA,CAAA;AAAA,YACnB,IAAA;AAAA,YACA,KAAA,EAAO,aAAa,IAAI;AAAA,WAC1B;AAAA,UACA,OAAO,EAAC;AAAA,UACR,QAAU,EAAA;AAAA,SACZ;AACA,QAAO,MAAA,CAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA;AAEnB,MAAE,CAAA,CAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,KAChB,MAAe,OAAA,CAAA,IAAA,CAAK,CAAC,CAAA;AAAA;AAEvB,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAY,EAAA,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC/B;AAAA,GACF;AACF;AAwBA,MAAM,aAAa,CAAC,UAAA,KAA8B,cAAe,CAAA,UAAU,EAAE,IAAK,EAAA;AAmF3E,SAAS,UAAW,CAAA,KAAA,EAAqB,GAAc,GAAA,IAAA,CAAK,KAA+B,EAAA;AAviBlG,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAwiBE,EAAI,IAAA,EAAC,KAAO,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,EAAA,CAAA,IAAM,UAAW,CAAA,KAAA,CAAM,UAAU,CAAM,KAAA,OAAA,IAAW,KAAM,CAAA,OAAA,EAAgB,OAAA,IAAA;AACpF,EAAA,MAAM,SAAS,EAAM,GAAA,CAAA,EAAA,GAAA,KAAA,CAAA,UAAA,KAAN,IAAkB,GAAA,MAAA,GAAA,EAAA,CAAA,KAAA,KAAlB,YAA2B,EAAC;AAC3C,EAAA,MAAM,MAAM,KAAM,CAAA,OAAA;AAClB,EAAA,MAAM,IAAQ,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,KAAA,CAAM,UAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAkB,SAAlB,IAEE,GAAA,MAAA,GAAA,EAAA,CAAA,KAAA;AAChB,EAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,CAAM,UAAU,CAAA;AAC1C,EAAA,MAAM,OAAU,GAAA,GAAA,IAAO,gBAAiB,CAAA,GAAA,CAAI,MAAM,CAAI,GAAA,cAAA,CAAA;AAAA,IACpD,IAAI,IAAK,CAAA,KAAA,CAAA,CAAM,SAAI,EAAJ,KAAA,IAAA,GAAA,EAAA,GAAU,EAAE,CAAK,IAAA,CAAA;AAAA,IAChC,QAAQ,kBAAmB,CAAA,GAAA,CAAI,MAAQ,EAAA,GAAA,CAAI,IAAI,GAAG;AAAA,GAAA,EAC9C,OAAO,GAAA,CAAI,OAAY,KAAA,QAAA,IAAY,IAAI,OAAU,GAAA;AAAA,IACnD,SAAS,GAAI,CAAA;AAAA,GACf,GAAI,EACF,CAAA,GAAA,MAAA;AACJ,EAAO,OAAA,cAAA,CAAA,aAAA,CAAA,cAAA,CAAA,cAAA,CAAA;AAAA,IACL,EAAA,EAAI,MAAO,CAAA,KAAA,CAAM,EAAE,CAAA;AAAA,IACnB,KAAO,EAAA,UAAA,CAAW,KAAM,CAAA,UAAU,CAAK,IAAA;AAAA,GAAA,EACnC,IAAO,GAAA;AAAA,IACT;AAAA,GACF,GAAI,EAAC,CAAA,EACD,KAAQ,GAAA;AAAA,IACV;AAAA,GACF,GAAI,EARC,CAAA,EAAA;AAAA,IASL,OAAA,EAAS,MAAM,OAAY,KAAA;AAAA,GAAA,CAAA,EACvB,OAAU,GAAA;AAAA,IACZ;AAAA,MACE,EAAC,CAAA;AAET"}
@@ -0,0 +1,48 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var _a;
21
+ let AsyncStorage = null;
22
+ try {
23
+ AsyncStorage = (_a = require("@react-native-async-storage/async-storage").default) != null ? _a : null;
24
+ } catch (e) {
25
+ AsyncStorage = null;
26
+ }
27
+ const MAX_RECENTS = 12;
28
+ const KEY = (workspaceId) => `yantra.notion.recents.v1:${workspaceId}`;
29
+ function pushRecent(list, page) {
30
+ return [page, ...list.filter((p) => p.id !== page.id)].slice(0, MAX_RECENTS);
31
+ }
32
+ async function readRecents(workspaceId) {
33
+ if (!AsyncStorage || !workspaceId) return [];
34
+ try {
35
+ const raw = await AsyncStorage.getItem(KEY(workspaceId));
36
+ const parsed = raw ? JSON.parse(raw) : [];
37
+ return Array.isArray(parsed) ? parsed.filter((p) => p && typeof p.id === "string") : [];
38
+ } catch (e) {
39
+ return [];
40
+ }
41
+ }
42
+ async function recordRecent(workspaceId, page) {
43
+ if (!AsyncStorage || !workspaceId || !page.id) return;
44
+ const next = pushRecent(await readRecents(workspaceId), __spreadProps(__spreadValues({}, page), {
45
+ at: Date.now()
46
+ }));
47
+ AsyncStorage.setItem(KEY(workspaceId), JSON.stringify(next)).catch(() => void 0);
48
+ }export{MAX_RECENTS,pushRecent,readRecents,recordRecent};//# sourceMappingURL=notionRecents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notionRecents.js","sources":["../../../src/features/notion/notionRecents.ts"],"sourcesContent":["/**\n * \"Recently visited\" (web utils/recentPages): the pages opened on this device, per workspace,\n * newest first. Kept on the device only, like the web keeps it in the browser.\n */\ntype StorageLike = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n};\n\nlet AsyncStorage: StorageLike | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require\n AsyncStorage = require('@react-native-async-storage/async-storage').default ?? null;\n} catch {\n AsyncStorage = null;\n}\n\nexport interface RecentPage {\n id: string;\n title: string;\n icon?: string | null;\n at: number;\n}\n\nexport const MAX_RECENTS = 12;\nconst KEY = (workspaceId: string) => `yantra.notion.recents.v1:${workspaceId}`;\n\n/** Put `page` first, drop older copies of it, keep the newest MAX_RECENTS. */\nexport function pushRecent(list: readonly RecentPage[], page: RecentPage): RecentPage[] {\n return [page, ...list.filter((p) => p.id !== page.id)].slice(0, MAX_RECENTS);\n}\n\nexport async function readRecents(workspaceId: string | null | undefined): Promise<RecentPage[]> {\n if (!AsyncStorage || !workspaceId) return [];\n try {\n const raw = await AsyncStorage.getItem(KEY(workspaceId));\n const parsed = raw ? (JSON.parse(raw) as RecentPage[]) : [];\n return Array.isArray(parsed) ? parsed.filter((p) => p && typeof p.id === 'string') : [];\n } catch {\n return [];\n }\n}\n\nexport async function recordRecent(workspaceId: string | null | undefined, page: Omit<RecentPage, 'at'>) {\n if (!AsyncStorage || !workspaceId || !page.id) return;\n const next = pushRecent(await readRecents(workspaceId), { ...page, at: Date.now() });\n AsyncStorage.setItem(KEY(workspaceId), JSON.stringify(next)).catch(() => undefined);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,IAAA,EAAA;AAQA,IAAI,YAAmC,GAAA,IAAA;AACvC,IAAI;AAEF,EAAA,YAAA,GAAA,CAAe,EAAQ,GAAA,OAAA,CAAA,2CAA2C,CAAE,CAAA,OAAA,KAArD,IAAgE,GAAA,EAAA,GAAA,IAAA;AACjF,CAAQ,CAAA,OAAA,CAAA,EAAA;AACN,EAAe,YAAA,GAAA,IAAA;AACjB;AAOO,MAAM,WAAc,GAAA;AAC3B,MAAM,GAAM,GAAA,CAAC,WAAwB,KAAA,CAAA,yBAAA,EAA4B,WAAW,CAAA,CAAA;AAG5D,SAAA,UAAA,CAAW,MAA6B,IAAgC,EAAA;AACtF,EAAA,OAAO,CAAC,IAAA,EAAM,GAAG,IAAA,CAAK,OAAO,CAAK,CAAA,KAAA,CAAA,CAAE,EAAO,KAAA,IAAA,CAAK,EAAE,CAAC,CAAE,CAAA,KAAA,CAAM,GAAG,WAAW,CAAA;AAC3E;AACA,eAAsB,YAAY,WAA+D,EAAA;AAC/F,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,WAAA,SAAoB,EAAC;AAC3C,EAAI,IAAA;AACF,IAAA,MAAM,MAAM,MAAM,YAAA,CAAa,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAC,CAAA;AACvD,IAAA,MAAM,SAAS,GAAM,GAAA,IAAA,CAAK,KAAM,CAAA,GAAG,IAAoB,EAAC;AACxD,IAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAO,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,IAAK,OAAO,CAAA,CAAE,EAAO,KAAA,QAAQ,IAAI,EAAC;AAAA,GAC9E,CAAA,OAAA,CAAA,EAAA;AACN,IAAA,OAAO,EAAC;AAAA;AAEZ;AACsB,eAAA,YAAA,CAAa,aAAwC,IAA8B,EAAA;AACvG,EAAA,IAAI,CAAC,YAAgB,IAAA,CAAC,WAAe,IAAA,CAAC,KAAK,EAAI,EAAA;AAC/C,EAAA,MAAM,OAAO,UAAW,CAAA,MAAM,YAAY,WAAW,CAAA,EAAG,iCACnD,IADmD,CAAA,EAAA;AAAA,IAEtD,EAAA,EAAI,KAAK,GAAI;AAAA,GACd,CAAA,CAAA;AACD,EAAa,YAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,WAAW,CAAG,EAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAC,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AACpF"}
@@ -0,0 +1,177 @@
1
+ import {normalizeRuns,mentionOfSegment}from'./notionRichTitle.js';var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ function titleArray(title) {
18
+ if (Array.isArray(title)) return title;
19
+ if (typeof title === "string") return title ? [{
20
+ text: {
21
+ content: title
22
+ },
23
+ plainText: title
24
+ }] : [];
25
+ return [];
26
+ }
27
+ function titleRunsOf(properties) {
28
+ return normalizeRuns(titleArray(properties == null ? void 0 : properties.title).map((rt) => {
29
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
30
+ const content = (_e = (_d = (_c = (_a = rt.text) == null ? void 0 : _a.content) != null ? _c : (_b = rt.equation) == null ? void 0 : _b.expression) != null ? _d : rt.plainText) != null ? _e : "";
31
+ const a = rt.annotations;
32
+ const annotations = a || rt.bold != null || rt.italic != null ? {
33
+ bold: !!(a == null ? void 0 : a.bold) || !!rt.bold,
34
+ italic: !!(a == null ? void 0 : a.italic) || !!rt.italic,
35
+ underline: !!(a == null ? void 0 : a.underline) || !!rt.underline,
36
+ strikethrough: !!(a == null ? void 0 : a.strikethrough) || !!rt.strikethrough,
37
+ code: !!(a == null ? void 0 : a.code) || !!rt.code,
38
+ color: (_f = a == null ? void 0 : a.color) != null ? _f : rt.color,
39
+ highlight: (_g = a == null ? void 0 : a.highlight) != null ? _g : rt.highlight
40
+ } : void 0;
41
+ const href = (_j = rt.href) != null ? _j : (_i = (_h = rt.text) == null ? void 0 : _h.link) == null ? void 0 : _i.url;
42
+ const mention = mentionOfSegment(rt);
43
+ return __spreadValues(__spreadValues(__spreadValues({
44
+ content: String((_k = rt.plainText) != null ? _k : content)
45
+ }, annotations ? {
46
+ annotations
47
+ } : {}), href ? {
48
+ href
49
+ } : {}), mention ? {
50
+ mention
51
+ } : {});
52
+ }));
53
+ }
54
+ const NOTION_COLORS = [{
55
+ value: "",
56
+ label: "Default"
57
+ }, {
58
+ value: "gray",
59
+ label: "Gray"
60
+ }, {
61
+ value: "brown",
62
+ label: "Brown"
63
+ }, {
64
+ value: "orange",
65
+ label: "Orange"
66
+ }, {
67
+ value: "yellow",
68
+ label: "Yellow"
69
+ }, {
70
+ value: "green",
71
+ label: "Green"
72
+ }, {
73
+ value: "blue",
74
+ label: "Blue"
75
+ }, {
76
+ value: "purple",
77
+ label: "Purple"
78
+ }, {
79
+ value: "pink",
80
+ label: "Pink"
81
+ }, {
82
+ value: "red",
83
+ label: "Red"
84
+ }];
85
+ const TEXT_TONE = {
86
+ gray: {
87
+ light: "#787774",
88
+ dark: "#9b9b9b"
89
+ },
90
+ brown: {
91
+ light: "#9f6b53",
92
+ dark: "#ba856f"
93
+ },
94
+ orange: {
95
+ light: "#d9730d",
96
+ dark: "#c77d48"
97
+ },
98
+ yellow: {
99
+ light: "#cb912f",
100
+ dark: "#ca9849"
101
+ },
102
+ green: {
103
+ light: "#448361",
104
+ dark: "#529e72"
105
+ },
106
+ blue: {
107
+ light: "#337ea9",
108
+ dark: "#379ad3"
109
+ },
110
+ purple: {
111
+ light: "#9065b0",
112
+ dark: "#9d68d3"
113
+ },
114
+ pink: {
115
+ light: "#c14c8a",
116
+ dark: "#d15796"
117
+ },
118
+ red: {
119
+ light: "#d44c47",
120
+ dark: "#e65b58"
121
+ }
122
+ };
123
+ const WASH_TONE = {
124
+ gray: {
125
+ light: "#f1f1ef",
126
+ dark: "rgba(155,155,155,0.18)"
127
+ },
128
+ brown: {
129
+ light: "#f4eeee",
130
+ dark: "rgba(186,133,111,0.18)"
131
+ },
132
+ orange: {
133
+ light: "#fbecdd",
134
+ dark: "rgba(199,125,72,0.2)"
135
+ },
136
+ yellow: {
137
+ light: "#fbf3db",
138
+ dark: "rgba(202,152,73,0.2)"
139
+ },
140
+ green: {
141
+ light: "#edf3ec",
142
+ dark: "rgba(82,158,114,0.2)"
143
+ },
144
+ blue: {
145
+ light: "#e7f3f8",
146
+ dark: "rgba(55,154,211,0.2)"
147
+ },
148
+ purple: {
149
+ light: "#f6f3f9",
150
+ dark: "rgba(157,104,211,0.2)"
151
+ },
152
+ pink: {
153
+ light: "#faf1f5",
154
+ dark: "rgba(209,87,150,0.2)"
155
+ },
156
+ red: {
157
+ light: "#fdebec",
158
+ dark: "rgba(230,91,88,0.2)"
159
+ }
160
+ };
161
+ function textColorOf(key, isDark) {
162
+ const t = typeof key === "string" ? TEXT_TONE[key] : void 0;
163
+ return t ? isDark ? t.dark : t.light : void 0;
164
+ }
165
+ function washColorOf(key, isDark) {
166
+ const t = typeof key === "string" ? WASH_TONE[key] : void 0;
167
+ return t ? isDark ? t.dark : t.light : void 0;
168
+ }
169
+ function blockColorParts(value) {
170
+ if (typeof value !== "string" || !value) return {};
171
+ if (value.endsWith("_background")) return {
172
+ background: value.replace(/_background$/, "")
173
+ };
174
+ return {
175
+ text: value
176
+ };
177
+ }export{NOTION_COLORS,blockColorParts,textColorOf,titleRunsOf,washColorOf};//# sourceMappingURL=notionRichText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notionRichText.js","sources":["../../../src/features/notion/notionRichText.ts"],"sourcesContent":["/**\n * Stored rich-text titles <-> editable runs, and the colour palette - ported from the web\n * BlockEditor (`parseTitleSegments` / `titleRunsOf`, TEXT_COLOR_OPTIONS / HIGHLIGHT_OPTIONS) so\n * mobile reads and writes exactly what the web does:\n * - annotations: bold, italic, underline, strikethrough, code, color, highlight;\n * - links: `href` (+ Notion-style `text.link.url`);\n * - block colour: `properties.color` = `red` (text) or `red_background` (band).\n *\n * Pure: no RN imports, so it runs under jest as-is.\n */\nimport { mentionOfSegment, normalizeRuns, type RichRun } from './notionRichTitle';\n\nfunction titleArray(title: unknown): Array<Record<string, any>> {\n if (Array.isArray(title)) return title as Array<Record<string, any>>;\n if (typeof title === 'string') return title ? [{ text: { content: title }, plainText: title }] : [];\n return [];\n}\n\n/** `properties.title` -> runs (web titleRunsOf). */\nexport function titleRunsOf(properties: Record<string, unknown> | null | undefined): RichRun[] {\n return normalizeRuns(\n titleArray(properties?.title).map((rt) => {\n const content = rt.text?.content ?? rt.equation?.expression ?? rt.plainText ?? '';\n const a = rt.annotations;\n const annotations =\n a || rt.bold != null || rt.italic != null\n ? {\n bold: !!a?.bold || !!rt.bold,\n italic: !!a?.italic || !!rt.italic,\n underline: !!a?.underline || !!rt.underline,\n strikethrough: !!a?.strikethrough || !!rt.strikethrough,\n code: !!a?.code || !!rt.code,\n color: a?.color ?? rt.color,\n highlight: a?.highlight ?? rt.highlight,\n }\n : undefined;\n const href = rt.href ?? rt.text?.link?.url;\n const mention = mentionOfSegment(rt);\n return {\n content: String(rt.plainText ?? content),\n ...(annotations ? { annotations } : {}),\n ...(href ? { href } : {}),\n ...(mention ? { mention } : {}),\n };\n }),\n );\n}\n\n/** The web's ten colours (Default = no colour). */\nexport const NOTION_COLORS: Array<{ value: string; label: string }> = [\n { value: '', label: 'Default' },\n { value: 'gray', label: 'Gray' },\n { value: 'brown', label: 'Brown' },\n { value: 'orange', label: 'Orange' },\n { value: 'yellow', label: 'Yellow' },\n { value: 'green', label: 'Green' },\n { value: 'blue', label: 'Blue' },\n { value: 'purple', label: 'Purple' },\n { value: 'pink', label: 'Pink' },\n { value: 'red', label: 'Red' },\n];\n\nconst TEXT_TONE: Record<string, { light: string; dark: string }> = {\n gray: { light: '#787774', dark: '#9b9b9b' },\n brown: { light: '#9f6b53', dark: '#ba856f' },\n orange: { light: '#d9730d', dark: '#c77d48' },\n yellow: { light: '#cb912f', dark: '#ca9849' },\n green: { light: '#448361', dark: '#529e72' },\n blue: { light: '#337ea9', dark: '#379ad3' },\n purple: { light: '#9065b0', dark: '#9d68d3' },\n pink: { light: '#c14c8a', dark: '#d15796' },\n red: { light: '#d44c47', dark: '#e65b58' },\n};\n\nconst WASH_TONE: Record<string, { light: string; dark: string }> = {\n gray: { light: '#f1f1ef', dark: 'rgba(155,155,155,0.18)' },\n brown: { light: '#f4eeee', dark: 'rgba(186,133,111,0.18)' },\n orange: { light: '#fbecdd', dark: 'rgba(199,125,72,0.2)' },\n yellow: { light: '#fbf3db', dark: 'rgba(202,152,73,0.2)' },\n green: { light: '#edf3ec', dark: 'rgba(82,158,114,0.2)' },\n blue: { light: '#e7f3f8', dark: 'rgba(55,154,211,0.2)' },\n purple: { light: '#f6f3f9', dark: 'rgba(157,104,211,0.2)' },\n pink: { light: '#faf1f5', dark: 'rgba(209,87,150,0.2)' },\n red: { light: '#fdebec', dark: 'rgba(230,91,88,0.2)' },\n};\n\nexport function textColorOf(key: unknown, isDark: boolean): string | undefined {\n const t = typeof key === 'string' ? TEXT_TONE[key] : undefined;\n return t ? (isDark ? t.dark : t.light) : undefined;\n}\n\nexport function washColorOf(key: unknown, isDark: boolean): string | undefined {\n const t = typeof key === 'string' ? WASH_TONE[key] : undefined;\n return t ? (isDark ? t.dark : t.light) : undefined;\n}\n\n/** A block's `properties.color` split into text / background colour keys. */\nexport function blockColorParts(value: unknown): { text?: string; background?: string } {\n if (typeof value !== 'string' || !value) return {};\n if (value.endsWith('_background')) return { background: value.replace(/_background$/, '') };\n return { text: value };\n}\n\nexport type { RichRun };\n"],"names":[],"mappings":"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"}