@agent-native/core 0.95.1 → 0.97.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 (655) hide show
  1. package/README.md +6 -0
  2. package/corpus/README.md +2 -2
  3. package/corpus/core/CHANGELOG.md +64 -0
  4. package/corpus/core/docs/content/audit-log.mdx +2 -1
  5. package/corpus/core/docs/content/automations.mdx +7 -7
  6. package/corpus/core/docs/content/creating-templates.mdx +1 -1
  7. package/corpus/core/docs/content/internationalization.mdx +2 -1
  8. package/corpus/core/docs/content/locales/ar-SA/audit-log.mdx +2 -1
  9. package/corpus/core/docs/content/locales/ar-SA/automations.mdx +7 -7
  10. package/corpus/core/docs/content/locales/ar-SA/getting-started.mdx +7 -1
  11. package/corpus/core/docs/content/locales/ar-SA/internationalization.mdx +1 -1
  12. package/corpus/core/docs/content/locales/ar-SA/package-lifecycle.mdx +19 -0
  13. package/corpus/core/docs/content/locales/ar-SA/sandbox-adapters.mdx +18 -7
  14. package/corpus/core/docs/content/locales/ar-SA/security.mdx +8 -0
  15. package/corpus/core/docs/content/locales/de-DE/audit-log.mdx +2 -1
  16. package/corpus/core/docs/content/locales/de-DE/automations.mdx +7 -7
  17. package/corpus/core/docs/content/locales/de-DE/getting-started.mdx +7 -1
  18. package/corpus/core/docs/content/locales/de-DE/internationalization.mdx +1 -1
  19. package/corpus/core/docs/content/locales/de-DE/package-lifecycle.mdx +22 -0
  20. package/corpus/core/docs/content/locales/de-DE/sandbox-adapters.mdx +18 -7
  21. package/corpus/core/docs/content/locales/de-DE/security.mdx +8 -0
  22. package/corpus/core/docs/content/locales/es-ES/audit-log.mdx +2 -1
  23. package/corpus/core/docs/content/locales/es-ES/automations.mdx +7 -7
  24. package/corpus/core/docs/content/locales/es-ES/getting-started.mdx +7 -1
  25. package/corpus/core/docs/content/locales/es-ES/internationalization.mdx +1 -1
  26. package/corpus/core/docs/content/locales/es-ES/package-lifecycle.mdx +22 -0
  27. package/corpus/core/docs/content/locales/es-ES/sandbox-adapters.mdx +18 -7
  28. package/corpus/core/docs/content/locales/es-ES/security.mdx +8 -0
  29. package/corpus/core/docs/content/locales/fr-FR/audit-log.mdx +2 -1
  30. package/corpus/core/docs/content/locales/fr-FR/automations.mdx +7 -7
  31. package/corpus/core/docs/content/locales/fr-FR/getting-started.mdx +7 -1
  32. package/corpus/core/docs/content/locales/fr-FR/internationalization.mdx +1 -1
  33. package/corpus/core/docs/content/locales/fr-FR/package-lifecycle.mdx +21 -0
  34. package/corpus/core/docs/content/locales/fr-FR/sandbox-adapters.mdx +19 -8
  35. package/corpus/core/docs/content/locales/fr-FR/security.mdx +8 -0
  36. package/corpus/core/docs/content/locales/hi-IN/audit-log.mdx +2 -1
  37. package/corpus/core/docs/content/locales/hi-IN/automations.mdx +7 -7
  38. package/corpus/core/docs/content/locales/hi-IN/getting-started.mdx +7 -1
  39. package/corpus/core/docs/content/locales/hi-IN/internationalization.mdx +1 -1
  40. package/corpus/core/docs/content/locales/hi-IN/package-lifecycle.mdx +20 -0
  41. package/corpus/core/docs/content/locales/hi-IN/sandbox-adapters.mdx +18 -7
  42. package/corpus/core/docs/content/locales/hi-IN/security.mdx +8 -0
  43. package/corpus/core/docs/content/locales/ja-JP/audit-log.mdx +2 -1
  44. package/corpus/core/docs/content/locales/ja-JP/automations.mdx +7 -7
  45. package/corpus/core/docs/content/locales/ja-JP/getting-started.mdx +7 -1
  46. package/corpus/core/docs/content/locales/ja-JP/internationalization.mdx +1 -1
  47. package/corpus/core/docs/content/locales/ja-JP/package-lifecycle.mdx +21 -0
  48. package/corpus/core/docs/content/locales/ja-JP/sandbox-adapters.mdx +17 -6
  49. package/corpus/core/docs/content/locales/ja-JP/security.mdx +8 -0
  50. package/corpus/core/docs/content/locales/ko-KR/audit-log.mdx +2 -1
  51. package/corpus/core/docs/content/locales/ko-KR/automations.mdx +7 -7
  52. package/corpus/core/docs/content/locales/ko-KR/getting-started.mdx +7 -1
  53. package/corpus/core/docs/content/locales/ko-KR/internationalization.mdx +1 -1
  54. package/corpus/core/docs/content/locales/ko-KR/package-lifecycle.mdx +20 -0
  55. package/corpus/core/docs/content/locales/ko-KR/sandbox-adapters.mdx +17 -6
  56. package/corpus/core/docs/content/locales/ko-KR/security.mdx +8 -0
  57. package/corpus/core/docs/content/locales/pt-BR/audit-log.mdx +2 -1
  58. package/corpus/core/docs/content/locales/pt-BR/automations.mdx +7 -7
  59. package/corpus/core/docs/content/locales/pt-BR/getting-started.mdx +7 -1
  60. package/corpus/core/docs/content/locales/pt-BR/internationalization.mdx +1 -1
  61. package/corpus/core/docs/content/locales/pt-BR/package-lifecycle.mdx +21 -0
  62. package/corpus/core/docs/content/locales/pt-BR/sandbox-adapters.mdx +18 -7
  63. package/corpus/core/docs/content/locales/pt-BR/security.mdx +8 -0
  64. package/corpus/core/docs/content/locales/zh-CN/audit-log.mdx +2 -1
  65. package/corpus/core/docs/content/locales/zh-CN/automations.mdx +7 -7
  66. package/corpus/core/docs/content/locales/zh-CN/getting-started.mdx +6 -4
  67. package/corpus/core/docs/content/locales/zh-CN/internationalization.mdx +1 -1
  68. package/corpus/core/docs/content/locales/zh-CN/package-lifecycle.mdx +19 -0
  69. package/corpus/core/docs/content/locales/zh-CN/sandbox-adapters.mdx +17 -6
  70. package/corpus/core/docs/content/locales/zh-CN/security.mdx +8 -0
  71. package/corpus/core/docs/content/locales/zh-TW/audit-log.mdx +2 -1
  72. package/corpus/core/docs/content/locales/zh-TW/automations.mdx +7 -7
  73. package/corpus/core/docs/content/locales/zh-TW/getting-started.mdx +6 -4
  74. package/corpus/core/docs/content/locales/zh-TW/internationalization.mdx +1 -1
  75. package/corpus/core/docs/content/locales/zh-TW/package-lifecycle.mdx +19 -0
  76. package/corpus/core/docs/content/locales/zh-TW/sandbox-adapters.mdx +18 -7
  77. package/corpus/core/docs/content/locales/zh-TW/security.mdx +8 -0
  78. package/corpus/core/docs/content/package-lifecycle.mdx +51 -0
  79. package/corpus/core/docs/content/sandbox-adapters.mdx +16 -5
  80. package/corpus/core/package.json +11 -2
  81. package/corpus/core/src/a2a/auth-policy.ts +33 -0
  82. package/corpus/core/src/a2a/client.ts +11 -1
  83. package/corpus/core/src/agent/durable-background.ts +15 -7
  84. package/corpus/core/src/agent/production-agent.ts +87 -27
  85. package/corpus/core/src/agent/run-store.ts +13 -4
  86. package/corpus/core/src/agent/thread-data-builder.ts +7 -5
  87. package/corpus/core/src/audit/actions/export-audit-events.ts +162 -0
  88. package/corpus/core/src/audit/store.ts +8 -3
  89. package/corpus/core/src/audit/types.ts +3 -0
  90. package/corpus/core/src/chat-threads/store.ts +20 -1
  91. package/corpus/core/src/cli/code-agent-executor.ts +1 -0
  92. package/corpus/core/src/cli/code-agent-runs.ts +14 -0
  93. package/corpus/core/src/cli/doctor.ts +396 -0
  94. package/corpus/core/src/cli/index.ts +56 -0
  95. package/corpus/core/src/cli/info.ts +3 -3
  96. package/corpus/core/src/cli/package-lifecycle.ts +821 -0
  97. package/corpus/core/src/client/AgentPanel.tsx +32 -25
  98. package/corpus/core/src/client/AssistantChat.tsx +36 -20
  99. package/corpus/core/src/client/MultiTabAssistantChat.tsx +141 -90
  100. package/corpus/core/src/client/agent-chat-adapter.ts +9 -9
  101. package/corpus/core/src/client/chat/ChatHistoryList.tsx +404 -0
  102. package/corpus/core/src/client/chat/index.ts +6 -0
  103. package/corpus/core/src/client/chat/tool-call-display.tsx +37 -3
  104. package/corpus/core/src/client/code-agent-chat-adapter.ts +72 -4
  105. package/corpus/core/src/client/composer/RealtimeVoiceMode.tsx +52 -11
  106. package/corpus/core/src/client/composer/TiptapComposer.tsx +157 -20
  107. package/corpus/core/src/client/composer/VoiceButton.tsx +28 -0
  108. package/corpus/core/src/client/composer/useRealtimeVoiceMode.tsx +5 -0
  109. package/corpus/core/src/client/conversation/code-agent-transcript.ts +4 -5
  110. package/corpus/core/src/client/guided-questions.tsx +2 -1
  111. package/corpus/core/src/client/index.ts +11 -0
  112. package/corpus/core/src/client/use-chat-threads.ts +10 -1
  113. package/corpus/core/src/client/voice-provider-status.ts +44 -0
  114. package/corpus/core/src/code-agents/transcript-normalizer.ts +76 -0
  115. package/corpus/core/src/deploy/build.ts +12 -11
  116. package/corpus/core/src/guards/db-tool-scoping.ts +129 -0
  117. package/corpus/core/src/guards/index.ts +23 -0
  118. package/corpus/core/src/guards/no-drizzle-push.ts +116 -0
  119. package/corpus/core/src/guards/no-env-credentials.ts +229 -0
  120. package/corpus/core/src/guards/no-env-mutation.ts +114 -0
  121. package/corpus/core/src/guards/no-localhost-fallback.ts +124 -0
  122. package/corpus/core/src/guards/no-unscoped-credentials.ts +227 -0
  123. package/corpus/core/src/guards/no-unscoped-queries.ts +834 -0
  124. package/corpus/core/src/guards/scan-utils.ts +105 -0
  125. package/corpus/core/src/guards/types.ts +30 -0
  126. package/corpus/core/src/integrations/a2a-continuation-processor.ts +35 -5
  127. package/corpus/core/src/integrations/adapters/slack.ts +74 -21
  128. package/corpus/core/src/integrations/webhook-handler.ts +14 -0
  129. package/corpus/core/src/localization/default-messages.ts +6 -0
  130. package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
  131. package/corpus/core/src/observability/routes.ts +17 -0
  132. package/corpus/core/src/observability/store.ts +4 -1
  133. package/corpus/core/src/observability/traces.ts +41 -2
  134. package/corpus/core/src/org/accept-pending.ts +9 -1
  135. package/corpus/core/src/org/migrations.ts +41 -0
  136. package/corpus/core/src/package-lifecycle/index.ts +1 -0
  137. package/corpus/core/src/package-lifecycle/manifest.ts +120 -0
  138. package/corpus/core/src/provider-api/custom-registry.ts +56 -0
  139. package/corpus/core/src/provider-api/index.ts +2 -0
  140. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +19 -1
  141. package/corpus/core/src/scripts/call-agent.ts +53 -3
  142. package/corpus/core/src/scripts/chat/search-chats.ts +11 -8
  143. package/corpus/core/src/secrets/register-framework-secrets.ts +1 -1
  144. package/corpus/core/src/secrets/storage.ts +47 -27
  145. package/corpus/core/src/server/action-discovery.ts +4 -0
  146. package/corpus/core/src/server/agent-chat-plugin.ts +95 -18
  147. package/corpus/core/src/server/core-routes-plugin.ts +45 -14
  148. package/corpus/core/src/server/csrf.ts +24 -5
  149. package/corpus/core/src/server/framework-request-handler.ts +34 -0
  150. package/corpus/core/src/server/google-realtime-session.ts +1 -36
  151. package/corpus/core/src/server/poll.ts +24 -2
  152. package/corpus/core/src/server/realtime-voice.ts +80 -24
  153. package/corpus/core/src/server/request-origin.ts +63 -0
  154. package/corpus/core/src/server/transcribe-voice.ts +1 -50
  155. package/corpus/core/src/server/voice-providers-status.ts +4 -3
  156. package/corpus/core/src/shared/cache-control.ts +2 -8
  157. package/corpus/core/src/styles/agent-native.css +1 -0
  158. package/corpus/core/src/styles/chat-history-list.css +313 -0
  159. package/corpus/core/src/templates/default/package.json +2 -2
  160. package/corpus/core/src/templates/headless/package.json +0 -1
  161. package/corpus/core/src/templates/workspace-core/.agents/skills/audit-log/SKILL.md +3 -0
  162. package/corpus/core/src/templates/workspace-core/.agents/skills/automations/SKILL.md +1 -1
  163. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +20 -0
  164. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +8 -4
  165. package/corpus/core/src/templates/workspace-core/package.json +0 -1
  166. package/corpus/core/src/templates/workspace-root/package.json +0 -1
  167. package/corpus/core/src/triggers/actions.ts +11 -3
  168. package/corpus/core/src/triggers/types.ts +7 -1
  169. package/corpus/core/src/vite/client.ts +1 -0
  170. package/corpus/templates/analytics/AGENTS.md +7 -0
  171. package/corpus/templates/analytics/actions/bigquery.ts +26 -2
  172. package/corpus/templates/analytics/actions/compose-dashboard.ts +65 -37
  173. package/corpus/templates/analytics/actions/data-source-status.ts +18 -0
  174. package/corpus/templates/analytics/actions/mutate-dashboard.ts +73 -24
  175. package/corpus/templates/analytics/actions/reorder-dashboard-panels.ts +16 -13
  176. package/corpus/templates/analytics/actions/update-dashboard.ts +53 -42
  177. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +5 -4
  178. package/corpus/templates/analytics/app/global.css +10 -0
  179. package/corpus/templates/analytics/app/pages/Ask.tsx +25 -2
  180. package/corpus/templates/analytics/changelog/2026-07-10-analytics-answers-simple-time-bounded-metrics-without-unnece.md +6 -0
  181. package/corpus/templates/analytics/changelog/2026-07-10-analytics-chat-reliably-uses-connected-data-sources-across-s.md +6 -0
  182. package/corpus/templates/analytics/changelog/2026-07-10-chat-threads-now-stay-clear-of-top-actions-and-fade-smoothly.md +6 -0
  183. package/corpus/templates/analytics/changelog/2026-07-10-context-chips-can-now-be-selected-and-removed-one-at-a-time-.md +6 -0
  184. package/corpus/templates/analytics/changelog/2026-07-10-dashboard-edits-from-the-agent-and-the-ui-at-the-same-time-n.md +6 -0
  185. package/corpus/templates/analytics/changelog/2026-07-10-the-ask-composer-no-longer-carries-dashboard-or-panel-contex.md +6 -0
  186. package/corpus/templates/analytics/changelog/2026-07-10-the-ask-section-stays-highlighted-while-its-chat-history-is-.md +6 -0
  187. package/corpus/templates/analytics/changelog/2026-07-10-timed-out-bigquery-jobs-are-now-cancelled-so-they-stop-consu.md +6 -0
  188. package/corpus/templates/analytics/package.json +1 -2
  189. package/corpus/templates/analytics/server/lib/bigquery.ts +91 -14
  190. package/corpus/templates/analytics/server/lib/dashboards-store.ts +154 -11
  191. package/corpus/templates/analytics/server/plugins/agent-chat.ts +82 -7
  192. package/corpus/templates/assets/package.json +1 -2
  193. package/corpus/templates/brain/package.json +1 -2
  194. package/corpus/templates/calendar/package.json +1 -2
  195. package/corpus/templates/chat/package.json +1 -2
  196. package/corpus/templates/clips/changelog/2026-07-10-atomic-view-tracking.md +6 -0
  197. package/corpus/templates/clips/chrome-extension/package.json +3 -2
  198. package/corpus/templates/clips/desktop/package.json +6 -4
  199. package/corpus/templates/clips/desktop/src/lib/recorder.ts +26 -13
  200. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +4 -1
  201. package/corpus/templates/clips/package.json +1 -2
  202. package/corpus/templates/clips/server/db/schema.ts +29 -17
  203. package/corpus/templates/clips/server/plugins/db.ts +8 -0
  204. package/corpus/templates/clips/server/routes/api/view-event.post.ts +260 -105
  205. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +16 -0
  206. package/corpus/templates/content/AGENTS.md +72 -62
  207. package/corpus/templates/content/actions/_content-database-source-adapters.ts +84 -0
  208. package/corpus/templates/content/actions/_database-source-utils.ts +206 -96
  209. package/corpus/templates/content/actions/_notion-database-source-adapter.ts +216 -0
  210. package/corpus/templates/content/actions/_position-utils.ts +76 -0
  211. package/corpus/templates/content/actions/_property-utils.ts +31 -20
  212. package/corpus/templates/content/actions/add-database-item.ts +52 -39
  213. package/corpus/templates/content/actions/attach-content-database-source.ts +95 -11
  214. package/corpus/templates/content/actions/change-content-database-source-role.ts +24 -1
  215. package/corpus/templates/content/actions/configure-document-property.ts +36 -27
  216. package/corpus/templates/content/actions/create-content-database.ts +40 -30
  217. package/corpus/templates/content/actions/create-document.ts +39 -32
  218. package/corpus/templates/content/actions/duplicate-document-property.ts +37 -28
  219. package/corpus/templates/content/actions/list-notion-database-sources.ts +80 -0
  220. package/corpus/templates/content/actions/move-document.ts +64 -48
  221. package/corpus/templates/content/actions/refresh-content-database-source.ts +42 -3
  222. package/corpus/templates/content/actions/share-local-file-document.ts +36 -27
  223. package/corpus/templates/content/actions/suggest-source-join-key.ts +39 -16
  224. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +89 -23
  225. package/corpus/templates/content/app/components/editor/database/settings.tsx +1 -1
  226. package/corpus/templates/content/app/hooks/use-content-database.ts +18 -1
  227. package/corpus/templates/content/app/i18n/zh-TW.ts +4 -0
  228. package/corpus/templates/content/app/i18n-data.ts +40 -0
  229. package/corpus/templates/content/changelog/2026-07-10-failed-row-creation-and-source-attach-now-show-an-error-inst.md +6 -0
  230. package/corpus/templates/content/changelog/2026-07-10-items-added-at-the-same-time-no-longer-end-up-with-identical.md +6 -0
  231. package/corpus/templates/content/changelog/2026-07-10-notion-databases-can-add-read-only-details-to-content-tables.md +6 -0
  232. package/corpus/templates/content/package.json +1 -2
  233. package/corpus/templates/content/parity/matrix.md +25 -25
  234. package/corpus/templates/content/parity/matrix.ts +1 -0
  235. package/corpus/templates/content/server/routes/api/documents/[id]/move.patch.ts +43 -26
  236. package/corpus/templates/content/shared/api.ts +16 -1
  237. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +8 -4
  238. package/corpus/templates/design/AGENTS.md +12 -2
  239. package/corpus/templates/design/DEVELOPING.md +10 -6
  240. package/corpus/templates/design/actions/apply-visual-edit.ts +191 -6
  241. package/corpus/templates/design/actions/duplicate-design.ts +31 -25
  242. package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +5 -1
  243. package/corpus/templates/design/changelog/2026-07-10-duplicating-a-design-can-no-longer-produce-a-copy-with-missi.md +6 -0
  244. package/corpus/templates/design/changelog/2026-07-10-local-visual-edits-can-now-save-safe-leaf-text-class-and.md +6 -0
  245. package/corpus/templates/design/package.json +1 -1
  246. package/corpus/templates/design/shared/local-jsx-visual-edit.ts +388 -0
  247. package/corpus/templates/dispatch/package.json +1 -2
  248. package/corpus/templates/forms/actions/patch-form-fields.ts +82 -44
  249. package/corpus/templates/forms/changelog/2026-07-10-simultaneous-edits-to-different-form-fields-no-longer-overwr.md +6 -0
  250. package/corpus/templates/forms/package.json +1 -2
  251. package/corpus/templates/macros/package.json +1 -2
  252. package/corpus/templates/mail/app/components/email/EmailThread.tsx +3 -1
  253. package/corpus/templates/mail/changelog/2026-07-10-fixed-calendar-rsvp-buttons-in-emails-firing-duplicate-respo.md +6 -0
  254. package/corpus/templates/mail/package.json +1 -2
  255. package/corpus/templates/plan/actions/restore-plan-version.ts +126 -96
  256. package/corpus/templates/plan/changelog/2026-07-10-restoring-a-plan-version-can-no-longer-leave-a-plan-half-res.md +6 -0
  257. package/corpus/templates/plan/package.json +1 -2
  258. package/corpus/templates/plan/server/plans.ts +9 -2
  259. package/corpus/templates/slides/actions/list-decks.ts +28 -0
  260. package/corpus/templates/slides/app/components/deck/MermaidRenderer.tsx +41 -26
  261. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +4 -8
  262. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +2 -4
  263. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +4 -8
  264. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +5 -12
  265. package/corpus/templates/slides/app/components/editor/HistoryPanel.tsx +3 -6
  266. package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +3 -6
  267. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +2 -5
  268. package/corpus/templates/slides/app/context/DeckContext.tsx +47 -4
  269. package/corpus/templates/slides/app/pages/DeckEditor.tsx +11 -30
  270. package/corpus/templates/slides/app/pages/Index.tsx +2 -3
  271. package/corpus/templates/slides/app/root.tsx +0 -5
  272. package/corpus/templates/slides/changelog/2026-07-10-deck-lists-load-much-faster-and-no-longer-re-download-slide-.md +6 -0
  273. package/corpus/templates/slides/package.json +1 -2
  274. package/dist/a2a/auth-policy.d.ts +19 -0
  275. package/dist/a2a/auth-policy.d.ts.map +1 -1
  276. package/dist/a2a/auth-policy.js +32 -0
  277. package/dist/a2a/auth-policy.js.map +1 -1
  278. package/dist/a2a/client.d.ts +7 -0
  279. package/dist/a2a/client.d.ts.map +1 -1
  280. package/dist/a2a/client.js +2 -1
  281. package/dist/a2a/client.js.map +1 -1
  282. package/dist/agent/durable-background.d.ts +8 -5
  283. package/dist/agent/durable-background.d.ts.map +1 -1
  284. package/dist/agent/durable-background.js +15 -8
  285. package/dist/agent/durable-background.js.map +1 -1
  286. package/dist/agent/production-agent.d.ts +6 -0
  287. package/dist/agent/production-agent.d.ts.map +1 -1
  288. package/dist/agent/production-agent.js +63 -26
  289. package/dist/agent/production-agent.js.map +1 -1
  290. package/dist/agent/run-store.d.ts.map +1 -1
  291. package/dist/agent/run-store.js +9 -4
  292. package/dist/agent/run-store.js.map +1 -1
  293. package/dist/agent/thread-data-builder.d.ts +1 -0
  294. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  295. package/dist/agent/thread-data-builder.js +6 -5
  296. package/dist/agent/thread-data-builder.js.map +1 -1
  297. package/dist/audit/actions/export-audit-events.d.ts +27 -0
  298. package/dist/audit/actions/export-audit-events.d.ts.map +1 -0
  299. package/dist/audit/actions/export-audit-events.js +144 -0
  300. package/dist/audit/actions/export-audit-events.js.map +1 -0
  301. package/dist/audit/store.d.ts +1 -0
  302. package/dist/audit/store.d.ts.map +1 -1
  303. package/dist/audit/store.js +8 -3
  304. package/dist/audit/store.js.map +1 -1
  305. package/dist/audit/types.d.ts +3 -0
  306. package/dist/audit/types.d.ts.map +1 -1
  307. package/dist/audit/types.js.map +1 -1
  308. package/dist/chat-threads/store.d.ts +10 -0
  309. package/dist/chat-threads/store.d.ts.map +1 -1
  310. package/dist/chat-threads/store.js +6 -0
  311. package/dist/chat-threads/store.js.map +1 -1
  312. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  313. package/dist/cli/code-agent-executor.js +1 -0
  314. package/dist/cli/code-agent-executor.js.map +1 -1
  315. package/dist/cli/code-agent-runs.d.ts +12 -0
  316. package/dist/cli/code-agent-runs.d.ts.map +1 -1
  317. package/dist/cli/code-agent-runs.js +1 -0
  318. package/dist/cli/code-agent-runs.js.map +1 -1
  319. package/dist/cli/doctor.d.ts +83 -0
  320. package/dist/cli/doctor.d.ts.map +1 -0
  321. package/dist/cli/doctor.js +277 -0
  322. package/dist/cli/doctor.js.map +1 -0
  323. package/dist/cli/index.js +50 -0
  324. package/dist/cli/index.js.map +1 -1
  325. package/dist/cli/info.js +3 -3
  326. package/dist/cli/info.js.map +1 -1
  327. package/dist/cli/package-lifecycle.d.ts +50 -0
  328. package/dist/cli/package-lifecycle.d.ts.map +1 -0
  329. package/dist/cli/package-lifecycle.js +560 -0
  330. package/dist/cli/package-lifecycle.js.map +1 -0
  331. package/dist/client/AgentPanel.d.ts.map +1 -1
  332. package/dist/client/AgentPanel.js +3 -3
  333. package/dist/client/AgentPanel.js.map +1 -1
  334. package/dist/client/AssistantChat.d.ts +11 -0
  335. package/dist/client/AssistantChat.d.ts.map +1 -1
  336. package/dist/client/AssistantChat.js +7 -4
  337. package/dist/client/AssistantChat.js.map +1 -1
  338. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  339. package/dist/client/MultiTabAssistantChat.js +83 -10
  340. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  341. package/dist/client/agent-chat-adapter.js +7 -3
  342. package/dist/client/agent-chat-adapter.js.map +1 -1
  343. package/dist/client/chat/ChatHistoryList.d.ts +88 -0
  344. package/dist/client/chat/ChatHistoryList.d.ts.map +1 -0
  345. package/dist/client/chat/ChatHistoryList.js +83 -0
  346. package/dist/client/chat/ChatHistoryList.js.map +1 -0
  347. package/dist/client/chat/index.d.ts +1 -0
  348. package/dist/client/chat/index.d.ts.map +1 -1
  349. package/dist/client/chat/index.js +1 -0
  350. package/dist/client/chat/index.js.map +1 -1
  351. package/dist/client/chat/tool-call-display.d.ts +13 -1
  352. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  353. package/dist/client/chat/tool-call-display.js +10 -2
  354. package/dist/client/chat/tool-call-display.js.map +1 -1
  355. package/dist/client/code-agent-chat-adapter.d.ts +17 -1
  356. package/dist/client/code-agent-chat-adapter.d.ts.map +1 -1
  357. package/dist/client/code-agent-chat-adapter.js +47 -3
  358. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  359. package/dist/client/composer/RealtimeVoiceMode.d.ts +11 -1
  360. package/dist/client/composer/RealtimeVoiceMode.d.ts.map +1 -1
  361. package/dist/client/composer/RealtimeVoiceMode.js +5 -3
  362. package/dist/client/composer/RealtimeVoiceMode.js.map +1 -1
  363. package/dist/client/composer/TiptapComposer.d.ts +25 -2
  364. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  365. package/dist/client/composer/TiptapComposer.js +96 -5
  366. package/dist/client/composer/TiptapComposer.js.map +1 -1
  367. package/dist/client/composer/VoiceButton.d.ts.map +1 -1
  368. package/dist/client/composer/VoiceButton.js +21 -1
  369. package/dist/client/composer/VoiceButton.js.map +1 -1
  370. package/dist/client/composer/useRealtimeVoiceMode.d.ts.map +1 -1
  371. package/dist/client/composer/useRealtimeVoiceMode.js +5 -0
  372. package/dist/client/composer/useRealtimeVoiceMode.js.map +1 -1
  373. package/dist/client/conversation/code-agent-transcript.d.ts +2 -0
  374. package/dist/client/conversation/code-agent-transcript.d.ts.map +1 -1
  375. package/dist/client/conversation/code-agent-transcript.js +3 -5
  376. package/dist/client/conversation/code-agent-transcript.js.map +1 -1
  377. package/dist/client/guided-questions.d.ts.map +1 -1
  378. package/dist/client/guided-questions.js +2 -1
  379. package/dist/client/guided-questions.js.map +1 -1
  380. package/dist/client/index.d.ts +3 -1
  381. package/dist/client/index.d.ts.map +1 -1
  382. package/dist/client/index.js +3 -1
  383. package/dist/client/index.js.map +1 -1
  384. package/dist/client/use-chat-threads.d.ts.map +1 -1
  385. package/dist/client/use-chat-threads.js +9 -1
  386. package/dist/client/use-chat-threads.js.map +1 -1
  387. package/dist/client/voice-provider-status.d.ts +10 -0
  388. package/dist/client/voice-provider-status.d.ts.map +1 -0
  389. package/dist/client/voice-provider-status.js +32 -0
  390. package/dist/client/voice-provider-status.js.map +1 -0
  391. package/dist/code-agents/transcript-normalizer.d.ts +29 -0
  392. package/dist/code-agents/transcript-normalizer.d.ts.map +1 -1
  393. package/dist/code-agents/transcript-normalizer.js +55 -0
  394. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  395. package/dist/collab/routes.d.ts +1 -1
  396. package/dist/deploy/build.d.ts.map +1 -1
  397. package/dist/deploy/build.js +13 -11
  398. package/dist/deploy/build.js.map +1 -1
  399. package/dist/guards/db-tool-scoping.d.ts +38 -0
  400. package/dist/guards/db-tool-scoping.d.ts.map +1 -0
  401. package/dist/guards/db-tool-scoping.js +114 -0
  402. package/dist/guards/db-tool-scoping.js.map +1 -0
  403. package/dist/guards/index.d.ts +23 -0
  404. package/dist/guards/index.d.ts.map +1 -0
  405. package/dist/guards/index.js +19 -0
  406. package/dist/guards/index.js.map +1 -0
  407. package/dist/guards/no-drizzle-push.d.ts +14 -0
  408. package/dist/guards/no-drizzle-push.d.ts.map +1 -0
  409. package/dist/guards/no-drizzle-push.js +97 -0
  410. package/dist/guards/no-drizzle-push.js.map +1 -0
  411. package/dist/guards/no-env-credentials.d.ts +36 -0
  412. package/dist/guards/no-env-credentials.d.ts.map +1 -0
  413. package/dist/guards/no-env-credentials.js +204 -0
  414. package/dist/guards/no-env-credentials.js.map +1 -0
  415. package/dist/guards/no-env-mutation.d.ts +23 -0
  416. package/dist/guards/no-env-mutation.d.ts.map +1 -0
  417. package/dist/guards/no-env-mutation.js +90 -0
  418. package/dist/guards/no-env-mutation.js.map +1 -0
  419. package/dist/guards/no-localhost-fallback.d.ts +30 -0
  420. package/dist/guards/no-localhost-fallback.d.ts.map +1 -0
  421. package/dist/guards/no-localhost-fallback.js +105 -0
  422. package/dist/guards/no-localhost-fallback.js.map +1 -0
  423. package/dist/guards/no-unscoped-credentials.d.ts +28 -0
  424. package/dist/guards/no-unscoped-credentials.d.ts.map +1 -0
  425. package/dist/guards/no-unscoped-credentials.js +199 -0
  426. package/dist/guards/no-unscoped-credentials.js.map +1 -0
  427. package/dist/guards/no-unscoped-queries.d.ts +32 -0
  428. package/dist/guards/no-unscoped-queries.d.ts.map +1 -0
  429. package/dist/guards/no-unscoped-queries.js +720 -0
  430. package/dist/guards/no-unscoped-queries.js.map +1 -0
  431. package/dist/guards/scan-utils.d.ts +28 -0
  432. package/dist/guards/scan-utils.d.ts.map +1 -0
  433. package/dist/guards/scan-utils.js +92 -0
  434. package/dist/guards/scan-utils.js.map +1 -0
  435. package/dist/guards/types.d.ts +28 -0
  436. package/dist/guards/types.d.ts.map +1 -0
  437. package/dist/guards/types.js +11 -0
  438. package/dist/guards/types.js.map +1 -0
  439. package/dist/integrations/a2a-continuation-processor.d.ts.map +1 -1
  440. package/dist/integrations/a2a-continuation-processor.js +25 -5
  441. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  442. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  443. package/dist/integrations/adapters/slack.js +55 -21
  444. package/dist/integrations/adapters/slack.js.map +1 -1
  445. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  446. package/dist/integrations/webhook-handler.js +11 -0
  447. package/dist/integrations/webhook-handler.js.map +1 -1
  448. package/dist/localization/default-messages.d.ts +5 -0
  449. package/dist/localization/default-messages.d.ts.map +1 -1
  450. package/dist/localization/default-messages.js +5 -0
  451. package/dist/localization/default-messages.js.map +1 -1
  452. package/dist/notifications/routes.d.ts +2 -2
  453. package/dist/observability/hosted-model-experiment.d.ts +39 -0
  454. package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
  455. package/dist/observability/hosted-model-experiment.js +90 -0
  456. package/dist/observability/hosted-model-experiment.js.map +1 -0
  457. package/dist/observability/routes.d.ts +1 -1
  458. package/dist/observability/routes.d.ts.map +1 -1
  459. package/dist/observability/routes.js +16 -0
  460. package/dist/observability/routes.js.map +1 -1
  461. package/dist/observability/store.d.ts.map +1 -1
  462. package/dist/observability/store.js +4 -1
  463. package/dist/observability/store.js.map +1 -1
  464. package/dist/observability/traces.d.ts +6 -0
  465. package/dist/observability/traces.d.ts.map +1 -1
  466. package/dist/observability/traces.js +28 -2
  467. package/dist/observability/traces.js.map +1 -1
  468. package/dist/org/accept-pending.d.ts.map +1 -1
  469. package/dist/org/accept-pending.js +9 -1
  470. package/dist/org/accept-pending.js.map +1 -1
  471. package/dist/org/migrations.d.ts +7 -2
  472. package/dist/org/migrations.d.ts.map +1 -1
  473. package/dist/org/migrations.js +41 -0
  474. package/dist/org/migrations.js.map +1 -1
  475. package/dist/package-lifecycle/index.d.ts +2 -0
  476. package/dist/package-lifecycle/index.d.ts.map +1 -0
  477. package/dist/package-lifecycle/index.js +2 -0
  478. package/dist/package-lifecycle/index.js.map +1 -0
  479. package/dist/package-lifecycle/manifest.d.ts +24 -0
  480. package/dist/package-lifecycle/manifest.d.ts.map +1 -0
  481. package/dist/package-lifecycle/manifest.js +81 -0
  482. package/dist/package-lifecycle/manifest.js.map +1 -0
  483. package/dist/progress/routes.d.ts +1 -1
  484. package/dist/provider-api/custom-registry.d.ts +32 -1
  485. package/dist/provider-api/custom-registry.d.ts.map +1 -1
  486. package/dist/provider-api/custom-registry.js +41 -1
  487. package/dist/provider-api/custom-registry.js.map +1 -1
  488. package/dist/provider-api/index.d.ts +1 -1
  489. package/dist/provider-api/index.d.ts.map +1 -1
  490. package/dist/provider-api/index.js +1 -1
  491. package/dist/provider-api/index.js.map +1 -1
  492. package/dist/resources/handlers.d.ts +1 -1
  493. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  494. package/dist/scripts/agent-engines/list-agent-engines.js +19 -1
  495. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  496. package/dist/scripts/call-agent.d.ts.map +1 -1
  497. package/dist/scripts/call-agent.js +43 -3
  498. package/dist/scripts/call-agent.js.map +1 -1
  499. package/dist/scripts/chat/search-chats.d.ts +1 -1
  500. package/dist/scripts/chat/search-chats.d.ts.map +1 -1
  501. package/dist/scripts/chat/search-chats.js +11 -8
  502. package/dist/scripts/chat/search-chats.js.map +1 -1
  503. package/dist/secrets/register-framework-secrets.js +1 -1
  504. package/dist/secrets/register-framework-secrets.js.map +1 -1
  505. package/dist/secrets/storage.d.ts.map +1 -1
  506. package/dist/secrets/storage.js +45 -27
  507. package/dist/secrets/storage.js.map +1 -1
  508. package/dist/server/action-discovery.d.ts.map +1 -1
  509. package/dist/server/action-discovery.js +4 -0
  510. package/dist/server/action-discovery.js.map +1 -1
  511. package/dist/server/agent-chat-plugin.d.ts +11 -0
  512. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  513. package/dist/server/agent-chat-plugin.js +74 -19
  514. package/dist/server/agent-chat-plugin.js.map +1 -1
  515. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  516. package/dist/server/core-routes-plugin.d.ts +3 -0
  517. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  518. package/dist/server/core-routes-plugin.js +36 -12
  519. package/dist/server/core-routes-plugin.js.map +1 -1
  520. package/dist/server/csrf.d.ts.map +1 -1
  521. package/dist/server/csrf.js +18 -5
  522. package/dist/server/csrf.js.map +1 -1
  523. package/dist/server/framework-request-handler.d.ts.map +1 -1
  524. package/dist/server/framework-request-handler.js +34 -0
  525. package/dist/server/framework-request-handler.js.map +1 -1
  526. package/dist/server/google-realtime-session.d.ts.map +1 -1
  527. package/dist/server/google-realtime-session.js +2 -34
  528. package/dist/server/google-realtime-session.js.map +1 -1
  529. package/dist/server/poll.d.ts.map +1 -1
  530. package/dist/server/poll.js +24 -2
  531. package/dist/server/poll.js.map +1 -1
  532. package/dist/server/realtime-voice.d.ts.map +1 -1
  533. package/dist/server/realtime-voice.js +64 -21
  534. package/dist/server/realtime-voice.js.map +1 -1
  535. package/dist/server/request-origin.d.ts +10 -0
  536. package/dist/server/request-origin.d.ts.map +1 -0
  537. package/dist/server/request-origin.js +60 -0
  538. package/dist/server/request-origin.js.map +1 -0
  539. package/dist/server/transcribe-voice.d.ts.map +1 -1
  540. package/dist/server/transcribe-voice.js +2 -48
  541. package/dist/server/transcribe-voice.js.map +1 -1
  542. package/dist/server/voice-providers-status.d.ts.map +1 -1
  543. package/dist/server/voice-providers-status.js +2 -3
  544. package/dist/server/voice-providers-status.js.map +1 -1
  545. package/dist/shared/cache-control.d.ts +4 -6
  546. package/dist/shared/cache-control.d.ts.map +1 -1
  547. package/dist/shared/cache-control.js +2 -7
  548. package/dist/shared/cache-control.js.map +1 -1
  549. package/dist/styles/agent-native.css +1 -0
  550. package/dist/styles/chat-history-list.css +313 -0
  551. package/dist/templates/default/package.json +2 -2
  552. package/dist/templates/headless/package.json +0 -1
  553. package/dist/templates/workspace-core/.agents/skills/audit-log/SKILL.md +3 -0
  554. package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +1 -1
  555. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +20 -0
  556. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +8 -4
  557. package/dist/templates/workspace-core/package.json +0 -1
  558. package/dist/templates/workspace-root/package.json +0 -1
  559. package/dist/triggers/actions.d.ts.map +1 -1
  560. package/dist/triggers/actions.js +8 -3
  561. package/dist/triggers/actions.js.map +1 -1
  562. package/dist/triggers/types.d.ts +7 -1
  563. package/dist/triggers/types.d.ts.map +1 -1
  564. package/dist/triggers/types.js.map +1 -1
  565. package/dist/vite/client.d.ts.map +1 -1
  566. package/dist/vite/client.js +1 -0
  567. package/dist/vite/client.js.map +1 -1
  568. package/docs/content/audit-log.mdx +2 -1
  569. package/docs/content/automations.mdx +7 -7
  570. package/docs/content/creating-templates.mdx +1 -1
  571. package/docs/content/internationalization.mdx +2 -1
  572. package/docs/content/locales/ar-SA/audit-log.mdx +2 -1
  573. package/docs/content/locales/ar-SA/automations.mdx +7 -7
  574. package/docs/content/locales/ar-SA/getting-started.mdx +7 -1
  575. package/docs/content/locales/ar-SA/internationalization.mdx +1 -1
  576. package/docs/content/locales/ar-SA/package-lifecycle.mdx +19 -0
  577. package/docs/content/locales/ar-SA/sandbox-adapters.mdx +18 -7
  578. package/docs/content/locales/ar-SA/security.mdx +8 -0
  579. package/docs/content/locales/de-DE/audit-log.mdx +2 -1
  580. package/docs/content/locales/de-DE/automations.mdx +7 -7
  581. package/docs/content/locales/de-DE/getting-started.mdx +7 -1
  582. package/docs/content/locales/de-DE/internationalization.mdx +1 -1
  583. package/docs/content/locales/de-DE/package-lifecycle.mdx +22 -0
  584. package/docs/content/locales/de-DE/sandbox-adapters.mdx +18 -7
  585. package/docs/content/locales/de-DE/security.mdx +8 -0
  586. package/docs/content/locales/es-ES/audit-log.mdx +2 -1
  587. package/docs/content/locales/es-ES/automations.mdx +7 -7
  588. package/docs/content/locales/es-ES/getting-started.mdx +7 -1
  589. package/docs/content/locales/es-ES/internationalization.mdx +1 -1
  590. package/docs/content/locales/es-ES/package-lifecycle.mdx +22 -0
  591. package/docs/content/locales/es-ES/sandbox-adapters.mdx +18 -7
  592. package/docs/content/locales/es-ES/security.mdx +8 -0
  593. package/docs/content/locales/fr-FR/audit-log.mdx +2 -1
  594. package/docs/content/locales/fr-FR/automations.mdx +7 -7
  595. package/docs/content/locales/fr-FR/getting-started.mdx +7 -1
  596. package/docs/content/locales/fr-FR/internationalization.mdx +1 -1
  597. package/docs/content/locales/fr-FR/package-lifecycle.mdx +21 -0
  598. package/docs/content/locales/fr-FR/sandbox-adapters.mdx +19 -8
  599. package/docs/content/locales/fr-FR/security.mdx +8 -0
  600. package/docs/content/locales/hi-IN/audit-log.mdx +2 -1
  601. package/docs/content/locales/hi-IN/automations.mdx +7 -7
  602. package/docs/content/locales/hi-IN/getting-started.mdx +7 -1
  603. package/docs/content/locales/hi-IN/internationalization.mdx +1 -1
  604. package/docs/content/locales/hi-IN/package-lifecycle.mdx +20 -0
  605. package/docs/content/locales/hi-IN/sandbox-adapters.mdx +18 -7
  606. package/docs/content/locales/hi-IN/security.mdx +8 -0
  607. package/docs/content/locales/ja-JP/audit-log.mdx +2 -1
  608. package/docs/content/locales/ja-JP/automations.mdx +7 -7
  609. package/docs/content/locales/ja-JP/getting-started.mdx +7 -1
  610. package/docs/content/locales/ja-JP/internationalization.mdx +1 -1
  611. package/docs/content/locales/ja-JP/package-lifecycle.mdx +21 -0
  612. package/docs/content/locales/ja-JP/sandbox-adapters.mdx +17 -6
  613. package/docs/content/locales/ja-JP/security.mdx +8 -0
  614. package/docs/content/locales/ko-KR/audit-log.mdx +2 -1
  615. package/docs/content/locales/ko-KR/automations.mdx +7 -7
  616. package/docs/content/locales/ko-KR/getting-started.mdx +7 -1
  617. package/docs/content/locales/ko-KR/internationalization.mdx +1 -1
  618. package/docs/content/locales/ko-KR/package-lifecycle.mdx +20 -0
  619. package/docs/content/locales/ko-KR/sandbox-adapters.mdx +17 -6
  620. package/docs/content/locales/ko-KR/security.mdx +8 -0
  621. package/docs/content/locales/pt-BR/audit-log.mdx +2 -1
  622. package/docs/content/locales/pt-BR/automations.mdx +7 -7
  623. package/docs/content/locales/pt-BR/getting-started.mdx +7 -1
  624. package/docs/content/locales/pt-BR/internationalization.mdx +1 -1
  625. package/docs/content/locales/pt-BR/package-lifecycle.mdx +21 -0
  626. package/docs/content/locales/pt-BR/sandbox-adapters.mdx +18 -7
  627. package/docs/content/locales/pt-BR/security.mdx +8 -0
  628. package/docs/content/locales/zh-CN/audit-log.mdx +2 -1
  629. package/docs/content/locales/zh-CN/automations.mdx +7 -7
  630. package/docs/content/locales/zh-CN/getting-started.mdx +6 -4
  631. package/docs/content/locales/zh-CN/internationalization.mdx +1 -1
  632. package/docs/content/locales/zh-CN/package-lifecycle.mdx +19 -0
  633. package/docs/content/locales/zh-CN/sandbox-adapters.mdx +17 -6
  634. package/docs/content/locales/zh-CN/security.mdx +8 -0
  635. package/docs/content/locales/zh-TW/audit-log.mdx +2 -1
  636. package/docs/content/locales/zh-TW/automations.mdx +7 -7
  637. package/docs/content/locales/zh-TW/getting-started.mdx +6 -4
  638. package/docs/content/locales/zh-TW/internationalization.mdx +1 -1
  639. package/docs/content/locales/zh-TW/package-lifecycle.mdx +19 -0
  640. package/docs/content/locales/zh-TW/sandbox-adapters.mdx +18 -7
  641. package/docs/content/locales/zh-TW/security.mdx +8 -0
  642. package/docs/content/package-lifecycle.mdx +51 -0
  643. package/docs/content/sandbox-adapters.mdx +16 -5
  644. package/package.json +12 -3
  645. package/src/templates/default/package.json +2 -2
  646. package/src/templates/headless/package.json +0 -1
  647. package/src/templates/workspace-core/.agents/skills/audit-log/SKILL.md +3 -0
  648. package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +1 -1
  649. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +20 -0
  650. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +8 -4
  651. package/src/templates/workspace-core/package.json +0 -1
  652. package/src/templates/workspace-root/package.json +0 -1
  653. package/corpus/templates/slides/app/components/ui/toast.tsx +0 -1
  654. package/corpus/templates/slides/app/components/ui/toaster.tsx +0 -1
  655. package/corpus/templates/slides/app/hooks/use-toast.ts +0 -1
@@ -0,0 +1,404 @@
1
+ import {
2
+ IconDots,
3
+ IconPencil,
4
+ IconPinned,
5
+ IconPinnedOff,
6
+ IconSearch,
7
+ IconTrash,
8
+ } from "@tabler/icons-react";
9
+ import React, { useEffect, useRef, useState } from "react";
10
+
11
+ import { cn } from "../utils.js";
12
+
13
+ /** A single row in a chat history list. Purely data — no fetching, no
14
+ * assistant-ui context. Formatting (relative time, "Active"/"Open" labels,
15
+ * status spinners) is the caller's responsibility; hand in the already
16
+ * rendered node via `timestamp`. */
17
+ export interface ChatHistoryItem {
18
+ id: string;
19
+ title: React.ReactNode;
20
+ /** Plain-text form of `title`, used to seed the inline rename input.
21
+ * Only needed when `onRename` is supplied. */
22
+ titleText?: string;
23
+ /** Secondary line — e.g. a message preview. */
24
+ subtitle?: React.ReactNode;
25
+ /** Tertiary line — e.g. a scope/folder label. */
26
+ detail?: React.ReactNode;
27
+ /** Pre-formatted trailing value: a relative time, "Active"/"Open", or a
28
+ * status node (spinner, unread dot). This component does not format
29
+ * dates or compute status itself. */
30
+ timestamp?: React.ReactNode;
31
+ pinned?: boolean;
32
+ disabled?: boolean;
33
+ }
34
+
35
+ export interface ChatHistorySection {
36
+ id: string;
37
+ label?: React.ReactNode;
38
+ items: ChatHistoryItem[];
39
+ }
40
+
41
+ export interface ChatHistoryListProps {
42
+ /** Flat item list. Ignored when `sections` is provided. */
43
+ items?: ChatHistoryItem[];
44
+ /** Grouped item list (e.g. "This deck" / "All chats", or pinned/recent). */
45
+ sections?: ChatHistorySection[];
46
+ /** Id of the currently active/selected item — highlighted in the list. */
47
+ activeId?: string | null;
48
+ onSelect: (id: string) => void;
49
+ /** Fired on double-click / explicit "open" gesture, distinct from select. */
50
+ onOpen?: (id: string) => void;
51
+ /** Presence enables the pin/unpin row action. */
52
+ onTogglePin?: (id: string) => void;
53
+ /** Presence enables the inline "Rename" row action. */
54
+ onRename?: (id: string, nextTitle: string) => void;
55
+ /** Presence enables the "Delete" row action. */
56
+ onDelete?: (id: string) => void;
57
+ /** Escape hatch: fully custom row action menu content, replacing the
58
+ * built-in rename/pin/delete items. Still gated by the trigger button,
59
+ * which shows whenever this or any of the on* callbacks above is set. */
60
+ renderRowActions?: (item: ChatHistoryItem) => React.ReactNode;
61
+
62
+ /** Controlled search input. Omit `onSearchChange` to hide the search box
63
+ * entirely and let the host render its own (results are always supplied
64
+ * by the caller via `items`/`sections` either way). */
65
+ searchValue?: string;
66
+ onSearchChange?: (value: string) => void;
67
+ searchPlaceholder?: string;
68
+ searchInputRef?: React.Ref<HTMLInputElement>;
69
+
70
+ /** True while results are being fetched — shows `loadingLabel` instead of
71
+ * the list. */
72
+ loading?: boolean;
73
+ loadingLabel?: React.ReactNode;
74
+ /** Shown instead of the list when set (takes priority over `loading`). */
75
+ error?: React.ReactNode;
76
+ emptyLabel?: React.ReactNode;
77
+ /** Shown instead of `emptyLabel` when `searchValue` is non-empty. */
78
+ emptySearchLabel?: React.ReactNode;
79
+
80
+ /** Rendered after the list, inside the scroll container (e.g. a
81
+ * "Load older chats" button). */
82
+ footer?: React.ReactNode;
83
+
84
+ /** "popover" (default) matches core's compact HistoryPopover list.
85
+ * "rail" is a denser variant with a solid active background, closer to
86
+ * a sidebar run rail. */
87
+ variant?: "popover" | "rail";
88
+ className?: string;
89
+ listClassName?: string;
90
+ }
91
+
92
+ /**
93
+ * Presentational chat history list shared by core's `HistoryPopover`
94
+ * (MultiTabAssistantChat.tsx) and Agent-Native Code's run rail
95
+ * (code-agents-ui). Styling is driven by stable `an-chat-history*` class
96
+ * names (see `styles/chat-history-list.css`) rather than Tailwind utilities
97
+ * so the same component renders correctly in a Tailwind host and in
98
+ * code-agents-ui's plain-CSS host.
99
+ *
100
+ * This component owns no data: search filtering, pin/rename persistence,
101
+ * and time formatting all stay with the caller. It only renders whatever
102
+ * `items`/`sections` it is given, plus the optional search box and
103
+ * loading/empty/error states.
104
+ */
105
+ export function ChatHistoryList({
106
+ items,
107
+ sections,
108
+ activeId = null,
109
+ onSelect,
110
+ onOpen,
111
+ onTogglePin,
112
+ onRename,
113
+ onDelete,
114
+ renderRowActions,
115
+ searchValue,
116
+ onSearchChange,
117
+ searchPlaceholder = "Search chats...",
118
+ searchInputRef,
119
+ loading = false,
120
+ loadingLabel = "Searching...",
121
+ error,
122
+ emptyLabel = "No chats yet",
123
+ emptySearchLabel = "No matching chats",
124
+ footer,
125
+ variant = "popover",
126
+ className,
127
+ listClassName,
128
+ }: ChatHistoryListProps) {
129
+ const resolvedSections: ChatHistorySection[] =
130
+ sections ?? (items ? [{ id: "default", items }] : []);
131
+ const totalCount = resolvedSections.reduce(
132
+ (sum, section) => sum + section.items.length,
133
+ 0,
134
+ );
135
+ const hasSearchValue = Boolean(searchValue?.trim());
136
+
137
+ return (
138
+ <div
139
+ className={cn(
140
+ "an-chat-history",
141
+ variant === "rail" && "an-chat-history--rail",
142
+ className,
143
+ )}
144
+ data-agent-native="chat-history-list"
145
+ >
146
+ {onSearchChange && (
147
+ <div className="an-chat-history__search">
148
+ <IconSearch size={13} className="an-chat-history__search-icon" />
149
+ <input
150
+ ref={searchInputRef}
151
+ type="text"
152
+ value={searchValue ?? ""}
153
+ onChange={(event) => onSearchChange(event.target.value)}
154
+ placeholder={searchPlaceholder}
155
+ aria-label={searchPlaceholder}
156
+ className="an-chat-history__search-input"
157
+ />
158
+ </div>
159
+ )}
160
+ <div className={cn("an-chat-history__list", listClassName)}>
161
+ {error ? (
162
+ <div className="an-chat-history__state an-chat-history__state--error">
163
+ {error}
164
+ </div>
165
+ ) : loading ? (
166
+ <div className="an-chat-history__state">{loadingLabel}</div>
167
+ ) : totalCount === 0 ? (
168
+ <div className="an-chat-history__state">
169
+ {hasSearchValue ? emptySearchLabel : emptyLabel}
170
+ </div>
171
+ ) : (
172
+ resolvedSections.map(
173
+ (section) =>
174
+ section.items.length > 0 && (
175
+ <div key={section.id} className="an-chat-history__section">
176
+ {section.label && (
177
+ <div className="an-chat-history__section-label">
178
+ {section.label}
179
+ </div>
180
+ )}
181
+ {section.items.map((item) => (
182
+ <ChatHistoryRow
183
+ key={item.id}
184
+ item={item}
185
+ active={item.id === activeId}
186
+ onSelect={onSelect}
187
+ onOpen={onOpen}
188
+ onTogglePin={onTogglePin}
189
+ onRename={onRename}
190
+ onDelete={onDelete}
191
+ renderRowActions={renderRowActions}
192
+ />
193
+ ))}
194
+ </div>
195
+ ),
196
+ )
197
+ )}
198
+ {footer}
199
+ </div>
200
+ </div>
201
+ );
202
+ }
203
+
204
+ function ChatHistoryRow({
205
+ item,
206
+ active,
207
+ onSelect,
208
+ onOpen,
209
+ onTogglePin,
210
+ onRename,
211
+ onDelete,
212
+ renderRowActions,
213
+ }: {
214
+ item: ChatHistoryItem;
215
+ active: boolean;
216
+ onSelect: (id: string) => void;
217
+ onOpen?: (id: string) => void;
218
+ onTogglePin?: (id: string) => void;
219
+ onRename?: (id: string, nextTitle: string) => void;
220
+ onDelete?: (id: string) => void;
221
+ renderRowActions?: (item: ChatHistoryItem) => React.ReactNode;
222
+ }) {
223
+ const [isRenaming, setIsRenaming] = useState(false);
224
+ const [draftTitle, setDraftTitle] = useState("");
225
+ const [menuOpen, setMenuOpen] = useState(false);
226
+ const renameInputRef = useRef<HTMLInputElement | null>(null);
227
+ const menuRef = useRef<HTMLDivElement | null>(null);
228
+
229
+ const hasMenu = Boolean(
230
+ onTogglePin || onRename || onDelete || renderRowActions,
231
+ );
232
+
233
+ useEffect(() => {
234
+ if (!menuOpen) return;
235
+ function handlePointerDown(event: PointerEvent) {
236
+ if (menuRef.current && !menuRef.current.contains(event.target as Node)) {
237
+ setMenuOpen(false);
238
+ }
239
+ }
240
+ function handleKeyDown(event: KeyboardEvent) {
241
+ if (event.key === "Escape") setMenuOpen(false);
242
+ }
243
+ document.addEventListener("pointerdown", handlePointerDown);
244
+ document.addEventListener("keydown", handleKeyDown);
245
+ return () => {
246
+ document.removeEventListener("pointerdown", handlePointerDown);
247
+ document.removeEventListener("keydown", handleKeyDown);
248
+ };
249
+ }, [menuOpen]);
250
+
251
+ function startRename() {
252
+ setDraftTitle(item.titleText ?? "");
253
+ setIsRenaming(true);
254
+ setMenuOpen(false);
255
+ window.requestAnimationFrame(() => {
256
+ renameInputRef.current?.select();
257
+ });
258
+ }
259
+
260
+ function commitRename() {
261
+ const trimmed = draftTitle.trim();
262
+ setIsRenaming(false);
263
+ if (trimmed && trimmed !== item.titleText) {
264
+ onRename?.(item.id, trimmed);
265
+ }
266
+ }
267
+
268
+ function handleRenameKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {
269
+ if (event.key === "Enter") {
270
+ event.preventDefault();
271
+ commitRename();
272
+ } else if (event.key === "Escape") {
273
+ event.preventDefault();
274
+ setIsRenaming(false);
275
+ }
276
+ }
277
+
278
+ return (
279
+ <div
280
+ className={cn(
281
+ "an-chat-history-row",
282
+ active && "an-chat-history-row--active",
283
+ item.pinned && "an-chat-history-row--pinned",
284
+ isRenaming && "an-chat-history-row--renaming",
285
+ item.disabled && "an-chat-history-row--disabled",
286
+ )}
287
+ >
288
+ {isRenaming ? (
289
+ <div className="an-chat-history-row__rename">
290
+ <input
291
+ ref={renameInputRef}
292
+ className="an-chat-history-row__rename-input"
293
+ value={draftTitle}
294
+ onChange={(event) => setDraftTitle(event.target.value)}
295
+ onKeyDown={handleRenameKeyDown}
296
+ onBlur={commitRename}
297
+ autoFocus
298
+ aria-label="Rename chat"
299
+ />
300
+ </div>
301
+ ) : (
302
+ <button
303
+ type="button"
304
+ className="an-chat-history-row__button"
305
+ onClick={() => !item.disabled && onSelect(item.id)}
306
+ onDoubleClick={() => !item.disabled && onOpen?.(item.id)}
307
+ disabled={item.disabled}
308
+ >
309
+ <div className="an-chat-history-row__topline">
310
+ <span className="an-chat-history-row__title">{item.title}</span>
311
+ {item.timestamp != null && (
312
+ <span className="an-chat-history-row__timestamp">
313
+ {item.timestamp}
314
+ </span>
315
+ )}
316
+ </div>
317
+ {item.subtitle != null && (
318
+ <div className="an-chat-history-row__subtitle">{item.subtitle}</div>
319
+ )}
320
+ {item.detail != null && (
321
+ <div className="an-chat-history-row__detail">{item.detail}</div>
322
+ )}
323
+ </button>
324
+ )}
325
+
326
+ {!isRenaming && hasMenu && (
327
+ <div className="an-chat-history-row__menu" ref={menuRef}>
328
+ <button
329
+ type="button"
330
+ className={cn(
331
+ "an-chat-history-row__menu-trigger",
332
+ item.pinned && "an-chat-history-row__menu-trigger--pinned",
333
+ )}
334
+ aria-label="Chat options"
335
+ aria-haspopup="menu"
336
+ aria-expanded={menuOpen}
337
+ onClick={() => setMenuOpen((open) => !open)}
338
+ >
339
+ {item.pinned ? (
340
+ <IconPinned size={13} strokeWidth={1.8} />
341
+ ) : (
342
+ <IconDots size={14} strokeWidth={1.8} />
343
+ )}
344
+ </button>
345
+ {menuOpen && (
346
+ <div className="an-chat-history-row__menu-content" role="menu">
347
+ {renderRowActions ? (
348
+ renderRowActions(item)
349
+ ) : (
350
+ <>
351
+ {onRename && (
352
+ <button
353
+ type="button"
354
+ role="menuitem"
355
+ className="an-chat-history-row__menu-item"
356
+ onClick={startRename}
357
+ >
358
+ <IconPencil size={13} strokeWidth={1.8} />
359
+ <span>Rename</span>
360
+ </button>
361
+ )}
362
+ {onTogglePin && (
363
+ <button
364
+ type="button"
365
+ role="menuitem"
366
+ className="an-chat-history-row__menu-item"
367
+ onClick={() => {
368
+ setMenuOpen(false);
369
+ onTogglePin(item.id);
370
+ }}
371
+ >
372
+ {item.pinned ? (
373
+ <IconPinnedOff size={13} strokeWidth={1.8} />
374
+ ) : (
375
+ <IconPinned size={13} strokeWidth={1.8} />
376
+ )}
377
+ <span>
378
+ {item.pinned ? "Unpin from top" : "Pin to top"}
379
+ </span>
380
+ </button>
381
+ )}
382
+ {onDelete && (
383
+ <button
384
+ type="button"
385
+ role="menuitem"
386
+ className="an-chat-history-row__menu-item an-chat-history-row__menu-item--danger"
387
+ onClick={() => {
388
+ setMenuOpen(false);
389
+ onDelete(item.id);
390
+ }}
391
+ >
392
+ <IconTrash size={13} strokeWidth={1.8} />
393
+ <span>Delete</span>
394
+ </button>
395
+ )}
396
+ </>
397
+ )}
398
+ </div>
399
+ )}
400
+ </div>
401
+ )}
402
+ </div>
403
+ );
404
+ }
@@ -151,5 +151,11 @@ export {
151
151
  type ChatThreadShareState,
152
152
  type UseChatThreadsOptions,
153
153
  } from "../use-chat-threads.js";
154
+ export {
155
+ ChatHistoryList,
156
+ type ChatHistoryItem,
157
+ type ChatHistorySection,
158
+ type ChatHistoryListProps,
159
+ } from "./ChatHistoryList.js";
154
160
  export * from "../composer/index.js";
155
161
  export * from "../conversation/index.js";
@@ -67,11 +67,23 @@ export const ChatRunningContext = React.createContext(false);
67
67
  * Human-in-the-loop approval bridge. `AssistantChatInner` provides a value that
68
68
  * re-issues the turn approving a specific paused tool call (opt-in
69
69
  * `needsApproval` actions). When null, the Approve button is not rendered.
70
- * Deny is handled locally in the affordance, so it needs no bridge.
70
+ * Deny defaults to local-only (the action stays un-run) unless `onDeny` is
71
+ * provided, and "Always allow" only renders when `onAlwaysAllow` is provided
72
+ * — both are additive so existing action-approval consumers are unaffected.
71
73
  */
72
74
  export type ApprovalContextValue = {
73
75
  /** Re-issue the turn so the server runs the approved call. */
74
76
  onApprove: (approvalKey: string) => void;
77
+ /**
78
+ * Optional host hook invoked in addition to the local "denied" state, e.g.
79
+ * so a Code session can also resolve its own pending approval as denied.
80
+ */
81
+ onDeny?: (approvalKey: string) => void;
82
+ /**
83
+ * Optional host hook that persists this exact call so future occurrences
84
+ * skip the approval gate. When absent, no "Always allow" button renders.
85
+ */
86
+ onAlwaysAllow?: (approvalKey: string) => void;
75
87
  };
76
88
  export const ApprovalContext = React.createContext<ApprovalContextValue | null>(
77
89
  null,
@@ -476,7 +488,9 @@ function ApprovalAffordance({
476
488
  </div>
477
489
  );
478
490
  }
479
- // Deny is local-only: the action simply stays un-run.
491
+ // Deny defaults to local-only (the action simply stays un-run). When the
492
+ // host also provided `onDeny` (e.g. a Code session resolving its own
493
+ // pending approval), it fires alongside the local state.
480
494
  if (denied) {
481
495
  return (
482
496
  <div className="mt-1.5 text-xs text-muted-foreground">
@@ -506,9 +520,29 @@ function ApprovalAffordance({
506
520
  Approve
507
521
  </button>
508
522
  )}
523
+ {ctx?.onAlwaysAllow && (
524
+ <button
525
+ type="button"
526
+ onClick={() => {
527
+ setApproved(true);
528
+ ctx.onAlwaysAllow?.(approval.approvalKey);
529
+ }}
530
+ title="Approve and always allow this exact command"
531
+ className={cn(
532
+ "inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1 text-xs font-medium transition-colors",
533
+ "text-foreground hover:bg-muted",
534
+ )}
535
+ >
536
+ <IconShieldCheck className="h-3.5 w-3.5" />
537
+ Always allow
538
+ </button>
539
+ )}
509
540
  <button
510
541
  type="button"
511
- onClick={() => setDenied(true)}
542
+ onClick={() => {
543
+ setDenied(true);
544
+ ctx?.onDeny?.(approval.approvalKey);
545
+ }}
512
546
  className={cn(
513
547
  "inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1 text-xs font-medium transition-colors",
514
548
  "text-foreground hover:bg-muted",
@@ -61,7 +61,14 @@ export interface CodeAgentChatController {
61
61
  }): Promise<CodeAgentChatControlResult>;
62
62
  control(input: {
63
63
  runId: string;
64
- command: "stop";
64
+ /**
65
+ * `"approve"` resolves the run's current pending `needsApproval` gate
66
+ * (see `requestCodeAgentApproval` in `cli/code-agent-executor.ts`) — the
67
+ * same effect as the host UI's "Approve" control. Deny / always-allow are
68
+ * intentionally NOT routed through this method; hosts wire those directly
69
+ * via `AssistantChatProps.approvalActions` instead (see CodeAgentsApp).
70
+ */
71
+ command: "stop" | "approve";
65
72
  }): Promise<CodeAgentChatControlResult>;
66
73
  }
67
74
 
@@ -101,13 +108,24 @@ export function createCodeAgentChatAdapter(
101
108
  const stopOnAbort = options.stopOnAbort === true;
102
109
 
103
110
  return {
104
- async *run({ messages, abortSignal }: ChatModelRunOptions) {
111
+ async *run({ messages, abortSignal, runConfig }: ChatModelRunOptions) {
105
112
  const runId = options.runIdRef.current;
106
113
  if (!runId) {
107
114
  yield errorResult("Select an Agent-Native Code session first.");
108
115
  return;
109
116
  }
110
117
 
118
+ // Human-in-the-loop: `ApprovalContext.onApprove` (tool-call-display.tsx)
119
+ // re-issues the turn carrying the pending approval's key in
120
+ // `approvedToolCalls`, the same mechanism regular SSE agent-chat
121
+ // approvals use. For Code sessions there is no server-side gate to
122
+ // notify — resolve the run's own pending approval directly instead of
123
+ // treating the accompanying "Approved..." text as a new prompt.
124
+ const approvedToolCalls = extractApprovedToolCalls(runConfig);
125
+ const isApprovalTurn = Boolean(
126
+ approvedToolCalls && approvedToolCalls.length > 0,
127
+ );
128
+
111
129
  const lastUserMessage = latestUserMessage(messages);
112
130
  const attachments = lastUserMessage
113
131
  ? extractPromptAttachmentsFromAssistantMessage(lastUserMessage)
@@ -115,7 +133,7 @@ export function createCodeAgentChatAdapter(
115
133
  const prompt =
116
134
  latestUserText(messages).trim() ||
117
135
  (attachments.length > 0 ? "Use the attached context." : "");
118
- if (!prompt.trim()) {
136
+ if (!isApprovalTurn && !prompt.trim()) {
119
137
  yield errorResult("Enter a follow-up prompt.");
120
138
  return;
121
139
  }
@@ -138,7 +156,19 @@ export function createCodeAgentChatAdapter(
138
156
  const seenEventIds = new Set(initialEvents.map((event) => event.id));
139
157
  const tailedEvents: CodeAgentChatTranscriptEvent[] = [];
140
158
 
141
- if (!options.attachOnlyRef?.current) {
159
+ if (isApprovalTurn) {
160
+ const response = await options.controller.control({
161
+ runId,
162
+ command: "approve",
163
+ });
164
+ if (!response.ok) {
165
+ yield errorResult(
166
+ response.error ?? response.message ?? "Could not approve.",
167
+ runId,
168
+ );
169
+ return;
170
+ }
171
+ } else if (!options.attachOnlyRef?.current) {
142
172
  const beforeSendRun = await options.controller.get(runId);
143
173
  const response = await options.controller.sendFollowUp({
144
174
  runId,
@@ -218,6 +248,41 @@ export function createCodeAgentChatAdapter(
218
248
  };
219
249
  }
220
250
 
251
+ function extractApprovedToolCalls(
252
+ runConfig: ChatModelRunOptions["runConfig"] | undefined,
253
+ ): string[] | undefined {
254
+ const raw =
255
+ runConfig?.custom &&
256
+ typeof runConfig.custom === "object" &&
257
+ "approvedToolCalls" in runConfig.custom
258
+ ? (runConfig.custom as { approvedToolCalls?: unknown }).approvedToolCalls
259
+ : undefined;
260
+ if (!Array.isArray(raw)) return undefined;
261
+ const keys = raw.filter(
262
+ (key): key is string => typeof key === "string" && key.length > 0,
263
+ );
264
+ return keys.length > 0 ? keys : undefined;
265
+ }
266
+
267
+ /**
268
+ * Whether any tool-call in this Code transcript currently carries an
269
+ * unresolved approval (see `NormalizedCodeAgentToolEvent.pendingApprovalKey`).
270
+ * Hosts (e.g. `CodeAgentsApp`) use this to keep their standalone approval
271
+ * banner as a fallback only for transcripts where the inline
272
+ * `ApprovalAffordance` cannot be joined to a tool-call part, instead of
273
+ * showing both at once.
274
+ */
275
+ export function codeAgentTranscriptHasPendingApproval(
276
+ events: readonly CodeAgentChatTranscriptEvent[],
277
+ ): boolean {
278
+ const normalized = normalizeCodeAgentTranscript(
279
+ events.map(toCoreCodeAgentTranscriptEvent),
280
+ );
281
+ return normalized.items.some(
282
+ (item) => item.type === "tool" && Boolean(item.pendingApprovalKey),
283
+ );
284
+ }
285
+
221
286
  export function codeAgentTranscriptEventsToContent(
222
287
  events: readonly CodeAgentChatTranscriptEvent[],
223
288
  ): ContentPart[] {
@@ -377,6 +442,9 @@ function toolContentPartForCodeAgentTranscriptItem(
377
442
  : {}),
378
443
  ...(item.mcpApp ? { mcpApp: item.mcpApp } : {}),
379
444
  ...(item.structuredMeta ? { structuredMeta: item.structuredMeta } : {}),
445
+ ...(item.pendingApprovalKey
446
+ ? { approval: { approvalKey: item.pendingApprovalKey } }
447
+ : {}),
380
448
  };
381
449
  }
382
450