@raybase/core 0.0.2 → 0.3.3

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 (435) hide show
  1. package/LICENSE +21 -0
  2. package/dist/.admin-build/AdminApp.css +2 -0
  3. package/dist/.admin-build/AdminApp.js +77 -0
  4. package/dist/.admin-docs-build/AdminDocsApp.css +2 -0
  5. package/dist/.admin-docs-build/AdminDocsApp.js +45 -0
  6. package/dist/actions.d.ts +347 -0
  7. package/dist/actions.d.ts.map +1 -0
  8. package/dist/actions.js +661 -0
  9. package/dist/actions.js.map +1 -0
  10. package/dist/admin-assets/admin.7738f50720a8ed7b.css +2 -0
  11. package/dist/admin-assets/admin.8678cb61db34dc81.js +77 -0
  12. package/dist/admin-boot.d.ts +94 -0
  13. package/dist/admin-boot.d.ts.map +1 -0
  14. package/dist/admin-boot.js +139 -0
  15. package/dist/admin-boot.js.map +1 -0
  16. package/dist/admin-docs-content.d.ts +95 -0
  17. package/dist/admin-docs-content.d.ts.map +1 -0
  18. package/dist/admin-docs-content.js +463 -0
  19. package/dist/admin-docs-content.js.map +1 -0
  20. package/dist/admin-docs-ui.d.ts +11 -0
  21. package/dist/admin-docs-ui.d.ts.map +1 -0
  22. package/dist/admin-docs-ui.js +23 -0
  23. package/dist/admin-docs-ui.js.map +1 -0
  24. package/dist/admin-kit.d.ts +29 -0
  25. package/dist/admin-kit.js +1557 -0
  26. package/dist/admin-role.d.ts +8 -0
  27. package/dist/admin-role.d.ts.map +1 -0
  28. package/dist/admin-role.js +22 -0
  29. package/dist/admin-role.js.map +1 -0
  30. package/dist/admin-ui.d.ts +3 -0
  31. package/dist/admin-ui.d.ts.map +1 -0
  32. package/dist/admin-ui.js +16 -0
  33. package/dist/admin-ui.js.map +1 -0
  34. package/dist/agent-ai-chat.d.ts +127 -0
  35. package/dist/agent-ai-chat.d.ts.map +1 -0
  36. package/dist/agent-ai-chat.js +5975 -0
  37. package/dist/agent-ai-chat.js.map +1 -0
  38. package/dist/agent-chapter-archive.d.ts +214 -0
  39. package/dist/agent-chapter-archive.d.ts.map +1 -0
  40. package/dist/agent-chapter-archive.js +696 -0
  41. package/dist/agent-chapter-archive.js.map +1 -0
  42. package/dist/agent-chapter-search.d.ts +116 -0
  43. package/dist/agent-chapter-search.d.ts.map +1 -0
  44. package/dist/agent-chapter-search.js +605 -0
  45. package/dist/agent-chapter-search.js.map +1 -0
  46. package/dist/agent-chapter-tools.d.ts +45 -0
  47. package/dist/agent-chapter-tools.d.ts.map +1 -0
  48. package/dist/agent-chapter-tools.js +344 -0
  49. package/dist/agent-chapter-tools.js.map +1 -0
  50. package/dist/agent-chapters.d.ts +228 -0
  51. package/dist/agent-chapters.d.ts.map +1 -0
  52. package/dist/agent-chapters.js +737 -0
  53. package/dist/agent-chapters.js.map +1 -0
  54. package/dist/agent-data-parts.d.ts +167 -0
  55. package/dist/agent-data-parts.d.ts.map +1 -0
  56. package/dist/agent-data-parts.js +68 -0
  57. package/dist/agent-data-parts.js.map +1 -0
  58. package/dist/agent-errors.d.ts +41 -0
  59. package/dist/agent-errors.d.ts.map +1 -0
  60. package/dist/agent-errors.js +191 -0
  61. package/dist/agent-errors.js.map +1 -0
  62. package/dist/agent-follow-up-store.d.ts +273 -0
  63. package/dist/agent-follow-up-store.d.ts.map +1 -0
  64. package/dist/agent-follow-up-store.js +703 -0
  65. package/dist/agent-follow-up-store.js.map +1 -0
  66. package/dist/agent-follow-ups.d.ts +314 -0
  67. package/dist/agent-follow-ups.d.ts.map +1 -0
  68. package/dist/agent-follow-ups.js +840 -0
  69. package/dist/agent-follow-ups.js.map +1 -0
  70. package/dist/agent-memory.d.ts +323 -0
  71. package/dist/agent-memory.d.ts.map +1 -0
  72. package/dist/agent-memory.js +1270 -0
  73. package/dist/agent-memory.js.map +1 -0
  74. package/dist/agent-message-parts.d.ts +58 -0
  75. package/dist/agent-message-parts.d.ts.map +1 -0
  76. package/dist/agent-message-parts.js +163 -0
  77. package/dist/agent-message-parts.js.map +1 -0
  78. package/dist/agent-remote-mcp-credentials.d.ts +154 -0
  79. package/dist/agent-remote-mcp-credentials.d.ts.map +1 -0
  80. package/dist/agent-remote-mcp-credentials.js +287 -0
  81. package/dist/agent-remote-mcp-credentials.js.map +1 -0
  82. package/dist/agent-remote-mcp-crypto.d.ts +32 -0
  83. package/dist/agent-remote-mcp-crypto.d.ts.map +1 -0
  84. package/dist/agent-remote-mcp-crypto.js +101 -0
  85. package/dist/agent-remote-mcp-crypto.js.map +1 -0
  86. package/dist/agent-remote-mcp-install.d.ts +299 -0
  87. package/dist/agent-remote-mcp-install.d.ts.map +1 -0
  88. package/dist/agent-remote-mcp-install.js +785 -0
  89. package/dist/agent-remote-mcp-install.js.map +1 -0
  90. package/dist/agent-remote-mcp-oauth.d.ts +73 -0
  91. package/dist/agent-remote-mcp-oauth.d.ts.map +1 -0
  92. package/dist/agent-remote-mcp-oauth.js +344 -0
  93. package/dist/agent-remote-mcp-oauth.js.map +1 -0
  94. package/dist/agent-remote-mcp-transport.d.ts +46 -0
  95. package/dist/agent-remote-mcp-transport.d.ts.map +1 -0
  96. package/dist/agent-remote-mcp-transport.js +225 -0
  97. package/dist/agent-remote-mcp-transport.js.map +1 -0
  98. package/dist/agent-remote-mcp.d.ts +147 -0
  99. package/dist/agent-remote-mcp.d.ts.map +1 -0
  100. package/dist/agent-remote-mcp.js +681 -0
  101. package/dist/agent-remote-mcp.js.map +1 -0
  102. package/dist/agent-room-redaction.d.ts +66 -0
  103. package/dist/agent-room-redaction.d.ts.map +1 -0
  104. package/dist/agent-room-redaction.js +264 -0
  105. package/dist/agent-room-redaction.js.map +1 -0
  106. package/dist/agent-rooms.d.ts +209 -0
  107. package/dist/agent-rooms.d.ts.map +1 -0
  108. package/dist/agent-rooms.js +244 -0
  109. package/dist/agent-rooms.js.map +1 -0
  110. package/dist/agent-runtime.d.ts +541 -0
  111. package/dist/agent-runtime.d.ts.map +1 -0
  112. package/dist/agent-runtime.js +4260 -0
  113. package/dist/agent-runtime.js.map +1 -0
  114. package/dist/agent-skill-archive.d.ts +20 -0
  115. package/dist/agent-skill-archive.d.ts.map +1 -0
  116. package/dist/agent-skill-archive.js +316 -0
  117. package/dist/agent-skill-archive.js.map +1 -0
  118. package/dist/agent-skill-discovery.d.ts +96 -0
  119. package/dist/agent-skill-discovery.d.ts.map +1 -0
  120. package/dist/agent-skill-discovery.js +464 -0
  121. package/dist/agent-skill-discovery.js.map +1 -0
  122. package/dist/agent-skill-format.d.ts +57 -0
  123. package/dist/agent-skill-format.d.ts.map +1 -0
  124. package/dist/agent-skill-format.js +238 -0
  125. package/dist/agent-skill-format.js.map +1 -0
  126. package/dist/agent-skill-import.d.ts +64 -0
  127. package/dist/agent-skill-import.d.ts.map +1 -0
  128. package/dist/agent-skill-import.js +295 -0
  129. package/dist/agent-skill-import.js.map +1 -0
  130. package/dist/agent-skill-publish.d.ts +51 -0
  131. package/dist/agent-skill-publish.d.ts.map +1 -0
  132. package/dist/agent-skill-publish.js +136 -0
  133. package/dist/agent-skill-publish.js.map +1 -0
  134. package/dist/agent-skill-store.d.ts +252 -0
  135. package/dist/agent-skill-store.d.ts.map +1 -0
  136. package/dist/agent-skill-store.js +514 -0
  137. package/dist/agent-skill-store.js.map +1 -0
  138. package/dist/agent-skills.d.ts +85 -0
  139. package/dist/agent-skills.d.ts.map +1 -0
  140. package/dist/agent-skills.js +291 -0
  141. package/dist/agent-skills.js.map +1 -0
  142. package/dist/agent-transcript-pager.d.ts +77 -0
  143. package/dist/agent-transcript-pager.d.ts.map +1 -0
  144. package/dist/agent-transcript-pager.js +210 -0
  145. package/dist/agent-transcript-pager.js.map +1 -0
  146. package/dist/agent-user-data-parts.d.ts +20 -0
  147. package/dist/agent-user-data-parts.d.ts.map +1 -0
  148. package/dist/agent-user-data-parts.js +161 -0
  149. package/dist/agent-user-data-parts.js.map +1 -0
  150. package/dist/agent-user-transcript.d.ts +46 -0
  151. package/dist/agent-user-transcript.d.ts.map +1 -0
  152. package/dist/agent-user-transcript.js +106 -0
  153. package/dist/agent-user-transcript.js.map +1 -0
  154. package/dist/agent-voice-notes.d.ts +15 -0
  155. package/dist/agent-voice-notes.d.ts.map +1 -0
  156. package/dist/agent-voice-notes.js +17 -0
  157. package/dist/agent-voice-notes.js.map +1 -0
  158. package/dist/agent-wakes.d.ts +213 -0
  159. package/dist/agent-wakes.d.ts.map +1 -0
  160. package/dist/agent-wakes.js +534 -0
  161. package/dist/agent-wakes.js.map +1 -0
  162. package/dist/agent.d.ts +1780 -0
  163. package/dist/agent.d.ts.map +1 -0
  164. package/dist/agent.js +3123 -0
  165. package/dist/agent.js.map +1 -0
  166. package/dist/ai.d.ts +583 -0
  167. package/dist/ai.d.ts.map +1 -0
  168. package/dist/ai.js +1858 -0
  169. package/dist/ai.js.map +1 -0
  170. package/dist/app-manifest.d.ts +255 -0
  171. package/dist/app-manifest.d.ts.map +1 -0
  172. package/dist/app-manifest.js +372 -0
  173. package/dist/app-manifest.js.map +1 -0
  174. package/dist/app-users.d.ts +30 -0
  175. package/dist/app-users.d.ts.map +1 -0
  176. package/dist/app-users.js +91 -0
  177. package/dist/app-users.js.map +1 -0
  178. package/dist/audit-archive.d.ts +85 -0
  179. package/dist/audit-archive.d.ts.map +1 -0
  180. package/dist/audit-archive.js +178 -0
  181. package/dist/audit-archive.js.map +1 -0
  182. package/dist/audit.d.ts +54 -0
  183. package/dist/audit.d.ts.map +1 -0
  184. package/dist/audit.js +95 -0
  185. package/dist/audit.js.map +1 -0
  186. package/dist/auth-logger.d.ts +28 -0
  187. package/dist/auth-logger.d.ts.map +1 -0
  188. package/dist/auth-logger.js +53 -0
  189. package/dist/auth-logger.js.map +1 -0
  190. package/dist/auth-password-secret.d.ts +59 -0
  191. package/dist/auth-password-secret.d.ts.map +1 -0
  192. package/dist/auth-password-secret.js +409 -0
  193. package/dist/auth-password-secret.js.map +1 -0
  194. package/dist/auth-schema.d.ts +120 -0
  195. package/dist/auth-schema.d.ts.map +1 -0
  196. package/dist/auth-schema.js +285 -0
  197. package/dist/auth-schema.js.map +1 -0
  198. package/dist/auth.d.ts +321 -0
  199. package/dist/auth.d.ts.map +1 -0
  200. package/dist/auth.js +1562 -0
  201. package/dist/auth.js.map +1 -0
  202. package/dist/backup-archive.d.ts +257 -0
  203. package/dist/backup-archive.d.ts.map +1 -0
  204. package/dist/backup-archive.js +2068 -0
  205. package/dist/backup-archive.js.map +1 -0
  206. package/dist/backup-crypto.d.ts +313 -0
  207. package/dist/backup-crypto.d.ts.map +1 -0
  208. package/dist/backup-crypto.js +693 -0
  209. package/dist/backup-crypto.js.map +1 -0
  210. package/dist/backup-format.d.ts +200 -0
  211. package/dist/backup-format.d.ts.map +1 -0
  212. package/dist/backup-format.js +1247 -0
  213. package/dist/backup-format.js.map +1 -0
  214. package/dist/cli.d.ts +9 -0
  215. package/dist/cli.d.ts.map +1 -0
  216. package/dist/cli.js +15 -0
  217. package/dist/cli.js.map +1 -0
  218. package/dist/clock.d.ts +35 -0
  219. package/dist/clock.d.ts.map +1 -0
  220. package/dist/clock.js +83 -0
  221. package/dist/clock.js.map +1 -0
  222. package/dist/data-client.d.ts +187 -0
  223. package/dist/data-client.d.ts.map +1 -0
  224. package/dist/data-client.js +590 -0
  225. package/dist/data-client.js.map +1 -0
  226. package/dist/data-secrets.d.ts +164 -0
  227. package/dist/data-secrets.d.ts.map +1 -0
  228. package/dist/data-secrets.js +383 -0
  229. package/dist/data-secrets.js.map +1 -0
  230. package/dist/db.d.ts +453 -0
  231. package/dist/db.d.ts.map +1 -0
  232. package/dist/db.js +324 -0
  233. package/dist/db.js.map +1 -0
  234. package/dist/dev-activity.d.ts +48 -0
  235. package/dist/dev-activity.d.ts.map +1 -0
  236. package/dist/dev-activity.js +50 -0
  237. package/dist/dev-activity.js.map +1 -0
  238. package/dist/do.d.ts +429 -0
  239. package/dist/do.d.ts.map +1 -0
  240. package/dist/do.js +4526 -0
  241. package/dist/do.js.map +1 -0
  242. package/dist/email.d.ts +137 -0
  243. package/dist/email.d.ts.map +1 -0
  244. package/dist/email.js +527 -0
  245. package/dist/email.js.map +1 -0
  246. package/dist/generated/admin-assets.d.ts +16 -0
  247. package/dist/generated/admin-assets.d.ts.map +1 -0
  248. package/dist/generated/admin-assets.js +16 -0
  249. package/dist/generated/admin-assets.js.map +1 -0
  250. package/dist/generated/admin-docs-assets.d.ts +3 -0
  251. package/dist/generated/admin-docs-assets.d.ts.map +1 -0
  252. package/dist/generated/admin-docs-assets.js +3 -0
  253. package/dist/generated/admin-docs-assets.js.map +1 -0
  254. package/dist/handoff-consumer.d.ts +79 -0
  255. package/dist/handoff-consumer.d.ts.map +1 -0
  256. package/dist/handoff-consumer.js +300 -0
  257. package/dist/handoff-consumer.js.map +1 -0
  258. package/dist/handoff.d.ts +70 -0
  259. package/dist/handoff.d.ts.map +1 -0
  260. package/dist/handoff.js +228 -0
  261. package/dist/handoff.js.map +1 -0
  262. package/dist/host-auth.d.ts +47 -0
  263. package/dist/host-auth.d.ts.map +1 -0
  264. package/dist/host-auth.js +59 -0
  265. package/dist/host-auth.js.map +1 -0
  266. package/dist/host-user.d.ts +15 -0
  267. package/dist/host-user.d.ts.map +1 -0
  268. package/dist/host-user.js +23 -0
  269. package/dist/host-user.js.map +1 -0
  270. package/dist/html.d.ts +35 -0
  271. package/dist/html.d.ts.map +1 -0
  272. package/dist/html.js +634 -0
  273. package/dist/html.js.map +1 -0
  274. package/dist/http-error.d.ts +13 -0
  275. package/dist/http-error.d.ts.map +1 -0
  276. package/dist/http-error.js +15 -0
  277. package/dist/http-error.js.map +1 -0
  278. package/dist/imports.d.ts +219 -0
  279. package/dist/imports.d.ts.map +1 -0
  280. package/dist/imports.js +571 -0
  281. package/dist/imports.js.map +1 -0
  282. package/dist/index.d.ts +78 -0
  283. package/dist/index.d.ts.map +1 -0
  284. package/dist/index.js +76 -0
  285. package/dist/index.js.map +1 -0
  286. package/dist/inference-tape.d.ts +64 -0
  287. package/dist/inference-tape.d.ts.map +1 -0
  288. package/dist/inference-tape.js +278 -0
  289. package/dist/inference-tape.js.map +1 -0
  290. package/dist/internal.d.ts +15 -0
  291. package/dist/internal.d.ts.map +1 -0
  292. package/dist/internal.js +48 -0
  293. package/dist/internal.js.map +1 -0
  294. package/dist/jobs.d.ts +796 -0
  295. package/dist/jobs.d.ts.map +1 -0
  296. package/dist/jobs.js +538 -0
  297. package/dist/jobs.js.map +1 -0
  298. package/dist/json-schema.d.ts +91 -0
  299. package/dist/json-schema.d.ts.map +1 -0
  300. package/dist/json-schema.js +884 -0
  301. package/dist/json-schema.js.map +1 -0
  302. package/dist/knowledge.d.ts +33 -0
  303. package/dist/knowledge.d.ts.map +1 -0
  304. package/dist/knowledge.js +348 -0
  305. package/dist/knowledge.js.map +1 -0
  306. package/dist/local-dev-chrome.d.ts +29 -0
  307. package/dist/local-dev-chrome.d.ts.map +1 -0
  308. package/dist/local-dev-chrome.js +514 -0
  309. package/dist/local-dev-chrome.js.map +1 -0
  310. package/dist/local-dev-personas.d.ts +15 -0
  311. package/dist/local-dev-personas.d.ts.map +1 -0
  312. package/dist/local-dev-personas.js +46 -0
  313. package/dist/local-dev-personas.js.map +1 -0
  314. package/dist/mcp.d.ts +567 -0
  315. package/dist/mcp.d.ts.map +1 -0
  316. package/dist/mcp.js +2480 -0
  317. package/dist/mcp.js.map +1 -0
  318. package/dist/modules.d.ts +145 -0
  319. package/dist/modules.d.ts.map +1 -0
  320. package/dist/modules.js +164 -0
  321. package/dist/modules.js.map +1 -0
  322. package/dist/notification-client.d.ts +94 -0
  323. package/dist/notification-client.d.ts.map +1 -0
  324. package/dist/notification-client.js +127 -0
  325. package/dist/notification-client.js.map +1 -0
  326. package/dist/notifications.d.ts +447 -0
  327. package/dist/notifications.d.ts.map +1 -0
  328. package/dist/notifications.js +1625 -0
  329. package/dist/notifications.js.map +1 -0
  330. package/dist/operator-data-query.d.ts +117 -0
  331. package/dist/operator-data-query.d.ts.map +1 -0
  332. package/dist/operator-data-query.js +431 -0
  333. package/dist/operator-data-query.js.map +1 -0
  334. package/dist/operator-mcp.d.ts +63 -0
  335. package/dist/operator-mcp.d.ts.map +1 -0
  336. package/dist/operator-mcp.js +2828 -0
  337. package/dist/operator-mcp.js.map +1 -0
  338. package/dist/outbound-https.d.ts +24 -0
  339. package/dist/outbound-https.d.ts.map +1 -0
  340. package/dist/outbound-https.js +172 -0
  341. package/dist/outbound-https.js.map +1 -0
  342. package/dist/pitr.d.ts +60 -0
  343. package/dist/pitr.d.ts.map +1 -0
  344. package/dist/pitr.js +94 -0
  345. package/dist/pitr.js.map +1 -0
  346. package/dist/platform.d.ts +199 -0
  347. package/dist/platform.d.ts.map +1 -0
  348. package/dist/platform.js +196 -0
  349. package/dist/platform.js.map +1 -0
  350. package/dist/policies.d.ts +115 -0
  351. package/dist/policies.d.ts.map +1 -0
  352. package/dist/policies.js +158 -0
  353. package/dist/policies.js.map +1 -0
  354. package/dist/principal.d.ts +143 -0
  355. package/dist/principal.d.ts.map +1 -0
  356. package/dist/principal.js +174 -0
  357. package/dist/principal.js.map +1 -0
  358. package/dist/realtime.d.ts +280 -0
  359. package/dist/realtime.d.ts.map +1 -0
  360. package/dist/realtime.js +578 -0
  361. package/dist/realtime.js.map +1 -0
  362. package/dist/retrieval.d.ts +263 -0
  363. package/dist/retrieval.d.ts.map +1 -0
  364. package/dist/retrieval.js +602 -0
  365. package/dist/retrieval.js.map +1 -0
  366. package/dist/runtime-error-client.d.ts +10 -0
  367. package/dist/runtime-error-client.d.ts.map +1 -0
  368. package/dist/runtime-error-client.js +70 -0
  369. package/dist/runtime-error-client.js.map +1 -0
  370. package/dist/runtime-errors.d.ts +180 -0
  371. package/dist/runtime-errors.d.ts.map +1 -0
  372. package/dist/runtime-errors.js +572 -0
  373. package/dist/runtime-errors.js.map +1 -0
  374. package/dist/schema.d.ts +434 -0
  375. package/dist/schema.d.ts.map +1 -0
  376. package/dist/schema.js +232 -0
  377. package/dist/schema.js.map +1 -0
  378. package/dist/search.d.ts +216 -0
  379. package/dist/search.d.ts.map +1 -0
  380. package/dist/search.js +785 -0
  381. package/dist/search.js.map +1 -0
  382. package/dist/settings.d.ts +191 -0
  383. package/dist/settings.d.ts.map +1 -0
  384. package/dist/settings.js +478 -0
  385. package/dist/settings.js.map +1 -0
  386. package/dist/sql.d.ts +7 -0
  387. package/dist/sql.d.ts.map +1 -0
  388. package/dist/sql.js +30 -0
  389. package/dist/sql.js.map +1 -0
  390. package/dist/storage-client.d.ts +69 -0
  391. package/dist/storage-client.d.ts.map +1 -0
  392. package/dist/storage-client.js +469 -0
  393. package/dist/storage-client.js.map +1 -0
  394. package/dist/storage.d.ts +21 -0
  395. package/dist/storage.d.ts.map +1 -0
  396. package/dist/storage.js +82 -0
  397. package/dist/storage.js.map +1 -0
  398. package/dist/subject-domains.d.ts +15 -0
  399. package/dist/subject-domains.d.ts.map +1 -0
  400. package/dist/subject-domains.js +38 -0
  401. package/dist/subject-domains.js.map +1 -0
  402. package/dist/support.d.ts +132 -0
  403. package/dist/support.d.ts.map +1 -0
  404. package/dist/support.js +483 -0
  405. package/dist/support.js.map +1 -0
  406. package/dist/system-tables.d.ts +12 -0
  407. package/dist/system-tables.d.ts.map +1 -0
  408. package/dist/system-tables.js +225 -0
  409. package/dist/system-tables.js.map +1 -0
  410. package/dist/test.d.ts +57 -0
  411. package/dist/test.d.ts.map +1 -0
  412. package/dist/test.js +454 -0
  413. package/dist/test.js.map +1 -0
  414. package/dist/vite.d.ts +82 -0
  415. package/dist/vite.d.ts.map +1 -0
  416. package/dist/vite.js +82 -0
  417. package/dist/vite.js.map +1 -0
  418. package/dist/webpush-crypto.d.ts +39 -0
  419. package/dist/webpush-crypto.d.ts.map +1 -0
  420. package/dist/webpush-crypto.js +213 -0
  421. package/dist/webpush-crypto.js.map +1 -0
  422. package/dist/webpush-private.d.ts +11 -0
  423. package/dist/webpush-private.d.ts.map +1 -0
  424. package/dist/webpush-private.js +11 -0
  425. package/dist/webpush-private.js.map +1 -0
  426. package/dist/webpush.d.ts +86 -0
  427. package/dist/webpush.d.ts.map +1 -0
  428. package/dist/webpush.js +375 -0
  429. package/dist/webpush.js.map +1 -0
  430. package/dist/worker.d.ts +185 -0
  431. package/dist/worker.d.ts.map +1 -0
  432. package/dist/worker.js +13021 -0
  433. package/dist/worker.js.map +1 -0
  434. package/package.json +161 -8
  435. package/README.md +0 -3
package/dist/html.js ADDED
@@ -0,0 +1,634 @@
1
+ import { publicSignupEnabled, resolveSignupMode } from "./schema.js";
2
+ import { raybaseDevPersonaOperatorRole, resolveRaybaseDevPersonas } from "./local-dev-personas.js";
3
+ export function escapeHtml(value) {
4
+ return String(value ?? "")
5
+ .replace(/&/g, "&")
6
+ .replace(/</g, "&lt;")
7
+ .replace(/>/g, "&gt;")
8
+ .replace(/"/g, "&quot;")
9
+ .replace(/'/g, "&#39;");
10
+ }
11
+ export function jsonScript(value) {
12
+ return JSON.stringify(value).replace(/</g, "\\u003c");
13
+ }
14
+ // Letter-mark favicon as a data URI: no static asset pipeline exists for core
15
+ // pages, and an inline icon also stops browsers requesting /favicon.ico (a 404
16
+ // logged on every page load otherwise).
17
+ export function faviconDataUri(appName) {
18
+ const letter = (appName ?? "").trim().charAt(0).toUpperCase().replace(/[^A-Z0-9]/, "") || "A";
19
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#09090b"/><text x="32" y="44" font-family="ui-sans-serif, system-ui, sans-serif" font-size="34" font-weight="600" fill="#ffffff" text-anchor="middle">${letter}</text></svg>`;
20
+ return `data:image/svg+xml,${encodeURIComponent(svg)}`;
21
+ }
22
+ function externalAssetTags(assets, placement) {
23
+ if (!assets?.length)
24
+ return "";
25
+ return assets
26
+ .map((asset) => {
27
+ const integrity = asset.integrity ? ` integrity="${escapeHtml(asset.integrity)}"` : "";
28
+ if (placement === "head" && asset.href)
29
+ return ` <link rel="stylesheet" href="${escapeHtml(asset.href)}"${integrity}>`;
30
+ if (placement === "body" && asset.src)
31
+ return `<script src="${escapeHtml(asset.src)}"${integrity} defer></script>`;
32
+ return "";
33
+ })
34
+ .filter(Boolean)
35
+ .join("\n");
36
+ }
37
+ export function page(title, body, options = {}) {
38
+ const appName = options.appName ?? "Raybase";
39
+ const headAssets = externalAssetTags(options.assets, "head");
40
+ const bodyAssets = externalAssetTags(options.assets, "body");
41
+ return `<!doctype html>
42
+ <html lang="en">
43
+ <head>
44
+ <meta charset="utf-8">
45
+ <meta name="viewport" content="width=device-width, initial-scale=1">
46
+ <link rel="icon" href="${faviconDataUri(appName)}">
47
+ <title>${escapeHtml(title)} - ${escapeHtml(appName)}</title>
48
+ ${options.headScript ? ` <script>${options.headScript}</script>\n` : ""}${headAssets ? `${headAssets}\n` : ""} <style>
49
+ :root { color-scheme: light; --ink:#09090b; --ink-hover:#27272a; --text:#18181b; --muted:#52525b; --line:#e4e4e7; --line-strong:#d4d4d8; --page:#fafafa; --surface:#ffffff; --surface-muted:#fafafa; --placeholder:#a1a1aa; --ring:rgb(161 161 170 / 0.7); }
50
+ * { box-sizing: border-box; }
51
+ body { margin:0; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background:var(--page); color:var(--text); -webkit-font-smoothing:antialiased; }
52
+ .auth-shell a { color: var(--ink); }
53
+ button, input, select, textarea { font: inherit; }
54
+ /* Form-element styling is scoped to the auth pages so it never bleeds into the
55
+ Tailwind-styled admin SPA (unlayered rules would otherwise beat @layer utilities). */
56
+ .auth-shell button { border: 1px solid var(--ink); background: var(--ink); color: #fff; border-radius: 0.5rem; padding: 0.55rem 0.85rem; font-weight: 500; cursor: pointer; transition: background-color .15s ease, border-color .15s ease, color .15s ease; }
57
+ .auth-shell button:hover { background: var(--ink-hover); border-color: var(--ink-hover); }
58
+ .auth-shell button.secondary { background: var(--surface); color: var(--text); border-color: var(--line); }
59
+ .auth-shell button.secondary:hover { background: var(--surface-muted); border-color: var(--line-strong); }
60
+ .auth-shell button.danger { background: var(--surface); color: var(--text); border-color: var(--line-strong); }
61
+ .auth-shell button.danger:hover { background: var(--ink); color: #fff; border-color: var(--ink); }
62
+ .auth-shell button:disabled { opacity: 0.4; cursor: not-allowed; }
63
+ .auth-shell input, .auth-shell select, .auth-shell textarea { width:100%; border:1px solid var(--line); background:var(--surface); border-radius:0.5rem; padding:0.55rem 0.7rem; color:var(--text); transition: border-color .15s ease, box-shadow .15s ease; }
64
+ .auth-shell input::placeholder, .auth-shell textarea::placeholder { color: var(--placeholder); }
65
+ .auth-shell input:hover, .auth-shell textarea:hover { border-color: var(--line-strong); }
66
+ .auth-shell input:focus, .auth-shell select:focus, .auth-shell textarea:focus { outline:none; border-color:var(--placeholder); box-shadow:0 0 0 2px var(--ring); }
67
+ .auth-shell label { display:grid; gap:0.4rem; color:var(--muted); font-size:0.8125rem; font-weight:500; }
68
+ .auth-shell { min-height:100vh; display:grid; place-items:center; padding:2rem; background:var(--page); }
69
+ .auth-panel { width:min(420px, 100%); border:1px solid var(--line); background:var(--surface); border-radius:0.75rem; padding:2rem; box-shadow:0 1px 2px 0 rgb(9 9 11 / 0.04); }
70
+ .auth-mark { width:2.5rem; height:2.5rem; border-radius:0.75rem; background:var(--ink); color:#fff; display:grid; place-items:center; font-size:0.875rem; font-weight:600; margin:0 0 1.2rem; }
71
+ .auth-panel h1 { font-size:1.5rem; line-height:1.15; margin:0 0 0.4rem; font-weight:600; letter-spacing:-0.01em; color:var(--text); }
72
+ .auth-panel p { color:var(--muted); margin:0 0 1.5rem; line-height:1.55; font-size:0.875rem; }
73
+ .stack { display:grid; gap:0.9rem; }
74
+ .split { display:grid; grid-template-columns: 1fr 1fr; gap:0.75rem; }
75
+ .notice { border:1px solid var(--line); background:var(--surface-muted); padding:0.7rem 0.8rem; border-radius:0.5rem; color:var(--muted); font-size:0.8125rem; line-height:1.5; }
76
+ .choice-field { border:1px solid var(--line); border-radius:0.5rem; padding:0.85rem; display:grid; gap:0.7rem; }
77
+ .choice-field legend { padding:0 0.3rem; color:var(--text); font-size:0.875rem; font-weight:600; }
78
+ .choice-field p { margin:0; color:var(--muted); font-size:0.8125rem; line-height:1.5; }
79
+ .auth-shell .radio-option { display:flex; align-items:flex-start; gap:0.55rem; color:var(--text); font-size:0.875rem; line-height:1.4; }
80
+ .auth-shell .radio-option input { width:auto; margin:0.2rem 0 0; flex:none; }
81
+ .warning { display:flex; align-items:flex-start; gap:0.45rem; border:1px solid var(--line-strong); background:var(--surface-muted); border-radius:0.5rem; padding:0.6rem 0.7rem; color:var(--text); font-size:0.8125rem; line-height:1.45; }
82
+ .warning[hidden] { display:none; }
83
+ .warning-icon { width:14px; height:14px; flex:none; margin-top:0.1rem; background-repeat:no-repeat; background-size:14px; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2318181b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0Z'/%3E%3Cline x1='12' y1='9' x2='12' y2='13'/%3E%3Cline x1='12' y1='17' x2='12.01' y2='17'/%3E%3C/svg%3E"); }
84
+ .provider-list { display:grid; gap:0.65rem; }
85
+ .provider-divider { display:flex; align-items:center; gap:0.75rem; color:var(--muted); font-size:0.75rem; text-transform:uppercase; letter-spacing:0.04em; }
86
+ .provider-divider::before, .provider-divider::after { content:""; height:1px; background:var(--line); flex:1; }
87
+ .error { color:var(--text); font-weight:500; min-height:1.4rem; font-size:0.875rem; }
88
+ .error:not(:empty) { display:flex; align-items:center; gap:0.4rem; }
89
+ .error:not(:empty)::before { content:""; width:14px; height:14px; flex:none; background-repeat:no-repeat; background-size:14px; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2318181b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='8' x2='12' y2='12'/%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'/%3E%3C/svg%3E"); }
90
+ .auth-footer { margin-top:1rem; color:var(--muted); font-size:0.8125rem; line-height:1.5; text-align:center; }
91
+ .auth-footer a { font-weight:500; }
92
+ ${options.style ?? ""}
93
+ </style>
94
+ </head>
95
+ <body>
96
+ ${body}
97
+ ${bodyAssets ? `${bodyAssets}\n` : ""}${options.script ? `<script>${options.script}</script>` : ""}
98
+ </body>
99
+ </html>`;
100
+ }
101
+ function localDevSessionButtons(config) {
102
+ const personas = resolveRaybaseDevPersonas(config);
103
+ if (personas.length === 1) {
104
+ return `<button id="dev-session" class="secondary" data-dev-session-email="${escapeHtml(personas[0].email)}">Use local ${escapeHtml(devPersonaLabel(personas[0]))} persona</button>`;
105
+ }
106
+ return `<div class="stack">${personas
107
+ .map((persona) => {
108
+ return `<button class="secondary" data-dev-session-email="${escapeHtml(persona.email)}">Use ${escapeHtml(persona.name)} (${escapeHtml(devPersonaLabel(persona))})</button>`;
109
+ })
110
+ .join("")}</div>`;
111
+ }
112
+ function devPersonaLabel(persona) {
113
+ const role = persona.role || "user";
114
+ return raybaseDevPersonaOperatorRole(persona) ? `Raybase Operator Admin - ${role}` : role;
115
+ }
116
+ function providerButtons(providers, divider = true) {
117
+ if (!providers?.length)
118
+ return "";
119
+ return `${divider ? `<div class="provider-divider">or</div>
120
+ ` : ""}<div class="provider-list">
121
+ ${providers
122
+ .map((provider) => `<button class="secondary external-provider" type="button" data-provider-id="${escapeHtml(provider.id)}">Continue with ${escapeHtml(provider.label)}</button>`)
123
+ .join("")}
124
+ </div>`;
125
+ }
126
+ export function loginPage(config, message = "", options = {}) {
127
+ const passwordReset = authEmailFeatureEnabled(config, "passwordReset");
128
+ const magicLink = authEmailFeatureEnabled(config, "magicLink");
129
+ const emailCode = authEmailFeatureEnabled(config, "emailCode");
130
+ const signupLink = publicSignupEnabled(config)
131
+ ? `<p class="auth-footer">Need an account? <a href="/signup">Sign up</a></p>`
132
+ : "";
133
+ return page("Sign in", `<main class="auth-shell">
134
+ <section class="auth-panel">
135
+ <div class="auth-mark">${escapeHtml((config.appName?.[0] ?? "A").toUpperCase())}</div>
136
+ <h1>${escapeHtml(config.appName)}</h1>
137
+ <p>Sign in with a passkey. Password sign-in is available as a fallback for invited users.</p>
138
+ <div class="stack">
139
+ ${options.local ? localDevSessionButtons(config) : ""}
140
+ ${providerButtons(options.externalProviders)}
141
+ <button id="passkey">Use passkey</button>
142
+ <form id="password" class="stack">
143
+ <label>Email <input name="email" type="email" autocomplete="username" required></label>
144
+ <label>Password <input name="password" type="password" autocomplete="current-password" required></label>
145
+ <button class="secondary" type="submit">Sign in with password</button>
146
+ </form>
147
+ ${magicLink ? `<form id="magic-link" class="stack">
148
+ <label>Email link <input name="email" type="email" autocomplete="username" required></label>
149
+ <button class="secondary" type="submit">Send sign-in link</button>
150
+ </form>` : ""}
151
+ ${emailCode ? `<form id="email-code" class="stack">
152
+ <label>Email code <input name="email" type="email" autocomplete="username" required></label>
153
+ <button class="secondary" type="submit">Email me a code</button>
154
+ </form>
155
+ <form id="email-code-verify" class="stack" hidden>
156
+ <label>Sign-in code <input name="code" inputmode="numeric" autocomplete="one-time-code" required></label>
157
+ <button class="secondary" type="submit">Sign in with code</button>
158
+ </form>` : ""}
159
+ ${passwordReset ? `<p><a href="/forgot-password">Forgot password?</a></p>` : ""}
160
+ <div class="error" id="error">${escapeHtml(message)}</div>
161
+ </div>
162
+ ${signupLink}
163
+ </section>
164
+ </main>`, { appName: config.appName, script: authBrowserScript("login", { magicLink, emailCode }) });
165
+ }
166
+ export function forgotPasswordPage(config, message = "") {
167
+ return page("Reset password", `<main class="auth-shell">
168
+ <section class="auth-panel">
169
+ <div class="auth-mark">${escapeHtml((config.appName?.[0] ?? "A").toUpperCase())}</div>
170
+ <h1>Reset password</h1>
171
+ <p>Enter your email and Raybase will send a password reset link if the account exists.</p>
172
+ <form id="forgot-password" class="stack">
173
+ <label>Email <input name="email" type="email" autocomplete="username" required></label>
174
+ <button type="submit">Send reset link</button>
175
+ <div class="notice" id="notice" hidden>If that account exists, a reset link has been sent.</div>
176
+ <div class="error" id="error">${escapeHtml(message)}</div>
177
+ </form>
178
+ </section>
179
+ </main>`, { appName: config.appName, script: forgotPasswordScript() });
180
+ }
181
+ export function resetPasswordPage(config, token = "", message = "") {
182
+ return page("Set new password", `<main class="auth-shell">
183
+ <section class="auth-panel">
184
+ <div class="auth-mark">${escapeHtml((config.appName?.[0] ?? "A").toUpperCase())}</div>
185
+ <h1>Set new password</h1>
186
+ <p>Choose a new password fallback for this Raybase account.</p>
187
+ <form id="reset-password" class="stack">
188
+ <input name="token" type="hidden" value="${escapeHtml(token)}">
189
+ <label>New password <input name="newPassword" type="password" autocomplete="new-password" minlength="10" required></label>
190
+ <button type="submit">Update password</button>
191
+ <div class="notice" id="notice" hidden>Password updated. You can sign in now.</div>
192
+ <div class="error" id="error">${escapeHtml(message)}</div>
193
+ </form>
194
+ </section>
195
+ </main>`, { appName: config.appName, script: resetPasswordScript() });
196
+ }
197
+ export function verifyEmailPage(config, token = "", email = "", message = "") {
198
+ return page("Verify email", `<main class="auth-shell">
199
+ <section class="auth-panel">
200
+ <div class="auth-mark">${escapeHtml((config.appName?.[0] ?? "A").toUpperCase())}</div>
201
+ <h1>Verify your email</h1>
202
+ <p>Open the verification link from your email to finish creating your account.</p>
203
+ <form id="verify-email" class="stack">
204
+ <input name="token" type="hidden" value="${escapeHtml(token)}">
205
+ <label>Email <input name="email" type="email" autocomplete="username" value="${escapeHtml(email)}"></label>
206
+ <button type="submit">${token ? "Verify email" : "Resend verification email"}</button>
207
+ <div class="notice" id="notice" hidden></div>
208
+ <div class="error" id="error">${escapeHtml(message)}</div>
209
+ </form>
210
+ <p class="auth-footer">Already verified? <a href="/login">Sign in</a></p>
211
+ </section>
212
+ </main>`, { appName: config.appName, script: verifyEmailScript() });
213
+ }
214
+ export function signupPage(config, message = "", options = {}) {
215
+ // `signupPage` is a public export, so it keeps the call shape it was released
216
+ // with and reads the mode itself. The `/signup` handler answers 404 before
217
+ // this page in invite-only mode; the page has always drawn the form for any
218
+ // config it is handed, and still does — except in the one mode that closes
219
+ // the password door.
220
+ const passwordSignup = resolveSignupMode(config) !== "provider-only";
221
+ return page("Sign up", `<main class="auth-shell">
222
+ <section class="auth-panel">
223
+ <div class="auth-mark">${escapeHtml((config.appName?.[0] ?? "A").toUpperCase())}</div>
224
+ <h1>Create your account</h1>
225
+ <p>Create an account for ${escapeHtml(config.appName)}.</p>
226
+ ${providerButtons(options.externalProviders, passwordSignup)}
227
+ ${passwordSignup ? `<form id="signup" class="stack">
228
+ <label>Email <input name="email" type="email" autocomplete="username" required></label>
229
+ <label>Name <input name="name" autocomplete="name"></label>
230
+ <label>Password <input name="password" type="password" autocomplete="new-password" minlength="10" required></label>
231
+ <div class="notice">After the account is created, this device can register a passkey.</div>
232
+ <button type="submit">Create account</button>
233
+ <div class="error" id="error">${escapeHtml(message)}</div>
234
+ </form>` : `${options.externalProviders?.length ? "" : `<p>No sign-in provider is configured.</p>\n `}<div class="error" id="error">${escapeHtml(message)}</div>`}
235
+ <p class="auth-footer">Already have an account? <a href="/login">Sign in</a></p>
236
+ </section>
237
+ </main>`, { appName: config.appName, script: authBrowserScript("signup") });
238
+ }
239
+ // Rendered when a signed-in non-admin navigates to /admin, a browser
240
+ // destination where the admin wall should be a page, not a JSON error body.
241
+ export function accessDeniedPage(config) {
242
+ return page("Admin access required", `<main class="auth-shell">
243
+ <section class="auth-panel">
244
+ <div class="auth-mark">${escapeHtml((config.appName?.[0] ?? "A").toUpperCase())}</div>
245
+ <h1>Admin access required</h1>
246
+ <p>You're signed in, but the admin area is reserved for admins of ${escapeHtml(config.appName)}. If you think you need access, ask the person who runs this app.</p>
247
+ <p><a href="/">Go to the app</a></p>
248
+ </section>
249
+ </main>`, { appName: config.appName });
250
+ }
251
+ export function setupPage(config, token, purpose, email = "", options = {}) {
252
+ const title = purpose === "owner-setup" ? "Create owner account" : "Accept invite";
253
+ return page(title, `<main class="auth-shell">
254
+ <section class="auth-panel">
255
+ <div class="auth-mark">${escapeHtml((config.appName?.[0] ?? "A").toUpperCase())}</div>
256
+ <h1>${escapeHtml(title)}</h1>
257
+ <p>${purpose === "owner-setup" ? "This one-time link creates the first owner. It expires after 24 hours." : "Create your account to join this internal app."}</p>
258
+ <form id="setup" class="stack">
259
+ <input name="token" type="hidden" value="${escapeHtml(token)}">
260
+ <input name="purpose" type="hidden" value="${escapeHtml(purpose)}">
261
+ <label>Email <input name="email" type="email" autocomplete="username" value="${escapeHtml(email)}" required></label>
262
+ <label>Name <input name="name" autocomplete="name" required></label>
263
+ <label>Password <input name="password" type="password" autocomplete="new-password" minlength="10" required></label>
264
+ ${purpose === "owner-setup"
265
+ ? `<fieldset class="choice-field">
266
+ <legend>Receive important updates from Raybase?</legend>
267
+ <p>We'll use the owner email for important Raybase Core updates, including critical security notices.</p>
268
+ <label class="radio-option"><input name="raybaseUpdates" type="radio" value="yes" required> Yes, send me important updates from Raybase.</label>
269
+ <label class="radio-option"><input name="raybaseUpdates" type="radio" value="no" required> No, do not send me Raybase updates.</label>
270
+ <div class="warning" id="raybase-updates-warning" hidden><span class="warning-icon" aria-hidden="true"></span><span>This will prevent you receiving critical security updates</span></div>
271
+ </fieldset>`
272
+ : ""}
273
+ ${providerButtons(options.externalProviders)}
274
+ <div class="notice">After the account is created, Raybase will ask this device to register a passkey.</div>
275
+ <button type="submit">Create account</button>
276
+ <div class="error" id="error"></div>
277
+ </form>
278
+ </section>
279
+ </main>`, { appName: config.appName, script: authBrowserScript("setup") });
280
+ }
281
+ function authBrowserScript(mode, options = {}) {
282
+ return `
283
+ const errorBox = document.getElementById("error");
284
+ const setError = (message) => { if (errorBox) errorBox.textContent = message || ""; };
285
+ const postJson = async (url, body) => {
286
+ const res = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) });
287
+ const data = await res.json().catch(() => ({}));
288
+ if (!res.ok) throw new Error(data.error || "Request failed");
289
+ return data;
290
+ };
291
+ const getJson = async (url) => {
292
+ const res = await fetch(url);
293
+ const data = await res.json().catch(() => ({}));
294
+ if (!res.ok) throw new Error(data.error || "Request failed");
295
+ return data;
296
+ };
297
+ const credentialToJSON = (credential) => {
298
+ if (credential.toJSON) return credential.toJSON();
299
+ const encode = (buffer) => btoa(String.fromCharCode(...new Uint8Array(buffer))).replace(/\\+/g, "-").replace(/\\//g, "_").replace(/=+$/g, "");
300
+ const response = credential.response;
301
+ if (response.attestationObject) {
302
+ return {
303
+ id: credential.id,
304
+ rawId: encode(credential.rawId),
305
+ type: credential.type,
306
+ authenticatorAttachment: credential.authenticatorAttachment,
307
+ clientExtensionResults: credential.getClientExtensionResults(),
308
+ response: {
309
+ clientDataJSON: encode(response.clientDataJSON),
310
+ attestationObject: encode(response.attestationObject),
311
+ transports: response.getTransports ? response.getTransports() : []
312
+ }
313
+ };
314
+ }
315
+ return {
316
+ id: credential.id,
317
+ rawId: encode(credential.rawId),
318
+ type: credential.type,
319
+ authenticatorAttachment: credential.authenticatorAttachment,
320
+ clientExtensionResults: credential.getClientExtensionResults(),
321
+ response: {
322
+ clientDataJSON: encode(response.clientDataJSON),
323
+ authenticatorData: encode(response.authenticatorData),
324
+ signature: encode(response.signature),
325
+ userHandle: response.userHandle ? encode(response.userHandle) : undefined
326
+ }
327
+ };
328
+ };
329
+ const decode = (value) => {
330
+ const padded = value.replace(/-/g, "+").replace(/_/g, "/").padEnd(Math.ceil(value.length / 4) * 4, "=");
331
+ const binary = atob(padded);
332
+ const bytes = new Uint8Array(binary.length);
333
+ for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);
334
+ return bytes.buffer;
335
+ };
336
+ const creationOptions = (options) => {
337
+ if (window.PublicKeyCredential?.parseCreationOptionsFromJSON) return PublicKeyCredential.parseCreationOptionsFromJSON(options);
338
+ return { ...options, challenge: decode(options.challenge), user: { ...options.user, id: decode(options.user.id) }, excludeCredentials: (options.excludeCredentials || []).map((item) => ({ ...item, id: decode(item.id) })) };
339
+ };
340
+ const requestOptions = (options) => {
341
+ if (window.PublicKeyCredential?.parseRequestOptionsFromJSON) return PublicKeyCredential.parseRequestOptionsFromJSON(options);
342
+ return { ...options, challenge: decode(options.challenge), allowCredentials: (options.allowCredentials || []).map((item) => ({ ...item, id: decode(item.id) })) };
343
+ };
344
+ const registerPasskey = async () => {
345
+ if (!window.PublicKeyCredential) return;
346
+ const options = await getJson("/api/auth/passkey/generate-register-options");
347
+ const credential = await navigator.credentials.create({ publicKey: creationOptions(options) });
348
+ await postJson("/api/auth/passkey/verify-registration", { response: credentialToJSON(credential) });
349
+ };
350
+ // A next path has to be a path. The URL parser strips TAB, CR and LF before
351
+ // parsing, so "/\\t//evil.com" would otherwise arrive as "//evil.com" and carry
352
+ // a completed sign-in to another origin; a backslash does the same in browsers
353
+ // that fold it to a slash.
354
+ const nextPathPattern = /^\\/(?!\\/)[^\\\\\\x00-\\x1f\\x7f]*$/;
355
+ const nextPath = () => {
356
+ const url = new URL(location.href);
357
+ const next = url.searchParams.get("next");
358
+ if (next && nextPathPattern.test(next)) return next;
359
+ return location.pathname === "/login" || location.pathname === "/signup" ? "/" : location.pathname + location.search;
360
+ };
361
+ // The same provider button on /login and /signup: one Core route starts the
362
+ // redirect, and whether it may create an account is the app's signup mode,
363
+ // decided server-side.
364
+ if (${JSON.stringify(mode)} === "login" || ${JSON.stringify(mode)} === "signup") {
365
+ document.querySelectorAll(".external-provider").forEach((button) => button.addEventListener("click", async (event) => {
366
+ try {
367
+ setError("");
368
+ const providerId = event.currentTarget.dataset.providerId;
369
+ const result = await postJson("/api/auth/raybase/provider/login", { providerId, callbackURL: nextPath() });
370
+ if (!result.url) throw new Error("Provider sign-in did not return a redirect URL");
371
+ location.href = result.url;
372
+ } catch (error) {
373
+ setError(error.message);
374
+ }
375
+ }));
376
+ }
377
+ if (${JSON.stringify(mode)} === "login") {
378
+ document.querySelectorAll("[data-dev-session-email]").forEach((button) => button.addEventListener("click", async () => {
379
+ try {
380
+ setError("");
381
+ await postJson("/api/dev/session", { email: button.dataset.devSessionEmail });
382
+ location.href = nextPath();
383
+ } catch (error) {
384
+ setError(error.message);
385
+ }
386
+ }));
387
+ document.getElementById("passkey")?.addEventListener("click", async () => {
388
+ try {
389
+ setError("");
390
+ const options = await getJson("/api/auth/passkey/generate-authenticate-options");
391
+ const credential = await navigator.credentials.get({ publicKey: requestOptions(options) });
392
+ await postJson("/api/auth/passkey/verify-authentication", { response: credentialToJSON(credential) });
393
+ location.href = nextPath();
394
+ } catch (error) {
395
+ setError(error.message);
396
+ }
397
+ });
398
+ document.getElementById("password")?.addEventListener("submit", async (event) => {
399
+ event.preventDefault();
400
+ try {
401
+ setError("");
402
+ const form = new FormData(event.currentTarget);
403
+ await postJson("/api/auth/login", Object.fromEntries(form));
404
+ location.href = nextPath();
405
+ } catch (error) {
406
+ setError(error.message);
407
+ }
408
+ });
409
+ if (${JSON.stringify(options.magicLink === true)}) {
410
+ document.getElementById("magic-link")?.addEventListener("submit", async (event) => {
411
+ event.preventDefault();
412
+ try {
413
+ setError("");
414
+ const form = new FormData(event.currentTarget);
415
+ const email = String(form.get("email") || "");
416
+ await postJson("/api/auth/sign-in/magic-link", { email, callbackURL: nextPath(), errorCallbackURL: "/login" });
417
+ setError("If that account exists, a sign-in link has been sent.");
418
+ } catch (error) {
419
+ setError(error.message);
420
+ }
421
+ });
422
+ }
423
+ if (${JSON.stringify(options.emailCode === true)}) {
424
+ const codeVerifyForm = document.getElementById("email-code-verify");
425
+ // The code is typed back here, so the address it was sent to has to survive
426
+ // the first step rather than being asked for twice.
427
+ let codeEmail = "";
428
+ document.getElementById("email-code")?.addEventListener("submit", async (event) => {
429
+ event.preventDefault();
430
+ try {
431
+ setError("");
432
+ const form = new FormData(event.currentTarget);
433
+ codeEmail = String(form.get("email") || "");
434
+ await postJson("/api/auth/email-otp/send-verification-otp", { email: codeEmail, type: "sign-in" });
435
+ if (codeVerifyForm) codeVerifyForm.hidden = false;
436
+ setError("If that account exists, a sign-in code has been sent.");
437
+ } catch (error) {
438
+ setError(error.message);
439
+ }
440
+ });
441
+ codeVerifyForm?.addEventListener("submit", async (event) => {
442
+ event.preventDefault();
443
+ try {
444
+ setError("");
445
+ const form = new FormData(event.currentTarget);
446
+ await postJson("/api/auth/sign-in/email-otp", { email: codeEmail, otp: String(form.get("code") || "") });
447
+ location.href = nextPath();
448
+ } catch (error) {
449
+ setError(error.message);
450
+ }
451
+ });
452
+ }
453
+ }
454
+ if (${JSON.stringify(mode)} === "setup") {
455
+ const updatesWarning = document.getElementById("raybase-updates-warning");
456
+ const syncUpdatesWarning = () => {
457
+ const choice = document.querySelector("input[name='raybaseUpdates']:checked");
458
+ if (updatesWarning) updatesWarning.hidden = choice?.value !== "no";
459
+ };
460
+ document.querySelectorAll("input[name='raybaseUpdates']").forEach((input) => input.addEventListener("change", syncUpdatesWarning));
461
+ syncUpdatesWarning();
462
+ document.querySelectorAll(".external-provider").forEach((button) => button.addEventListener("click", async (event) => {
463
+ try {
464
+ setError("");
465
+ const formElement = document.getElementById("setup");
466
+ const form = new FormData(formElement);
467
+ const result = await postJson("/api/auth/raybase/provider/setup", {
468
+ ...Object.fromEntries(form),
469
+ providerId: event.currentTarget.dataset.providerId,
470
+ callbackURL: "/api/auth/raybase/provider/complete"
471
+ });
472
+ if (!result.url) throw new Error("Provider setup did not return a redirect URL");
473
+ location.href = result.url;
474
+ } catch (error) {
475
+ setError(error.message);
476
+ }
477
+ }));
478
+ document.getElementById("setup")?.addEventListener("submit", async (event) => {
479
+ event.preventDefault();
480
+ try {
481
+ setError("");
482
+ const form = new FormData(event.currentTarget);
483
+ const result = await postJson("/api/auth/setup", Object.fromEntries(form));
484
+ try { await registerPasskey(); } catch (error) { console.warn("Passkey registration skipped", error); }
485
+ // The server decides the landing page (admins -> /admin, users -> /);
486
+ // guard like nextPath so only same-origin paths are followed.
487
+ const target = typeof result.redirect === "string" && result.redirect.startsWith("/") && !result.redirect.startsWith("//") ? result.redirect : "/";
488
+ location.href = target;
489
+ } catch (error) {
490
+ setError(error.message);
491
+ }
492
+ });
493
+ }
494
+ if (${JSON.stringify(mode)} === "signup") {
495
+ document.getElementById("signup")?.addEventListener("submit", async (event) => {
496
+ event.preventDefault();
497
+ try {
498
+ setError("");
499
+ const form = new FormData(event.currentTarget);
500
+ const result = await postJson("/api/auth/signup", Object.fromEntries(form));
501
+ try { await registerPasskey(); } catch (error) { console.warn("Passkey registration skipped", error); }
502
+ const target = typeof result.redirect === "string" && result.redirect.startsWith("/") && !result.redirect.startsWith("//") ? result.redirect : "/";
503
+ location.href = target;
504
+ } catch (error) {
505
+ setError(error.message);
506
+ }
507
+ });
508
+ }
509
+ `;
510
+ }
511
+ function forgotPasswordScript() {
512
+ return `
513
+ const errorBox = document.getElementById("error");
514
+ const notice = document.getElementById("notice");
515
+ const setError = (message) => { if (errorBox) errorBox.textContent = message || ""; };
516
+ document.getElementById("forgot-password")?.addEventListener("submit", async (event) => {
517
+ event.preventDefault();
518
+ try {
519
+ setError("");
520
+ if (notice) notice.hidden = true;
521
+ const form = new FormData(event.currentTarget);
522
+ const res = await fetch("/api/auth/request-password-reset", {
523
+ method: "POST",
524
+ headers: { "Content-Type": "application/json" },
525
+ body: JSON.stringify({ email: String(form.get("email") || ""), redirectTo: "/reset-password" })
526
+ });
527
+ if (!res.ok) {
528
+ const data = await res.json().catch(() => ({}));
529
+ throw new Error(data.error || "Request failed");
530
+ }
531
+ if (notice) notice.hidden = false;
532
+ } catch (error) {
533
+ setError(error.message);
534
+ }
535
+ });
536
+ `;
537
+ }
538
+ function resetPasswordScript() {
539
+ return `
540
+ const errorBox = document.getElementById("error");
541
+ const notice = document.getElementById("notice");
542
+ const setError = (message) => { if (errorBox) errorBox.textContent = message || ""; };
543
+ document.getElementById("reset-password")?.addEventListener("submit", async (event) => {
544
+ event.preventDefault();
545
+ try {
546
+ setError("");
547
+ if (notice) notice.hidden = true;
548
+ const url = new URL(location.href);
549
+ const form = new FormData(event.currentTarget);
550
+ const token = String(form.get("token") || url.searchParams.get("token") || "");
551
+ const res = await fetch("/api/auth/reset-password", {
552
+ method: "POST",
553
+ headers: { "Content-Type": "application/json" },
554
+ body: JSON.stringify({ token, newPassword: String(form.get("newPassword") || "") })
555
+ });
556
+ if (!res.ok) {
557
+ const data = await res.json().catch(() => ({}));
558
+ throw new Error(data.error || "Reset failed");
559
+ }
560
+ if (notice) notice.hidden = false;
561
+ } catch (error) {
562
+ setError(error.message);
563
+ }
564
+ });
565
+ `;
566
+ }
567
+ function verifyEmailScript() {
568
+ return `
569
+ const errorBox = document.getElementById("error");
570
+ const notice = document.getElementById("notice");
571
+ const setError = (message) => { if (errorBox) errorBox.textContent = message || ""; };
572
+ const setNotice = (message) => { if (notice) { notice.textContent = message || ""; notice.hidden = !message; } };
573
+ const verifyToken = async (token) => {
574
+ const res = await fetch("/api/auth/verify-email?token=" + encodeURIComponent(token));
575
+ if (!res.ok) {
576
+ const data = await res.json().catch(() => ({}));
577
+ throw new Error(data.error || data.message || "Verification failed");
578
+ }
579
+ };
580
+ const verifyFromLocation = async () => {
581
+ const url = new URL(location.href);
582
+ const token = url.searchParams.get("token") || "";
583
+ if (!token) return;
584
+ try {
585
+ setError("");
586
+ setNotice("");
587
+ await verifyToken(token);
588
+ setNotice("Email verified. You can sign in now.");
589
+ } catch (error) {
590
+ setError(error.message);
591
+ }
592
+ };
593
+ void verifyFromLocation();
594
+ document.getElementById("verify-email")?.addEventListener("submit", async (event) => {
595
+ event.preventDefault();
596
+ try {
597
+ setError("");
598
+ setNotice("");
599
+ const url = new URL(location.href);
600
+ const form = new FormData(event.currentTarget);
601
+ const token = String(form.get("token") || url.searchParams.get("token") || "");
602
+ if (token) {
603
+ await verifyToken(token);
604
+ setNotice("Email verified. You can sign in now.");
605
+ return;
606
+ }
607
+ const email = String(form.get("email") || "");
608
+ const res = await fetch("/api/auth/send-verification-email", {
609
+ method: "POST",
610
+ headers: { "Content-Type": "application/json" },
611
+ body: JSON.stringify({ email, callbackURL: "/" })
612
+ });
613
+ if (!res.ok) {
614
+ const data = await res.json().catch(() => ({}));
615
+ throw new Error(data.error || data.message || "Request failed");
616
+ }
617
+ setNotice("If that account exists and needs verification, a new link has been sent.");
618
+ } catch (error) {
619
+ setError(error.message);
620
+ }
621
+ });
622
+ `;
623
+ }
624
+ function authEmailFeatureEnabled(config, feature) {
625
+ const email = config.auth?.email;
626
+ if (email?.provider !== "cloudflare" || !email.from)
627
+ return false;
628
+ if (feature === "magicLink")
629
+ return email.magicLink?.enabled === true;
630
+ if (feature === "emailCode")
631
+ return email.emailCode?.enabled === true;
632
+ return email.passwordReset?.enabled !== false;
633
+ }
634
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"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"}