@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,720 @@
1
+ /**
2
+ * scanUnscopedQueries — ported from `scripts/guard-no-unscoped-queries.mjs`.
3
+ *
4
+ * Refuse to let any code query an "ownable" resource table (one that
5
+ * spreads `...ownableColumns()`) without going through framework access
6
+ * control: `accessFilter` / `resolveAccess` / `assertAccess`, or an
7
+ * explicit `ownerEmail` / `userEmail` / `orgId` filter. The check is
8
+ * per-STATEMENT, scoped to the enclosing block, so a sibling `if` branch
9
+ * that correctly scopes its query does not defuse an unscoped sibling.
10
+ *
11
+ * Conditional guard — per report 005's V1 guard set table: the original
12
+ * restricts scanning to `templates/[^/]+/(server|actions)/` and
13
+ * `packages/[^/]+/src/`, and hardcodes a `FILE_ALLOWLIST` of this
14
+ * framework's own sharing-primitive implementation files. For a generated
15
+ * app (no `templates/`/`packages/` wrapper — source lives at `actions/`
16
+ * and `server/` under the app root), this port scans `actions/` and
17
+ * `server/` directly and drops the hardcoded allowlist in favor of an
18
+ * optional `extraExemptPaths` param (default `[]`).
19
+ *
20
+ * Opt-out (within the enclosing block, or as a file header for whole-file
21
+ * opt-outs):
22
+ * // guard:allow-unscoped — short reason
23
+ */
24
+ import { readFileSafe, relPosix, walk } from "./scan-utils.js";
25
+ const ACCESS_CONTROL_HELPERS = [
26
+ /\baccessFilter\s*\(/,
27
+ /\bresolveAccess\s*\(/,
28
+ /\bassertAccess\s*\(/,
29
+ /\bgetShareableResource\s*\(/,
30
+ /\baccessFilterForShares\s*\(/,
31
+ ];
32
+ const EXPLICIT_OWNER_FILTERS = [
33
+ /\.\s*ownerEmail\b\s*[,)]/,
34
+ /\.\s*userEmail\b\s*[,)]/,
35
+ /\.\s*orgId\b\s*[,)]/,
36
+ /WHERE[\s\S]*?\bowner_email\b/i,
37
+ /WHERE[\s\S]*?\buser_email\b/i,
38
+ /WHERE[\s\S]*?\borg_id\b/i,
39
+ ];
40
+ const INSERT_OWNER_PATTERNS = [
41
+ /\bownerEmail\s*:/,
42
+ /\bownerEmail\s*[,}]/,
43
+ /\buserEmail\s*[:,}]/,
44
+ /\borgId\s*[:,}]/,
45
+ ];
46
+ const OPT_OUT_MARKER = /\/\/\s*guard:allow-unscoped\b/;
47
+ const BLOCK_OWNERSHIP_SIGNALS = [
48
+ /\bgetRequestUserEmail\s*\(/,
49
+ /\bgetRequestOrgId\s*\(/,
50
+ /\bgetCurrentUserEmail\s*\(/,
51
+ /\bgetCurrentOwnerEmail\s*\(/,
52
+ /\brunWithRequestContext\s*\(/,
53
+ ];
54
+ function extractTableCalls(contents) {
55
+ const out = [];
56
+ const headerRegex = /export\s+const\s+([a-zA-Z_$][\w$]*)\s*=\s*(?:[a-zA-Z_$][\w$]*Table|table)\s*\(\s*"([^"]+)"\s*,\s*\{/gm;
57
+ let m;
58
+ while ((m = headerRegex.exec(contents)) !== null) {
59
+ const exportName = m[1];
60
+ const sqlName = m[2];
61
+ const start = headerRegex.lastIndex - 1;
62
+ let depth = 0;
63
+ let inStr = null;
64
+ let i = start;
65
+ let bodyEnd = -1;
66
+ for (; i < contents.length; i++) {
67
+ const c = contents[i];
68
+ const prev = contents[i - 1];
69
+ if (inStr) {
70
+ if (c === inStr && prev !== "\\")
71
+ inStr = null;
72
+ continue;
73
+ }
74
+ if (c === '"' || c === "'" || c === "`") {
75
+ inStr = c;
76
+ continue;
77
+ }
78
+ if (c === "{")
79
+ depth++;
80
+ else if (c === "}") {
81
+ depth--;
82
+ if (depth === 0) {
83
+ bodyEnd = i;
84
+ break;
85
+ }
86
+ }
87
+ }
88
+ if (bodyEnd === -1)
89
+ continue;
90
+ const body = contents.slice(start + 1, bodyEnd);
91
+ out.push({ exportName, sqlName, body });
92
+ }
93
+ return out;
94
+ }
95
+ function extractOwnableExports(contents) {
96
+ const exports = new Set();
97
+ for (const { exportName, sqlName, body } of extractTableCalls(contents)) {
98
+ if (/\.\.\.ownableColumns\s*\(/.test(body)) {
99
+ exports.add(exportName);
100
+ exports.add(`__sql__${sqlName}`);
101
+ }
102
+ }
103
+ return exports;
104
+ }
105
+ function collectOwnableTables(root) {
106
+ const byDir = new Map();
107
+ for (const file of walk(root)) {
108
+ if (!file.endsWith("/db/schema.ts"))
109
+ continue;
110
+ const contents = readFileSafe(file);
111
+ if (contents === null || !/ownableColumns\s*\(/.test(contents))
112
+ continue;
113
+ const ownables = extractOwnableExports(contents);
114
+ if (ownables.size > 0) {
115
+ byDir.set(relPosix(root, file), ownables);
116
+ }
117
+ }
118
+ return byDir;
119
+ }
120
+ function buildBlockTree(contents) {
121
+ const blocks = [];
122
+ const stack = [];
123
+ let i = 0;
124
+ const n = contents.length;
125
+ let inStr = null;
126
+ const templateStack = [];
127
+ while (i < n) {
128
+ const c = contents[i];
129
+ const next = contents[i + 1];
130
+ if (inStr) {
131
+ if (c === "\\") {
132
+ i += 2;
133
+ continue;
134
+ }
135
+ if (inStr === "`") {
136
+ if (c === "`") {
137
+ inStr = null;
138
+ i++;
139
+ continue;
140
+ }
141
+ if (c === "$" && next === "{") {
142
+ templateStack.push("`");
143
+ inStr = null;
144
+ stack.push(-1 - templateStack.length);
145
+ i += 2;
146
+ continue;
147
+ }
148
+ }
149
+ else if (c === inStr) {
150
+ inStr = null;
151
+ i++;
152
+ continue;
153
+ }
154
+ i++;
155
+ continue;
156
+ }
157
+ if (c === "/" && next === "/") {
158
+ while (i < n && contents[i] !== "\n")
159
+ i++;
160
+ continue;
161
+ }
162
+ if (c === "/" && next === "*") {
163
+ i += 2;
164
+ while (i < n - 1 && !(contents[i] === "*" && contents[i + 1] === "/"))
165
+ i++;
166
+ i += 2;
167
+ continue;
168
+ }
169
+ if (c === '"' || c === "'" || c === "`") {
170
+ inStr = c;
171
+ i++;
172
+ continue;
173
+ }
174
+ if (c === "{") {
175
+ stack.push(i);
176
+ i++;
177
+ continue;
178
+ }
179
+ if (c === "}") {
180
+ const open = stack.pop();
181
+ if (open !== undefined && open >= 0) {
182
+ blocks.push({ open, close: i });
183
+ }
184
+ else if (open !== undefined && open < 0) {
185
+ const kind = templateStack.pop();
186
+ inStr = kind ?? null;
187
+ }
188
+ i++;
189
+ continue;
190
+ }
191
+ i++;
192
+ }
193
+ blocks.sort((a, b) => a.open - b.open);
194
+ return blocks;
195
+ }
196
+ function innermostBlock(blocks, offset, fileLen) {
197
+ let best = null;
198
+ for (const b of blocks) {
199
+ if (b.open <= offset && b.close >= offset) {
200
+ if (!best || b.open > best.open)
201
+ best = b;
202
+ }
203
+ }
204
+ return best || { open: 0, close: fileLen };
205
+ }
206
+ function computeLineOffsets(contents) {
207
+ const offsets = [0];
208
+ for (let i = 0; i < contents.length; i++) {
209
+ if (contents[i] === "\n")
210
+ offsets.push(i + 1);
211
+ }
212
+ return offsets;
213
+ }
214
+ function offsetToLine(offsets, offset) {
215
+ let lo = 0;
216
+ let hi = offsets.length - 1;
217
+ while (lo < hi) {
218
+ const mid = (lo + hi + 1) >>> 1;
219
+ if (offsets[mid] <= offset)
220
+ lo = mid;
221
+ else
222
+ hi = mid - 1;
223
+ }
224
+ return lo + 1;
225
+ }
226
+ function findChainEnd(contents, startIdx) {
227
+ let depth = 0;
228
+ let inStr = null;
229
+ let templateDepth = 0;
230
+ const limit = Math.min(contents.length, startIdx + 10000);
231
+ let sawOpen = false;
232
+ for (let i = startIdx; i < limit; i++) {
233
+ const c = contents[i];
234
+ const prev = contents[i - 1];
235
+ if (inStr) {
236
+ if (inStr === "`") {
237
+ if (c === "`")
238
+ inStr = null;
239
+ else if (c === "$" && contents[i + 1] === "{") {
240
+ templateDepth++;
241
+ i++;
242
+ }
243
+ }
244
+ else if (c === inStr && prev !== "\\") {
245
+ inStr = null;
246
+ }
247
+ continue;
248
+ }
249
+ if (templateDepth > 0 && c === "}") {
250
+ templateDepth--;
251
+ inStr = "`";
252
+ continue;
253
+ }
254
+ if (c === '"' || c === "'" || c === "`") {
255
+ inStr = c;
256
+ continue;
257
+ }
258
+ if (c === "(" || c === "{" || c === "[") {
259
+ depth++;
260
+ sawOpen = true;
261
+ }
262
+ else if (c === ")" || c === "}" || c === "]") {
263
+ depth--;
264
+ }
265
+ else if (c === ";" && depth <= 0) {
266
+ return i + 1;
267
+ }
268
+ else if (c === "\n" && sawOpen && depth <= 0) {
269
+ let j = i + 1;
270
+ while (j < limit && /[ \t]/.test(contents[j]))
271
+ j++;
272
+ if (j >= limit || (contents[j] !== "." && contents[j] !== ")")) {
273
+ return i + 1;
274
+ }
275
+ }
276
+ }
277
+ return limit;
278
+ }
279
+ function walkBackToChainHead(contents, idx) {
280
+ let i = idx;
281
+ while (i > 0) {
282
+ const c = contents[i];
283
+ if (c === ";" || c === "{" || c === "}")
284
+ return i + 1;
285
+ if (c === "\n") {
286
+ let j = i + 1;
287
+ while (j < contents.length && /[ \t]/.test(contents[j]))
288
+ j++;
289
+ if (contents[j] !== "." && contents[j] !== ")")
290
+ return i + 1;
291
+ }
292
+ i--;
293
+ }
294
+ return 0;
295
+ }
296
+ function findStatements(contents, ownableNames, ownableSqlNames) {
297
+ const statements = [];
298
+ const lineOffsets = computeLineOffsets(contents);
299
+ const namesAlt = [...ownableNames]
300
+ .map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))
301
+ .join("|");
302
+ if (namesAlt.length > 0) {
303
+ const fromRe = new RegExp(`\\.\\s*from\\s*\\(\\s*(?:[a-zA-Z_$][\\w$]*\\s*\\.\\s*)?(${namesAlt})\\b`, "g");
304
+ let fromMatch;
305
+ while ((fromMatch = fromRe.exec(contents)) !== null) {
306
+ const name = fromMatch[1];
307
+ const queryStart = walkBackToChainHead(contents, fromMatch.index);
308
+ const queryEnd = findChainEnd(contents, fromMatch.index);
309
+ const snippet = contents.slice(queryStart, queryEnd);
310
+ statements.push({
311
+ kind: "drizzle",
312
+ op: "select",
313
+ name,
314
+ line: offsetToLine(lineOffsets, fromMatch.index),
315
+ queryStart,
316
+ queryEnd,
317
+ snippet,
318
+ });
319
+ }
320
+ for (const op of ["update", "delete", "insert"]) {
321
+ const re = new RegExp(`\\bdb\\s*\\.\\s*${op}\\s*\\(\\s*(?:[a-zA-Z_$][\\w$]*\\s*\\.\\s*)?(${namesAlt})\\b`, "g");
322
+ let m;
323
+ while ((m = re.exec(contents)) !== null) {
324
+ const name = m[1];
325
+ const queryStart = walkBackToChainHead(contents, m.index);
326
+ const queryEnd = findChainEnd(contents, m.index);
327
+ const snippet = contents.slice(queryStart, queryEnd);
328
+ statements.push({
329
+ kind: "drizzle",
330
+ op,
331
+ name,
332
+ line: offsetToLine(lineOffsets, m.index),
333
+ queryStart,
334
+ queryEnd,
335
+ snippet,
336
+ });
337
+ }
338
+ }
339
+ }
340
+ for (const sqlName of ownableSqlNames) {
341
+ const escaped = sqlName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
342
+ const verbs = [
343
+ ["select", `\\bFROM\\s+${escaped}\\b`],
344
+ ["update", `\\bUPDATE\\s+${escaped}\\b`],
345
+ ["delete", `\\bDELETE\\s+FROM\\s+${escaped}\\b`],
346
+ ["insert", `\\bINSERT\\s+INTO\\s+${escaped}\\b`],
347
+ ];
348
+ for (const [op, body] of verbs) {
349
+ const re = new RegExp(`["'\`][^"'\`]*${body}[\\s\\S]*?["'\`]`, "gi");
350
+ let m;
351
+ while ((m = re.exec(contents)) !== null) {
352
+ const matchStart = m.index;
353
+ statements.push({
354
+ kind: "raw-sql",
355
+ op,
356
+ name: sqlName,
357
+ line: offsetToLine(lineOffsets, matchStart),
358
+ queryStart: matchStart,
359
+ queryEnd: matchStart + m[0].length,
360
+ snippet: m[0],
361
+ });
362
+ }
363
+ }
364
+ }
365
+ return statements;
366
+ }
367
+ function isControlFlowBlock(contents, block) {
368
+ let i = block.open - 1;
369
+ while (i > 0 && /[ \t\n\r]/.test(contents[i]))
370
+ i--;
371
+ if (contents[i] === ")") {
372
+ let depth = 1;
373
+ let j = i - 1;
374
+ while (j > 0 && depth > 0) {
375
+ if (contents[j] === ")")
376
+ depth++;
377
+ else if (contents[j] === "(")
378
+ depth--;
379
+ if (depth === 0)
380
+ break;
381
+ j--;
382
+ }
383
+ j--;
384
+ while (j > 0 && /[ \t\n\r]/.test(contents[j]))
385
+ j--;
386
+ let end = j + 1;
387
+ while (j > 0 && /[a-zA-Z_$]/.test(contents[j]))
388
+ j--;
389
+ const word = contents.slice(j + 1, end);
390
+ return ["if", "for", "while", "switch", "catch"].includes(word);
391
+ }
392
+ let end = i + 1;
393
+ while (i > 0 && /[a-zA-Z_$]/.test(contents[i]))
394
+ i--;
395
+ const word = contents.slice(i + 1, end);
396
+ return ["else", "try", "do", "finally"].includes(word);
397
+ }
398
+ function directBlockText(contents, block, blocks, queryOffset) {
399
+ const candidates = blocks.filter((b) => b.open > block.open &&
400
+ b.close < block.close &&
401
+ !(b.open <= queryOffset && b.close >= queryOffset) &&
402
+ isControlFlowBlock(contents, b));
403
+ const descendants = candidates
404
+ .filter((b) => !candidates.some((p) => p !== b && p.open < b.open && p.close > b.close))
405
+ .sort((a, b) => b.open - a.open);
406
+ let result = contents.slice(block.open, block.close + 1);
407
+ for (const child of descendants) {
408
+ const start = child.open - block.open;
409
+ const end = child.close - block.open;
410
+ if (start < 0 || end >= result.length)
411
+ continue;
412
+ const inner = result.slice(start + 1, end);
413
+ const blanked = inner.replace(/[^\n]/g, " ");
414
+ result = result.slice(0, start + 1) + blanked + result.slice(end);
415
+ }
416
+ return result;
417
+ }
418
+ function blockHasAccessControl(blockText) {
419
+ if (ACCESS_CONTROL_HELPERS.some((re) => re.test(blockText)))
420
+ return true;
421
+ if (EXPLICIT_OWNER_FILTERS.some((re) => re.test(blockText)))
422
+ return true;
423
+ if (BLOCK_OWNERSHIP_SIGNALS.some((re) => re.test(blockText)))
424
+ return true;
425
+ return false;
426
+ }
427
+ function collectAccessControlBindings(contents) {
428
+ const names = new Set();
429
+ const bindRe = /\b(?:const|let|var)\s+([a-zA-Z_$][\w$]*)\s*(?::[^=]+)?\s*=\s*([\s\S]{0,400}?)(?:;|\n\s*(?:const|let|var|if|return|await|function|export|}|\/\/))/g;
430
+ let m;
431
+ while ((m = bindRe.exec(contents)) !== null) {
432
+ const name = m[1];
433
+ const rhs = m[2];
434
+ if (ACCESS_CONTROL_HELPERS.some((re) => re.test(rhs)) ||
435
+ EXPLICIT_OWNER_FILTERS.some((re) => re.test(rhs))) {
436
+ names.add(name);
437
+ }
438
+ }
439
+ const pushRe = /\b([a-zA-Z_$][\w$]*)\.push\s*\(([^;]{0,400})\)/g;
440
+ while ((m = pushRe.exec(contents)) !== null) {
441
+ const name = m[1];
442
+ const arg = m[2];
443
+ if (ACCESS_CONTROL_HELPERS.some((re) => re.test(arg)) ||
444
+ EXPLICIT_OWNER_FILTERS.some((re) => re.test(arg))) {
445
+ names.add(name);
446
+ }
447
+ }
448
+ return names;
449
+ }
450
+ function statementHasInlineAccessControl(stmt) {
451
+ const snippet = stmt.snippet;
452
+ if (ACCESS_CONTROL_HELPERS.some((re) => re.test(snippet)))
453
+ return true;
454
+ if (stmt.kind === "drizzle" &&
455
+ EXPLICIT_OWNER_FILTERS.some((re) => re.test(snippet)))
456
+ return true;
457
+ if (stmt.op === "insert") {
458
+ if (INSERT_OWNER_PATTERNS.some((re) => re.test(snippet)))
459
+ return true;
460
+ }
461
+ if (stmt.kind === "raw-sql") {
462
+ if (/\bowner_email\b/i.test(snippet) ||
463
+ /\buser_email\b/i.test(snippet) ||
464
+ /\borg_id\b/i.test(snippet)) {
465
+ return true;
466
+ }
467
+ }
468
+ return false;
469
+ }
470
+ function isOptedOutWithinBlock(blockText) {
471
+ return OPT_OUT_MARKER.test(blockText);
472
+ }
473
+ function isEligibleScanPath(rel) {
474
+ return /^actions\//.test(rel) || /^server\//.test(rel);
475
+ }
476
+ function scanFiles(root, ownablesByDir, extraExemptPaths) {
477
+ const allOwnableNames = new Set();
478
+ const allOwnableSqlNames = new Set();
479
+ for (const set of ownablesByDir.values()) {
480
+ for (const name of set) {
481
+ if (name.startsWith("__sql__"))
482
+ allOwnableSqlNames.add(name.slice(7));
483
+ else
484
+ allOwnableNames.add(name);
485
+ }
486
+ }
487
+ const violations = [];
488
+ for (const file of walk(root)) {
489
+ if (!file.endsWith(".ts") && !file.endsWith(".tsx"))
490
+ continue;
491
+ if (file.endsWith(".d.ts"))
492
+ continue;
493
+ const rel = relPosix(root, file);
494
+ if (extraExemptPaths.includes(rel))
495
+ continue;
496
+ if (rel.endsWith("/db/schema.ts"))
497
+ continue;
498
+ if (!isEligibleScanPath(rel))
499
+ continue;
500
+ const contents = readFileSafe(file);
501
+ if (contents === null)
502
+ continue;
503
+ if (!/\bfrom\s*\(/.test(contents) &&
504
+ !/\bdb\s*\.\s*(update|delete|insert)\b/.test(contents) &&
505
+ !/\b(FROM|UPDATE|INSERT INTO|DELETE FROM)\b/i.test(contents)) {
506
+ continue;
507
+ }
508
+ const head = contents.split("\n").slice(0, 30).join("\n");
509
+ if (OPT_OUT_MARKER.test(head))
510
+ continue;
511
+ const statements = findStatements(contents, allOwnableNames, allOwnableSqlNames);
512
+ if (statements.length === 0)
513
+ continue;
514
+ const fileHasAccessControl = ACCESS_CONTROL_HELPERS.some((re) => re.test(contents)) ||
515
+ EXPLICIT_OWNER_FILTERS.some((re) => re.test(contents));
516
+ if (!fileHasAccessControl)
517
+ continue;
518
+ const blocks = buildBlockTree(contents);
519
+ const accessControlBindings = collectAccessControlBindings(contents);
520
+ const fileViolations = [];
521
+ for (const stmt of statements) {
522
+ if (statementHasInlineAccessControl(stmt))
523
+ continue;
524
+ let scoped = false;
525
+ let cur = innermostBlock(blocks, stmt.queryStart, contents.length);
526
+ let levels = 0;
527
+ while (cur && levels < 8) {
528
+ const directText = directBlockText(contents, cur, blocks, stmt.queryStart);
529
+ if (isOptedOutWithinBlock(directText)) {
530
+ scoped = true;
531
+ break;
532
+ }
533
+ if (blockHasAccessControl(directText)) {
534
+ scoped = true;
535
+ break;
536
+ }
537
+ if (accessControlBindings.size > 0 &&
538
+ [...accessControlBindings].some((name) => new RegExp(`\\b${name}\\b`).test(stmt.snippet))) {
539
+ scoped = true;
540
+ break;
541
+ }
542
+ const parents = blocks.filter((b) => b.open < cur.open && b.close > cur.close);
543
+ const parent = parents.length > 0
544
+ ? parents.reduce((a, b) => (a.open > b.open ? a : b))
545
+ : null;
546
+ if (!parent)
547
+ break;
548
+ cur = parent;
549
+ levels++;
550
+ }
551
+ if (scoped)
552
+ continue;
553
+ fileViolations.push(stmt);
554
+ }
555
+ if (fileViolations.length > 0) {
556
+ violations.push({ file: rel, hits: fileViolations });
557
+ }
558
+ }
559
+ return violations;
560
+ }
561
+ function scanMentionProviders(root, ownablesByDir, extraExemptPaths) {
562
+ const allOwnableNames = new Set();
563
+ for (const set of ownablesByDir.values()) {
564
+ for (const name of set) {
565
+ if (!name.startsWith("__sql__"))
566
+ allOwnableNames.add(name);
567
+ }
568
+ }
569
+ if (allOwnableNames.size === 0)
570
+ return [];
571
+ const namesAlt = [...allOwnableNames]
572
+ .map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))
573
+ .join("|");
574
+ const fromOwnableRe = new RegExp(`\\.\\s*from\\s*\\(\\s*(?:[a-zA-Z_$][\\w$]*\\s*\\.\\s*)?(${namesAlt})\\b`, "g");
575
+ const CLOSURE_ACCESS_PATTERNS = [
576
+ ...ACCESS_CONTROL_HELPERS,
577
+ ...EXPLICIT_OWNER_FILTERS,
578
+ ...BLOCK_OWNERSHIP_SIGNALS,
579
+ ];
580
+ const violations = [];
581
+ for (const file of walk(root)) {
582
+ if (!file.endsWith(".ts") && !file.endsWith(".tsx"))
583
+ continue;
584
+ if (file.endsWith(".d.ts"))
585
+ continue;
586
+ const rel = relPosix(root, file);
587
+ if (extraExemptPaths.includes(rel))
588
+ continue;
589
+ if (!/^server\//.test(rel))
590
+ continue;
591
+ const contents = readFileSafe(file);
592
+ if (contents === null)
593
+ continue;
594
+ if (!/\bmentionProviders\b/.test(contents) ||
595
+ !/\bfrom\s*\(/.test(contents)) {
596
+ continue;
597
+ }
598
+ const head = contents.split("\n").slice(0, 30).join("\n");
599
+ if (OPT_OUT_MARKER.test(head))
600
+ continue;
601
+ const lineOffsets = computeLineOffsets(contents);
602
+ const mpHeaderRe = /\bmentionProviders\s*:/g;
603
+ while (mpHeaderRe.exec(contents) !== null) {
604
+ let i = mpHeaderRe.lastIndex;
605
+ while (i < contents.length && contents[i] !== "{" && contents[i] !== "\n")
606
+ i++;
607
+ if (i >= contents.length || contents[i] !== "{")
608
+ continue;
609
+ let depth = 0;
610
+ let inStr = null;
611
+ const mpStart = i;
612
+ let mpEnd = -1;
613
+ for (let j = i; j < contents.length; j++) {
614
+ const c = contents[j];
615
+ if (inStr) {
616
+ if (c === "\\" && inStr !== "`") {
617
+ j++;
618
+ continue;
619
+ }
620
+ if (c === inStr)
621
+ inStr = null;
622
+ continue;
623
+ }
624
+ if (c === '"' || c === "'" || c === "`") {
625
+ inStr = c;
626
+ continue;
627
+ }
628
+ if (c === "{")
629
+ depth++;
630
+ else if (c === "}") {
631
+ depth--;
632
+ if (depth === 0) {
633
+ mpEnd = j;
634
+ break;
635
+ }
636
+ }
637
+ }
638
+ if (mpEnd === -1)
639
+ continue;
640
+ const mpBody = contents.slice(mpStart, mpEnd + 1);
641
+ const searchRe = /\bsearch\s*:\s*async\s*\([^)]*\)\s*=>\s*\{/g;
642
+ let searchMatch;
643
+ while ((searchMatch = searchRe.exec(mpBody)) !== null) {
644
+ const closureStart = mpStart + searchMatch.index + searchMatch[0].length - 1;
645
+ let closureDepth = 0;
646
+ let closureEnd = -1;
647
+ let closureInStr = null;
648
+ for (let j = closureStart; j < mpEnd; j++) {
649
+ const c = contents[j];
650
+ if (closureInStr) {
651
+ if (c === "\\" && closureInStr !== "`") {
652
+ j++;
653
+ continue;
654
+ }
655
+ if (c === closureInStr)
656
+ closureInStr = null;
657
+ continue;
658
+ }
659
+ if (c === '"' || c === "'" || c === "`") {
660
+ closureInStr = c;
661
+ continue;
662
+ }
663
+ if (c === "{")
664
+ closureDepth++;
665
+ else if (c === "}") {
666
+ closureDepth--;
667
+ if (closureDepth === 0) {
668
+ closureEnd = j;
669
+ break;
670
+ }
671
+ }
672
+ }
673
+ if (closureEnd === -1)
674
+ continue;
675
+ const closureBody = contents.slice(closureStart, closureEnd + 1);
676
+ if (OPT_OUT_MARKER.test(closureBody))
677
+ continue;
678
+ fromOwnableRe.lastIndex = 0;
679
+ let fromMatch;
680
+ while ((fromMatch = fromOwnableRe.exec(closureBody)) !== null) {
681
+ const tableName = fromMatch[1];
682
+ if (CLOSURE_ACCESS_PATTERNS.some((re) => re.test(closureBody)))
683
+ continue;
684
+ const absOffset = closureStart + fromMatch.index;
685
+ const line = offsetToLine(lineOffsets, absOffset);
686
+ violations.push({ file: rel, line, table: tableName });
687
+ }
688
+ }
689
+ }
690
+ }
691
+ return violations;
692
+ }
693
+ export function scanUnscopedQueries(options) {
694
+ const { root, extraExemptPaths = [] } = options;
695
+ const findings = [];
696
+ const ownablesByDir = collectOwnableTables(root);
697
+ if (ownablesByDir.size === 0) {
698
+ return { name: "no-unscoped-queries", findings };
699
+ }
700
+ const violations = scanFiles(root, ownablesByDir, extraExemptPaths);
701
+ for (const v of violations) {
702
+ for (const hit of v.hits) {
703
+ findings.push({
704
+ file: v.file,
705
+ line: hit.line,
706
+ message: `unscoped ${hit.op} on "${hit.name}" (${hit.kind}) — add accessFilter/resolveAccess/assertAccess or an explicit ownerEmail/userEmail/orgId filter.`,
707
+ });
708
+ }
709
+ }
710
+ const mentionViolations = scanMentionProviders(root, ownablesByDir, extraExemptPaths);
711
+ for (const v of mentionViolations) {
712
+ findings.push({
713
+ file: v.file,
714
+ line: v.line,
715
+ message: `mentionProviders search closure queries "${v.table}" without access control — every user who types @ in chat would see rows owned by other users.`,
716
+ });
717
+ }
718
+ return { name: "no-unscoped-queries", findings };
719
+ }
720
+ //# sourceMappingURL=no-unscoped-queries.js.map