@agent-native/core 0.103.0 → 0.104.0

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 (572) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +36 -0
  3. package/corpus/core/package.json +9 -2
  4. package/corpus/core/src/agent/engine/credential-errors.ts +2 -2
  5. package/corpus/core/src/agent/production-agent.ts +30 -0
  6. package/corpus/core/src/agent/run-store.ts +12 -2
  7. package/corpus/core/src/cli/create.ts +1 -0
  8. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +30 -11
  9. package/corpus/core/src/cli/templates-meta.ts +4 -3
  10. package/corpus/core/src/client/AgentAskPopover.tsx +89 -0
  11. package/corpus/core/src/client/AgentChatHome.tsx +4 -0
  12. package/corpus/core/src/client/AgentPanel.tsx +321 -223
  13. package/corpus/core/src/client/AssistantChat.tsx +6 -10
  14. package/corpus/core/src/client/MultiTabAssistantChat.tsx +53 -372
  15. package/corpus/core/src/client/agent-chat-adapter.ts +13 -1
  16. package/corpus/core/src/client/agent-page/AgentContextTab.tsx +133 -149
  17. package/corpus/core/src/client/agent-page/AgentEmptyState.tsx +44 -0
  18. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +153 -82
  19. package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +39 -0
  20. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +368 -356
  21. package/corpus/core/src/client/agent-page/types.ts +1 -1
  22. package/corpus/core/src/client/analytics.ts +51 -5
  23. package/corpus/core/src/client/chat/run-recovery.tsx +12 -4
  24. package/corpus/core/src/client/composer/PromptComposer.tsx +5 -15
  25. package/corpus/core/src/client/composer/TiptapComposer.tsx +32 -3
  26. package/corpus/core/src/client/dynamic-suggestions.ts +3 -3
  27. package/corpus/core/src/client/index.ts +16 -1
  28. package/corpus/core/src/client/resources/ResourceTree.tsx +249 -38
  29. package/corpus/core/src/client/resources/ResourcesPanel.tsx +307 -140
  30. package/corpus/core/src/client/session-replay.ts +158 -5
  31. package/corpus/core/src/client/settings/AutomationsSection.tsx +30 -10
  32. package/corpus/core/src/client/settings/SettingsPanel.tsx +3 -2
  33. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +2 -0
  34. package/corpus/core/src/client/settings/agent-settings-search.ts +2 -2
  35. package/corpus/core/src/client/use-chat-threads.ts +2 -0
  36. package/corpus/core/src/connections/catalog.ts +49 -7
  37. package/corpus/core/src/db/index.ts +6 -1
  38. package/corpus/core/src/extensions/actions.ts +106 -16
  39. package/corpus/core/src/extensions/content-patch.ts +22 -0
  40. package/corpus/core/src/extensions/routes.ts +18 -0
  41. package/corpus/core/src/extensions/store.ts +8 -0
  42. package/corpus/core/src/index.ts +3 -0
  43. package/corpus/core/src/ingestion/docx.ts +158 -0
  44. package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
  45. package/corpus/core/src/ingestion/figma.ts +548 -0
  46. package/corpus/core/src/ingestion/index.ts +107 -0
  47. package/corpus/core/src/ingestion/media.ts +264 -0
  48. package/corpus/core/src/ingestion/notion.ts +121 -0
  49. package/corpus/core/src/ingestion/office.ts +214 -0
  50. package/corpus/core/src/ingestion/orchestration.ts +160 -0
  51. package/corpus/core/src/ingestion/pptx.ts +333 -0
  52. package/corpus/core/src/ingestion/selection.ts +81 -0
  53. package/corpus/core/src/ingestion/website.ts +151 -0
  54. package/corpus/core/src/integrations/plugin.ts +45 -37
  55. package/corpus/core/src/localization/default-messages.ts +35 -12
  56. package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
  57. package/corpus/core/src/observability/traces.ts +5 -3
  58. package/corpus/core/src/provider-api/index.ts +452 -8
  59. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
  60. package/corpus/core/src/search-utils/index.ts +112 -0
  61. package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
  62. package/corpus/core/src/server/action-discovery.ts +33 -8
  63. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  64. package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
  65. package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
  66. package/corpus/core/src/server/core-routes-plugin.ts +12 -0
  67. package/corpus/core/src/server/index.ts +30 -0
  68. package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
  69. package/corpus/core/src/styles/agent-native.css +9 -0
  70. package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
  71. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  72. package/corpus/core/src/templates/workspace-root/.env.example +12 -0
  73. package/corpus/core/src/vite/client.ts +2 -0
  74. package/corpus/core/src/workspace-connections/index.ts +6 -0
  75. package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
  76. package/corpus/core/src/workspace-connections/store.ts +16 -0
  77. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
  78. package/corpus/templates/analytics/AGENTS.md +9 -0
  79. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
  80. package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
  81. package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
  82. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
  83. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
  84. package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
  85. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
  86. package/corpus/templates/analytics/app/i18n-data.ts +3 -3
  87. package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
  88. package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
  89. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
  91. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
  92. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
  93. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
  98. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
  99. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
  100. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
  101. package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
  102. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  103. package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
  104. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
  105. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
  106. package/corpus/templates/assets/AGENTS.md +10 -0
  107. package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
  108. package/corpus/templates/assets/actions/edit-image.ts +2 -0
  109. package/corpus/templates/assets/actions/generate-asset.ts +52 -0
  110. package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
  111. package/corpus/templates/assets/actions/generate-image.ts +219 -1
  112. package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
  113. package/corpus/templates/assets/actions/refine-image.ts +3 -0
  114. package/corpus/templates/assets/actions/restyle-image.ts +2 -0
  115. package/corpus/templates/assets/agent-native.app-skill.json +4 -0
  116. package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
  117. package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
  118. package/corpus/templates/assets/app/i18n-data.ts +29 -13
  119. package/corpus/templates/assets/app/routes/agent.tsx +7 -1
  120. package/corpus/templates/assets/app/routes/library.tsx +9 -0
  121. package/corpus/templates/assets/app/routes/settings.tsx +3 -0
  122. package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
  123. package/corpus/templates/assets/package.json +1 -0
  124. package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
  125. package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
  126. package/corpus/templates/brain/app/i18n-data.ts +3 -3
  127. package/corpus/templates/brain/app/lib/brain.ts +1 -1
  128. package/corpus/templates/brain/server/lib/search.ts +17 -67
  129. package/corpus/templates/calendar/app/i18n-data.ts +3 -3
  130. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
  131. package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
  132. package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
  133. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
  134. package/corpus/templates/clips/AGENTS.md +4 -0
  135. package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
  136. package/corpus/templates/clips/actions/create-meeting.ts +6 -2
  137. package/corpus/templates/clips/actions/create-organization.ts +3 -2
  138. package/corpus/templates/clips/actions/create-recording.ts +4 -1
  139. package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
  140. package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
  141. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
  142. package/corpus/templates/clips/actions/list-meetings.ts +23 -5
  143. package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
  144. package/corpus/templates/clips/actions/remove-silences.ts +10 -1
  145. package/corpus/templates/clips/actions/request-transcript.ts +53 -11
  146. package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
  147. package/corpus/templates/clips/actions/search-recordings.ts +5 -8
  148. package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
  149. package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
  150. package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
  151. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
  152. package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
  153. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
  154. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
  155. package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
  156. package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
  157. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
  158. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  159. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  160. package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
  161. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  162. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  163. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  164. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  165. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  166. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  167. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
  168. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
  169. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
  170. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
  171. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
  172. package/corpus/templates/clips/app/routes/record.tsx +23 -2
  173. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
  174. package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
  176. package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
  177. package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  178. package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
  180. package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
  181. package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
  182. package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
  183. package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
  184. package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
  185. package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
  186. package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
  187. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  188. package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
  189. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
  190. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
  191. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
  192. package/corpus/templates/clips/desktop/src/app.tsx +66 -28
  193. package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
  194. package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
  195. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
  196. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
  197. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
  198. package/corpus/templates/clips/desktop/src/styles.css +13 -11
  199. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
  200. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
  201. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
  202. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
  203. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
  204. package/corpus/templates/clips/server/db/schema.ts +2 -2
  205. package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
  206. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
  207. package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
  208. package/corpus/templates/clips/server/lib/recordings.ts +40 -1
  209. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  210. package/corpus/templates/clips/server/plugins/db.ts +2 -2
  211. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
  212. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
  213. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
  214. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
  215. package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
  216. package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
  217. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
  218. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
  219. package/corpus/templates/content/AGENTS.md +9 -0
  220. package/corpus/templates/content/actions/create-document.ts +94 -0
  221. package/corpus/templates/content/actions/edit-document.ts +144 -4
  222. package/corpus/templates/content/actions/update-document.ts +138 -0
  223. package/corpus/templates/content/agent-native.app-skill.json +4 -0
  224. package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
  225. package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
  226. package/corpus/templates/content/app/i18n-data.ts +13 -4
  227. package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
  228. package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
  229. package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
  230. package/corpus/templates/content/package.json +1 -0
  231. package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
  232. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
  233. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
  234. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
  235. package/corpus/templates/design/AGENTS.md +6 -0
  236. package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
  237. package/corpus/templates/design/actions/edit-design.ts +128 -0
  238. package/corpus/templates/design/actions/generate-design.ts +278 -14
  239. package/corpus/templates/design/actions/generate-screens.ts +42 -1
  240. package/corpus/templates/design/agent-native.app-skill.json +4 -0
  241. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
  242. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  243. package/corpus/templates/design/app/i18n-data.ts +10 -4
  244. package/corpus/templates/design/app/routes/agent.tsx +2 -1
  245. package/corpus/templates/design/app/routes/settings.tsx +3 -0
  246. package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
  247. package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  248. package/corpus/templates/design/package.json +1 -0
  249. package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
  250. package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
  251. package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
  252. package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
  253. package/corpus/templates/design/shared/generation-session.ts +7 -0
  254. package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
  255. package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
  256. package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
  257. package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
  258. package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
  259. package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
  260. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
  261. package/corpus/templates/plan/AGENTS.md +21 -1
  262. package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
  263. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
  264. package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
  265. package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
  266. package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
  267. package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
  268. package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
  269. package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
  270. package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
  271. package/corpus/templates/plan/server/plan-mdx.ts +75 -2
  272. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
  273. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
  274. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
  275. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
  276. package/corpus/templates/slides/AGENTS.md +6 -0
  277. package/corpus/templates/slides/actions/add-slide.ts +230 -14
  278. package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
  279. package/corpus/templates/slides/actions/create-deck.ts +130 -0
  280. package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
  281. package/corpus/templates/slides/actions/import-file.ts +5 -4
  282. package/corpus/templates/slides/actions/patch-deck.ts +200 -10
  283. package/corpus/templates/slides/actions/update-slide.ts +208 -15
  284. package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
  285. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
  286. package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
  287. package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
  288. package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
  289. package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
  290. package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
  291. package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
  292. package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
  293. package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
  294. package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
  295. package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
  296. package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
  297. package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
  298. package/corpus/templates/slides/app/routes/agent.tsx +7 -1
  299. package/corpus/templates/slides/app/routes/settings.tsx +3 -0
  300. package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
  301. package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
  302. package/corpus/templates/slides/package.json +1 -0
  303. package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
  304. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
  305. package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
  306. package/dist/agent/engine/credential-errors.d.ts +1 -1
  307. package/dist/agent/engine/credential-errors.d.ts.map +1 -1
  308. package/dist/agent/engine/credential-errors.js +2 -2
  309. package/dist/agent/engine/credential-errors.js.map +1 -1
  310. package/dist/agent/production-agent.d.ts.map +1 -1
  311. package/dist/agent/production-agent.js +25 -0
  312. package/dist/agent/production-agent.js.map +1 -1
  313. package/dist/agent/run-store.d.ts.map +1 -1
  314. package/dist/agent/run-store.js +12 -2
  315. package/dist/agent/run-store.js.map +1 -1
  316. package/dist/cli/create.d.ts.map +1 -1
  317. package/dist/cli/create.js +1 -0
  318. package/dist/cli/create.js.map +1 -1
  319. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  320. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  321. package/dist/cli/skills-content/visual-plan-skill.js +30 -11
  322. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  323. package/dist/cli/templates-meta.d.ts.map +1 -1
  324. package/dist/cli/templates-meta.js +4 -3
  325. package/dist/cli/templates-meta.js.map +1 -1
  326. package/dist/client/AgentAskPopover.d.ts +11 -0
  327. package/dist/client/AgentAskPopover.d.ts.map +1 -0
  328. package/dist/client/AgentAskPopover.js +30 -0
  329. package/dist/client/AgentAskPopover.js.map +1 -0
  330. package/dist/client/AgentChatHome.d.ts +1 -1
  331. package/dist/client/AgentChatHome.d.ts.map +1 -1
  332. package/dist/client/AgentChatHome.js +2 -2
  333. package/dist/client/AgentChatHome.js.map +1 -1
  334. package/dist/client/AgentPanel.d.ts +9 -19
  335. package/dist/client/AgentPanel.d.ts.map +1 -1
  336. package/dist/client/AgentPanel.js +119 -80
  337. package/dist/client/AgentPanel.js.map +1 -1
  338. package/dist/client/AssistantChat.d.ts.map +1 -1
  339. package/dist/client/AssistantChat.js +4 -4
  340. package/dist/client/AssistantChat.js.map +1 -1
  341. package/dist/client/MultiTabAssistantChat.d.ts +3 -9
  342. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  343. package/dist/client/MultiTabAssistantChat.js +49 -189
  344. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  345. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  346. package/dist/client/agent-chat-adapter.js +12 -1
  347. package/dist/client/agent-chat-adapter.js.map +1 -1
  348. package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
  349. package/dist/client/agent-page/AgentContextTab.js +26 -28
  350. package/dist/client/agent-page/AgentContextTab.js.map +1 -1
  351. package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
  352. package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
  353. package/dist/client/agent-page/AgentEmptyState.js +6 -0
  354. package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
  355. package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
  356. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  357. package/dist/client/agent-page/AgentJobsTab.js +90 -58
  358. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  359. package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
  360. package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
  361. package/dist/client/agent-page/AgentTabFrame.js +7 -0
  362. package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
  363. package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
  364. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  365. package/dist/client/agent-page/AgentTabsPage.js +135 -99
  366. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  367. package/dist/client/agent-page/types.d.ts +1 -1
  368. package/dist/client/agent-page/types.d.ts.map +1 -1
  369. package/dist/client/agent-page/types.js.map +1 -1
  370. package/dist/client/analytics.d.ts +10 -3
  371. package/dist/client/analytics.d.ts.map +1 -1
  372. package/dist/client/analytics.js +37 -2
  373. package/dist/client/analytics.js.map +1 -1
  374. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  375. package/dist/client/chat/run-recovery.js +10 -3
  376. package/dist/client/chat/run-recovery.js.map +1 -1
  377. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  378. package/dist/client/composer/PromptComposer.js +2 -2
  379. package/dist/client/composer/PromptComposer.js.map +1 -1
  380. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  381. package/dist/client/composer/TiptapComposer.js +15 -3
  382. package/dist/client/composer/TiptapComposer.js.map +1 -1
  383. package/dist/client/dynamic-suggestions.js +3 -3
  384. package/dist/client/dynamic-suggestions.js.map +1 -1
  385. package/dist/client/index.d.ts +4 -3
  386. package/dist/client/index.d.ts.map +1 -1
  387. package/dist/client/index.js +3 -2
  388. package/dist/client/index.js.map +1 -1
  389. package/dist/client/resources/ResourceTree.d.ts +5 -1
  390. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  391. package/dist/client/resources/ResourceTree.js +74 -5
  392. package/dist/client/resources/ResourceTree.js.map +1 -1
  393. package/dist/client/resources/ResourcesPanel.d.ts +11 -2
  394. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  395. package/dist/client/resources/ResourcesPanel.js +105 -31
  396. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  397. package/dist/client/session-replay.d.ts +28 -0
  398. package/dist/client/session-replay.d.ts.map +1 -1
  399. package/dist/client/session-replay.js +122 -8
  400. package/dist/client/session-replay.js.map +1 -1
  401. package/dist/client/settings/AutomationsSection.d.ts +3 -1
  402. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  403. package/dist/client/settings/AutomationsSection.js +16 -6
  404. package/dist/client/settings/AutomationsSection.js.map +1 -1
  405. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  406. package/dist/client/settings/SettingsPanel.js +3 -3
  407. package/dist/client/settings/SettingsPanel.js.map +1 -1
  408. package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
  409. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  410. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  411. package/dist/client/settings/agent-settings-search.js +2 -2
  412. package/dist/client/settings/agent-settings-search.js.map +1 -1
  413. package/dist/client/use-chat-threads.d.ts +2 -0
  414. package/dist/client/use-chat-threads.d.ts.map +1 -1
  415. package/dist/client/use-chat-threads.js.map +1 -1
  416. package/dist/collab/awareness.d.ts +2 -2
  417. package/dist/collab/awareness.d.ts.map +1 -1
  418. package/dist/collab/routes.d.ts +1 -1
  419. package/dist/connections/catalog.d.ts +41 -7
  420. package/dist/connections/catalog.d.ts.map +1 -1
  421. package/dist/connections/catalog.js +40 -7
  422. package/dist/connections/catalog.js.map +1 -1
  423. package/dist/db/index.d.ts +2 -2
  424. package/dist/db/index.d.ts.map +1 -1
  425. package/dist/db/index.js +2 -2
  426. package/dist/db/index.js.map +1 -1
  427. package/dist/extensions/actions.d.ts.map +1 -1
  428. package/dist/extensions/actions.js +85 -15
  429. package/dist/extensions/actions.js.map +1 -1
  430. package/dist/extensions/content-patch.d.ts +4 -0
  431. package/dist/extensions/content-patch.d.ts.map +1 -1
  432. package/dist/extensions/content-patch.js +18 -0
  433. package/dist/extensions/content-patch.js.map +1 -1
  434. package/dist/extensions/routes.d.ts.map +1 -1
  435. package/dist/extensions/routes.js +14 -0
  436. package/dist/extensions/routes.js.map +1 -1
  437. package/dist/extensions/store.d.ts +1 -0
  438. package/dist/extensions/store.d.ts.map +1 -1
  439. package/dist/extensions/store.js +4 -1
  440. package/dist/extensions/store.js.map +1 -1
  441. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  442. package/dist/index.d.ts +1 -1
  443. package/dist/index.d.ts.map +1 -1
  444. package/dist/index.js +1 -1
  445. package/dist/index.js.map +1 -1
  446. package/dist/ingestion/docx.d.ts +16 -0
  447. package/dist/ingestion/docx.d.ts.map +1 -0
  448. package/dist/ingestion/docx.js +129 -0
  449. package/dist/ingestion/docx.js.map +1 -0
  450. package/dist/ingestion/figma-node-to-html.d.ts +304 -0
  451. package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
  452. package/dist/ingestion/figma-node-to-html.js +1292 -0
  453. package/dist/ingestion/figma-node-to-html.js.map +1 -0
  454. package/dist/ingestion/figma.d.ts +115 -0
  455. package/dist/ingestion/figma.d.ts.map +1 -0
  456. package/dist/ingestion/figma.js +399 -0
  457. package/dist/ingestion/figma.js.map +1 -0
  458. package/dist/ingestion/index.d.ts +11 -0
  459. package/dist/ingestion/index.d.ts.map +1 -0
  460. package/dist/ingestion/index.js +11 -0
  461. package/dist/ingestion/index.js.map +1 -0
  462. package/dist/ingestion/media.d.ts +36 -0
  463. package/dist/ingestion/media.d.ts.map +1 -0
  464. package/dist/ingestion/media.js +178 -0
  465. package/dist/ingestion/media.js.map +1 -0
  466. package/dist/ingestion/notion.d.ts +12 -0
  467. package/dist/ingestion/notion.d.ts.map +1 -0
  468. package/dist/ingestion/notion.js +104 -0
  469. package/dist/ingestion/notion.js.map +1 -0
  470. package/dist/ingestion/office.d.ts +45 -0
  471. package/dist/ingestion/office.d.ts.map +1 -0
  472. package/dist/ingestion/office.js +141 -0
  473. package/dist/ingestion/office.js.map +1 -0
  474. package/dist/ingestion/orchestration.d.ts +52 -0
  475. package/dist/ingestion/orchestration.d.ts.map +1 -0
  476. package/dist/ingestion/orchestration.js +89 -0
  477. package/dist/ingestion/orchestration.js.map +1 -0
  478. package/dist/ingestion/pptx.d.ts +28 -0
  479. package/dist/ingestion/pptx.d.ts.map +1 -0
  480. package/dist/ingestion/pptx.js +255 -0
  481. package/dist/ingestion/pptx.js.map +1 -0
  482. package/dist/ingestion/selection.d.ts +20 -0
  483. package/dist/ingestion/selection.d.ts.map +1 -0
  484. package/dist/ingestion/selection.js +52 -0
  485. package/dist/ingestion/selection.js.map +1 -0
  486. package/dist/ingestion/website.d.ts +27 -0
  487. package/dist/ingestion/website.d.ts.map +1 -0
  488. package/dist/ingestion/website.js +100 -0
  489. package/dist/ingestion/website.js.map +1 -0
  490. package/dist/integrations/plugin.d.ts.map +1 -1
  491. package/dist/integrations/plugin.js +32 -27
  492. package/dist/integrations/plugin.js.map +1 -1
  493. package/dist/localization/default-messages.d.ts +22 -0
  494. package/dist/localization/default-messages.d.ts.map +1 -1
  495. package/dist/localization/default-messages.js +31 -9
  496. package/dist/localization/default-messages.js.map +1 -1
  497. package/dist/observability/hosted-model-experiment.d.ts +39 -0
  498. package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
  499. package/dist/observability/hosted-model-experiment.js +90 -0
  500. package/dist/observability/hosted-model-experiment.js.map +1 -0
  501. package/dist/observability/routes.d.ts +5 -5
  502. package/dist/observability/traces.d.ts.map +1 -1
  503. package/dist/observability/traces.js +5 -3
  504. package/dist/observability/traces.js.map +1 -1
  505. package/dist/progress/routes.d.ts +1 -1
  506. package/dist/provider-api/index.d.ts +35 -4
  507. package/dist/provider-api/index.d.ts.map +1 -1
  508. package/dist/provider-api/index.js +339 -8
  509. package/dist/provider-api/index.js.map +1 -1
  510. package/dist/resources/handlers.d.ts +1 -1
  511. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  512. package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
  513. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  514. package/dist/search-utils/index.d.ts +12 -0
  515. package/dist/search-utils/index.d.ts.map +1 -0
  516. package/dist/search-utils/index.js +95 -0
  517. package/dist/search-utils/index.js.map +1 -0
  518. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  519. package/dist/secrets/register-framework-secrets.js +57 -0
  520. package/dist/secrets/register-framework-secrets.js.map +1 -1
  521. package/dist/secrets/routes.d.ts +9 -9
  522. package/dist/server/action-discovery.d.ts +8 -0
  523. package/dist/server/action-discovery.d.ts.map +1 -1
  524. package/dist/server/action-discovery.js +26 -9
  525. package/dist/server/action-discovery.js.map +1 -1
  526. package/dist/server/agent-chat/framework-prompts.js +2 -2
  527. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  528. package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
  529. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
  530. package/dist/server/agent-chat/prompt-resources.js +95 -0
  531. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  532. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  533. package/dist/server/agent-chat-plugin.js +7 -0
  534. package/dist/server/agent-chat-plugin.js.map +1 -1
  535. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  536. package/dist/server/core-routes-plugin.js +5 -0
  537. package/dist/server/core-routes-plugin.js.map +1 -1
  538. package/dist/server/index.d.ts +5 -1
  539. package/dist/server/index.d.ts.map +1 -1
  540. package/dist/server/index.js +5 -1
  541. package/dist/server/index.js.map +1 -1
  542. package/dist/server/workspace-provider-oauth.d.ts +48 -0
  543. package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
  544. package/dist/server/workspace-provider-oauth.js +415 -0
  545. package/dist/server/workspace-provider-oauth.js.map +1 -0
  546. package/dist/styles/agent-native.css +9 -0
  547. package/dist/templates/chat/app/i18n/en-US.ts +3 -3
  548. package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
  549. package/dist/templates/default/app/i18n/en-US.ts +3 -3
  550. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  551. package/dist/templates/workspace-root/.env.example +12 -0
  552. package/dist/vite/client.d.ts.map +1 -1
  553. package/dist/vite/client.js +2 -0
  554. package/dist/vite/client.js.map +1 -1
  555. package/dist/workspace-connections/index.d.ts +1 -0
  556. package/dist/workspace-connections/index.d.ts.map +1 -1
  557. package/dist/workspace-connections/index.js +1 -0
  558. package/dist/workspace-connections/index.js.map +1 -1
  559. package/dist/workspace-connections/lifecycle.d.ts +16 -0
  560. package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
  561. package/dist/workspace-connections/lifecycle.js +14 -0
  562. package/dist/workspace-connections/lifecycle.js.map +1 -0
  563. package/dist/workspace-connections/store.d.ts.map +1 -1
  564. package/dist/workspace-connections/store.js +16 -0
  565. package/dist/workspace-connections/store.js.map +1 -1
  566. package/package.json +10 -3
  567. package/src/templates/chat/app/i18n/en-US.ts +3 -3
  568. package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
  569. package/src/templates/chat/app/lib/agent-page.tsx +10 -1
  570. package/src/templates/default/app/i18n/en-US.ts +3 -3
  571. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  572. package/src/templates/workspace-root/.env.example +12 -0
@@ -0,0 +1,548 @@
1
+ export interface FigmaRgba {
2
+ r: number;
3
+ g: number;
4
+ b: number;
5
+ a?: number;
6
+ }
7
+
8
+ export interface FigmaFrameSummary {
9
+ id: string;
10
+ name: string;
11
+ type: string;
12
+ text: string[];
13
+ colors: string[];
14
+ typography: Array<{
15
+ family?: string;
16
+ size?: number;
17
+ weight?: number;
18
+ lineHeight?: number;
19
+ }>;
20
+ spacing: number[];
21
+ radii: number[];
22
+ }
23
+
24
+ export interface FigmaContextNode {
25
+ id: string;
26
+ name: string;
27
+ type: string;
28
+ box?: { x: number; y: number; width: number; height: number };
29
+ text?: {
30
+ characters: string;
31
+ truncated: boolean;
32
+ fontFamily?: string;
33
+ fontWeight?: number;
34
+ fontSize?: number;
35
+ lineHeightPx?: number;
36
+ lineHeightPercent?: number;
37
+ letterSpacing?: number;
38
+ textAlignHorizontal?: string;
39
+ textCase?: string;
40
+ textDecoration?: string;
41
+ };
42
+ fills?: Array<{
43
+ type: string;
44
+ color?: string;
45
+ opacity?: number;
46
+ angleDeg?: number;
47
+ stops?: Array<{ position: number; color: string }>;
48
+ imageRef?: string;
49
+ scaleMode?: string;
50
+ }>;
51
+ opacity?: number;
52
+ blendMode?: string;
53
+ rotation?: number;
54
+ isMask?: boolean;
55
+ strokes?: {
56
+ paints: NonNullable<FigmaContextNode["fills"]>;
57
+ weight?: number;
58
+ align?: string;
59
+ };
60
+ cornerRadius?: number | [number, number, number, number];
61
+ effects?: Array<{
62
+ type: string;
63
+ color?: string;
64
+ offset?: { x: number; y: number };
65
+ radius?: number;
66
+ spread?: number;
67
+ }>;
68
+ layout?: {
69
+ mode: string;
70
+ primaryAxisAlignItems?: string;
71
+ counterAxisAlignItems?: string;
72
+ itemSpacing?: number;
73
+ wrap?: string;
74
+ padding: { top: number; right: number; bottom: number; left: number };
75
+ sizingHorizontal?: string;
76
+ sizingVertical?: string;
77
+ };
78
+ componentId?: string;
79
+ isComponent?: boolean;
80
+ isInstance?: boolean;
81
+ styles?: Record<string, string>;
82
+ children?: FigmaContextNode[];
83
+ childCount?: number;
84
+ truncatedChildren?: boolean;
85
+ truncatedDepth?: boolean;
86
+ }
87
+
88
+ export interface SummarizeFigmaNodeResult {
89
+ node: FigmaContextNode;
90
+ nodeCount: number;
91
+ truncated: boolean;
92
+ }
93
+
94
+ export function summarizeFigmaNode(
95
+ value: unknown,
96
+ options: { maxDepth?: number; maxNodes?: number } = {},
97
+ ): SummarizeFigmaNodeResult {
98
+ const root = asRecord(value);
99
+ if (!root) throw new Error("Figma node must be an object.");
100
+ const maxDepth = options.maxDepth ?? 4;
101
+ const maxNodes = options.maxNodes ?? 300;
102
+ let nodeCount = 0;
103
+ let truncated = false;
104
+ const build = (
105
+ node: Record<string, unknown>,
106
+ depth: number,
107
+ ): FigmaContextNode => {
108
+ nodeCount++;
109
+ const bounding = asRecord(node.absoluteBoundingBox);
110
+ const box = bounding
111
+ ? {
112
+ x: round(numberValue(bounding.x) ?? 0),
113
+ y: round(numberValue(bounding.y) ?? 0),
114
+ width: round(numberValue(bounding.width) ?? 0),
115
+ height: round(numberValue(bounding.height) ?? 0),
116
+ }
117
+ : undefined;
118
+ const fills = array(node.fills).flatMap((paint) => {
119
+ const described = describeFigmaPaint(asRecord(paint), box);
120
+ return described ? [described] : [];
121
+ });
122
+ const strokePaints = array(node.strokes).flatMap((paint) => {
123
+ const described = describeFigmaPaint(asRecord(paint), box);
124
+ return described ? [described] : [];
125
+ });
126
+ const effects = array(node.effects).flatMap((effect) => {
127
+ const described = describeFigmaEffect(asRecord(effect));
128
+ return described ? [described] : [];
129
+ });
130
+ const characters =
131
+ typeof node.characters === "string" ? node.characters : undefined;
132
+ const style = asRecord(node.style);
133
+ const children = array(node.children).flatMap((child) => {
134
+ const record = asRecord(child);
135
+ return record?.visible === false || !record ? [] : [record];
136
+ });
137
+ const summary: FigmaContextNode = {
138
+ id: stringValue(node.id) ?? "",
139
+ name: stringValue(node.name) ?? stringValue(node.type) ?? "Untitled",
140
+ type: stringValue(node.type) ?? "UNKNOWN",
141
+ box,
142
+ opacity:
143
+ numberValue(node.opacity) !== undefined &&
144
+ numberValue(node.opacity)! < 1
145
+ ? round(numberValue(node.opacity)!, 2)
146
+ : undefined,
147
+ blendMode:
148
+ stringValue(node.blendMode) &&
149
+ node.blendMode !== "NORMAL" &&
150
+ node.blendMode !== "PASS_THROUGH"
151
+ ? String(node.blendMode)
152
+ : undefined,
153
+ rotation: numberValue(node.rotation)
154
+ ? round(numberValue(node.rotation)!, 2)
155
+ : undefined,
156
+ isMask: node.isMask === true ? true : undefined,
157
+ ...(characters !== undefined
158
+ ? {
159
+ text: {
160
+ characters:
161
+ characters.length > 500
162
+ ? `${characters.slice(0, 500)}…`
163
+ : characters,
164
+ truncated: characters.length > 500,
165
+ fontFamily: stringValue(style?.fontFamily),
166
+ fontWeight: numberValue(style?.fontWeight),
167
+ fontSize: numberValue(style?.fontSize),
168
+ lineHeightPx: numberValue(style?.lineHeightPx),
169
+ lineHeightPercent: numberValue(style?.lineHeightPercent),
170
+ letterSpacing: numberValue(style?.letterSpacing),
171
+ textAlignHorizontal: stringValue(style?.textAlignHorizontal),
172
+ textCase:
173
+ stringValue(style?.textCase) && style?.textCase !== "ORIGINAL"
174
+ ? String(style?.textCase)
175
+ : undefined,
176
+ textDecoration:
177
+ stringValue(style?.textDecoration) &&
178
+ style?.textDecoration !== "NONE"
179
+ ? String(style?.textDecoration)
180
+ : undefined,
181
+ },
182
+ }
183
+ : {}),
184
+ ...(fills.length ? { fills } : {}),
185
+ ...(strokePaints.length
186
+ ? {
187
+ strokes: {
188
+ paints: strokePaints,
189
+ weight: numberValue(node.strokeWeight),
190
+ align: stringValue(node.strokeAlign),
191
+ },
192
+ }
193
+ : {}),
194
+ cornerRadius: figmaCornerRadius(node),
195
+ ...(effects.length ? { effects } : {}),
196
+ ...(node.layoutMode && node.layoutMode !== "NONE"
197
+ ? {
198
+ layout: {
199
+ mode: String(node.layoutMode),
200
+ primaryAxisAlignItems: stringValue(node.primaryAxisAlignItems),
201
+ counterAxisAlignItems: stringValue(node.counterAxisAlignItems),
202
+ itemSpacing: numberValue(node.itemSpacing),
203
+ wrap: stringValue(node.layoutWrap),
204
+ padding: {
205
+ top: numberValue(node.paddingTop) ?? 0,
206
+ right: numberValue(node.paddingRight) ?? 0,
207
+ bottom: numberValue(node.paddingBottom) ?? 0,
208
+ left: numberValue(node.paddingLeft) ?? 0,
209
+ },
210
+ sizingHorizontal: stringValue(node.layoutSizingHorizontal),
211
+ sizingVertical: stringValue(node.layoutSizingVertical),
212
+ },
213
+ }
214
+ : {}),
215
+ componentId: stringValue(node.componentId),
216
+ isComponent: node.type === "COMPONENT" ? true : undefined,
217
+ isInstance: node.type === "INSTANCE" ? true : undefined,
218
+ styles: stringRecord(node.styles),
219
+ };
220
+ if (!children.length) return summary;
221
+ if (depth >= maxDepth) {
222
+ summary.childCount = children.length;
223
+ summary.truncatedDepth = true;
224
+ truncated = true;
225
+ return summary;
226
+ }
227
+ const built: FigmaContextNode[] = [];
228
+ for (const child of children) {
229
+ if (nodeCount >= maxNodes) {
230
+ summary.childCount = children.length - built.length;
231
+ summary.truncatedChildren = true;
232
+ truncated = true;
233
+ break;
234
+ }
235
+ built.push(build(child, depth + 1));
236
+ }
237
+ summary.children = built;
238
+ return summary;
239
+ };
240
+ return { node: build(root, 0), nodeCount, truncated };
241
+ }
242
+
243
+ export function extractFigmaTopLevelFrames(
244
+ value: unknown,
245
+ ): Record<string, unknown>[] {
246
+ const document = asRecord(value);
247
+ const pages = array(document?.children);
248
+ const frames = pages
249
+ .flatMap((page) => array(asRecord(page)?.children))
250
+ .flatMap((child) => {
251
+ const record = asRecord(child);
252
+ return record ? [record] : [];
253
+ });
254
+ return frames.length > 0 ? frames : document ? [document] : [];
255
+ }
256
+
257
+ export function summarizeFigmaFrame(value: unknown): FigmaFrameSummary {
258
+ const frame = asRecord(value) ?? {};
259
+ const text = new Set<string>();
260
+ const colors = new Set<string>();
261
+ const typography = new Map<string, FigmaFrameSummary["typography"][number]>();
262
+ const spacing = new Set<number>();
263
+ const radii = new Set<number>();
264
+ visitFigmaNode(frame, { text, colors, typography, spacing, radii });
265
+ return {
266
+ id: stringValue(frame.id) ?? "",
267
+ name: stringValue(frame.name) ?? "Untitled frame",
268
+ type: stringValue(frame.type) ?? "UNKNOWN",
269
+ text: [...text],
270
+ colors: [...colors],
271
+ typography: [...typography.values()],
272
+ spacing: [...spacing].sort(numberSort),
273
+ radii: [...radii].sort(numberSort),
274
+ };
275
+ }
276
+
277
+ export function figmaColorToHex(color: FigmaRgba, opacity = 1): string {
278
+ const alpha = clamp(color.a ?? 1) * clamp(opacity);
279
+ const channels = [color.r, color.g, color.b].map((channel) =>
280
+ Math.round(clamp(channel) * 255)
281
+ .toString(16)
282
+ .padStart(2, "0"),
283
+ );
284
+ return `#${channels.join("")}${
285
+ alpha < 1
286
+ ? Math.round(alpha * 255)
287
+ .toString(16)
288
+ .padStart(2, "0")
289
+ : ""
290
+ }`.toUpperCase();
291
+ }
292
+
293
+ export function compositeFigmaColors(
294
+ foreground: FigmaRgba,
295
+ background: FigmaRgba,
296
+ ): Required<FigmaRgba> {
297
+ const foregroundAlpha = clamp(foreground.a ?? 1);
298
+ const backgroundAlpha = clamp(background.a ?? 1);
299
+ const alpha = foregroundAlpha + backgroundAlpha * (1 - foregroundAlpha);
300
+ if (alpha === 0) return { r: 0, g: 0, b: 0, a: 0 };
301
+ return {
302
+ r:
303
+ (clamp(foreground.r) * foregroundAlpha +
304
+ clamp(background.r) * backgroundAlpha * (1 - foregroundAlpha)) /
305
+ alpha,
306
+ g:
307
+ (clamp(foreground.g) * foregroundAlpha +
308
+ clamp(background.g) * backgroundAlpha * (1 - foregroundAlpha)) /
309
+ alpha,
310
+ b:
311
+ (clamp(foreground.b) * foregroundAlpha +
312
+ clamp(background.b) * backgroundAlpha * (1 - foregroundAlpha)) /
313
+ alpha,
314
+ a: alpha,
315
+ };
316
+ }
317
+
318
+ export function figmaContrastRatio(a: FigmaRgba, b: FigmaRgba): number {
319
+ const light = Math.max(relativeLuminance(a), relativeLuminance(b));
320
+ const dark = Math.min(relativeLuminance(a), relativeLuminance(b));
321
+ return (light + 0.05) / (dark + 0.05);
322
+ }
323
+
324
+ function visitFigmaNode(
325
+ node: Record<string, unknown>,
326
+ output: {
327
+ text: Set<string>;
328
+ colors: Set<string>;
329
+ typography: Map<string, FigmaFrameSummary["typography"][number]>;
330
+ spacing: Set<number>;
331
+ radii: Set<number>;
332
+ },
333
+ ): void {
334
+ const characters = stringValue(node.characters);
335
+ if (characters) output.text.add(characters);
336
+ for (const collection of [node.fills, node.strokes, node.background]) {
337
+ for (const value of array(collection)) {
338
+ const paint = asRecord(value);
339
+ const color = asColor(paint?.color);
340
+ if (color && paint?.visible !== false) {
341
+ output.colors.add(
342
+ figmaColorToHex(color, numberValue(paint?.opacity) ?? 1),
343
+ );
344
+ }
345
+ }
346
+ }
347
+ const style = asRecord(node.style);
348
+ if (style) {
349
+ const typography = {
350
+ family: stringValue(style.fontFamily),
351
+ size: numberValue(style.fontSize),
352
+ weight: numberValue(style.fontWeight),
353
+ lineHeight: numberValue(style.lineHeightPx),
354
+ };
355
+ if (Object.values(typography).some((value) => value !== undefined)) {
356
+ output.typography.set(JSON.stringify(typography), typography);
357
+ }
358
+ }
359
+ for (const key of [
360
+ "itemSpacing",
361
+ "paddingLeft",
362
+ "paddingRight",
363
+ "paddingTop",
364
+ "paddingBottom",
365
+ ]) {
366
+ const value = numberValue(node[key]);
367
+ if (value !== undefined) output.spacing.add(value);
368
+ }
369
+ for (const value of [
370
+ node.cornerRadius,
371
+ ...array(node.rectangleCornerRadii),
372
+ ]) {
373
+ const radius = numberValue(value);
374
+ if (radius !== undefined) output.radii.add(radius);
375
+ }
376
+ for (const child of array(node.children)) {
377
+ const record = asRecord(child);
378
+ if (record) visitFigmaNode(record, output);
379
+ }
380
+ }
381
+
382
+ function relativeLuminance(color: FigmaRgba): number {
383
+ const channels = [color.r, color.g, color.b].map((channel) => {
384
+ const value = clamp(channel);
385
+ return value <= 0.03928 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;
386
+ });
387
+ return 0.2126 * channels[0] + 0.7152 * channels[1] + 0.0722 * channels[2];
388
+ }
389
+
390
+ function describeFigmaPaint(
391
+ paint: Record<string, unknown> | null,
392
+ box: { width: number; height: number } | undefined,
393
+ ): NonNullable<FigmaContextNode["fills"]>[number] | null {
394
+ if (!paint || paint.visible === false) return null;
395
+ const type = stringValue(paint.type) ?? "UNKNOWN";
396
+ const opacity = numberValue(paint.opacity);
397
+ if (type === "SOLID") {
398
+ const color = asColor(paint.color);
399
+ return {
400
+ type: "solid",
401
+ ...(color ? { color: figmaColorToHex(color) } : {}),
402
+ ...(opacity !== undefined && opacity < 1
403
+ ? { opacity: round(opacity, 2) }
404
+ : {}),
405
+ };
406
+ }
407
+ if (type.startsWith("GRADIENT_")) {
408
+ const handles = array(paint.gradientHandlePositions)
409
+ .map(asRecord)
410
+ .filter(Boolean) as Record<string, unknown>[];
411
+ const figmaAngle =
412
+ handles.length >= 2
413
+ ? Math.atan2(
414
+ ((numberValue(handles[1].y) ?? 0) -
415
+ (numberValue(handles[0].y) ?? 0)) *
416
+ (box?.height ?? 1),
417
+ ((numberValue(handles[1].x) ?? 0) -
418
+ (numberValue(handles[0].x) ?? 0)) *
419
+ (box?.width ?? 1),
420
+ ) *
421
+ (180 / Math.PI)
422
+ : undefined;
423
+ const angle =
424
+ figmaAngle === undefined
425
+ ? undefined
426
+ : (((figmaAngle + 90) % 360) + 360) % 360;
427
+ return {
428
+ type: `${type.replace("GRADIENT_", "").toLowerCase()}-gradient`,
429
+ ...(opacity !== undefined && opacity < 1
430
+ ? { opacity: round(opacity, 2) }
431
+ : {}),
432
+ ...(angle !== undefined ? { angleDeg: round(angle) } : {}),
433
+ stops: array(paint.gradientStops).flatMap((value) => {
434
+ const stop = asRecord(value);
435
+ const color = asColor(stop?.color);
436
+ return color
437
+ ? [
438
+ {
439
+ position: round(numberValue(stop?.position) ?? 0, 3),
440
+ color: figmaColorToHex(color),
441
+ },
442
+ ]
443
+ : [];
444
+ }),
445
+ };
446
+ }
447
+ return {
448
+ type: type.toLowerCase(),
449
+ ...(opacity !== undefined && opacity < 1
450
+ ? { opacity: round(opacity, 2) }
451
+ : {}),
452
+ ...(stringValue(paint.imageRef)
453
+ ? { imageRef: stringValue(paint.imageRef) }
454
+ : {}),
455
+ ...(stringValue(paint.scaleMode)
456
+ ? { scaleMode: stringValue(paint.scaleMode) }
457
+ : {}),
458
+ };
459
+ }
460
+
461
+ function describeFigmaEffect(
462
+ effect: Record<string, unknown> | null,
463
+ ): NonNullable<FigmaContextNode["effects"]>[number] | null {
464
+ if (!effect || effect.visible === false) return null;
465
+ const offset = asRecord(effect.offset);
466
+ const color = asColor(effect.color);
467
+ return {
468
+ type: (stringValue(effect.type) ?? "unknown")
469
+ .toLowerCase()
470
+ .replace(/_/g, "-"),
471
+ ...(color ? { color: figmaColorToHex(color) } : {}),
472
+ ...(offset
473
+ ? {
474
+ offset: {
475
+ x: round(numberValue(offset.x) ?? 0),
476
+ y: round(numberValue(offset.y) ?? 0),
477
+ },
478
+ }
479
+ : {}),
480
+ ...(numberValue(effect.radius) !== undefined
481
+ ? { radius: round(numberValue(effect.radius)!) }
482
+ : {}),
483
+ ...(numberValue(effect.spread) !== undefined
484
+ ? { spread: round(numberValue(effect.spread)!) }
485
+ : {}),
486
+ };
487
+ }
488
+
489
+ function figmaCornerRadius(
490
+ node: Record<string, unknown>,
491
+ ): FigmaContextNode["cornerRadius"] {
492
+ const corners = array(node.rectangleCornerRadii).map(numberValue);
493
+ if (corners.length === 4 && corners.every((value) => value !== undefined)) {
494
+ return corners as [number, number, number, number];
495
+ }
496
+ return numberValue(node.cornerRadius);
497
+ }
498
+
499
+ function asColor(value: unknown): FigmaRgba | null {
500
+ const record = asRecord(value);
501
+ const r = numberValue(record?.r);
502
+ const g = numberValue(record?.g);
503
+ const b = numberValue(record?.b);
504
+ if (r === undefined || g === undefined || b === undefined) return null;
505
+ return { r, g, b, a: numberValue(record?.a) };
506
+ }
507
+
508
+ function asRecord(value: unknown): Record<string, unknown> | null {
509
+ return value && typeof value === "object" && !Array.isArray(value)
510
+ ? (value as Record<string, unknown>)
511
+ : null;
512
+ }
513
+
514
+ function array(value: unknown): unknown[] {
515
+ return Array.isArray(value) ? value : [];
516
+ }
517
+
518
+ function stringValue(value: unknown): string | undefined {
519
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
520
+ }
521
+
522
+ function numberValue(value: unknown): number | undefined {
523
+ return typeof value === "number" && Number.isFinite(value)
524
+ ? value
525
+ : undefined;
526
+ }
527
+
528
+ function clamp(value: number): number {
529
+ return Math.max(0, Math.min(1, value));
530
+ }
531
+
532
+ function numberSort(a: number, b: number): number {
533
+ return a - b;
534
+ }
535
+
536
+ function round(value: number, decimals = 1): number {
537
+ const factor = 10 ** decimals;
538
+ return Math.round(value * factor) / factor;
539
+ }
540
+
541
+ function stringRecord(value: unknown): Record<string, string> | undefined {
542
+ const record = asRecord(value);
543
+ if (!record) return undefined;
544
+ const entries = Object.entries(record).filter(
545
+ (entry): entry is [string, string] => typeof entry[1] === "string",
546
+ );
547
+ return entries.length ? Object.fromEntries(entries) : undefined;
548
+ }
@@ -0,0 +1,107 @@
1
+ export {
2
+ acquireIngestionLease,
3
+ assertInventoryComplete,
4
+ consumeIngestionBudget,
5
+ createIngestionBudgetState,
6
+ createIngestionCheckpoint,
7
+ ingestionBudgetStopReason,
8
+ releaseIngestionLease,
9
+ renewIngestionLease,
10
+ type AcquireIngestionLeaseInput,
11
+ type AcquireIngestionLeaseResult,
12
+ type IngestionBudgetLimits,
13
+ type IngestionBudgetState,
14
+ type IngestionBudgetStopReason,
15
+ type IngestionCheckpoint,
16
+ type IngestionLease,
17
+ type IngestionPhase,
18
+ } from "./orchestration.js";
19
+ export {
20
+ detectOfficeDocumentType,
21
+ normalizeDocumentText,
22
+ parseOfficeDocument,
23
+ type OfficeDocumentAst,
24
+ type OfficeDocumentParser,
25
+ type OfficeDocumentPart,
26
+ type OfficeDocumentType,
27
+ type ParsedOfficeDocument,
28
+ type ParseOfficeDocumentInput,
29
+ } from "./office.js";
30
+ export {
31
+ parsePptxPresentation,
32
+ type ParsedPptxImage,
33
+ type ParsedPptxPresentation,
34
+ type ParsedPptxSlide,
35
+ type ParsedPptxTextRun,
36
+ } from "./pptx.js";
37
+ export {
38
+ extractDocxSections,
39
+ parseDocxDocument,
40
+ sanitizeInertDocumentHtml,
41
+ type ParsedDocxDocument,
42
+ type ParsedDocxSection,
43
+ } from "./docx.js";
44
+ export {
45
+ compositeFigmaColors,
46
+ extractFigmaTopLevelFrames,
47
+ figmaColorToHex,
48
+ figmaContrastRatio,
49
+ summarizeFigmaFrame,
50
+ summarizeFigmaNode,
51
+ type FigmaContextNode,
52
+ type FigmaFrameSummary,
53
+ type FigmaRgba,
54
+ type SummarizeFigmaNodeResult,
55
+ } from "./figma.js";
56
+ export {
57
+ assertFigmaNodeTreeComplexity,
58
+ collectFallbackNodeIds,
59
+ collectFontUsage,
60
+ collectImageFillRefs,
61
+ gradientAngleDegrees,
62
+ mapFigmaNodeToHtml,
63
+ type FidelityEntry,
64
+ type FidelityLevel,
65
+ type FidelityReport,
66
+ type FigmaBoundingBox,
67
+ type FigmaColor,
68
+ type FigmaColorStop,
69
+ type FigmaEffect,
70
+ type FigmaFontUsage,
71
+ type FigmaImageFilter,
72
+ type FigmaIndividualStrokeWeights,
73
+ type FigmaNode,
74
+ type FigmaPaint,
75
+ type FigmaTypeStyle,
76
+ type MapFigmaNodeOptions,
77
+ type MapFigmaNodeResult,
78
+ } from "./figma-node-to-html.js";
79
+ export {
80
+ notionBlocksToMarkdown,
81
+ notionBlockToMarkdown,
82
+ type NotionMarkdownResult,
83
+ type NotionMarkdownSection,
84
+ } from "./notion.js";
85
+ export {
86
+ compareRasterImages,
87
+ cropImageRegion,
88
+ extractCssColors,
89
+ extractDominantColors,
90
+ fingerprintMedia,
91
+ rankColorSamples,
92
+ readBoundedResponseBytes,
93
+ type CroppedImageRegion,
94
+ type MediaFingerprint,
95
+ } from "./media.js";
96
+ export {
97
+ extractStaticWebsiteContext,
98
+ type WebsiteAsset,
99
+ type WebsiteDesignTokens,
100
+ type WebsiteExtraction,
101
+ } from "./website.js";
102
+ export {
103
+ selectInventoryForHydration,
104
+ type IngestionHydrationPolicy,
105
+ type IngestionHydrationSelection,
106
+ type IngestionInventoryCandidate,
107
+ } from "./selection.js";