@agent-native/core 0.7.2 → 0.7.6

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 (352) hide show
  1. package/README.md +6 -5
  2. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  3. package/dist/agent/engine/anthropic-engine.js +8 -4
  4. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  5. package/dist/agent/engine/types.d.ts +1 -1
  6. package/dist/agent/engine/types.d.ts.map +1 -1
  7. package/dist/agent/production-agent.d.ts +7 -0
  8. package/dist/agent/production-agent.d.ts.map +1 -1
  9. package/dist/agent/production-agent.js +153 -118
  10. package/dist/agent/production-agent.js.map +1 -1
  11. package/dist/cli/create.d.ts.map +1 -1
  12. package/dist/cli/create.js +8 -1
  13. package/dist/cli/create.js.map +1 -1
  14. package/dist/cli/index.js +8 -0
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/cli/info.d.ts +2 -0
  17. package/dist/cli/info.d.ts.map +1 -0
  18. package/dist/cli/info.js +103 -0
  19. package/dist/cli/info.js.map +1 -0
  20. package/dist/client/AssistantChat.d.ts.map +1 -1
  21. package/dist/client/AssistantChat.js +171 -68
  22. package/dist/client/AssistantChat.js.map +1 -1
  23. package/dist/client/FeedbackButton.d.ts +3 -1
  24. package/dist/client/FeedbackButton.d.ts.map +1 -1
  25. package/dist/client/FeedbackButton.js +115 -40
  26. package/dist/client/FeedbackButton.js.map +1 -1
  27. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  28. package/dist/client/agent-chat-adapter.js +12 -1
  29. package/dist/client/agent-chat-adapter.js.map +1 -1
  30. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  31. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  32. package/dist/client/composer/TiptapComposer.js +46 -2
  33. package/dist/client/composer/TiptapComposer.js.map +1 -1
  34. package/dist/client/composer/VoiceButton.d.ts +21 -0
  35. package/dist/client/composer/VoiceButton.d.ts.map +1 -0
  36. package/dist/client/composer/VoiceButton.js +51 -0
  37. package/dist/client/composer/VoiceButton.js.map +1 -0
  38. package/dist/client/composer/useVoiceDictation.d.ts +38 -0
  39. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -0
  40. package/dist/client/composer/useVoiceDictation.js +398 -0
  41. package/dist/client/composer/useVoiceDictation.js.map +1 -0
  42. package/dist/client/index.d.ts +1 -0
  43. package/dist/client/index.d.ts.map +1 -1
  44. package/dist/client/index.js +1 -0
  45. package/dist/client/index.js.map +1 -1
  46. package/dist/client/onboarding/OnboardingPanel.js +2 -2
  47. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  48. package/dist/client/org/OrgSwitcher.d.ts +5 -4
  49. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  50. package/dist/client/org/OrgSwitcher.js +90 -24
  51. package/dist/client/org/OrgSwitcher.js.map +1 -1
  52. package/dist/client/resources/McpServerDetail.d.ts +15 -0
  53. package/dist/client/resources/McpServerDetail.d.ts.map +1 -0
  54. package/dist/client/resources/McpServerDetail.js +65 -0
  55. package/dist/client/resources/McpServerDetail.js.map +1 -0
  56. package/dist/client/resources/ResourceEditor.js +1 -1
  57. package/dist/client/resources/ResourceEditor.js.map +1 -1
  58. package/dist/client/resources/ResourceTree.d.ts +6 -1
  59. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  60. package/dist/client/resources/ResourceTree.js +18 -7
  61. package/dist/client/resources/ResourceTree.js.map +1 -1
  62. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  63. package/dist/client/resources/ResourcesPanel.js +191 -20
  64. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  65. package/dist/client/resources/use-mcp-servers.d.ts +68 -0
  66. package/dist/client/resources/use-mcp-servers.d.ts.map +1 -0
  67. package/dist/client/resources/use-mcp-servers.js +83 -0
  68. package/dist/client/resources/use-mcp-servers.js.map +1 -0
  69. package/dist/client/resources/use-resources.d.ts +27 -1
  70. package/dist/client/resources/use-resources.d.ts.map +1 -1
  71. package/dist/client/resources/use-resources.js +63 -0
  72. package/dist/client/resources/use-resources.js.map +1 -1
  73. package/dist/client/settings/SecretsSection.d.ts +12 -0
  74. package/dist/client/settings/SecretsSection.d.ts.map +1 -0
  75. package/dist/client/settings/SecretsSection.js +148 -0
  76. package/dist/client/settings/SecretsSection.js.map +1 -0
  77. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  78. package/dist/client/settings/SettingsPanel.js +101 -2
  79. package/dist/client/settings/SettingsPanel.js.map +1 -1
  80. package/dist/client/settings/VoiceTranscriptionSection.d.ts +14 -0
  81. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -0
  82. package/dist/client/settings/VoiceTranscriptionSection.js +111 -0
  83. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -0
  84. package/dist/client/settings/index.d.ts +1 -0
  85. package/dist/client/settings/index.d.ts.map +1 -1
  86. package/dist/client/settings/index.js +1 -0
  87. package/dist/client/settings/index.js.map +1 -1
  88. package/dist/client/sharing/ShareButton.d.ts +16 -0
  89. package/dist/client/sharing/ShareButton.d.ts.map +1 -0
  90. package/dist/client/sharing/ShareButton.js +308 -0
  91. package/dist/client/sharing/ShareButton.js.map +1 -0
  92. package/dist/client/sharing/ShareDialog.d.ts +33 -0
  93. package/dist/client/sharing/ShareDialog.d.ts.map +1 -0
  94. package/dist/client/sharing/ShareDialog.js +231 -0
  95. package/dist/client/sharing/ShareDialog.js.map +1 -0
  96. package/dist/client/sharing/VisibilityBadge.d.ts +11 -0
  97. package/dist/client/sharing/VisibilityBadge.d.ts.map +1 -0
  98. package/dist/client/sharing/VisibilityBadge.js +19 -0
  99. package/dist/client/sharing/VisibilityBadge.js.map +1 -0
  100. package/dist/client/sharing/index.d.ts +4 -0
  101. package/dist/client/sharing/index.d.ts.map +1 -0
  102. package/dist/client/sharing/index.js +4 -0
  103. package/dist/client/sharing/index.js.map +1 -0
  104. package/dist/client/use-action.d.ts.map +1 -1
  105. package/dist/client/use-action.js +27 -3
  106. package/dist/client/use-action.js.map +1 -1
  107. package/dist/db/migrations.d.ts +18 -3
  108. package/dist/db/migrations.d.ts.map +1 -1
  109. package/dist/db/migrations.js +25 -3
  110. package/dist/db/migrations.js.map +1 -1
  111. package/dist/db/schema.d.ts +1 -0
  112. package/dist/db/schema.d.ts.map +1 -1
  113. package/dist/db/schema.js +4 -0
  114. package/dist/db/schema.js.map +1 -1
  115. package/dist/deploy/build.js +22 -3
  116. package/dist/deploy/build.js.map +1 -1
  117. package/dist/deploy/workspace-core.js +2 -2
  118. package/dist/index.d.ts +1 -0
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +4 -0
  121. package/dist/index.js.map +1 -1
  122. package/dist/mcp-client/config.d.ts +20 -1
  123. package/dist/mcp-client/config.d.ts.map +1 -1
  124. package/dist/mcp-client/config.js +28 -11
  125. package/dist/mcp-client/config.js.map +1 -1
  126. package/dist/mcp-client/hub-client.d.ts +38 -0
  127. package/dist/mcp-client/hub-client.d.ts.map +1 -0
  128. package/dist/mcp-client/hub-client.js +147 -0
  129. package/dist/mcp-client/hub-client.js.map +1 -0
  130. package/dist/mcp-client/hub-routes.d.ts +42 -0
  131. package/dist/mcp-client/hub-routes.d.ts.map +1 -0
  132. package/dist/mcp-client/hub-routes.js +114 -0
  133. package/dist/mcp-client/hub-routes.js.map +1 -0
  134. package/dist/mcp-client/index.d.ts +15 -0
  135. package/dist/mcp-client/index.d.ts.map +1 -1
  136. package/dist/mcp-client/index.js +35 -0
  137. package/dist/mcp-client/index.js.map +1 -1
  138. package/dist/mcp-client/manager.d.ts +54 -8
  139. package/dist/mcp-client/manager.d.ts.map +1 -1
  140. package/dist/mcp-client/manager.js +276 -59
  141. package/dist/mcp-client/manager.js.map +1 -1
  142. package/dist/mcp-client/remote-store.d.ts +102 -0
  143. package/dist/mcp-client/remote-store.d.ts.map +1 -0
  144. package/dist/mcp-client/remote-store.js +200 -0
  145. package/dist/mcp-client/remote-store.js.map +1 -0
  146. package/dist/mcp-client/routes.d.ts +55 -0
  147. package/dist/mcp-client/routes.d.ts.map +1 -0
  148. package/dist/mcp-client/routes.js +384 -0
  149. package/dist/mcp-client/routes.js.map +1 -0
  150. package/dist/mcp-client/visibility.d.ts +16 -0
  151. package/dist/mcp-client/visibility.d.ts.map +1 -0
  152. package/dist/mcp-client/visibility.js +45 -0
  153. package/dist/mcp-client/visibility.js.map +1 -0
  154. package/dist/onboarding/default-steps.d.ts.map +1 -1
  155. package/dist/onboarding/default-steps.js +5 -0
  156. package/dist/onboarding/default-steps.js.map +1 -1
  157. package/dist/org/accept-pending.d.ts +22 -0
  158. package/dist/org/accept-pending.d.ts.map +1 -0
  159. package/dist/org/accept-pending.js +75 -0
  160. package/dist/org/accept-pending.js.map +1 -0
  161. package/dist/org/context.js +2 -2
  162. package/dist/org/context.js.map +1 -1
  163. package/dist/org/handlers.d.ts +2 -0
  164. package/dist/org/handlers.d.ts.map +1 -1
  165. package/dist/org/handlers.js +54 -3
  166. package/dist/org/handlers.js.map +1 -1
  167. package/dist/org/index.d.ts +2 -0
  168. package/dist/org/index.d.ts.map +1 -1
  169. package/dist/org/index.js +1 -0
  170. package/dist/org/index.js.map +1 -1
  171. package/dist/resources/handlers.d.ts.map +1 -1
  172. package/dist/resources/handlers.js +30 -0
  173. package/dist/resources/handlers.js.map +1 -1
  174. package/dist/secrets/index.d.ts +15 -0
  175. package/dist/secrets/index.d.ts.map +1 -0
  176. package/dist/secrets/index.js +15 -0
  177. package/dist/secrets/index.js.map +1 -0
  178. package/dist/secrets/onboarding.d.ts +18 -0
  179. package/dist/secrets/onboarding.d.ts.map +1 -0
  180. package/dist/secrets/onboarding.js +87 -0
  181. package/dist/secrets/onboarding.js.map +1 -0
  182. package/dist/secrets/register-framework-secrets.d.ts +13 -0
  183. package/dist/secrets/register-framework-secrets.d.ts.map +1 -0
  184. package/dist/secrets/register-framework-secrets.js +59 -0
  185. package/dist/secrets/register-framework-secrets.js.map +1 -0
  186. package/dist/secrets/register.d.ts +63 -0
  187. package/dist/secrets/register.d.ts.map +1 -0
  188. package/dist/secrets/register.js +62 -0
  189. package/dist/secrets/register.js.map +1 -0
  190. package/dist/secrets/routes.d.ts +67 -0
  191. package/dist/secrets/routes.d.ts.map +1 -0
  192. package/dist/secrets/routes.js +275 -0
  193. package/dist/secrets/routes.js.map +1 -0
  194. package/dist/secrets/schema.d.ts +154 -0
  195. package/dist/secrets/schema.d.ts.map +1 -0
  196. package/dist/secrets/schema.js +41 -0
  197. package/dist/secrets/schema.js.map +1 -0
  198. package/dist/secrets/storage.d.ts +54 -0
  199. package/dist/secrets/storage.d.ts.map +1 -0
  200. package/dist/secrets/storage.js +181 -0
  201. package/dist/secrets/storage.js.map +1 -0
  202. package/dist/server/action-discovery.d.ts +18 -0
  203. package/dist/server/action-discovery.d.ts.map +1 -1
  204. package/dist/server/action-discovery.js +95 -0
  205. package/dist/server/action-discovery.js.map +1 -1
  206. package/dist/server/action-routes.d.ts.map +1 -1
  207. package/dist/server/action-routes.js +22 -2
  208. package/dist/server/action-routes.js.map +1 -1
  209. package/dist/server/agent-chat-plugin.d.ts +16 -0
  210. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  211. package/dist/server/agent-chat-plugin.js +120 -25
  212. package/dist/server/agent-chat-plugin.js.map +1 -1
  213. package/dist/server/app-name.d.ts +13 -0
  214. package/dist/server/app-name.d.ts.map +1 -0
  215. package/dist/server/app-name.js +41 -0
  216. package/dist/server/app-name.js.map +1 -0
  217. package/dist/server/app-url.d.ts +24 -0
  218. package/dist/server/app-url.d.ts.map +1 -0
  219. package/dist/server/app-url.js +76 -0
  220. package/dist/server/app-url.js.map +1 -0
  221. package/dist/server/auth.d.ts.map +1 -1
  222. package/dist/server/auth.js +50 -0
  223. package/dist/server/auth.js.map +1 -1
  224. package/dist/server/better-auth-instance.d.ts.map +1 -1
  225. package/dist/server/better-auth-instance.js +137 -13
  226. package/dist/server/better-auth-instance.js.map +1 -1
  227. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  228. package/dist/server/core-routes-plugin.js +73 -0
  229. package/dist/server/core-routes-plugin.js.map +1 -1
  230. package/dist/server/create-server.d.ts.map +1 -1
  231. package/dist/server/create-server.js +6 -0
  232. package/dist/server/create-server.js.map +1 -1
  233. package/dist/server/date-utils.d.ts +15 -0
  234. package/dist/server/date-utils.d.ts.map +1 -0
  235. package/dist/server/date-utils.js +41 -0
  236. package/dist/server/date-utils.js.map +1 -0
  237. package/dist/server/email-template.d.ts +51 -0
  238. package/dist/server/email-template.d.ts.map +1 -0
  239. package/dist/server/email-template.js +146 -0
  240. package/dist/server/email-template.js.map +1 -0
  241. package/dist/server/index.d.ts +6 -1
  242. package/dist/server/index.d.ts.map +1 -1
  243. package/dist/server/index.js +6 -1
  244. package/dist/server/index.js.map +1 -1
  245. package/dist/server/onboarding-html.d.ts +3 -0
  246. package/dist/server/onboarding-html.d.ts.map +1 -1
  247. package/dist/server/onboarding-html.js +13 -3
  248. package/dist/server/onboarding-html.js.map +1 -1
  249. package/dist/server/request-context.d.ts +9 -0
  250. package/dist/server/request-context.d.ts.map +1 -1
  251. package/dist/server/request-context.js +10 -0
  252. package/dist/server/request-context.js.map +1 -1
  253. package/dist/server/transcribe-voice.d.ts +26 -0
  254. package/dist/server/transcribe-voice.d.ts.map +1 -0
  255. package/dist/server/transcribe-voice.js +143 -0
  256. package/dist/server/transcribe-voice.js.map +1 -0
  257. package/dist/sharing/access.d.ts +56 -0
  258. package/dist/sharing/access.d.ts.map +1 -0
  259. package/dist/sharing/access.js +149 -0
  260. package/dist/sharing/access.js.map +1 -0
  261. package/dist/sharing/actions/list-resource-shares.d.ts +3 -0
  262. package/dist/sharing/actions/list-resource-shares.d.ts.map +1 -0
  263. package/dist/sharing/actions/list-resource-shares.js +38 -0
  264. package/dist/sharing/actions/list-resource-shares.js.map +1 -0
  265. package/dist/sharing/actions/set-resource-visibility.d.ts +3 -0
  266. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -0
  267. package/dist/sharing/actions/set-resource-visibility.js +24 -0
  268. package/dist/sharing/actions/set-resource-visibility.js.map +1 -0
  269. package/dist/sharing/actions/share-resource.d.ts +3 -0
  270. package/dist/sharing/actions/share-resource.d.ts.map +1 -0
  271. package/dist/sharing/actions/share-resource.js +64 -0
  272. package/dist/sharing/actions/share-resource.js.map +1 -0
  273. package/dist/sharing/actions/unshare-resource.d.ts +3 -0
  274. package/dist/sharing/actions/unshare-resource.d.ts.map +1 -0
  275. package/dist/sharing/actions/unshare-resource.js +24 -0
  276. package/dist/sharing/actions/unshare-resource.js.map +1 -0
  277. package/dist/sharing/index.d.ts +11 -0
  278. package/dist/sharing/index.d.ts.map +1 -0
  279. package/dist/sharing/index.js +11 -0
  280. package/dist/sharing/index.js.map +1 -0
  281. package/dist/sharing/registry.d.ts +44 -0
  282. package/dist/sharing/registry.d.ts.map +1 -0
  283. package/dist/sharing/registry.js +54 -0
  284. package/dist/sharing/registry.js.map +1 -0
  285. package/dist/sharing/schema.d.ts +202 -0
  286. package/dist/sharing/schema.d.ts.map +1 -0
  287. package/dist/sharing/schema.js +88 -0
  288. package/dist/sharing/schema.js.map +1 -0
  289. package/dist/styles/agent-native.css +111 -0
  290. package/dist/tailwind.preset.d.ts +2 -2
  291. package/dist/tailwind.preset.d.ts.map +1 -1
  292. package/dist/tailwind.preset.js +27 -7
  293. package/dist/tailwind.preset.js.map +1 -1
  294. package/dist/templates/default/app/global.css +65 -68
  295. package/dist/templates/default/components.json +1 -1
  296. package/dist/templates/default/package.json +2 -4
  297. package/dist/templates/default/vite.config.ts +3 -0
  298. package/dist/templates/workspace-core/package.json +1 -4
  299. package/dist/templates/workspace-core/src/index.ts +1 -1
  300. package/dist/templates/workspace-core/styles/tokens.css +22 -0
  301. package/dist/templates/workspace-core/tsconfig.json +1 -1
  302. package/dist/vite/action-types-plugin.d.ts +5 -0
  303. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  304. package/dist/vite/action-types-plugin.js +129 -28
  305. package/dist/vite/action-types-plugin.js.map +1 -1
  306. package/dist/vite/client.d.ts +6 -0
  307. package/dist/vite/client.d.ts.map +1 -1
  308. package/dist/vite/client.js +18 -1
  309. package/dist/vite/client.js.map +1 -1
  310. package/docs/content/actions.md +169 -74
  311. package/docs/content/agent-teams.md +139 -0
  312. package/docs/content/cloneable-saas.md +98 -0
  313. package/docs/content/creating-templates.md +9 -11
  314. package/docs/content/deployment.md +2 -9
  315. package/docs/content/drop-in-agent.md +200 -0
  316. package/docs/content/enterprise-workspace.md +22 -10
  317. package/docs/content/getting-started.md +34 -19
  318. package/docs/content/integrations.md +3 -3
  319. package/docs/content/key-concepts.md +50 -23
  320. package/docs/content/mcp-clients.md +71 -0
  321. package/docs/content/pure-agent-apps.md +69 -0
  322. package/docs/content/recurring-jobs.md +123 -0
  323. package/docs/content/skills-guide.md +8 -0
  324. package/docs/content/template-analytics.md +190 -0
  325. package/docs/content/template-calendar.md +151 -0
  326. package/docs/content/template-clips.md +55 -0
  327. package/docs/content/template-content.md +141 -0
  328. package/docs/content/template-dispatch.md +58 -0
  329. package/docs/content/template-forms.md +51 -0
  330. package/docs/content/template-mail.md +169 -0
  331. package/docs/content/template-slides.md +218 -0
  332. package/docs/content/template-starter.md +68 -0
  333. package/docs/content/template-video.md +162 -0
  334. package/docs/content/voice-input.md +59 -0
  335. package/docs/content/what-is-agent-native.md +142 -45
  336. package/docs/content/workspace-management.md +1 -0
  337. package/docs/content/{resources.md → workspace.md} +94 -42
  338. package/package.json +20 -19
  339. package/src/templates/default/app/global.css +65 -68
  340. package/src/templates/default/components.json +1 -1
  341. package/src/templates/default/package.json +2 -4
  342. package/src/templates/default/vite.config.ts +3 -0
  343. package/src/templates/workspace-core/package.json +1 -4
  344. package/src/templates/workspace-core/src/index.ts +1 -1
  345. package/src/templates/workspace-core/styles/tokens.css +22 -0
  346. package/src/templates/workspace-core/tsconfig.json +1 -1
  347. package/dist/templates/default/postcss.config.js +0 -6
  348. package/dist/templates/default/tailwind.config.ts +0 -7
  349. package/dist/templates/workspace-core/tailwind.preset.ts +0 -34
  350. package/src/templates/default/postcss.config.js +0 -6
  351. package/src/templates/default/tailwind.config.ts +0 -7
  352. package/src/templates/workspace-core/tailwind.preset.ts +0 -34
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -23,13 +23,18 @@ export { spawnTask, getTask, getTaskByThread, listTasks, sendToTask, markTaskErr
23
23
  export { isOAuthConnected, getOAuthAccounts } from "./oauth-helpers.js";
24
24
  export { wrapWithAnalytics } from "./analytics.js";
25
25
  export { getH3App, awaitBootstrap, } from "./framework-request-handler.js";
26
- export { autoDiscoverActions, autoDiscoverScripts, } from "./action-discovery.js";
26
+ export { autoDiscoverActions, autoDiscoverScripts, loadActionsFromStaticRegistry, mergeCoreSharingActions, } from "./action-discovery.js";
27
27
  export { mountActionRoutes, } from "./action-routes.js";
28
+ export { runWithRequestContext, getRequestUserEmail, getRequestOrgId, getRequestTimezone, } from "./request-context.js";
29
+ export { formatDateInTimezone, todayInTimezone } from "./date-utils.js";
28
30
  export { createOnboardingPlugin, defaultOnboardingPlugin, } from "../onboarding/plugin.js";
29
31
  export { registerFileUploadProvider, unregisterFileUploadProvider, listFileUploadProviders, getActiveFileUploadProvider, uploadFile, builderFileUploadProvider, } from "../file-upload/index.js";
30
32
  export { createIntegrationsPlugin, defaultIntegrationsPlugin, slackAdapter, telegramAdapter, whatsappAdapter, } from "../integrations/index.js";
31
33
  export { isElectron, isMobile, getOrigin, encodeOAuthState, decodeOAuthState, resolveOAuthOwner, createOAuthSession, oauthCallbackResponse, oauthErrorPage, } from "./google-oauth.js";
32
34
  export { FeatureNotConfiguredError, hasBuilderPrivateKey, getBuilderProxyOrigin, getBuilderAuthHeader, } from "./credential-provider.js";
35
+ export { sendEmail, isEmailConfigured, getEmailProvider, } from "./email.js";
36
+ export { renderEmail, emailStrong, } from "./email-template.js";
37
+ export { getAppProductionUrl, getFirstPartyProdUrl } from "./app-url.js";
33
38
  export function defineNitroPlugin(def) {
34
39
  return def;
35
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,GAGd,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAA0B,MAAM,UAAU,CAAC;AACpE,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,UAAU,EACV,UAAU,EACV,aAAa,EACb,eAAe,EACf,YAAY,GAGb,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAA2B,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAA4B,MAAM,cAAc,CAAC;AACvE,OAAO,EACL,4BAA4B,GAY7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,2EAA2E;AAC3E,2EAA2E;AAC3E,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACL,sBAAsB,GAEvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,YAAY,EACZ,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,YAAY,GAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,GAEvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GAEtB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,kBAAkB,GAEnB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,SAAS,EACT,OAAO,EACP,eAAe,EACf,SAAS,EACT,UAAU,EACV,eAAe,GAGhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EACL,QAAQ,EACR,cAAc,GAEf,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,uBAAuB,EACvB,2BAA2B,EAC3B,UAAU,EACV,yBAAyB,GAI1B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,YAAY,EACZ,eAAe,EACf,eAAe,GAMhB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,GAIf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAWlC,MAAM,UAAU,iBAAiB,CAAC,GAAmB;IACnD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,9 @@
9
9
  * After first account exists, this page acts as a normal login page.
10
10
  * The "Use locally" escape hatch is hidden in production to ensure
11
11
  * real accounts are used (needed for per-user usage tracking/limits).
12
+ * It's also hidden when DATABASE_URL points at a non-local DB (Postgres,
13
+ * Turso, D1) — local@localhost has no per-user scoping, so enabling it
14
+ * against a shared DB would silently fail server-side.
12
15
  */
13
16
  export interface OnboardingHtmlOptions {
14
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding-html.d.ts","sourceRoot":"","sources":["../../src/server/onboarding-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAwBH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAID,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,qBAA0B,GAAG,MAAM,CAuf1E;AAED,kDAAkD;AAClD,eAAO,MAAM,eAAe,QAAsB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAwG7C"}
1
+ {"version":3,"file":"onboarding-html.d.ts","sourceRoot":"","sources":["../../src/server/onboarding-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA0BH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAID,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,qBAA0B,GAAG,MAAM,CA8f1E;AAED,kDAAkD;AAClD,eAAO,MAAM,eAAe,QAAsB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAwG7C"}
@@ -9,7 +9,11 @@
9
9
  * After first account exists, this page acts as a normal login page.
10
10
  * The "Use locally" escape hatch is hidden in production to ensure
11
11
  * real accounts are used (needed for per-user usage tracking/limits).
12
+ * It's also hidden when DATABASE_URL points at a non-local DB (Postgres,
13
+ * Turso, D1) — local@localhost has no per-user scoping, so enabling it
14
+ * against a shared DB would silently fail server-side.
12
15
  */
16
+ import { isLocalDatabase } from "../db/client.js";
13
17
  function isProductionEnv() {
14
18
  const env = process.env.NODE_ENV;
15
19
  return env !== "development" && env !== "test";
@@ -36,7 +40,7 @@ function getConnectionLabel() {
36
40
  }
37
41
  const MIGRATE_FLAG_KEY = "an_migrate_from_local";
38
42
  export function getOnboardingHtml(opts = {}) {
39
- const showLocalMode = !isProductionEnv() && !opts.googleOnly;
43
+ const showLocalMode = !isProductionEnv() && !opts.googleOnly && isLocalDatabase();
40
44
  const showGoogle = hasGoogleOAuth();
41
45
  const googleOnly = !!opts.googleOnly;
42
46
  const localModeBlock = showLocalMode
@@ -62,8 +66,14 @@ export function getOnboardingHtml(opts = {}) {
62
66
  if (res.ok) {
63
67
  window.location.reload();
64
68
  } else {
65
- btn.textContent = 'Failed try again';
66
- btn.disabled = false;
69
+ var data = await res.json().catch(function() { return {}; });
70
+ var info = document.getElementById('local-info');
71
+ if (info && data && data.error) {
72
+ info.textContent = data.error;
73
+ info.style.color = '#f87171';
74
+ }
75
+ btn.textContent = 'Not available';
76
+ btn.disabled = true;
67
77
  }
68
78
  } catch(e) {
69
79
  btn.textContent = 'Failed — try again';
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding-html.js","sourceRoot":"","sources":["../../src/server/onboarding-html.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"onboarding-html.js","sourceRoot":"","sources":["../../src/server/onboarding-html.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  export interface RequestContext {
2
2
  userEmail?: string;
3
3
  orgId?: string;
4
+ timezone?: string;
4
5
  }
5
6
  /**
6
7
  * Run a callback within a per-request context. The context is available to all
@@ -17,4 +18,12 @@ export declare function getRequestUserEmail(): string | undefined;
17
18
  * Falls back to `process.env.AGENT_ORG_ID` for CLI scripts.
18
19
  */
19
20
  export declare function getRequestOrgId(): string | undefined;
21
+ /**
22
+ * Get the current request's IANA timezone (e.g. "America/Los_Angeles").
23
+ * The UI sends this via the `x-user-timezone` header on every action call, and
24
+ * the agent chat plugin propagates it into the request context so that
25
+ * agent-initiated tool calls also see the user's timezone. Falls back to
26
+ * `process.env.AGENT_USER_TIMEZONE` for CLI scripts, and undefined if unset.
27
+ */
28
+ export declare function getRequestTimezone(): string | undefined;
20
29
  //# sourceMappingURL=request-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEhB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAExD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpD"}
1
+ {"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEhB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAExD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAEvD"}
@@ -38,4 +38,14 @@ export function getRequestUserEmail() {
38
38
  export function getRequestOrgId() {
39
39
  return als.getStore()?.orgId ?? process.env.AGENT_ORG_ID;
40
40
  }
41
+ /**
42
+ * Get the current request's IANA timezone (e.g. "America/Los_Angeles").
43
+ * The UI sends this via the `x-user-timezone` header on every action call, and
44
+ * the agent chat plugin propagates it into the request context so that
45
+ * agent-initiated tool calls also see the user's timezone. Falls back to
46
+ * `process.env.AGENT_USER_TIMEZONE` for CLI scripts, and undefined if unset.
47
+ */
48
+ export function getRequestTimezone() {
49
+ return als.getStore()?.timezone ?? process.env.AGENT_USER_TIMEZONE;
50
+ }
41
51
  //# sourceMappingURL=request-context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-context.js","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAmB,EACnB,EAAwB;IAExB,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"request-context.js","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAQrD,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAmB,EACnB,EAAwB;IAExB,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,GAAG,CAAC,QAAQ,EAAE,EAAE,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACrE,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * POST /_agent-native/transcribe-voice
3
+ *
4
+ * Receives an audio blob from the agent sidebar composer and forwards it to
5
+ * OpenAI Whisper. Returns `{ text }` on success, `{ error }` on failure.
6
+ *
7
+ * Key resolution order (mirrors `templates/clips/actions/request-transcript.ts`):
8
+ * 1. User-scoped encrypted secret (`readAppSecret` — set via the sidebar
9
+ * settings UI).
10
+ * 2. `resolveCredential("OPENAI_API_KEY")` — env var + SQL settings store.
11
+ *
12
+ * If no key is configured, returns 400 with an error the composer UI can
13
+ * surface (the client falls back to the browser Web Speech API).
14
+ *
15
+ * This is a framework route rather than a `defineAction` because multipart
16
+ * audio bodies aren't a clean fit for the action contract (actions are
17
+ * typed JSON-in / JSON-out).
18
+ */
19
+ export declare function createTranscribeVoiceHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
20
+ error: string;
21
+ text?: undefined;
22
+ } | {
23
+ text: string;
24
+ error?: undefined;
25
+ }>>;
26
+ //# sourceMappingURL=transcribe-voice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcribe-voice.d.ts","sourceRoot":"","sources":["../../src/server/transcribe-voice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAyCH,wBAAgB,4BAA4B;;;;;;IAyF3C"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * POST /_agent-native/transcribe-voice
3
+ *
4
+ * Receives an audio blob from the agent sidebar composer and forwards it to
5
+ * OpenAI Whisper. Returns `{ text }` on success, `{ error }` on failure.
6
+ *
7
+ * Key resolution order (mirrors `templates/clips/actions/request-transcript.ts`):
8
+ * 1. User-scoped encrypted secret (`readAppSecret` — set via the sidebar
9
+ * settings UI).
10
+ * 2. `resolveCredential("OPENAI_API_KEY")` — env var + SQL settings store.
11
+ *
12
+ * If no key is configured, returns 400 with an error the composer UI can
13
+ * surface (the client falls back to the browser Web Speech API).
14
+ *
15
+ * This is a framework route rather than a `defineAction` because multipart
16
+ * audio bodies aren't a clean fit for the action contract (actions are
17
+ * typed JSON-in / JSON-out).
18
+ */
19
+ import { defineEventHandler, getMethod, getRequestHeader, readMultipartFormData, setResponseStatus, } from "h3";
20
+ import { readAppSecret } from "../secrets/storage.js";
21
+ import { resolveCredential } from "../credentials/index.js";
22
+ import { getSession } from "./auth.js";
23
+ const WHISPER_URL = "https://api.openai.com/v1/audio/transcriptions";
24
+ const MAX_AUDIO_BYTES = 25 * 1024 * 1024; // Whisper hard limit.
25
+ /**
26
+ * Reject cross-site POSTs. Cookies are `SameSite=None; Secure` over HTTPS so
27
+ * the browser would otherwise attach the session to a forged form submission
28
+ * from evil.com, causing us to spend OpenAI credits on the user's behalf.
29
+ * Same-origin browsers always send `Origin` on POST; if it's missing we fall
30
+ * back to `Sec-Fetch-Site` so Safari's fetch-spec behavior still works.
31
+ */
32
+ function isSameOriginRequest(event) {
33
+ const host = getRequestHeader(event, "host");
34
+ const origin = getRequestHeader(event, "origin");
35
+ if (origin && host) {
36
+ try {
37
+ return new URL(origin).host === host;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ const fetchSite = getRequestHeader(event, "sec-fetch-site");
44
+ if (fetchSite)
45
+ return fetchSite === "same-origin" || fetchSite === "none";
46
+ // No Origin and no Sec-Fetch-Site: likely a non-browser client (curl,
47
+ // server-side) — safe to allow, CSRF requires a browser with ambient cookies.
48
+ return true;
49
+ }
50
+ export function createTranscribeVoiceHandler() {
51
+ return defineEventHandler(async (event) => {
52
+ if (getMethod(event) !== "POST") {
53
+ setResponseStatus(event, 405);
54
+ return { error: "Method not allowed" };
55
+ }
56
+ if (!isSameOriginRequest(event)) {
57
+ setResponseStatus(event, 403);
58
+ return { error: "Cross-origin request rejected" };
59
+ }
60
+ const parts = await readMultipartFormData(event).catch(() => null);
61
+ const audio = parts?.find((p) => p.name === "audio");
62
+ if (!audio?.data?.length) {
63
+ setResponseStatus(event, 400);
64
+ return { error: "Missing audio payload" };
65
+ }
66
+ if (audio.data.length > MAX_AUDIO_BYTES) {
67
+ setResponseStatus(event, 413);
68
+ return { error: "Audio too large (max 25 MB)" };
69
+ }
70
+ const languagePart = parts?.find((p) => p.name === "language");
71
+ const language = languagePart?.data
72
+ ? languagePart.data.toString("utf8").trim().slice(0, 8)
73
+ : undefined;
74
+ // Resolve the key.
75
+ let apiKey;
76
+ const session = await getSession(event).catch(() => null);
77
+ if (session?.email) {
78
+ const userSecret = await readAppSecret({
79
+ key: "OPENAI_API_KEY",
80
+ scope: "user",
81
+ scopeId: session.email,
82
+ }).catch(() => null);
83
+ if (userSecret?.value)
84
+ apiKey = userSecret.value;
85
+ }
86
+ if (!apiKey) {
87
+ apiKey = await resolveCredential("OPENAI_API_KEY");
88
+ }
89
+ if (!apiKey) {
90
+ setResponseStatus(event, 400);
91
+ return {
92
+ error: "OPENAI_API_KEY not configured. Add it in Settings → API Keys to enable Whisper transcription.",
93
+ };
94
+ }
95
+ const mime = audio.type || "audio/webm";
96
+ const ext = pickExtension(mime);
97
+ const filename = `composer-voice.${ext}`;
98
+ const form = new FormData();
99
+ const bytes = new Uint8Array(audio.data.buffer, audio.data.byteOffset, audio.data.byteLength);
100
+ form.append("file", new Blob([bytes], { type: mime }), filename);
101
+ form.append("model", "whisper-1");
102
+ form.append("response_format", "json");
103
+ if (language)
104
+ form.append("language", language);
105
+ try {
106
+ const res = await fetch(WHISPER_URL, {
107
+ method: "POST",
108
+ headers: { Authorization: `Bearer ${apiKey}` },
109
+ body: form,
110
+ });
111
+ if (!res.ok) {
112
+ const text = await res.text().catch(() => "");
113
+ setResponseStatus(event, res.status === 401 ? 401 : 502);
114
+ return {
115
+ error: res.status === 401
116
+ ? "OpenAI rejected the API key. Update it in Settings → API Keys."
117
+ : `Whisper API error ${res.status}: ${text.slice(0, 300)}`,
118
+ };
119
+ }
120
+ const data = (await res.json());
121
+ return { text: (data.text ?? "").trim() };
122
+ }
123
+ catch (err) {
124
+ setResponseStatus(event, 502);
125
+ return {
126
+ error: `Could not reach OpenAI: ${err?.message ?? err}`,
127
+ };
128
+ }
129
+ });
130
+ }
131
+ function pickExtension(mime) {
132
+ const lower = mime.toLowerCase();
133
+ if (lower.includes("mp4") || lower.includes("m4a"))
134
+ return "mp4";
135
+ if (lower.includes("mpeg") || lower.includes("mp3"))
136
+ return "mp3";
137
+ if (lower.includes("ogg"))
138
+ return "ogg";
139
+ if (lower.includes("wav"))
140
+ return "wav";
141
+ return "webm";
142
+ }
143
+ //# sourceMappingURL=transcribe-voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcribe-voice.js","sourceRoot":"","sources":["../../src/server/transcribe-voice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Access-control helpers for shareable resources.
3
+ *
4
+ * The access model combines:
5
+ * 1. Direct ownership — `owner_email = currentUser`.
6
+ * 2. Visibility — `'private' | 'org' | 'public'`. `org` grants read to anyone
7
+ * in the same org; `public` grants read to any authenticated user.
8
+ * 3. Share rows — per-user or per-org grants in the `{type}_shares` table
9
+ * with a role (`viewer | editor | admin`).
10
+ *
11
+ * Use `applyAccessFilter()` on list/read queries to filter rows the current
12
+ * user can see. Use `assertAccess()` at the top of write actions to reject
13
+ * callers who lack the required role.
14
+ */
15
+ import { type SQL } from "drizzle-orm";
16
+ import { type ShareRole } from "./schema.js";
17
+ export declare class ForbiddenError extends Error {
18
+ statusCode: number;
19
+ constructor(message?: string);
20
+ }
21
+ export interface AccessContext {
22
+ userEmail?: string;
23
+ orgId?: string;
24
+ }
25
+ /** Current request's access context. Pulls from request-context ALS. */
26
+ export declare function currentAccess(): AccessContext;
27
+ /**
28
+ * Build a Drizzle `WHERE` clause that admits rows the current user can see.
29
+ * Pass the ownable resource table and its shares table; optional min role
30
+ * (defaults to 'viewer') gates which share rows count.
31
+ *
32
+ * Example:
33
+ *
34
+ * const rows = await db
35
+ * .select()
36
+ * .from(schema.documents)
37
+ * .where(accessFilter(schema.documents, schema.documentShares));
38
+ */
39
+ export declare function accessFilter(resourceTable: any, sharesTable: any, ctx?: AccessContext, minRole?: ShareRole): SQL;
40
+ export interface ResolvedAccess {
41
+ /** Effective role: 'owner' for the resource owner, or the share role. */
42
+ role: "owner" | ShareRole;
43
+ /** The resource row (already loaded). */
44
+ resource: any;
45
+ }
46
+ /**
47
+ * Return the effective role the current user has on a specific resource, or
48
+ * null if they have no access. Loads the resource and relevant share rows.
49
+ */
50
+ export declare function resolveAccess(resourceType: string, resourceId: string, ctx?: AccessContext): Promise<ResolvedAccess | null>;
51
+ /**
52
+ * Throw ForbiddenError if the current user can't act on this resource with at
53
+ * least the given role. Used at the top of update/delete actions.
54
+ */
55
+ export declare function assertAccess(resourceType: string, resourceId: string, minRole?: ShareRole | "owner", ctx?: AccessContext): Promise<ResolvedAccess>;
56
+ //# sourceMappingURL=access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../src/sharing/access.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAoB,KAAK,GAAG,EAAE,MAAM,aAAa,CAAC;AASzD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAExD,qBAAa,cAAe,SAAQ,KAAK;IACvC,UAAU,SAAO;gBACL,OAAO,SAAc;CAIlC;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wEAAwE;AACxE,wBAAgB,aAAa,IAAI,aAAa,CAK7C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,aAAa,EAAE,GAAG,EAClB,WAAW,EAAE,GAAG,EAChB,GAAG,GAAE,aAA+B,EACpC,OAAO,GAAE,SAAoB,GAC5B,GAAG,CAkCL;AAaD,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,yCAAyC;IACzC,QAAQ,EAAE,GAAG,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,aAA+B,GACnC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA2BhC;AA+BD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,SAAS,GAAG,OAAkB,EACvC,GAAG,GAAE,aAA+B,GACnC,OAAO,CAAC,cAAc,CAAC,CAWzB"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Access-control helpers for shareable resources.
3
+ *
4
+ * The access model combines:
5
+ * 1. Direct ownership — `owner_email = currentUser`.
6
+ * 2. Visibility — `'private' | 'org' | 'public'`. `org` grants read to anyone
7
+ * in the same org; `public` grants read to any authenticated user.
8
+ * 3. Share rows — per-user or per-org grants in the `{type}_shares` table
9
+ * with a role (`viewer | editor | admin`).
10
+ *
11
+ * Use `applyAccessFilter()` on list/read queries to filter rows the current
12
+ * user can see. Use `assertAccess()` at the top of write actions to reject
13
+ * callers who lack the required role.
14
+ */
15
+ import { and, eq, or, sql } from "drizzle-orm";
16
+ import { getRequestUserEmail, getRequestOrgId, } from "../server/request-context.js";
17
+ import { requireShareableResource, } from "./registry.js";
18
+ import { ROLE_RANK } from "./schema.js";
19
+ export class ForbiddenError extends Error {
20
+ statusCode = 403;
21
+ constructor(message = "Forbidden") {
22
+ super(message);
23
+ this.name = "ForbiddenError";
24
+ }
25
+ }
26
+ /** Current request's access context. Pulls from request-context ALS. */
27
+ export function currentAccess() {
28
+ return {
29
+ userEmail: getRequestUserEmail(),
30
+ orgId: getRequestOrgId(),
31
+ };
32
+ }
33
+ /**
34
+ * Build a Drizzle `WHERE` clause that admits rows the current user can see.
35
+ * Pass the ownable resource table and its shares table; optional min role
36
+ * (defaults to 'viewer') gates which share rows count.
37
+ *
38
+ * Example:
39
+ *
40
+ * const rows = await db
41
+ * .select()
42
+ * .from(schema.documents)
43
+ * .where(accessFilter(schema.documents, schema.documentShares));
44
+ */
45
+ export function accessFilter(resourceTable, sharesTable, ctx = currentAccess(), minRole = "viewer") {
46
+ const { userEmail, orgId } = ctx;
47
+ const clauses = [];
48
+ if (userEmail) {
49
+ clauses.push(eq(resourceTable.ownerEmail, userEmail));
50
+ }
51
+ clauses.push(eq(resourceTable.visibility, "public"));
52
+ if (orgId) {
53
+ clauses.push(and(eq(resourceTable.visibility, "org"), eq(resourceTable.orgId, orgId)));
54
+ }
55
+ if (userEmail) {
56
+ clauses.push(sql `exists (select 1 from ${sharesTable}
57
+ where ${sharesTable.resourceId} = ${resourceTable.id}
58
+ and ${sharesTable.principalType} = 'user'
59
+ and ${sharesTable.principalId} = ${userEmail}
60
+ and ${minRoleSql(minRole)})`);
61
+ }
62
+ if (orgId) {
63
+ clauses.push(sql `exists (select 1 from ${sharesTable}
64
+ where ${sharesTable.resourceId} = ${resourceTable.id}
65
+ and ${sharesTable.principalType} = 'org'
66
+ and ${sharesTable.principalId} = ${orgId}
67
+ and ${minRoleSql(minRole)})`);
68
+ }
69
+ // If there's no user and no org (fully anonymous), only public resources.
70
+ return or(...clauses) ?? eq(resourceTable.visibility, "public");
71
+ }
72
+ function minRoleSql(minRole) {
73
+ if (minRole === "viewer") {
74
+ // any role satisfies viewer
75
+ return sql `1=1`;
76
+ }
77
+ if (minRole === "editor") {
78
+ return sql `role in ('editor','admin')`;
79
+ }
80
+ return sql `role = 'admin'`;
81
+ }
82
+ /**
83
+ * Return the effective role the current user has on a specific resource, or
84
+ * null if they have no access. Loads the resource and relevant share rows.
85
+ */
86
+ export async function resolveAccess(resourceType, resourceId, ctx = currentAccess()) {
87
+ const reg = requireShareableResource(resourceType);
88
+ const db = reg.getDb();
89
+ const [resource] = await db
90
+ .select()
91
+ .from(reg.resourceTable)
92
+ .where(eq(reg.resourceTable.id, resourceId));
93
+ if (!resource)
94
+ return null;
95
+ const { userEmail, orgId } = ctx;
96
+ if (userEmail && resource.ownerEmail === userEmail) {
97
+ return { role: "owner", resource };
98
+ }
99
+ if (resource.visibility === "public") {
100
+ // No share row needed; default viewer unless upgraded below.
101
+ const role = await highestShareRole(reg, resourceId, ctx);
102
+ return { role: role ?? "viewer", resource };
103
+ }
104
+ if (resource.visibility === "org" && orgId && resource.orgId === orgId) {
105
+ const role = await highestShareRole(reg, resourceId, ctx);
106
+ return { role: role ?? "viewer", resource };
107
+ }
108
+ const role = await highestShareRole(reg, resourceId, ctx);
109
+ if (role)
110
+ return { role, resource };
111
+ return null;
112
+ }
113
+ async function highestShareRole(reg, resourceId, ctx) {
114
+ const { userEmail, orgId } = ctx;
115
+ if (!userEmail && !orgId)
116
+ return null;
117
+ const db = reg.getDb();
118
+ const rows = await db
119
+ .select()
120
+ .from(reg.sharesTable)
121
+ .where(eq(reg.sharesTable.resourceId, resourceId));
122
+ let best = null;
123
+ for (const r of rows) {
124
+ const matches = (r.principalType === "user" &&
125
+ userEmail &&
126
+ r.principalId === userEmail) ||
127
+ (r.principalType === "org" && orgId && r.principalId === orgId);
128
+ if (!matches)
129
+ continue;
130
+ if (!best || ROLE_RANK[r.role] > ROLE_RANK[best])
131
+ best = r.role;
132
+ }
133
+ return best;
134
+ }
135
+ /**
136
+ * Throw ForbiddenError if the current user can't act on this resource with at
137
+ * least the given role. Used at the top of update/delete actions.
138
+ */
139
+ export async function assertAccess(resourceType, resourceId, minRole = "viewer", ctx = currentAccess()) {
140
+ const access = await resolveAccess(resourceType, resourceId, ctx);
141
+ if (!access) {
142
+ throw new ForbiddenError(`No access to ${resourceType} ${resourceId}`);
143
+ }
144
+ if (ROLE_RANK[access.role] < ROLE_RANK[minRole]) {
145
+ throw new ForbiddenError(`Requires ${minRole} role on ${resourceType} ${resourceId} (have ${access.role})`);
146
+ }
147
+ return access;
148
+ }
149
+ //# sourceMappingURL=access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/sharing/access.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ //# sourceMappingURL=list-resource-shares.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-resource-shares.d.ts","sourceRoot":"","sources":["../../../src/sharing/actions/list-resource-shares.ts"],"names":[],"mappings":";AAMA,wBAiCG"}
@@ -0,0 +1,38 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { z } from "zod";
3
+ import { defineAction } from "../../action.js";
4
+ import { resolveAccess } from "../access.js";
5
+ import { requireShareableResource } from "../registry.js";
6
+ export default defineAction({
7
+ description: "List the current visibility and share grants on a shareable resource. Any read access is sufficient.",
8
+ schema: z.object({
9
+ resourceType: z.string(),
10
+ resourceId: z.string(),
11
+ }),
12
+ http: { method: "GET" },
13
+ run: async (args) => {
14
+ const reg = requireShareableResource(args.resourceType);
15
+ const access = await resolveAccess(args.resourceType, args.resourceId);
16
+ if (!access)
17
+ return { ownerEmail: null, visibility: null, shares: [] };
18
+ const db = reg.getDb();
19
+ const shares = await db
20
+ .select()
21
+ .from(reg.sharesTable)
22
+ .where(eq(reg.sharesTable.resourceId, args.resourceId));
23
+ return {
24
+ ownerEmail: access.resource.ownerEmail ?? null,
25
+ orgId: access.resource.orgId ?? null,
26
+ visibility: access.resource.visibility ?? "private",
27
+ role: access.role,
28
+ shares: shares.map((s) => ({
29
+ id: s.id,
30
+ principalType: s.principalType,
31
+ principalId: s.principalId,
32
+ role: s.role,
33
+ createdAt: s.createdAt,
34
+ })),
35
+ };
36
+ },
37
+ });
38
+ //# sourceMappingURL=list-resource-shares.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-resource-shares.js","sourceRoot":"","sources":["../../../src/sharing/actions/list-resource-shares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,sGAAsG;IACxG,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC;IACF,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IACvB,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,wBAAwB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAEvE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAS,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,EAAE;aACpB,MAAM,EAAE;aACR,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;aACrB,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAE1D,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI;YAC9C,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI;YACpC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,SAAS;YACnD,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ //# sourceMappingURL=set-resource-visibility.d.ts.map