@agent-native/core 0.102.1 → 0.103.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 (295) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +15 -0
  3. package/corpus/core/docs/content/local-file-mode.mdx +99 -489
  4. package/corpus/core/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
  5. package/corpus/core/docs/content/locales/ar-SA/template-content.mdx +10 -24
  6. package/corpus/core/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
  7. package/corpus/core/docs/content/locales/de-DE/template-content.mdx +10 -24
  8. package/corpus/core/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
  9. package/corpus/core/docs/content/locales/es-ES/template-content.mdx +10 -24
  10. package/corpus/core/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
  11. package/corpus/core/docs/content/locales/fr-FR/template-content.mdx +10 -24
  12. package/corpus/core/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
  13. package/corpus/core/docs/content/locales/hi-IN/template-content.mdx +10 -24
  14. package/corpus/core/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
  15. package/corpus/core/docs/content/locales/ja-JP/template-content.mdx +10 -24
  16. package/corpus/core/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
  17. package/corpus/core/docs/content/locales/ko-KR/template-content.mdx +10 -24
  18. package/corpus/core/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
  19. package/corpus/core/docs/content/locales/pt-BR/template-content.mdx +10 -24
  20. package/corpus/core/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
  21. package/corpus/core/docs/content/locales/zh-CN/template-content.mdx +9 -24
  22. package/corpus/core/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
  23. package/corpus/core/docs/content/locales/zh-TW/template-content.mdx +9 -24
  24. package/corpus/core/docs/content/template-content.mdx +26 -42
  25. package/corpus/core/package.json +1 -1
  26. package/corpus/core/src/cli/content-local.ts +86 -18
  27. package/corpus/core/src/cli/index.ts +2 -2
  28. package/corpus/core/src/cli/skills-content/content-skill.ts +36 -25
  29. package/corpus/core/src/cli/skills.ts +47 -13
  30. package/corpus/core/src/client/AgentPanel.tsx +7 -0
  31. package/corpus/core/src/client/AssistantChat.tsx +7 -0
  32. package/corpus/core/src/client/agent-chat-adapter.ts +7 -1
  33. package/corpus/core/src/client/chat/message-components.tsx +17 -3
  34. package/corpus/core/src/client/composer/ComposerPlusMenu.tsx +96 -6
  35. package/corpus/core/src/client/composer/asset-picker-url.ts +80 -0
  36. package/corpus/core/src/client/error-format.ts +24 -0
  37. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +8 -1
  38. package/corpus/core/src/local-artifacts/index.ts +65 -0
  39. package/corpus/templates/assets/app/components/library/GenerationPresetsPanel.tsx +325 -0
  40. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +12 -0
  41. package/corpus/templates/assets/app/i18n/zh-TW.ts +21 -0
  42. package/corpus/templates/assets/app/i18n-data.ts +215 -0
  43. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +19 -479
  44. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1 -1
  45. package/corpus/templates/assets/app/routes/brand-kits.$id_.settings.tsx +446 -0
  46. package/corpus/templates/assets/app/routes/library.tsx +69 -0
  47. package/corpus/templates/assets/changelog/2026-07-15-fixed-top-level-image-picker-selections-returning-to-the-com.md +6 -0
  48. package/corpus/templates/clips/actions/disconnect-calendar.ts +57 -9
  49. package/corpus/templates/clips/actions/generate-workflow.ts +102 -59
  50. package/corpus/templates/clips/actions/get-recording-player-data.ts +64 -1
  51. package/corpus/templates/clips/actions/regenerate-summary.ts +7 -0
  52. package/corpus/templates/clips/actions/regenerate-title.ts +29 -11
  53. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +34 -13
  54. package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +87 -9
  55. package/corpus/templates/clips/app/components/editor/trim-handles.tsx +15 -0
  56. package/corpus/templates/clips/app/components/editor/waveform.tsx +21 -8
  57. package/corpus/templates/clips/app/components/library/folder-tree.tsx +52 -0
  58. package/corpus/templates/clips/app/components/player/settings-panel.tsx +116 -58
  59. package/corpus/templates/clips/app/components/player/share-dialog.tsx +43 -37
  60. package/corpus/templates/clips/app/components/player/video-player.tsx +50 -2
  61. package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +22 -3
  62. package/corpus/templates/clips/app/i18n/ar-SA.ts +5 -2
  63. package/corpus/templates/clips/app/i18n/de-DE.ts +6 -2
  64. package/corpus/templates/clips/app/i18n/en-US.ts +5 -2
  65. package/corpus/templates/clips/app/i18n/es-ES.ts +6 -2
  66. package/corpus/templates/clips/app/i18n/fr-FR.ts +5 -2
  67. package/corpus/templates/clips/app/i18n/hi-IN.ts +5 -2
  68. package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -1
  69. package/corpus/templates/clips/app/i18n/ko-KR.ts +5 -2
  70. package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -2
  71. package/corpus/templates/clips/app/i18n/zh-CN.ts +5 -2
  72. package/corpus/templates/clips/app/i18n/zh-TW.ts +5 -2
  73. package/corpus/templates/clips/app/lib/timestamp-mapping.ts +14 -0
  74. package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -2
  75. package/corpus/templates/clips/app/routes/_index.tsx +1 -2
  76. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +98 -32
  77. package/corpus/templates/clips/app/routes/share.$shareId.tsx +4 -1
  78. package/corpus/templates/clips/changelog/2026-07-15-ai-workflow-generation-now-stays-visible-avoids-duplicate-re.md +6 -0
  79. package/corpus/templates/clips/changelog/2026-07-15-clip-playback-and-cta-controls-remain-interactive-through-ed.md +6 -0
  80. package/corpus/templates/clips/changelog/2026-07-15-clip-titles-no-longer-describe-the-product-as-a-loom-alterna.md +6 -0
  81. package/corpus/templates/clips/changelog/2026-07-15-description-regeneration-now-opens-the-agent-chat-so-progres.md +6 -0
  82. package/corpus/templates/clips/changelog/2026-07-15-direct-recording-urls-now-respect-share-link-and-password-ac.md +6 -0
  83. package/corpus/templates/clips/changelog/2026-07-15-disconnecting-a-calendar-now-clears-unrecorded-synced-meetin.md +6 -0
  84. package/corpus/templates/clips/changelog/2026-07-15-folders-now-expose-rename-and-delete-actions-directly-in-the.md +6 -0
  85. package/corpus/templates/clips/changelog/2026-07-15-recording-pages-now-explain-sign-in-access-and-avoid-showing.md +6 -0
  86. package/corpus/templates/clips/changelog/2026-07-15-the-clips-extension-quick-actions-toolbar-can-be-moved-out-o.md +6 -0
  87. package/corpus/templates/clips/changelog/2026-07-15-the-editor-now-skips-cut-sections-during-preview-and-keeps-t.md +6 -0
  88. package/corpus/templates/clips/changelog/2026-07-15-thumbnail-capture-now-updates-previews-while-scrubbing-and-l.md +6 -0
  89. package/corpus/templates/clips/changelog/2026-07-15-windows-permission-links-open-the-matching-settings-page.md +6 -0
  90. package/corpus/templates/clips/chrome-extension/src/content-script.ts +117 -2
  91. package/corpus/templates/clips/chrome-extension/src/overlay.ts +27 -0
  92. package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
  93. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +139 -101
  94. package/corpus/templates/clips/server/lib/recording-page-access.ts +35 -0
  95. package/corpus/templates/clips/server/lib/share-password.ts +6 -3
  96. package/corpus/templates/content/.agents/skills/content/SKILL.md +26 -39
  97. package/corpus/templates/content/AGENTS.md +25 -30
  98. package/corpus/templates/content/actions/_builder-docs-client.ts +23 -0
  99. package/corpus/templates/content/actions/_content-database-source-adapters.ts +21 -3
  100. package/corpus/templates/content/actions/_content-files.ts +338 -0
  101. package/corpus/templates/content/actions/_content-space-access.ts +135 -0
  102. package/corpus/templates/content/actions/_content-spaces.ts +640 -0
  103. package/corpus/templates/content/actions/_database-source-utils.ts +90 -7
  104. package/corpus/templates/content/actions/_database-utils.ts +7 -1
  105. package/corpus/templates/content/actions/_local-file-documents.ts +0 -9
  106. package/corpus/templates/content/actions/_local-folder-source.ts +53 -0
  107. package/corpus/templates/content/actions/_property-utils.ts +9 -4
  108. package/corpus/templates/content/actions/add-database-item.ts +108 -65
  109. package/corpus/templates/content/actions/backfill-content-files.ts +22 -0
  110. package/corpus/templates/content/actions/connect-local-folder-source.ts +221 -0
  111. package/corpus/templates/content/actions/create-content-database.ts +129 -3
  112. package/corpus/templates/content/actions/create-document.ts +65 -55
  113. package/corpus/templates/content/actions/create-inline-content-database.ts +6 -1
  114. package/corpus/templates/content/actions/delete-content-database.ts +3 -0
  115. package/corpus/templates/content/actions/delete-document.ts +7 -11
  116. package/corpus/templates/content/actions/disconnect-local-folder-source.ts +175 -0
  117. package/corpus/templates/content/actions/duplicate-database-item.ts +10 -0
  118. package/corpus/templates/content/actions/duplicate-database-items.ts +13 -0
  119. package/corpus/templates/content/actions/edit-document.ts +2 -28
  120. package/corpus/templates/content/actions/ensure-content-spaces.ts +26 -0
  121. package/corpus/templates/content/actions/export-content-source.ts +47 -9
  122. package/corpus/templates/content/actions/get-document.ts +0 -14
  123. package/corpus/templates/content/actions/import-content-source.ts +43 -3
  124. package/corpus/templates/content/actions/list-content-spaces.ts +103 -0
  125. package/corpus/templates/content/actions/list-documents.ts +12 -9
  126. package/corpus/templates/content/actions/move-document.ts +3 -14
  127. package/corpus/templates/content/actions/pull-document.ts +0 -23
  128. package/corpus/templates/content/actions/remove-local-file-source.ts +50 -29
  129. package/corpus/templates/content/actions/resolve-local-folder-conflict.ts +442 -0
  130. package/corpus/templates/content/actions/reveal-local-source-file.ts +6 -17
  131. package/corpus/templates/content/actions/search-documents.ts +0 -34
  132. package/corpus/templates/content/actions/share-local-file-document.ts +25 -1
  133. package/corpus/templates/content/actions/submit-content-database-form.ts +12 -0
  134. package/corpus/templates/content/actions/sync-local-folder-source.ts +731 -0
  135. package/corpus/templates/content/actions/sync-manifest-local-folder-source.ts +123 -0
  136. package/corpus/templates/content/actions/update-content-database-view.ts +10 -1
  137. package/corpus/templates/content/actions/update-document.ts +0 -15
  138. package/corpus/templates/content/actions/view-screen.ts +2 -50
  139. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +76 -62
  140. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +70 -22
  141. package/corpus/templates/content/app/components/editor/database/grouping.ts +2 -1
  142. package/corpus/templates/content/app/components/editor/database/settings.tsx +23 -20
  143. package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
  144. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +330 -0
  145. package/corpus/templates/content/app/components/editor/database/types.ts +1 -0
  146. package/corpus/templates/content/app/components/editor/database/view-config.ts +3 -1
  147. package/corpus/templates/content/app/components/layout/Layout.tsx +25 -1
  148. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +209 -113
  149. package/corpus/templates/content/app/components/sidebar/select-content-space.ts +31 -0
  150. package/corpus/templates/content/app/hooks/use-content-database.ts +16 -0
  151. package/corpus/templates/content/app/hooks/use-content-spaces.ts +39 -0
  152. package/corpus/templates/content/app/i18n/zh-TW.ts +11 -0
  153. package/corpus/templates/content/app/i18n-data.ts +75 -0
  154. package/corpus/templates/content/app/routes/_app.local-files.tsx +174 -65
  155. package/corpus/templates/content/changelog/2026-07-16-content-callouts-can-now-be-reviewed-and-published-to-builder.md +6 -0
  156. package/corpus/templates/content/changelog/2026-07-16-heading-5-and-heading-6-are-available-from-the-editor-slash-.md +6 -0
  157. package/corpus/templates/content/changelog/2026-07-16-organize-every-workspace-through-a-customizable-files-databa.md +6 -0
  158. package/corpus/templates/content/parity/matrix.md +2 -1
  159. package/corpus/templates/content/parity/matrix.ts +37 -1
  160. package/corpus/templates/content/scripts/dev-database.mjs +7 -5
  161. package/corpus/templates/content/server/db/schema.ts +113 -40
  162. package/corpus/templates/content/server/lib/document-context.ts +15 -1
  163. package/corpus/templates/content/server/lib/notion-sync.ts +6 -0
  164. package/corpus/templates/content/server/plugins/db.ts +153 -0
  165. package/corpus/templates/content/shared/api.ts +17 -3
  166. package/corpus/templates/content/shared/builder-mdx.ts +163 -16
  167. package/corpus/templates/design/.agents/skills/design-templates/SKILL.md +59 -0
  168. package/corpus/templates/design/AGENTS.md +6 -1
  169. package/corpus/templates/design/actions/create-design-from-template.ts +19 -7
  170. package/corpus/templates/design/actions/list-design-templates.ts +69 -21
  171. package/corpus/templates/design/actions/navigate.ts +2 -2
  172. package/corpus/templates/design/actions/view-screen.ts +15 -2
  173. package/corpus/templates/design/agent-native.app-skill.json +5 -0
  174. package/corpus/templates/design/app/components/design/design-canvas/external-preview.ts +7 -3
  175. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +281 -56
  176. package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +14 -2
  177. package/corpus/templates/design/app/hooks/use-navigation-state.ts +3 -2
  178. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -3
  179. package/corpus/templates/design/app/i18n-data.ts +21 -2
  180. package/corpus/templates/design/app/i18n-template-feature.ts +218 -10
  181. package/corpus/templates/design/app/pages/Index.tsx +195 -24
  182. package/corpus/templates/design/app/pages/Templates.tsx +144 -55
  183. package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +12 -1
  184. package/corpus/templates/design/changelog/2026-07-14-templates-now-appear-in-the-new-design-picker-with-previews-.md +6 -0
  185. package/corpus/templates/design/changelog/2026-07-15-prototype-print-and-download-buttons-now-work-in-preview.md +6 -0
  186. package/corpus/templates/design/changelog/2026-07-15-templates-now-open-immediately-after-copying-even-while-the-.md +6 -0
  187. package/corpus/templates/design/server/plugins/agent-chat.ts +1 -1
  188. package/corpus/templates/mail/AGENTS.md +23 -18
  189. package/corpus/templates/mail/actions/bulk-archive.ts +32 -28
  190. package/corpus/templates/mail/actions/mark-read.ts +131 -20
  191. package/corpus/templates/mail/actions/mark-thread-read.ts +1 -1
  192. package/corpus/templates/mail/actions/move-email.ts +30 -24
  193. package/corpus/templates/mail/actions/send-email.ts +73 -68
  194. package/corpus/templates/mail/changelog/2026-07-15-unread-inbox-cleanup-now-completes-reliably.md +6 -0
  195. package/corpus/templates/mail/server/handlers/emails.ts +218 -209
  196. package/corpus/templates/mail/server/lib/bulk-mark-read.ts +30 -0
  197. package/corpus/templates/mail/server/lib/email-state.ts +198 -113
  198. package/corpus/templates/mail/server/lib/google-auth.ts +218 -25
  199. package/corpus/templates/mail/server/lib/jobs.ts +69 -74
  200. package/corpus/templates/mail/server/lib/local-email-store.ts +265 -0
  201. package/corpus/templates/mail/server/plugins/agent-chat.ts +6 -0
  202. package/corpus/templates/slides/actions/extract-pdf.ts +1 -1
  203. package/corpus/templates/slides/actions/import-file.ts +4 -1
  204. package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +1 -1
  205. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +9 -12
  206. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +29 -21
  207. package/corpus/templates/slides/app/i18n/ar-SA.ts +1 -0
  208. package/corpus/templates/slides/app/i18n/de-DE.ts +1 -0
  209. package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
  210. package/corpus/templates/slides/app/i18n/es-ES.ts +1 -0
  211. package/corpus/templates/slides/app/i18n/fr-FR.ts +1 -0
  212. package/corpus/templates/slides/app/i18n/hi-IN.ts +1 -0
  213. package/corpus/templates/slides/app/i18n/ja-JP.ts +1 -0
  214. package/corpus/templates/slides/app/i18n/ko-KR.ts +1 -0
  215. package/corpus/templates/slides/app/i18n/pt-BR.ts +1 -0
  216. package/corpus/templates/slides/app/i18n/zh-CN.ts +1 -0
  217. package/corpus/templates/slides/app/i18n/zh-TW.ts +1 -0
  218. package/corpus/templates/slides/changelog/2026-07-15-image-search-and-generation-controls-now-use-the-registered-.md +6 -0
  219. package/corpus/templates/slides/changelog/2026-07-15-pdf-deck-references-can-be-imported-for-slide-inspiration-ag.md +6 -0
  220. package/corpus/templates/slides/changelog/2026-07-15-stable-style-inspector-dock.md +6 -0
  221. package/dist/cli/content-local.d.ts +1 -0
  222. package/dist/cli/content-local.d.ts.map +1 -1
  223. package/dist/cli/content-local.js +75 -17
  224. package/dist/cli/content-local.js.map +1 -1
  225. package/dist/cli/index.js +2 -2
  226. package/dist/cli/index.js.map +1 -1
  227. package/dist/cli/skills-content/content-skill.d.ts +1 -1
  228. package/dist/cli/skills-content/content-skill.d.ts.map +1 -1
  229. package/dist/cli/skills-content/content-skill.js +36 -25
  230. package/dist/cli/skills-content/content-skill.js.map +1 -1
  231. package/dist/cli/skills.d.ts.map +1 -1
  232. package/dist/cli/skills.js +47 -14
  233. package/dist/cli/skills.js.map +1 -1
  234. package/dist/client/AgentPanel.d.ts.map +1 -1
  235. package/dist/client/AgentPanel.js +5 -0
  236. package/dist/client/AgentPanel.js.map +1 -1
  237. package/dist/client/AssistantChat.d.ts.map +1 -1
  238. package/dist/client/AssistantChat.js +7 -0
  239. package/dist/client/AssistantChat.js.map +1 -1
  240. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  241. package/dist/client/agent-chat-adapter.js +8 -1
  242. package/dist/client/agent-chat-adapter.js.map +1 -1
  243. package/dist/client/chat/message-components.d.ts +4 -0
  244. package/dist/client/chat/message-components.d.ts.map +1 -1
  245. package/dist/client/chat/message-components.js +10 -3
  246. package/dist/client/chat/message-components.js.map +1 -1
  247. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  248. package/dist/client/composer/ComposerPlusMenu.js +58 -6
  249. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  250. package/dist/client/composer/asset-picker-url.d.ts +16 -0
  251. package/dist/client/composer/asset-picker-url.d.ts.map +1 -0
  252. package/dist/client/composer/asset-picker-url.js +64 -0
  253. package/dist/client/composer/asset-picker-url.js.map +1 -0
  254. package/dist/client/error-format.d.ts.map +1 -1
  255. package/dist/client/error-format.js +17 -0
  256. package/dist/client/error-format.js.map +1 -1
  257. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  258. package/dist/client/resources/McpIntegrationDialog.js +6 -1
  259. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  260. package/dist/collab/awareness.d.ts +2 -2
  261. package/dist/collab/awareness.d.ts.map +1 -1
  262. package/dist/collab/struct-routes.d.ts +1 -1
  263. package/dist/local-artifacts/index.d.ts +10 -0
  264. package/dist/local-artifacts/index.d.ts.map +1 -1
  265. package/dist/local-artifacts/index.js +39 -0
  266. package/dist/local-artifacts/index.js.map +1 -1
  267. package/dist/notifications/routes.d.ts +1 -1
  268. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  269. package/dist/resources/handlers.d.ts +3 -3
  270. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  271. package/dist/server/transcribe-voice.d.ts +1 -1
  272. package/docs/content/local-file-mode.mdx +99 -489
  273. package/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
  274. package/docs/content/locales/ar-SA/template-content.mdx +10 -24
  275. package/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
  276. package/docs/content/locales/de-DE/template-content.mdx +10 -24
  277. package/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
  278. package/docs/content/locales/es-ES/template-content.mdx +10 -24
  279. package/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
  280. package/docs/content/locales/fr-FR/template-content.mdx +10 -24
  281. package/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
  282. package/docs/content/locales/hi-IN/template-content.mdx +10 -24
  283. package/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
  284. package/docs/content/locales/ja-JP/template-content.mdx +10 -24
  285. package/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
  286. package/docs/content/locales/ko-KR/template-content.mdx +10 -24
  287. package/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
  288. package/docs/content/locales/pt-BR/template-content.mdx +10 -24
  289. package/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
  290. package/docs/content/locales/zh-CN/template-content.mdx +9 -24
  291. package/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
  292. package/docs/content/locales/zh-TW/template-content.mdx +9 -24
  293. package/docs/content/template-content.mdx +26 -42
  294. package/package.json +1 -1
  295. package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +0 -126
@@ -0,0 +1,265 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+
3
+ import { getDbExec, isPostgres } from "@agent-native/core/db";
4
+ import {
5
+ getSettingsEmitter,
6
+ getUserSetting,
7
+ type StoreWriteOptions,
8
+ } from "@agent-native/core/settings";
9
+ import type { EmailMessage } from "@shared/types.js";
10
+ import { nanoid } from "nanoid";
11
+
12
+ const localEmailMutationLocks = new Map<string, Promise<unknown>>();
13
+ const LOCK_SETTING_KEY = "local-emails-mutation-lock";
14
+ const LOCK_LEASE_MS = 60_000;
15
+ const LOCK_ACQUIRE_TIMEOUT_MS = 10_000;
16
+ const LOCK_RETRY_MS = 25;
17
+ const LOCK_RELEASE_ATTEMPTS = 3;
18
+ const MAX_MUTATION_ATTEMPTS = 8;
19
+
20
+ interface LocalEmailMutationContext {
21
+ ownerKey: string;
22
+ expectedMailboxRaw?: string | null;
23
+ }
24
+
25
+ class LocalEmailWriteConflict extends Error {}
26
+
27
+ const localEmailMutationContext =
28
+ new AsyncLocalStorage<LocalEmailMutationContext>();
29
+
30
+ interface LocalEmailLease {
31
+ token: string;
32
+ expiresAt: number;
33
+ }
34
+
35
+ function settingsTable(): string {
36
+ return isPostgres() ? "public.settings" : "settings";
37
+ }
38
+
39
+ function lockStorageKey(ownerEmail: string): string {
40
+ return `u:${ownerEmail.toLowerCase()}:${LOCK_SETTING_KEY}`;
41
+ }
42
+
43
+ function mailboxStorageKey(ownerEmail: string): string {
44
+ return `u:${ownerEmail}:local-emails`;
45
+ }
46
+
47
+ function parseLease(raw: string | null): LocalEmailLease | null {
48
+ if (!raw) return null;
49
+ try {
50
+ const parsed = JSON.parse(raw) as Partial<LocalEmailLease>;
51
+ if (
52
+ typeof parsed.token === "string" &&
53
+ typeof parsed.expiresAt === "number"
54
+ ) {
55
+ return { token: parsed.token, expiresAt: parsed.expiresAt };
56
+ }
57
+ } catch {}
58
+ return null;
59
+ }
60
+
61
+ async function readLeaseRow(
62
+ ownerEmail: string,
63
+ ): Promise<{ raw: string | null; lease: LocalEmailLease | null }> {
64
+ // Initialize the framework-owned settings table, then bypass the request
65
+ // settings cache so every lease attempt sees the latest committed owner row.
66
+ await getUserSetting(ownerEmail, LOCK_SETTING_KEY);
67
+ const { rows } = await getDbExec().execute({
68
+ sql: `SELECT value FROM ${settingsTable()} WHERE key = ?`,
69
+ args: [lockStorageKey(ownerEmail)],
70
+ });
71
+ const raw = rows.length ? String(rows[0].value ?? rows[0][0]) : null;
72
+ return { raw, lease: parseLease(raw) };
73
+ }
74
+
75
+ async function compareAndSwapLease(
76
+ ownerEmail: string,
77
+ expectedRaw: string | null,
78
+ nextRaw: string,
79
+ ): Promise<boolean> {
80
+ const client = getDbExec();
81
+ const key = lockStorageKey(ownerEmail);
82
+ if (expectedRaw === null) {
83
+ const result = await client.execute({
84
+ sql: isPostgres()
85
+ ? `INSERT INTO ${settingsTable()} (key, value, updated_at) VALUES (?, ?, ?) ON CONFLICT (key) DO NOTHING`
86
+ : `INSERT OR IGNORE INTO ${settingsTable()} (key, value, updated_at) VALUES (?, ?, ?)`,
87
+ args: [key, nextRaw, Date.now()],
88
+ });
89
+ return result.rowsAffected === 1;
90
+ }
91
+ const result = await client.execute({
92
+ sql: `UPDATE ${settingsTable()} SET value = ?, updated_at = ? WHERE key = ? AND value = ?`,
93
+ args: [nextRaw, Date.now(), key, expectedRaw],
94
+ });
95
+ return result.rowsAffected === 1;
96
+ }
97
+
98
+ async function acquireDatabaseLease(ownerEmail: string): Promise<string> {
99
+ const token = nanoid(16);
100
+ const deadline = Date.now() + LOCK_ACQUIRE_TIMEOUT_MS;
101
+ while (Date.now() < deadline) {
102
+ const { raw, lease } = await readLeaseRow(ownerEmail);
103
+ const now = Date.now();
104
+ if (!lease || lease.expiresAt <= now) {
105
+ const nextRaw = JSON.stringify({
106
+ token,
107
+ expiresAt: now + LOCK_LEASE_MS,
108
+ } satisfies LocalEmailLease);
109
+ if (await compareAndSwapLease(ownerEmail, raw, nextRaw)) return nextRaw;
110
+ }
111
+ await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_MS));
112
+ }
113
+ throw new Error("Timed out waiting for local mailbox mutation lock");
114
+ }
115
+
116
+ async function releaseDatabaseLease(
117
+ ownerEmail: string,
118
+ leaseRaw: string,
119
+ ): Promise<void> {
120
+ for (let attempt = 0; attempt < LOCK_RELEASE_ATTEMPTS; attempt += 1) {
121
+ try {
122
+ await getDbExec().execute({
123
+ sql: `DELETE FROM ${settingsTable()} WHERE key = ? AND value = ?`,
124
+ args: [lockStorageKey(ownerEmail), leaseRaw],
125
+ });
126
+ return;
127
+ } catch (error) {
128
+ if (attempt === LOCK_RELEASE_ATTEMPTS - 1) throw error;
129
+ await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_MS));
130
+ }
131
+ }
132
+ }
133
+
134
+ async function readMailboxRow(ownerEmail: string): Promise<string | null> {
135
+ // Initialize the settings table, then bypass its request cache so CAS retry
136
+ // attempts always compare against the latest committed mailbox snapshot.
137
+ await getUserSetting(ownerEmail, "local-emails");
138
+ const { rows } = await getDbExec().execute({
139
+ sql: `SELECT value FROM ${settingsTable()} WHERE key = ?`,
140
+ args: [mailboxStorageKey(ownerEmail)],
141
+ });
142
+ return rows.length ? String(rows[0].value ?? rows[0][0]) : null;
143
+ }
144
+
145
+ function parseEmails(raw: string | null): EmailMessage[] {
146
+ if (!raw) return [];
147
+ try {
148
+ const data = JSON.parse(raw);
149
+ return Array.isArray(data?.emails) ? data.emails : [];
150
+ } catch {
151
+ return [];
152
+ }
153
+ }
154
+
155
+ async function compareAndSwapMailbox(
156
+ ownerEmail: string,
157
+ expectedRaw: string | null,
158
+ nextRaw: string,
159
+ ): Promise<boolean> {
160
+ const client = getDbExec();
161
+ const key = mailboxStorageKey(ownerEmail);
162
+ if (expectedRaw === null) {
163
+ const result = await client.execute({
164
+ sql: isPostgres()
165
+ ? `INSERT INTO ${settingsTable()} (key, value, updated_at) VALUES (?, ?, ?) ON CONFLICT (key) DO NOTHING`
166
+ : `INSERT OR IGNORE INTO ${settingsTable()} (key, value, updated_at) VALUES (?, ?, ?)`,
167
+ args: [key, nextRaw, Date.now()],
168
+ });
169
+ return result.rowsAffected === 1;
170
+ }
171
+ const result = await client.execute({
172
+ sql: `UPDATE ${settingsTable()} SET value = ?, updated_at = ? WHERE key = ? AND value = ?`,
173
+ args: [nextRaw, Date.now(), key, expectedRaw],
174
+ });
175
+ return result.rowsAffected === 1;
176
+ }
177
+
178
+ /**
179
+ * Serialize read-modify-write operations on an owner's synthetic mailbox.
180
+ * Local mail is one JSON document, so every writer must participate to avoid
181
+ * replacing a concurrent writer's newer snapshot.
182
+ */
183
+ export function withLocalEmailMutationLock<T>(
184
+ ownerEmail: string,
185
+ mutate: () => Promise<T>,
186
+ ): Promise<T> {
187
+ const key = ownerEmail.toLowerCase();
188
+ const previous = localEmailMutationLocks.get(key) ?? Promise.resolve();
189
+ const runWithDatabaseLease = async () => {
190
+ for (let attempt = 0; attempt < MAX_MUTATION_ATTEMPTS; attempt += 1) {
191
+ const leaseRaw = await acquireDatabaseLease(ownerEmail);
192
+ try {
193
+ return await localEmailMutationContext.run({ ownerKey: key }, mutate);
194
+ } catch (error) {
195
+ if (!(error instanceof LocalEmailWriteConflict)) throw error;
196
+ } finally {
197
+ try {
198
+ await releaseDatabaseLease(ownerEmail, leaseRaw);
199
+ } catch (error) {
200
+ // The lease expires and is token-scoped, so a transient cleanup
201
+ // failure must not turn an already committed mailbox write into an
202
+ // ambiguous failure that callers may retry.
203
+ console.warn(
204
+ "[local-email-store] failed to release mutation lease; it will expire",
205
+ error,
206
+ );
207
+ }
208
+ }
209
+ }
210
+ throw new Error("Local mailbox changed too many times; please retry");
211
+ };
212
+ const next = previous.then(runWithDatabaseLease, runWithDatabaseLease);
213
+ localEmailMutationLocks.set(key, next);
214
+ const cleanup = () => {
215
+ if (localEmailMutationLocks.get(key) === next) {
216
+ localEmailMutationLocks.delete(key);
217
+ }
218
+ };
219
+ next.then(cleanup, cleanup);
220
+ return next;
221
+ }
222
+
223
+ export async function readLocalEmails(
224
+ ownerEmail: string,
225
+ ): Promise<EmailMessage[]> {
226
+ const raw = await readMailboxRow(ownerEmail);
227
+ const context = localEmailMutationContext.getStore();
228
+ if (context?.ownerKey === ownerEmail.toLowerCase()) {
229
+ context.expectedMailboxRaw = raw;
230
+ }
231
+ return parseEmails(raw);
232
+ }
233
+
234
+ export async function writeLocalEmails(
235
+ ownerEmail: string,
236
+ emails: EmailMessage[],
237
+ options?: StoreWriteOptions,
238
+ ): Promise<void> {
239
+ const context = localEmailMutationContext.getStore();
240
+ if (
241
+ context?.ownerKey !== ownerEmail.toLowerCase() ||
242
+ context.expectedMailboxRaw === undefined
243
+ ) {
244
+ throw new Error(
245
+ "Local mailbox writes must run inside withLocalEmailMutationLock after a fresh read",
246
+ );
247
+ }
248
+ const nextRaw = JSON.stringify({ emails });
249
+ if (
250
+ !(await compareAndSwapMailbox(
251
+ ownerEmail,
252
+ context.expectedMailboxRaw,
253
+ nextRaw,
254
+ ))
255
+ ) {
256
+ throw new LocalEmailWriteConflict("Local mailbox changed concurrently");
257
+ }
258
+ context.expectedMailboxRaw = nextRaw;
259
+ getSettingsEmitter().emit("settings", {
260
+ source: "settings",
261
+ type: "change",
262
+ key: mailboxStorageKey(ownerEmail),
263
+ ...(options?.requestSource && { requestSource: options.requestSource }),
264
+ });
265
+ }
@@ -105,6 +105,12 @@ Available operations:
105
105
  - Queue teammate-requested drafts for organization members to review and send
106
106
  - Navigate the UI to specific views or threads
107
107
 
108
+ ## Reliable Mail Mutations
109
+
110
+ For requests to mark all, every, or many unread conversations read in one account, call \`mark-read\` exactly once with \`scope: "all-unread"\` and the exact \`accountEmail\`. Resolve conversations the user wants preserved to exact thread IDs and pass them in \`excludeThreadIds\`. Never loop \`mark-thread-read\` for broad cleanup. Report the returned matched, excluded, changed, and remaining-unread counts; completeness comes from the action's verification read, not merely from a successful tool submission.
111
+
112
+ Use \`mark-thread-read\` for one specific conversation only.
113
+
108
114
  ## Provider APIs Are Escape Hatches, Not Limits
109
115
 
110
116
  Provider-specific Mail actions are shortcuts, not limits. If a first-class action cannot express the exact Gmail, Google Calendar, or CRM endpoint, search query, label/filter setting, request body, pagination mode, account id, payload shape, or API version needed, call \`provider-api-catalog\` and \`provider-api-docs\` as needed, then call \`provider-api-request\` against the provider's real HTTP API.
@@ -11,7 +11,7 @@ export default async function (args: string[]) {
11
11
  }
12
12
 
13
13
  const buf = fs.readFileSync(pdfPath);
14
- const pdf = new PDFParse(new Uint8Array(buf));
14
+ const pdf = new PDFParse({ data: new Uint8Array(buf) });
15
15
  const result = await pdf.getText();
16
16
  const pages = result.pages || [];
17
17
  console.log("Total pages:", pages.length);
@@ -214,7 +214,10 @@ export default defineAction({
214
214
  const { PDFParse } = await import("pdf-parse");
215
215
  const { convertSectionsToSlides } =
216
216
  await import("../server/handlers/import/html-converter.js");
217
- const pdf = new PDFParse(new Uint8Array(fileBuffer));
217
+ // pdf-parse v2 expects a LoadParameters object. Passing the byte array
218
+ // directly uses the old v1 shape and can fail while pdf.js initializes
219
+ // in production (the reported DOMMatrix error).
220
+ const pdf = new PDFParse({ data: new Uint8Array(fileBuffer) });
218
221
  const result = await pdf.getText();
219
222
  const pages = normalizePdfPages(result);
220
223
  const textPages = pages.filter((p) => p.text.trim());
@@ -69,7 +69,7 @@ export default function ImageGenPanel({
69
69
  const contextParts: string[] = [];
70
70
 
71
71
  contextParts.push(
72
- "Generate 3 image variations using our image generation action (`pnpm action generate-image`).",
72
+ "Generate 3 image variations by calling the registered `generate-image-api` action three times with the same prompt.",
73
73
  );
74
74
  contextParts.push(
75
75
  "The deliverables must be actual generated image assets from the action. Do not create placeholder HTML/CSS, oversized icon compositions, inline SVGs, or text-only mockups.",
@@ -1,4 +1,4 @@
1
- import { appBasePath, useT } from "@agent-native/core/client";
1
+ import { callAction, useT } from "@agent-native/core/client";
2
2
  import { IconX, IconSearch, IconLoader2 } from "@tabler/icons-react";
3
3
  import { useState, useEffect, useRef } from "react";
4
4
  import { createPortal } from "react-dom";
@@ -61,18 +61,15 @@ export default function ImageSearchPanel({
61
61
  setLoading(true);
62
62
  setError(null);
63
63
  try {
64
- const res = await fetch(
65
- `${appBasePath()}/api/image-search?q=${encodeURIComponent(query)}`,
64
+ const data = await callAction<SearchResult[]>(
65
+ "search-images",
66
+ { q: query.trim() },
67
+ { method: "GET" },
66
68
  );
67
- if (!res.ok) {
68
- const data = await res.json();
69
- setError(data.error || "Search failed");
70
- setResults([]);
71
- } else {
72
- setResults(await res.json());
73
- }
74
- } catch {
75
- setError("Search failed");
69
+ setResults(data);
70
+ } catch (error) {
71
+ setError(error instanceof Error ? error.message : t("raw.searchFailed"));
72
+ setResults([]);
76
73
  } finally {
77
74
  setLoading(false);
78
75
  }
@@ -1141,7 +1141,10 @@ export default function SlideEditor({
1141
1141
  const selector = getBuilderSelector(el);
1142
1142
  el.contentEditable = "true";
1143
1143
  el.setAttribute("data-editing-block", "true");
1144
- clearSelectedElement();
1144
+ // Keep the inspector selection mounted while text is being edited. The
1145
+ // inspector is a stable dock, so clearing it here would make the canvas
1146
+ // resize and auto-fit again on the second click.
1147
+ setSelectedElementRect(null);
1145
1148
  captureInlineEditDraft(slide.id);
1146
1149
  // Mark the deck dirty immediately so SSE/poll refreshes do not replace
1147
1150
  // the deck under an active contentEditable edit, even before the user
@@ -1167,13 +1170,7 @@ export default function SlideEditor({
1167
1170
  );
1168
1171
  }
1169
1172
  },
1170
- [
1171
- buildSelectionState,
1172
- captureInlineEditDraft,
1173
- clearSelectedElement,
1174
- onInlineEditStart,
1175
- slide.id,
1176
- ],
1173
+ [buildSelectionState, captureInlineEditDraft, onInlineEditStart, slide.id],
1177
1174
  );
1178
1175
 
1179
1176
  // Exit edit mode when switching slides — save pending content first so
@@ -2053,18 +2050,29 @@ export default function SlideEditor({
2053
2050
  )}
2054
2051
  </div>
2055
2052
 
2056
- {selectedStyleSnapshot && !readOnly && (
2057
- <div className="relative z-[70] hidden h-full w-[17rem] shrink-0 border-l border-border/70 bg-background/95 lg:block">
2058
- <SlideStyleInspector
2059
- snapshot={selectedStyleSnapshot}
2060
- designSystem={designSystem}
2061
- className="h-full w-full rounded-none border-0 bg-transparent shadow-none"
2062
- onChange={applySelectedStylePatch}
2063
- onClose={() => {
2064
- clearSelectedElement();
2065
- syncSelectionToAppState(null);
2066
- }}
2067
- />
2053
+ {!readOnly && (
2054
+ <div
2055
+ className="relative z-[70] hidden h-full w-[17rem] shrink-0 border-l border-border/70 bg-background/95 lg:block"
2056
+ data-slide-style-dock="true"
2057
+ >
2058
+ {selectedStyleSnapshot ? (
2059
+ <SlideStyleInspector
2060
+ snapshot={selectedStyleSnapshot}
2061
+ designSystem={designSystem}
2062
+ className="h-full w-full rounded-none border-0 bg-transparent shadow-none"
2063
+ onChange={applySelectedStylePatch}
2064
+ onClose={() => {
2065
+ clearSelectedElement();
2066
+ syncSelectionToAppState(null);
2067
+ }}
2068
+ />
2069
+ ) : (
2070
+ <div className="flex h-11 items-center border-b border-border/70 px-3">
2071
+ <span className="text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/70">
2072
+ {t("styleInspector.title")}
2073
+ </span>
2074
+ </div>
2075
+ )}
2068
2076
  </div>
2069
2077
  )}
2070
2078
  </div>
@@ -2082,7 +2090,7 @@ export default function SlideEditor({
2082
2090
  viewportRect={selectionViewportRect}
2083
2091
  />
2084
2092
  )}
2085
- {selectedElementRect && (
2093
+ {selectedElementRect && !editingEl && (
2086
2094
  <ElementSelectionOutline
2087
2095
  rect={selectedElementRect}
2088
2096
  viewportRect={selectionViewportRect}
@@ -103,6 +103,7 @@ const messages = {
103
103
  searchImagesPlaceholder: "Buscar imagens...",
104
104
  searchForLogosImagesIcons: "Buscar logos, imagens, ícones...",
105
105
  search: "بحث",
106
+ searchFailed: "فشل البحث",
106
107
  logoSearchTitle: "بحث عن الشعار",
107
108
  searchCompanyLogo: "Busque uma empresa para encontrar seu logo",
108
109
  searchCompanyPlaceholder: "Buscar nome da empresa (ex.: Intuit)",
@@ -106,6 +106,7 @@ const messages = {
106
106
  searchImagesPlaceholder: "Nach Bildern suchen...",
107
107
  searchForLogosImagesIcons: "Nach Logos, Bildern, Icons suchen...",
108
108
  search: "Suchen",
109
+ searchFailed: "Suche fehlgeschlagen",
109
110
  logoSearchTitle: "Logo-Suche",
110
111
  searchCompanyLogo: "Suche nach einem Unternehmen, um sein Logo zu finden",
111
112
  searchCompanyPlaceholder: "Unternehmensname suchen (z. B. Intuit)",
@@ -104,6 +104,7 @@ const messages = {
104
104
  searchImagesPlaceholder: "Search for images...",
105
105
  searchForLogosImagesIcons: "Search for logos, images, icons...",
106
106
  search: "Search",
107
+ searchFailed: "Search failed",
107
108
  logoSearchTitle: "Logo Search",
108
109
  searchCompanyLogo: "Search for a company to find their logo",
109
110
  searchCompanyPlaceholder: "Search company name (e.g. Intuit)",
@@ -105,6 +105,7 @@ const messages = {
105
105
  searchImagesPlaceholder: "Buscar imágenes...",
106
106
  searchForLogosImagesIcons: "Buscar logos, imágenes, iconos...",
107
107
  search: "Buscar",
108
+ searchFailed: "Error al buscar",
108
109
  logoSearchTitle: "Búsqueda de logos",
109
110
  searchCompanyLogo: "Busca una empresa para encontrar su logo",
110
111
  searchCompanyPlaceholder: "Buscar nombre de empresa (p. ej. Intuit)",
@@ -106,6 +106,7 @@ const messages = {
106
106
  searchImagesPlaceholder: "Rechercher des images...",
107
107
  searchForLogosImagesIcons: "Rechercher des logos, images, icônes...",
108
108
  search: "Rechercher",
109
+ searchFailed: "Échec de la recherche",
109
110
  logoSearchTitle: "Recherche de logo",
110
111
  searchCompanyLogo: "Recherchez une entreprise pour trouver son logo",
111
112
  searchCompanyPlaceholder: "Rechercher un nom d’entreprise (ex. Intuit)",
@@ -103,6 +103,7 @@ const messages = {
103
103
  searchImagesPlaceholder: "Buscar imagens...",
104
104
  searchForLogosImagesIcons: "Buscar logos, imagens, ícones...",
105
105
  search: "खोजें",
106
+ searchFailed: "खोज विफल",
106
107
  logoSearchTitle: "लोगो खोज",
107
108
  searchCompanyLogo: "Busque uma empresa para encontrar seu logo",
108
109
  searchCompanyPlaceholder: "Buscar nome da empresa (ex.: Intuit)",
@@ -104,6 +104,7 @@ const messages = {
104
104
  searchImagesPlaceholder: "画像を検索...",
105
105
  searchForLogosImagesIcons: "ロゴ、画像、アイコンを検索...",
106
106
  search: "検索",
107
+ searchFailed: "検索に失敗しました",
107
108
  logoSearchTitle: "ロゴ検索",
108
109
  searchCompanyLogo: "会社を検索してロゴを見つける",
109
110
  searchCompanyPlaceholder: "会社名を検索(例: Intuit)",
@@ -104,6 +104,7 @@ const messages = {
104
104
  searchImagesPlaceholder: "画像を検索...",
105
105
  searchForLogosImagesIcons: "ロゴ、画像、アイコンを検索...",
106
106
  search: "검색",
107
+ searchFailed: "검색 실패",
107
108
  logoSearchTitle: "로고 검색",
108
109
  searchCompanyLogo: "会社を検索してロゴを見つける",
109
110
  searchCompanyPlaceholder: "会社名を検索(例: Intuit)",
@@ -104,6 +104,7 @@ const messages = {
104
104
  searchImagesPlaceholder: "Buscar imagens...",
105
105
  searchForLogosImagesIcons: "Buscar logos, imagens, ícones...",
106
106
  search: "Buscar",
107
+ searchFailed: "Falha na pesquisa",
107
108
  logoSearchTitle: "Busca de logo",
108
109
  searchCompanyLogo: "Busque uma empresa para encontrar seu logo",
109
110
  searchCompanyPlaceholder: "Buscar nome da empresa (ex.: Intuit)",
@@ -102,6 +102,7 @@ const messages = {
102
102
  searchImagesPlaceholder: "画像を検索...",
103
103
  searchForLogosImagesIcons: "ロゴ、画像、アイコンを検索...",
104
104
  search: "搜索",
105
+ searchFailed: "搜索失败",
105
106
  logoSearchTitle: "徽标搜索",
106
107
  searchCompanyLogo: "会社を検索してロゴを見つける",
107
108
  searchCompanyPlaceholder: "会社名を検索(例: Intuit)",
@@ -100,6 +100,7 @@ const messages = {
100
100
  searchImagesPlaceholder: "搜尋圖片...",
101
101
  searchForLogosImagesIcons: "搜尋徽標、圖片、圖示...",
102
102
  search: "搜尋",
103
+ searchFailed: "搜尋失敗",
103
104
  logoSearchTitle: "徽標搜尋",
104
105
  searchCompanyLogo: "搜尋公司以尋找徽標",
105
106
  searchCompanyPlaceholder: "搜尋公司名稱(例如:Intuit)",
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ Image search and generation controls now use the registered Slides actions
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ PDF deck references can be imported for slide inspiration again
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-15
4
+ ---
5
+
6
+ The slide Style inspector now stays in a stable dock while selecting and editing elements, so the canvas no longer jumps or changes zoom.
@@ -12,6 +12,7 @@ export interface ContentLocalLaunchPlan {
12
12
  manifestPath: string;
13
13
  rootPath: string;
14
14
  filePath?: string;
15
+ connectionId: string;
15
16
  url: string;
16
17
  command: string;
17
18
  args: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"content-local.d.ts","sourceRoot":"","sources":["../../src/cli/content-local.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAoCD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CA8CtE;AAqGD,wBAAgB,sBAAsB,CAAC,GAAG,SAAgB,UAmBzD;AAOD,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA+ClC;AAgCD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,mBA+CnD"}
1
+ {"version":3,"file":"content-local.d.ts","sourceRoot":"","sources":["../../src/cli/content-local.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AA4CD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CA8CtE;AAuJD,wBAAgB,sBAAsB,CAAC,GAAG,SAAgB,UAmBzD;AAQD,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkDlC;AAgCD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,mBAmDnD"}