@db3.ai/app 0.1.0-beta.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (653) hide show
  1. package/README.md +75 -17
  2. package/agent-instructions.md +76 -0
  3. package/dist/ai/AIErrors.d.ts +7 -1
  4. package/dist/ai/AIErrors.js +8 -1
  5. package/dist/ai/AIFailover.d.ts +10 -0
  6. package/dist/ai/AIFailover.js +3 -2
  7. package/dist/ai/AIProviderAdmission.d.ts +101 -0
  8. package/dist/ai/AIProviderAdmission.js +336 -0
  9. package/dist/ai/AIRateLimiter.d.ts +11 -2
  10. package/dist/ai/AIRateLimiter.js +125 -10
  11. package/dist/ai/AIRequestTrackingError.d.ts +22 -0
  12. package/dist/ai/AIRequestTrackingError.js +33 -0
  13. package/dist/ai/Agent.d.ts +7 -7
  14. package/dist/ai/Agent.js +84 -56
  15. package/dist/ai/Ai.d.ts +11 -3
  16. package/dist/ai/Ai.js +94 -44
  17. package/dist/ai/OpenAIProviderError.js +1 -1
  18. package/dist/ai/ProviderSseObserver.d.ts +19 -0
  19. package/dist/ai/ProviderSseObserver.js +98 -0
  20. package/dist/ai/aiServiceTier.d.ts +5 -0
  21. package/dist/ai/aiServiceTier.js +14 -0
  22. package/dist/ai/chunkEmbeddingText.d.ts +14 -0
  23. package/dist/ai/chunkEmbeddingText.js +147 -0
  24. package/dist/ai/contracts/AI.d.ts +16 -0
  25. package/dist/ai/contracts/AIRequestErrorDiagnostics.d.ts +12 -0
  26. package/dist/ai/contracts/AIRequestErrorDiagnostics.js +1 -0
  27. package/dist/ai/contracts/AIServiceTier.d.ts +2 -0
  28. package/dist/ai/contracts/AIServiceTier.js +1 -0
  29. package/dist/ai/contracts/Agent.d.ts +3 -0
  30. package/dist/ai/contracts/EmbeddingTextChunk.d.ts +25 -0
  31. package/dist/ai/contracts/EmbeddingTextChunk.js +1 -0
  32. package/dist/ai/contracts/Pricing.d.ts +7 -1
  33. package/dist/ai/contracts/Providers.d.ts +2 -0
  34. package/dist/ai/contracts/index.d.ts +2 -0
  35. package/dist/ai/contracts/index.js +1 -0
  36. package/dist/ai/index.d.ts +8 -2
  37. package/dist/ai/index.js +5 -2
  38. package/dist/ai/{Models.d.ts → modelPricing.d.ts} +2 -2
  39. package/dist/ai/{Models.js → modelPricing.js} +38 -4
  40. package/dist/apps/AppInstallation.d.ts +21 -0
  41. package/dist/apps/AppInstallation.js +16 -0
  42. package/dist/apps/AppRouteError.d.ts +6 -0
  43. package/dist/apps/AppRouteError.js +10 -0
  44. package/dist/apps/AppService.d.ts +24 -0
  45. package/dist/apps/AppService.js +21 -0
  46. package/dist/apps/Apps.d.ts +59 -0
  47. package/dist/apps/Apps.js +566 -0
  48. package/dist/apps/appsPlugin.d.ts +3 -0
  49. package/dist/apps/appsPlugin.js +36 -0
  50. package/dist/apps/commands/disableApp.d.ts +2 -0
  51. package/dist/apps/commands/disableApp.js +5 -0
  52. package/dist/apps/commands/enableApp.d.ts +2 -0
  53. package/dist/apps/commands/enableApp.js +5 -0
  54. package/dist/apps/commands/index.d.ts +10 -0
  55. package/dist/apps/commands/index.js +27 -0
  56. package/dist/apps/commands/installApp.d.ts +2 -0
  57. package/dist/apps/commands/installApp.js +5 -0
  58. package/dist/apps/commands/listApps.d.ts +2 -0
  59. package/dist/apps/commands/listApps.js +5 -0
  60. package/dist/apps/commands/makeAppMigration.d.ts +2 -0
  61. package/dist/apps/commands/makeAppMigration.js +9 -0
  62. package/dist/apps/commands/rollbackApp.d.ts +2 -0
  63. package/dist/apps/commands/rollbackApp.js +5 -0
  64. package/dist/apps/commands/uninstallApp.d.ts +2 -0
  65. package/dist/apps/commands/uninstallApp.js +5 -0
  66. package/dist/apps/contracts/AppAction.d.ts +2 -0
  67. package/dist/apps/contracts/AppAction.js +1 -0
  68. package/dist/apps/contracts/AppDefinition.d.ts +45 -0
  69. package/dist/apps/contracts/AppDefinition.js +1 -0
  70. package/dist/apps/contracts/AppDescription.d.ts +32 -0
  71. package/dist/apps/contracts/AppDescription.js +1 -0
  72. package/dist/apps/contracts/AppManifest.d.ts +30 -0
  73. package/dist/apps/contracts/AppManifest.js +1 -0
  74. package/dist/apps/contracts/AppNavigation.d.ts +9 -0
  75. package/dist/apps/contracts/AppNavigation.js +1 -0
  76. package/dist/apps/contracts/AppNavigationBadge.d.ts +6 -0
  77. package/dist/apps/contracts/AppNavigationBadge.js +1 -0
  78. package/dist/apps/contracts/AppNavigationContext.d.ts +8 -0
  79. package/dist/apps/contracts/AppNavigationContext.js +1 -0
  80. package/dist/apps/contracts/AppNavigationResult.d.ts +12 -0
  81. package/dist/apps/contracts/AppNavigationResult.js +1 -0
  82. package/dist/apps/contracts/AppRoute.d.ts +19 -0
  83. package/dist/apps/contracts/AppRoute.js +1 -0
  84. package/dist/apps/contracts/DiscoveredApp.d.ts +10 -0
  85. package/dist/apps/contracts/DiscoveredApp.js +1 -0
  86. package/dist/apps/contracts/InstalledApps.d.ts +3 -0
  87. package/dist/apps/contracts/InstalledApps.js +1 -0
  88. package/dist/apps/contracts/index.d.ts +11 -0
  89. package/dist/apps/contracts/index.js +1 -0
  90. package/dist/apps/defineApp.d.ts +7 -0
  91. package/dist/apps/defineApp.js +8 -0
  92. package/dist/apps/discoverApps.d.ts +3 -0
  93. package/dist/apps/discoverApps.js +62 -0
  94. package/dist/apps/fastify.d.ts +1 -0
  95. package/dist/apps/fastify.js +1 -0
  96. package/dist/apps/index.d.ts +7 -0
  97. package/dist/apps/index.js +7 -0
  98. package/dist/apps/normalizeAppNavigation.d.ts +3 -0
  99. package/dist/apps/normalizeAppNavigation.js +30 -0
  100. package/dist/apps/registerAppRoutes.d.ts +6 -0
  101. package/dist/apps/registerAppRoutes.js +52 -0
  102. package/dist/apps/validateAppDefinitions.d.ts +3 -0
  103. package/dist/apps/validateAppDefinitions.js +65 -0
  104. package/dist/apps/vite.d.ts +1 -0
  105. package/dist/apps/vite.js +1 -0
  106. package/dist/apps/writeAppTypes.d.ts +2 -0
  107. package/dist/apps/writeAppTypes.js +13 -0
  108. package/dist/auth/Auth.d.ts +18 -0
  109. package/dist/auth/Auth.js +89 -13
  110. package/dist/auth/PasswordLoginAttempt.d.ts +50 -0
  111. package/dist/auth/PasswordLoginAttempt.js +60 -0
  112. package/dist/auth/PasswordSuspendedError.d.ts +10 -0
  113. package/dist/auth/PasswordSuspendedError.js +13 -0
  114. package/dist/auth/contracts/PasswordAuthProviderOptions.d.ts +26 -0
  115. package/dist/auth/contracts/PasswordAuthProviderOptions.js +1 -0
  116. package/dist/auth/contracts/PasswordSuspension.d.ts +7 -0
  117. package/dist/auth/contracts/PasswordSuspension.js +1 -0
  118. package/dist/auth/contracts/PasswordSuspensionOptions.d.ts +10 -0
  119. package/dist/auth/contracts/PasswordSuspensionOptions.js +1 -0
  120. package/dist/auth/contracts/index.d.ts +3 -0
  121. package/dist/auth/contracts/index.js +3 -0
  122. package/dist/auth/index.d.ts +2 -0
  123. package/dist/auth/index.js +2 -0
  124. package/dist/auth/providers/PasswordAuthProvider.d.ts +19 -23
  125. package/dist/auth/providers/PasswordAuthProvider.js +96 -8
  126. package/dist/auth/providers/resolveAuthProviders.js +1 -0
  127. package/dist/cli/Cli.d.ts +2 -0
  128. package/dist/cli/Cli.js +8 -0
  129. package/dist/cli/commands/repl.js +2 -1
  130. package/dist/cli/contracts/CliCommand.d.ts +2 -0
  131. package/dist/cli/contracts/CliCommandInfo.d.ts +12 -0
  132. package/dist/cli/contracts/CliCommandInfo.js +1 -0
  133. package/dist/cli/contracts/index.d.ts +1 -0
  134. package/dist/cli/index.d.ts +1 -0
  135. package/dist/cli/index.js +1 -0
  136. package/dist/cli/listDb3Commands.d.ts +8 -0
  137. package/dist/cli/listDb3Commands.js +10 -0
  138. package/dist/cli/runDb3.d.ts +3 -6
  139. package/dist/cli/runDb3.js +5 -59
  140. package/dist/cli/withDb3Cli.d.ts +4 -0
  141. package/dist/cli/withDb3Cli.js +60 -0
  142. package/dist/db/ActiveQueryBuilder.d.ts +8 -0
  143. package/dist/db/ActiveQueryBuilder.js +11 -0
  144. package/dist/db/ActiveRecord.d.ts +6 -0
  145. package/dist/db/ActiveRecord.js +8 -0
  146. package/dist/db/connection.js +14 -2
  147. package/dist/db/fields/TimestampField.d.ts +1 -1
  148. package/dist/db/fields/TimestampField.js +7 -12
  149. package/dist/db/migrations/DatabaseMigrationManager.d.ts +3 -1
  150. package/dist/db/migrations/DatabaseMigrationManager.js +9 -3
  151. package/dist/db/migrations/contracts/DatabaseMigration.d.ts +7 -0
  152. package/dist/db/migrations/index.d.ts +1 -1
  153. package/dist/db/migrations/index.js +1 -1
  154. package/dist/db/migrations/{KnexMigrationRenderer.d.ts → renderKnexMigration.d.ts} +4 -3
  155. package/dist/db/migrations/{KnexMigrationRenderer.js → renderKnexMigration.js} +7 -6
  156. package/dist/flows/FlowCompiler.js +1 -1
  157. package/dist/flows/Flows.js +1 -1
  158. package/dist/flows/index.d.ts +1 -1
  159. package/dist/flows/index.js +1 -1
  160. package/dist/health/Health.d.ts +41 -0
  161. package/dist/health/Health.js +153 -0
  162. package/dist/health/contracts/Health.d.ts +36 -0
  163. package/dist/health/contracts/Health.js +1 -0
  164. package/dist/health/contracts/HealthHttp.d.ts +15 -0
  165. package/dist/health/contracts/HealthHttp.js +1 -0
  166. package/dist/health/contracts/index.d.ts +2 -0
  167. package/dist/health/contracts/index.js +1 -0
  168. package/dist/health/databaseHealthCheck.d.ts +15 -0
  169. package/dist/health/databaseHealthCheck.js +18 -0
  170. package/dist/health/fastify.d.ts +13 -0
  171. package/dist/health/fastify.js +44 -0
  172. package/dist/health/index.d.ts +3 -0
  173. package/dist/health/index.js +2 -0
  174. package/dist/in-app/InApp.d.ts +33 -0
  175. package/dist/in-app/InApp.js +191 -0
  176. package/dist/in-app/InAppError.d.ts +6 -0
  177. package/dist/in-app/InAppError.js +10 -0
  178. package/dist/in-app/InAppRecord.d.ts +36 -0
  179. package/dist/in-app/InAppRecord.js +24 -0
  180. package/dist/in-app/contracts/InAppInbox.d.ts +45 -0
  181. package/dist/in-app/contracts/InAppInbox.js +1 -0
  182. package/dist/in-app/contracts/InAppMessage.d.ts +22 -0
  183. package/dist/in-app/contracts/InAppMessage.js +1 -0
  184. package/dist/in-app/contracts/InAppScope.d.ts +17 -0
  185. package/dist/in-app/contracts/InAppScope.js +1 -0
  186. package/dist/in-app/contracts/index.d.ts +3 -0
  187. package/dist/in-app/contracts/index.js +3 -0
  188. package/dist/in-app/index.d.ts +4 -0
  189. package/dist/in-app/index.js +4 -0
  190. package/dist/in-app/validation.d.ts +21 -0
  191. package/dist/in-app/validation.js +50 -0
  192. package/dist/index.d.ts +2 -14
  193. package/dist/index.js +2 -5
  194. package/dist/logging/DevelopmentConsole.d.ts +42 -0
  195. package/dist/logging/DevelopmentConsole.js +162 -0
  196. package/dist/logging/Log.d.ts +3 -1
  197. package/dist/logging/Log.js +5 -2
  198. package/dist/logging/PrettyLogFormatter.d.ts +16 -0
  199. package/dist/logging/PrettyLogFormatter.js +151 -0
  200. package/dist/logging/acquireDevelopmentConsole.d.ts +6 -0
  201. package/dist/logging/acquireDevelopmentConsole.js +21 -0
  202. package/dist/logging/contracts/DevelopmentConsoleOptions.d.ts +16 -0
  203. package/dist/logging/contracts/DevelopmentConsoleOptions.js +1 -0
  204. package/dist/logging/contracts/EmailLogOptions.d.ts +8 -0
  205. package/dist/logging/contracts/EmailLogOptions.js +1 -0
  206. package/dist/logging/contracts/HttpExchangeMonitorOptions.d.ts +12 -0
  207. package/dist/logging/contracts/HttpExchangeMonitorOptions.js +1 -0
  208. package/dist/logging/contracts/LogTransportOptions.d.ts +19 -0
  209. package/dist/logging/contracts/LogTransportOptions.js +1 -0
  210. package/dist/logging/contracts/LoggingOptions.d.ts +12 -1
  211. package/dist/logging/contracts/index.d.ts +4 -0
  212. package/dist/logging/contracts/index.js +4 -0
  213. package/dist/logging/drivers/PinoLoggerDriver.d.ts +3 -1
  214. package/dist/logging/drivers/PinoLoggerDriver.js +75 -16
  215. package/dist/logging/formatLogEmail.d.ts +4 -0
  216. package/dist/logging/formatLogEmail.js +21 -0
  217. package/dist/logging/highlightQueueMessage.d.ts +11 -0
  218. package/dist/logging/highlightQueueMessage.js +36 -0
  219. package/dist/logging/httpBodyCapture.d.ts +24 -0
  220. package/dist/logging/httpBodyCapture.js +321 -0
  221. package/dist/logging/index.d.ts +2 -0
  222. package/dist/logging/index.js +2 -0
  223. package/dist/logging/redactLogEmail.d.ts +2 -0
  224. package/dist/logging/redactLogEmail.js +12 -0
  225. package/dist/logging/registerHttpExchangeMonitor.d.ts +10 -0
  226. package/dist/logging/registerHttpExchangeMonitor.js +43 -0
  227. package/dist/logging/transports/EmailLogTransport.d.ts +18 -0
  228. package/dist/logging/transports/EmailLogTransport.js +47 -0
  229. package/dist/mail/Mail.d.ts +2 -0
  230. package/dist/mail/Mail.js +3 -0
  231. package/dist/mail/MailDeliveryError.d.ts +9 -0
  232. package/dist/mail/MailDeliveryError.js +16 -0
  233. package/dist/mail/index.d.ts +1 -0
  234. package/dist/mail/index.js +1 -0
  235. package/dist/mail/transports/MailgunTransport.js +2 -0
  236. package/dist/mail/transports/ResendTransport.d.ts +3 -2
  237. package/dist/mail/transports/ResendTransport.js +22 -14
  238. package/dist/media/MediaManager.d.ts +4 -2
  239. package/dist/media/MediaManager.js +40 -8
  240. package/dist/network/BlockedUrlError.d.ts +16 -0
  241. package/dist/network/BlockedUrlError.js +19 -0
  242. package/dist/network/assertPublicUrl.d.ts +22 -0
  243. package/dist/network/assertPublicUrl.js +67 -0
  244. package/dist/network/contracts/GuardedFetch.d.ts +35 -0
  245. package/dist/network/contracts/GuardedFetch.js +1 -0
  246. package/dist/network/contracts/PublicUrlOptions.d.ts +17 -0
  247. package/dist/network/contracts/PublicUrlOptions.js +1 -0
  248. package/dist/network/contracts/index.d.ts +2 -0
  249. package/dist/network/contracts/index.js +2 -0
  250. package/dist/network/guardedFetch.d.ts +29 -0
  251. package/dist/network/guardedFetch.js +133 -0
  252. package/dist/network/index.d.ts +6 -0
  253. package/dist/network/index.js +6 -0
  254. package/dist/network/playwright/GuardedBrowserProxy.d.ts +32 -0
  255. package/dist/network/playwright/GuardedBrowserProxy.js +172 -0
  256. package/dist/network/playwright/contracts/GuardedBrowserContextOptions.d.ts +37 -0
  257. package/dist/network/playwright/contracts/GuardedBrowserContextOptions.js +1 -0
  258. package/dist/network/playwright/contracts/index.d.ts +1 -0
  259. package/dist/network/playwright/contracts/index.js +1 -0
  260. package/dist/network/playwright/index.d.ts +2 -0
  261. package/dist/network/playwright/index.js +2 -0
  262. package/dist/network/playwright/newGuardedBrowserContext.d.ts +21 -0
  263. package/dist/network/playwright/newGuardedBrowserContext.js +86 -0
  264. package/dist/network/privateNetworkAddresses.d.ts +44 -0
  265. package/dist/network/privateNetworkAddresses.js +157 -0
  266. package/dist/network/publicAddressLookup.d.ts +26 -0
  267. package/dist/network/publicAddressLookup.js +42 -0
  268. package/dist/notifications/Notifications.d.ts +27 -0
  269. package/dist/notifications/Notifications.js +99 -0
  270. package/dist/notifications/contracts/Notification.d.ts +56 -0
  271. package/dist/notifications/contracts/Notification.js +1 -0
  272. package/dist/notifications/contracts/NotificationDelivery.d.ts +11 -0
  273. package/dist/notifications/contracts/NotificationDelivery.js +1 -0
  274. package/dist/notifications/contracts/index.d.ts +2 -0
  275. package/dist/notifications/contracts/index.js +2 -0
  276. package/dist/notifications/index.d.ts +2 -0
  277. package/dist/notifications/index.js +2 -0
  278. package/dist/queue/JobRunAttempt.d.ts +16 -0
  279. package/dist/queue/JobRunAttempt.js +17 -0
  280. package/dist/queue/JobRunEvent.d.ts +15 -0
  281. package/dist/queue/JobRunEvent.js +16 -0
  282. package/dist/queue/JobRunStoppedError.d.ts +6 -0
  283. package/dist/queue/JobRunStoppedError.js +10 -0
  284. package/dist/queue/Queue.d.ts +19 -4
  285. package/dist/queue/Queue.js +122 -9
  286. package/dist/queue/QueueTerminalError.d.ts +9 -0
  287. package/dist/queue/QueueTerminalError.js +12 -0
  288. package/dist/queue/QueueWorker.d.ts +12 -5
  289. package/dist/queue/QueueWorker.js +94 -9
  290. package/dist/queue/QueueWorkerReporter.d.ts +17 -0
  291. package/dist/queue/QueueWorkerReporter.js +71 -0
  292. package/dist/queue/QueueableJob.d.ts +2 -2
  293. package/dist/queue/RunnableJob.d.ts +78 -0
  294. package/dist/queue/RunnableJob.js +284 -0
  295. package/dist/queue/console.d.ts +8 -0
  296. package/dist/queue/console.js +53 -19
  297. package/dist/queue/contracts/QueueDriver.d.ts +8 -0
  298. package/dist/queue/contracts/QueueJobRunner.d.ts +4 -0
  299. package/dist/queue/contracts/QueueJobRunner.js +1 -0
  300. package/dist/queue/contracts/QueuePayload.d.ts +1 -1
  301. package/dist/queue/contracts/QueueSelection.d.ts +11 -0
  302. package/dist/queue/contracts/QueueSelection.js +1 -0
  303. package/dist/queue/contracts/QueueService.d.ts +18 -4
  304. package/dist/queue/contracts/QueueWorkerLifecycle.d.ts +2 -2
  305. package/dist/queue/contracts/QueueWorkerSnapshot.d.ts +14 -0
  306. package/dist/queue/contracts/QueueWorkerSnapshot.js +1 -0
  307. package/dist/queue/contracts/QueueableJob.d.ts +7 -3
  308. package/dist/queue/contracts/QueueableJobContract.d.ts +12 -0
  309. package/dist/queue/contracts/QueueableJobContract.js +1 -0
  310. package/dist/queue/contracts/index.d.ts +4 -0
  311. package/dist/queue/contracts/index.js +2 -0
  312. package/dist/queue/drivers/DatabaseQueueDriver.d.ts +4 -0
  313. package/dist/queue/drivers/DatabaseQueueDriver.js +27 -3
  314. package/dist/queue/drivers/RedisQueueDriver.d.ts +7 -0
  315. package/dist/queue/drivers/RedisQueueDriver.js +37 -0
  316. package/dist/queue/index.d.ts +5 -0
  317. package/dist/queue/index.js +5 -0
  318. package/dist/queue/jobEnvelopeHasPrefix.d.ts +3 -0
  319. package/dist/queue/jobEnvelopeHasPrefix.js +4 -0
  320. package/dist/scheduler/ScheduledEvent.d.ts +8 -4
  321. package/dist/scheduler/ScheduledEvent.js +17 -3
  322. package/dist/scheduler/ScheduledJob.d.ts +1 -1
  323. package/dist/scheduler/Scheduler.d.ts +5 -0
  324. package/dist/scheduler/Scheduler.js +92 -28
  325. package/dist/scheduler/SchedulerCheckpointRecord.d.ts +16 -0
  326. package/dist/scheduler/SchedulerCheckpointRecord.js +53 -0
  327. package/dist/scheduler/SchedulerWorker.d.ts +3 -5
  328. package/dist/scheduler/SchedulerWorker.js +58 -14
  329. package/dist/scheduler/console.js +3 -1
  330. package/dist/scheduler/contracts/Schedule.d.ts +19 -0
  331. package/dist/scheduler/contracts/Schedule.js +1 -0
  332. package/dist/scheduler/contracts/Scheduler.d.ts +18 -6
  333. package/dist/scheduler/contracts/SchedulerCheckpoint.d.ts +23 -0
  334. package/dist/scheduler/contracts/SchedulerCheckpoint.js +1 -0
  335. package/dist/scheduler/contracts/SchedulerConsole.d.ts +5 -0
  336. package/dist/scheduler/contracts/SchedulerWorker.d.ts +6 -1
  337. package/dist/scheduler/contracts/index.d.ts +2 -0
  338. package/dist/scheduler/contracts/index.js +2 -0
  339. package/dist/scheduler/index.d.ts +1 -0
  340. package/dist/scheduler/index.js +1 -0
  341. package/dist/server/App.d.ts +36 -4
  342. package/dist/server/App.js +57 -7
  343. package/dist/server/contracts/HttpErrorHandlerOptions.d.ts +29 -0
  344. package/dist/server/contracts/HttpErrorHandlerOptions.js +1 -0
  345. package/dist/server/contracts/index.d.ts +1 -0
  346. package/dist/server/contracts/index.js +1 -0
  347. package/dist/server/index.d.ts +4 -0
  348. package/dist/server/index.js +4 -0
  349. package/dist/server/publicServerErrorMessage.d.ts +11 -0
  350. package/dist/server/publicServerErrorMessage.js +16 -0
  351. package/dist/server/registerBrowserJsonFormatting.d.ts +16 -0
  352. package/dist/server/registerBrowserJsonFormatting.js +100 -0
  353. package/dist/server/registerHttpErrorHandler.d.ts +20 -0
  354. package/dist/server/registerHttpErrorHandler.js +93 -0
  355. package/dist/ssr/vite/contracts/ViteSsrOptions.d.ts +2 -0
  356. package/dist/ssr/vite/fastifyViteSsr.js +4 -3
  357. package/dist/storage/drivers/FlystorageDisk.js +2 -2
  358. package/dist/storage/index.d.ts +2 -2
  359. package/dist/storage/index.js +2 -2
  360. package/dist/websocket/WebSocketChannels.d.ts +18 -0
  361. package/dist/websocket/WebSocketChannels.js +129 -0
  362. package/dist/websocket/WebSocketConnection.d.ts +25 -0
  363. package/dist/websocket/WebSocketConnection.js +244 -0
  364. package/dist/websocket/WebSockets.d.ts +41 -0
  365. package/dist/websocket/WebSockets.js +194 -0
  366. package/dist/websocket/client/WebSocketClient.d.ts +21 -0
  367. package/dist/websocket/client/WebSocketClient.js +230 -0
  368. package/dist/websocket/client/index.d.ts +3 -0
  369. package/dist/websocket/client/index.js +1 -0
  370. package/dist/websocket/contracts/WebSocketChannel.d.ts +20 -0
  371. package/dist/websocket/contracts/WebSocketChannel.js +1 -0
  372. package/dist/websocket/contracts/WebSocketClient.d.ts +45 -0
  373. package/dist/websocket/contracts/WebSocketClient.js +1 -0
  374. package/dist/websocket/contracts/WebSocketEndpoint.d.ts +43 -0
  375. package/dist/websocket/contracts/WebSocketEndpoint.js +1 -0
  376. package/dist/websocket/contracts/WebSocketOptions.d.ts +48 -0
  377. package/dist/websocket/contracts/WebSocketOptions.js +1 -0
  378. package/dist/websocket/contracts/WebSocketPresence.d.ts +6 -0
  379. package/dist/websocket/contracts/WebSocketPresence.js +1 -0
  380. package/dist/websocket/contracts/WebSocketServiceOptions.d.ts +12 -0
  381. package/dist/websocket/contracts/WebSocketServiceOptions.js +1 -0
  382. package/dist/websocket/contracts/index.d.ts +6 -0
  383. package/dist/websocket/contracts/index.js +1 -0
  384. package/dist/websocket/defineChannel.d.ts +8 -0
  385. package/dist/websocket/defineChannel.js +13 -0
  386. package/dist/websocket/defineWebSocket.d.ts +14 -0
  387. package/dist/websocket/defineWebSocket.js +4 -0
  388. package/dist/websocket/fastify.d.ts +11 -0
  389. package/dist/websocket/fastify.js +38 -0
  390. package/dist/websocket/index.d.ts +5 -0
  391. package/dist/websocket/index.js +4 -0
  392. package/package.json +108 -7
  393. package/src/ai/AIErrors.ts +10 -0
  394. package/src/ai/AIFailover.ts +3 -2
  395. package/src/ai/AIProviderAdmission.ts +329 -0
  396. package/src/ai/AIRateLimiter.ts +134 -10
  397. package/src/ai/AIRequestTrackingError.ts +37 -0
  398. package/src/ai/Agent.ts +85 -71
  399. package/src/ai/Ai.ts +104 -48
  400. package/src/ai/OpenAIProviderError.ts +1 -1
  401. package/src/ai/ProviderSseObserver.ts +89 -0
  402. package/src/ai/README.md +216 -11
  403. package/src/ai/aiServiceTier.ts +14 -0
  404. package/src/ai/chunkEmbeddingText.ts +137 -0
  405. package/src/ai/contracts/AI.ts +17 -0
  406. package/src/ai/contracts/AIRequestErrorDiagnostics.ts +12 -0
  407. package/src/ai/contracts/AIServiceTier.ts +2 -0
  408. package/src/ai/contracts/Agent.ts +3 -0
  409. package/src/ai/contracts/EmbeddingTextChunk.ts +26 -0
  410. package/src/ai/contracts/Pricing.ts +7 -1
  411. package/src/ai/contracts/Providers.ts +2 -0
  412. package/src/ai/contracts/index.ts +2 -0
  413. package/src/ai/examples/prepareDocumentEmbeddings.ts +20 -0
  414. package/src/ai/index.ts +9 -2
  415. package/src/ai/{Models.ts → modelPricing.ts} +37 -4
  416. package/src/apps/AppInstallation.ts +25 -0
  417. package/src/apps/AppRouteError.ts +8 -0
  418. package/src/apps/AppService.ts +30 -0
  419. package/src/apps/Apps.ts +508 -0
  420. package/src/apps/README.md +354 -0
  421. package/src/apps/appsPlugin.ts +34 -0
  422. package/src/apps/commands/disableApp.ts +6 -0
  423. package/src/apps/commands/enableApp.ts +6 -0
  424. package/src/apps/commands/index.ts +29 -0
  425. package/src/apps/commands/installApp.ts +6 -0
  426. package/src/apps/commands/listApps.ts +6 -0
  427. package/src/apps/commands/makeAppMigration.ts +9 -0
  428. package/src/apps/commands/rollbackApp.ts +6 -0
  429. package/src/apps/commands/uninstallApp.ts +6 -0
  430. package/src/apps/contracts/AppAction.ts +2 -0
  431. package/src/apps/contracts/AppDefinition.ts +49 -0
  432. package/src/apps/contracts/AppDescription.ts +27 -0
  433. package/src/apps/contracts/AppManifest.ts +32 -0
  434. package/src/apps/contracts/AppNavigation.ts +10 -0
  435. package/src/apps/contracts/AppNavigationBadge.ts +6 -0
  436. package/src/apps/contracts/AppNavigationContext.ts +6 -0
  437. package/src/apps/contracts/AppNavigationResult.ts +9 -0
  438. package/src/apps/contracts/AppRoute.ts +18 -0
  439. package/src/apps/contracts/DiscoveredApp.ts +11 -0
  440. package/src/apps/contracts/InstalledApps.ts +2 -0
  441. package/src/apps/contracts/index.ts +11 -0
  442. package/src/apps/defineApp.ts +10 -0
  443. package/src/apps/discoverApps.ts +56 -0
  444. package/src/apps/fastify.ts +1 -0
  445. package/src/apps/index.ts +7 -0
  446. package/src/apps/normalizeAppNavigation.ts +29 -0
  447. package/src/apps/registerAppRoutes.ts +48 -0
  448. package/src/apps/validateAppDefinitions.ts +52 -0
  449. package/src/apps/vite.ts +1 -0
  450. package/src/apps/writeAppTypes.ts +14 -0
  451. package/src/auth/Auth.ts +89 -23
  452. package/src/auth/PasswordLoginAttempt.ts +72 -0
  453. package/src/auth/PasswordSuspendedError.ts +13 -0
  454. package/src/auth/README.md +94 -4
  455. package/src/auth/contracts/PasswordAuthProviderOptions.ts +30 -0
  456. package/src/auth/contracts/PasswordSuspension.ts +7 -0
  457. package/src/auth/contracts/PasswordSuspensionOptions.ts +10 -0
  458. package/src/auth/contracts/index.ts +3 -0
  459. package/src/auth/examples/runPasswordAuth.ts +6 -6
  460. package/src/auth/index.ts +2 -0
  461. package/src/auth/providers/PasswordAuthProvider.ts +96 -30
  462. package/src/auth/providers/resolveAuthProviders.ts +1 -0
  463. package/src/cli/Cli.ts +9 -0
  464. package/src/cli/README.md +19 -0
  465. package/src/cli/commands/repl.ts +2 -1
  466. package/src/cli/contracts/CliCommand.ts +2 -0
  467. package/src/cli/contracts/CliCommandInfo.ts +13 -0
  468. package/src/cli/contracts/index.ts +1 -0
  469. package/src/cli/index.ts +1 -0
  470. package/src/cli/listDb3Commands.ts +12 -0
  471. package/src/cli/runDb3.ts +5 -51
  472. package/src/cli/withDb3Cli.ts +55 -0
  473. package/src/db/ActiveQueryBuilder.ts +12 -0
  474. package/src/db/ActiveRecord.ts +9 -0
  475. package/src/db/README.md +45 -1
  476. package/src/db/connection.ts +12 -1
  477. package/src/db/examples/FieldNote.ts +7 -13
  478. package/src/db/examples/KnowledgeNote.ts +7 -13
  479. package/src/db/examples/runNoteMigrations.ts +11 -11
  480. package/src/db/fields/TimestampField.ts +8 -17
  481. package/src/db/migrations/DatabaseMigrationManager.ts +12 -4
  482. package/src/db/migrations/contracts/DatabaseMigration.ts +9 -0
  483. package/src/db/migrations/index.ts +1 -1
  484. package/src/db/migrations/{KnexMigrationRenderer.ts → renderKnexMigration.ts} +8 -14
  485. package/src/flows/FlowCompiler.ts +1 -1
  486. package/src/flows/Flows.ts +1 -1
  487. package/src/flows/index.ts +1 -1
  488. package/src/health/Health.ts +163 -0
  489. package/src/health/README.md +46 -0
  490. package/src/health/contracts/Health.ts +47 -0
  491. package/src/health/contracts/HealthHttp.ts +19 -0
  492. package/src/health/contracts/index.ts +2 -0
  493. package/src/health/databaseHealthCheck.ts +21 -0
  494. package/src/health/fastify.ts +49 -0
  495. package/src/health/index.ts +3 -0
  496. package/src/in-app/InApp.ts +173 -0
  497. package/src/in-app/InAppError.ts +8 -0
  498. package/src/in-app/InAppRecord.ts +41 -0
  499. package/src/in-app/README.md +193 -0
  500. package/src/in-app/contracts/InAppInbox.ts +51 -0
  501. package/src/in-app/contracts/InAppMessage.ts +19 -0
  502. package/src/in-app/contracts/InAppScope.ts +12 -0
  503. package/src/in-app/contracts/index.ts +3 -0
  504. package/src/in-app/examples/sendReportReady.ts +14 -0
  505. package/src/in-app/index.ts +4 -0
  506. package/src/in-app/validation.ts +49 -0
  507. package/src/index.ts +2 -22
  508. package/src/logging/DevelopmentConsole.ts +154 -0
  509. package/src/logging/Log.ts +5 -2
  510. package/src/logging/PrettyLogFormatter.ts +165 -0
  511. package/src/logging/README.md +52 -109
  512. package/src/logging/acquireDevelopmentConsole.ts +19 -0
  513. package/src/logging/contracts/DevelopmentConsoleOptions.ts +13 -0
  514. package/src/logging/contracts/EmailLogOptions.ts +9 -0
  515. package/src/logging/contracts/HttpExchangeMonitorOptions.ts +13 -0
  516. package/src/logging/contracts/LogTransportOptions.ts +10 -0
  517. package/src/logging/contracts/LoggingOptions.ts +12 -1
  518. package/src/logging/contracts/index.ts +4 -0
  519. package/src/logging/development/README.md +88 -0
  520. package/src/logging/drivers/PinoLoggerDriver.ts +72 -20
  521. package/src/logging/examples/runDevelopmentLogs.ts +36 -0
  522. package/src/logging/formatLogEmail.ts +24 -0
  523. package/src/logging/highlightQueueMessage.ts +38 -0
  524. package/src/logging/httpBodyCapture.ts +393 -0
  525. package/src/logging/index.ts +2 -0
  526. package/src/logging/redactLogEmail.ts +12 -0
  527. package/src/logging/registerHttpExchangeMonitor.ts +45 -0
  528. package/src/logging/transports/EmailLogTransport.ts +46 -0
  529. package/src/mail/Mail.ts +5 -0
  530. package/src/mail/MailDeliveryError.ts +8 -0
  531. package/src/mail/README.md +11 -1
  532. package/src/mail/index.ts +1 -0
  533. package/src/mail/transports/MailgunTransport.ts +2 -0
  534. package/src/mail/transports/ResendTransport.ts +24 -22
  535. package/src/media/MediaManager.ts +31 -10
  536. package/src/media/README.md +4 -0
  537. package/src/media/examples/runPrivateFiles.ts +2 -2
  538. package/src/network/BlockedUrlError.ts +19 -0
  539. package/src/network/README.md +133 -0
  540. package/src/network/assertPublicUrl.ts +77 -0
  541. package/src/network/contracts/GuardedFetch.ts +40 -0
  542. package/src/network/contracts/PublicUrlOptions.ts +17 -0
  543. package/src/network/contracts/index.ts +2 -0
  544. package/src/network/examples/runGuardedFetch.ts +35 -0
  545. package/src/network/guardedFetch.ts +150 -0
  546. package/src/network/index.ts +6 -0
  547. package/src/network/playwright/GuardedBrowserProxy.ts +172 -0
  548. package/src/network/playwright/contracts/GuardedBrowserContextOptions.ts +43 -0
  549. package/src/network/playwright/contracts/index.ts +1 -0
  550. package/src/network/playwright/index.ts +2 -0
  551. package/src/network/playwright/newGuardedBrowserContext.ts +74 -0
  552. package/src/network/privateNetworkAddresses.ts +166 -0
  553. package/src/network/publicAddressLookup.ts +49 -0
  554. package/src/notifications/Notifications.ts +105 -0
  555. package/src/notifications/README.md +59 -0
  556. package/src/notifications/contracts/Notification.ts +65 -0
  557. package/src/notifications/contracts/NotificationDelivery.ts +11 -0
  558. package/src/notifications/contracts/index.ts +2 -0
  559. package/src/notifications/examples/ReportReadyNotification.ts +31 -0
  560. package/src/notifications/index.ts +2 -0
  561. package/src/queue/JobRunAttempt.ts +17 -0
  562. package/src/queue/JobRunEvent.ts +16 -0
  563. package/src/queue/JobRunStoppedError.ts +8 -0
  564. package/src/queue/Queue.ts +112 -11
  565. package/src/queue/QueueTerminalError.ts +12 -0
  566. package/src/queue/QueueWorker.ts +86 -7
  567. package/src/queue/QueueWorkerReporter.ts +59 -0
  568. package/src/queue/QueueableJob.ts +2 -2
  569. package/src/queue/README.md +142 -1
  570. package/src/queue/RunnableJob.ts +272 -0
  571. package/src/queue/console.ts +54 -21
  572. package/src/queue/contracts/QueueDriver.ts +9 -0
  573. package/src/queue/contracts/QueueJobRunner.ts +4 -0
  574. package/src/queue/contracts/QueuePayload.ts +1 -1
  575. package/src/queue/contracts/QueueSelection.ts +11 -0
  576. package/src/queue/contracts/QueueService.ts +19 -4
  577. package/src/queue/contracts/QueueWorkerLifecycle.ts +2 -2
  578. package/src/queue/contracts/QueueWorkerSnapshot.ts +15 -0
  579. package/src/queue/contracts/QueueableJob.ts +7 -3
  580. package/src/queue/contracts/QueueableJobContract.ts +13 -0
  581. package/src/queue/contracts/index.ts +6 -0
  582. package/src/queue/drivers/DatabaseQueueDriver.ts +25 -3
  583. package/src/queue/drivers/RedisQueueDriver.ts +36 -0
  584. package/src/queue/examples/runQueueSelection.ts +34 -0
  585. package/src/queue/index.ts +7 -0
  586. package/src/queue/jobEnvelopeHasPrefix.ts +6 -0
  587. package/src/scheduler/README.md +50 -9
  588. package/src/scheduler/ScheduledEvent.ts +20 -5
  589. package/src/scheduler/ScheduledJob.ts +1 -1
  590. package/src/scheduler/Scheduler.ts +73 -27
  591. package/src/scheduler/SchedulerCheckpointRecord.ts +51 -0
  592. package/src/scheduler/SchedulerWorker.ts +54 -19
  593. package/src/scheduler/console.ts +3 -1
  594. package/src/scheduler/contracts/Schedule.ts +22 -0
  595. package/src/scheduler/contracts/Scheduler.ts +21 -6
  596. package/src/scheduler/contracts/SchedulerCheckpoint.ts +23 -0
  597. package/src/scheduler/contracts/SchedulerConsole.ts +5 -0
  598. package/src/scheduler/contracts/SchedulerWorker.ts +6 -1
  599. package/src/scheduler/contracts/index.ts +2 -0
  600. package/src/scheduler/examples/runSchedulerWindow.ts +54 -0
  601. package/src/scheduler/index.ts +1 -0
  602. package/src/server/App.ts +73 -10
  603. package/src/server/README.md +95 -2
  604. package/src/server/contracts/HttpErrorHandlerOptions.ts +29 -0
  605. package/src/server/contracts/index.ts +1 -0
  606. package/src/server/examples/createFirstServer.ts +5 -3
  607. package/src/server/index.ts +4 -0
  608. package/src/server/publicServerErrorMessage.ts +17 -0
  609. package/src/server/registerBrowserJsonFormatting.ts +94 -0
  610. package/src/server/registerHttpErrorHandler.ts +96 -0
  611. package/src/ssr/README.md +6 -0
  612. package/src/ssr/vite/contracts/ViteSsrOptions.ts +2 -0
  613. package/src/ssr/vite/fastifyViteSsr.ts +4 -3
  614. package/src/storage/drivers/FlystorageDisk.ts +2 -2
  615. package/src/storage/index.ts +2 -2
  616. package/src/websocket/README.md +458 -0
  617. package/src/websocket/WebSocketChannels.ts +99 -0
  618. package/src/websocket/WebSocketConnection.ts +162 -0
  619. package/src/websocket/WebSockets.ts +157 -0
  620. package/src/websocket/client/WebSocketClient.ts +188 -0
  621. package/src/websocket/client/index.ts +3 -0
  622. package/src/websocket/contracts/WebSocketChannel.ts +23 -0
  623. package/src/websocket/contracts/WebSocketClient.ts +48 -0
  624. package/src/websocket/contracts/WebSocketEndpoint.ts +46 -0
  625. package/src/websocket/contracts/WebSocketOptions.ts +50 -0
  626. package/src/websocket/contracts/WebSocketPresence.ts +6 -0
  627. package/src/websocket/contracts/WebSocketServiceOptions.ts +12 -0
  628. package/src/websocket/contracts/index.ts +6 -0
  629. package/src/websocket/defineChannel.ts +14 -0
  630. package/src/websocket/defineWebSocket.ts +15 -0
  631. package/src/websocket/examples/board/LiveBoard.ts +97 -0
  632. package/src/websocket/examples/board/SummarizeBoardJob.ts +52 -0
  633. package/src/websocket/examples/board/boardSnapshot.ts +16 -0
  634. package/src/websocket/examples/board/createBoardClient.ts +43 -0
  635. package/src/websocket/examples/board/createBoardStore.ts +58 -0
  636. package/src/websocket/examples/board/registerBoardRoutes.ts +31 -0
  637. package/src/websocket/examples/createChannelSync.ts +66 -0
  638. package/src/websocket/examples/deploymentEndpoint.ts +13 -0
  639. package/src/websocket/examples/deploymentSnapshot.ts +36 -0
  640. package/src/websocket/examples/resourceChannels.ts +18 -0
  641. package/src/websocket/examples/userEndpoint.ts +27 -0
  642. package/src/websocket/fastify.ts +39 -0
  643. package/src/websocket/index.ts +5 -0
  644. package/templates/AGENTS.md +33 -2
  645. /package/dist/flows/{FlowValueValidator.d.ts → flowValueValidator.d.ts} +0 -0
  646. /package/dist/flows/{FlowValueValidator.js → flowValueValidator.js} +0 -0
  647. /package/dist/storage/{mime.d.ts → mimeTypeFromPath.d.ts} +0 -0
  648. /package/dist/storage/{mime.js → mimeTypeFromPath.js} +0 -0
  649. /package/dist/storage/{contents.d.ts → storageContentsToBuffer.d.ts} +0 -0
  650. /package/dist/storage/{contents.js → storageContentsToBuffer.js} +0 -0
  651. /package/src/flows/{FlowValueValidator.ts → flowValueValidator.ts} +0 -0
  652. /package/src/storage/{mime.ts → mimeTypeFromPath.ts} +0 -0
  653. /package/src/storage/{contents.ts → storageContentsToBuffer.ts} +0 -0
@@ -30,7 +30,7 @@ export async function runSchedulerConsole(options, argv = process.argv.slice(2))
30
30
  case 'scheduler:list':
31
31
  await runWithApp(options, app => {
32
32
  for (const definition of app.scheduler.definitions()) {
33
- console.log(`${definition.name}\t${definition.kind}\tdaily at ${definition.frequency.time}\t${definition.timezone}${definition.jobName ? `\t${definition.jobName}` : ''}`);
33
+ console.log(`${definition.name}\t${definition.kind}\t${definition.frequency.type === 'minute' ? 'every minute' : definition.frequency.type === 'hourly' ? 'hourly (UTC)' : `daily at ${definition.frequency.time}`}\t${definition.timezone}${definition.jobName ? `\t${definition.jobName}` : ''}`);
34
34
  }
35
35
  });
36
36
  return;
@@ -112,6 +112,8 @@ async function workScheduler(options) {
112
112
  const app = options.app();
113
113
  app.scheduler.definitions();
114
114
  const worker = new SchedulerWorker(app.scheduler, {
115
+ onTick: options.onTick,
116
+ checkpoint: options.checkpoint,
115
117
  logger: app.log ? schedulerLogger(app.log) : undefined,
116
118
  });
117
119
  let shuttingDown = false;
@@ -0,0 +1,19 @@
1
+ import type { ScheduledJob } from '../ScheduledJob.js';
2
+ import type { ScheduledCall } from '../ScheduledCall.js';
3
+ import type { ScheduledJobSource, ScheduledCallHandler, ScheduledTaskDefinition } from './Scheduler.js';
4
+ /** Fluent declaration surface shared by the host scheduler and app-owned schedule.ts files. */
5
+ export interface Schedule {
6
+ /** Declares queued work; workers execute the expensive operation. */
7
+ job(source: ScheduledJobSource): ScheduledJob;
8
+ /** Declares a short inline operation executed by the scheduler. */
9
+ call(handler: ScheduledCallHandler): ScheduledCall;
10
+ }
11
+ /** Ownership handle for one group's registrations. Closing removes only that group. */
12
+ export interface ScheduleRegistration {
13
+ /** Browser-safe definitions, including the owning app identifier. */
14
+ definitions: ScheduledTaskDefinition[];
15
+ /** Idempotently removes the group's runtime definitions. Durable history remains. */
16
+ close(): void;
17
+ }
18
+ /** Wraps one complete occurrence, including claiming and dispatch, in the owner's lifecycle gate. */
19
+ export type ScheduleRunner = (operation: () => Promise<void>) => Promise<void>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,4 @@
1
- import type { QueueableJob } from '../../queue/index.js';
1
+ import type { QueueableJobContract as QueueableJob } from '../../queue/index.js';
2
2
  /**
3
3
  * Supported scheduled task kinds.
4
4
  */
@@ -8,24 +8,36 @@ export type ScheduledTaskKind = 'job' | 'call';
8
8
  */
9
9
  export type ScheduledOccurrenceStatus = 'claimed' | 'queued' | 'running' | 'retrying' | 'deferred' | 'succeeded' | 'failed';
10
10
  /**
11
- * Daily frequency supported by the initial scheduler implementation.
11
+ * Daily frequency interpreted in the configured timezone.
12
12
  */
13
13
  export interface DailyScheduleFrequency {
14
- /** Frequency discriminator reserved for future schedule types. */
14
+ /** Frequency discriminator. */
15
15
  type: 'daily';
16
16
  /** Local wall-clock time in 24-hour HH:mm format. */
17
17
  time: string;
18
18
  }
19
+ /** Runs once for each evaluated UTC minute, including catch-up after downtime. */
20
+ export interface MinuteScheduleFrequency {
21
+ type: 'minute';
22
+ }
23
+ /** Supported calendar frequencies; durable claims remain scoped to UTC minutes. */
24
+ export type ScheduleFrequency = DailyScheduleFrequency | MinuteScheduleFrequency | HourlyScheduleFrequency;
25
+ /** Runs at minute zero of each UTC hour, including catch-up; independent of local daylight-saving changes. */
26
+ export interface HourlyScheduleFrequency {
27
+ type: 'hourly';
28
+ }
19
29
  /**
20
30
  * Normalized public description of one registered schedule.
21
31
  */
22
32
  export interface ScheduledTaskDefinition {
33
+ /** App or other runtime group that owns this registration; absent for host declarations. */
34
+ owner?: string;
23
35
  /** Stable task name used for deduplication and history. */
24
36
  name: string;
25
37
  /** Whether the task dispatches a job or executes an inline callback. */
26
38
  kind: ScheduledTaskKind;
27
- /** Daily frequency and local wall-clock time. */
28
- frequency: DailyScheduleFrequency;
39
+ /** Minute/hour cadence or daily local wall-clock time. */
40
+ frequency: ScheduleFrequency;
29
41
  /** IANA timezone used to interpret the frequency. */
30
42
  timezone: string;
31
43
  /** Durable queue job name when known without invoking a factory. */
@@ -49,7 +61,7 @@ export interface ScheduledJobClass {
49
61
  * @param data - JSON-safe queue payload.
50
62
  * @returns Rehydrated job instance.
51
63
  */
52
- fromJSON(data: Record<string, unknown>): QueueableJob;
64
+ fromJSON(data: Record<string, unknown>): QueueableJob | Promise<QueueableJob>;
53
65
  }
54
66
  /**
55
67
  * Zero-argument class or fresh-job factory accepted by Scheduler.job().
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Application-owned durable progress for one registered scheduler.
3
+ * Share this checkpoint between replacement processes using the same definitions.
4
+ */
5
+ export interface SchedulerCheckpoint {
6
+ /**
7
+ * Loads the last fully evaluated UTC minute. On first use, atomically persist
8
+ * and return the minute immediately before firstMinute, establishing the start
9
+ * of coverage before any scheduled work is attempted.
10
+ *
11
+ * @param firstMinute - Current UTC minute at the worker's first startup.
12
+ * @returns Last evaluated minute, or the newly established starting boundary.
13
+ */
14
+ load(firstMinute: Date): Promise<Date>;
15
+ /**
16
+ * Advances progress after all events in a minute have been considered.
17
+ * Concurrent saves must never move the stored minute backwards. A rejected
18
+ * save causes the worker to reconsider that minute using occurrence deduplication.
19
+ *
20
+ * @param evaluatedFor - UTC minute whose complete evaluation was recorded.
21
+ */
22
+ save(evaluatedFor: Date): Promise<void>;
23
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,6 @@
1
1
  import type { Scheduler } from '../Scheduler.js';
2
2
  import type { Logger } from '../../logging/index.js';
3
+ import type { SchedulerWorkerOptions } from './SchedulerWorker.js';
3
4
  /**
4
5
  * Parsed scheduler command name, positional arguments, and long options.
5
6
  */
@@ -26,6 +27,10 @@ export interface SchedulerConsoleApp {
26
27
  * Application hooks and help customisation for scheduler console commands.
27
28
  */
28
29
  export interface SchedulerConsoleOptions {
30
+ /** Called after a successful scheduler worker tick for application-owned health reporting. */
31
+ onTick?: SchedulerWorkerOptions['onTick'];
32
+ /** Durable worker progress, initialized only by scheduler:work. One-off commands leave it alone. */
33
+ checkpoint?: SchedulerWorkerOptions['checkpoint'];
29
34
  /** Resolves the active application instance after bootstrap. */
30
35
  app: () => SchedulerConsoleApp;
31
36
  /** Prepares schema, queue jobs, and schedule definitions. */
@@ -1,4 +1,5 @@
1
- import type { SchedulerLogger } from './Scheduler.js';
1
+ import type { SchedulerLogger, SchedulerRunResult } from './Scheduler.js';
2
+ import type { SchedulerCheckpoint } from './SchedulerCheckpoint.js';
2
3
  /**
3
4
  * Abort-aware sleep function used by the long-running scheduler worker.
4
5
  */
@@ -7,6 +8,10 @@ export type SchedulerSleep = (delayMs: number, signal: AbortSignal) => Promise<v
7
8
  * Runtime dependencies and logging overrides for SchedulerWorker.
8
9
  */
9
10
  export interface SchedulerWorkerOptions {
11
+ /** Durable coverage across process restarts; without it, coverage starts in the current process. */
12
+ checkpoint?: SchedulerCheckpoint;
13
+ /** Records a successful evaluation and its actual minute; hook failures retry that minute. */
14
+ onTick?: (result: SchedulerRunResult) => Promise<void>;
10
15
  /** Clock used to align and evaluate scheduler ticks. */
11
16
  now?: () => Date;
12
17
  /** Abort-aware sleeper used between minute boundaries. */
@@ -1,3 +1,5 @@
1
1
  export * from './Scheduler.js';
2
2
  export * from './SchedulerConsole.js';
3
3
  export * from './SchedulerWorker.js';
4
+ export * from './SchedulerCheckpoint.js';
5
+ export * from './Schedule.js';
@@ -1,3 +1,5 @@
1
1
  export * from './Scheduler.js';
2
2
  export * from './SchedulerConsole.js';
3
3
  export * from './SchedulerWorker.js';
4
+ export * from './SchedulerCheckpoint.js';
5
+ export * from './Schedule.js';
@@ -7,3 +7,4 @@ export * from './ScheduledJob.js';
7
7
  export * from './ScheduledOccurrence.js';
8
8
  export * from './ScheduledOccurrenceRecorder.js';
9
9
  export * from './SchedulerWorker.js';
10
+ export * from './SchedulerCheckpointRecord.js';
@@ -7,3 +7,4 @@ export * from './ScheduledJob.js';
7
7
  export * from './ScheduledOccurrence.js';
8
8
  export * from './ScheduledOccurrenceRecorder.js';
9
9
  export * from './SchedulerWorker.js';
10
+ export * from './SchedulerCheckpointRecord.js';
@@ -1,9 +1,16 @@
1
+ import type { WebSocketServiceOptions } from '../websocket/index.js';
1
2
  import type { Knex } from 'knex';
2
3
  import { Ai, type AIOptions } from '../ai/index.js';
4
+ import { Apps, type AppDefinitions, type AppServices, type InstalledApps } from '../apps/index.js';
3
5
  import { Auth, type AuthOptions } from '../auth/index.js';
4
6
  import { Cache } from '../cache/index.js';
5
7
  import { Config, type ConfigValues } from '../config/index.js';
6
8
  import { Database, type DatabaseOptions } from '../db/index.js';
9
+ import { InApp, type InAppOptions } from '../in-app/index.js';
10
+ import { Health, type HealthOptions } from '../health/index.js';
11
+ import { Mail, type MailOptions } from '../mail/index.js';
12
+ import { Notifications } from '../notifications/index.js';
13
+ import { WebSockets } from '../websocket/index.js';
7
14
  import { Events } from '../events/index.js';
8
15
  import { UrlGenerator, type UrlGeneratorOptions } from '../url/index.js';
9
16
  import { Queue, type QueueOptions } from '../queue/index.js';
@@ -15,7 +22,9 @@ import { Serializer, type SerializerOptions } from '../serialization/index.js';
15
22
  import { MediaManager } from '../media/index.js';
16
23
  import { RequestContext } from './RequestContext.js';
17
24
  /** Application root, service configuration and optional dependencies supplied at bootstrap. */
18
- export interface AppOptions {
25
+ export interface AppOptions<TApps extends AppDefinitions = {}> {
26
+ /** Optional explicit composition. Omit to discover local apps and marked npm dependencies. */
27
+ apps?: TApps;
19
28
  /** App root as a path or file URL; defaults to the working directory at construction. */
20
29
  directory?: string | URL;
21
30
  /** Provider adapters and extensible ActiveRecord models for app().ai. */
@@ -29,6 +38,14 @@ export interface AppOptions {
29
38
  /** Canonical application URL configuration used across all runtimes. */
30
39
  url?: UrlGeneratorOptions;
31
40
  queue?: QueueOptions;
41
+ /** Authorization policy for application-scoped in-app inboxes. */
42
+ inApp?: InAppOptions;
43
+ /** Optional shared transport for channel events from API and worker processes. */
44
+ webSockets?: WebSocketServiceOptions;
45
+ /** Application health identity and initial component checks. */
46
+ health?: HealthOptions;
47
+ /** Provider-neutral mail delivery used directly and by app().notifications. */
48
+ mail?: MailOptions;
32
49
  /** Serializable classes and ActiveRecord models registered with app().serializer. */
33
50
  serializer?: SerializerOptions;
34
51
  storage?: StorageOptions;
@@ -39,8 +56,8 @@ export interface AppOptions {
39
56
  * Keep this as the place where top-level framework capabilities are discovered
40
57
  * and wired, not where domain logic itself accumulates.
41
58
  */
42
- export declare class App {
43
- protected readonly options: AppOptions;
59
+ export declare class App<TApps extends AppDefinitions = {}> {
60
+ protected readonly options: AppOptions<TApps>;
44
61
  private readonly services;
45
62
  /** Absolute app root used for conventional server paths, independent of later working-directory changes. */
46
63
  readonly directory: string;
@@ -49,9 +66,21 @@ export declare class App {
49
66
  *
50
67
  * @param options - Framework services and application configuration.
51
68
  */
52
- constructor(options?: AppOptions);
69
+ constructor(options?: AppOptions<TApps>);
70
+ /** Returns the app composition registry with optional, inferred public service accessors. */
71
+ get apps(): Apps<TApps> & AppServices<TApps>;
53
72
  /** Returns the lazy database service with this app's connection, model registry and root directory. */
54
73
  get db(): Database;
74
+ /** Returns the durable inbox service using the configured Auth identity model. */
75
+ get inApp(): InApp;
76
+ /** Returns the extensible application health registry. */
77
+ get health(): Health;
78
+ /** Returns the provider-neutral mail service configured for this application. */
79
+ get mail(): Mail;
80
+ /** Returns the notification coordinator for application-owned channel renderers. */
81
+ get notifications(): Notifications<any>;
82
+ /** Returns authenticated WebSocket endpoints owned by this application's lifecycle. */
83
+ get webSockets(): WebSockets;
55
84
  get auth(): Auth<any>;
56
85
  get requestContext(): RequestContext;
57
86
  /** Returns the application AI service with durable request and conversation history. */
@@ -139,3 +168,6 @@ export declare class App {
139
168
  private resolveDbConnection;
140
169
  private resolveDatabaseOptions;
141
170
  }
171
+ /** Optional discovered app services, generated from root App.ts classes by DB3 tooling. */
172
+ export interface App<TApps extends AppDefinitions = {}> extends InstalledApps {
173
+ }
@@ -1,11 +1,18 @@
1
1
  import { resolve } from 'node:path';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import { Ai } from '../ai/index.js';
4
+ import { Apps } from '../apps/index.js';
4
5
  import { Auth, } from '../auth/index.js';
5
6
  import { Cache, } from '../cache/index.js';
6
7
  import { Config, } from '../config/index.js';
7
8
  import { db as defaultDb, destroyDatabase, } from '../db/connection.js';
8
9
  import { Database, } from '../db/index.js';
10
+ import { InApp } from '../in-app/index.js';
11
+ import { Health } from '../health/index.js';
12
+ import { Mail } from '../mail/index.js';
13
+ import { Notifications } from '../notifications/index.js';
14
+ import { WebSockets } from '../websocket/index.js';
15
+ import { UserIdentity } from '../auth/index.js';
9
16
  import { Events } from '../events/index.js';
10
17
  import { UrlGenerator } from '../url/index.js';
11
18
  import { Queue, } from '../queue/index.js';
@@ -36,16 +43,42 @@ export class App {
36
43
  constructor(options = {}) {
37
44
  this.options = options;
38
45
  this.directory = resolve(options.directory instanceof URL ? fileURLToPath(options.directory) : options.directory ?? process.cwd());
46
+ if (options.apps)
47
+ void this.apps;
39
48
  setActiveApp(this);
40
49
  if (this.config.has('security'))
41
50
  void this.security;
42
51
  }
52
+ /** Returns the app composition registry with optional, inferred public service accessors. */
53
+ get apps() {
54
+ return this.service('apps', () => new Apps(this, this.options.apps));
55
+ }
43
56
  /** Returns the lazy database service with this app's connection, model registry and root directory. */
44
57
  get db() {
45
58
  return this.service('db', () => {
46
59
  return new Database(this.resolveDbConnection(), this.resolveDatabaseOptions(), this.directory);
47
60
  });
48
61
  }
62
+ /** Returns the durable inbox service using the configured Auth identity model. */
63
+ get inApp() {
64
+ return this.service('inApp', () => new InApp(this.options.inApp, this.options.auth?.identityModel ?? UserIdentity));
65
+ }
66
+ /** Returns the extensible application health registry. */
67
+ get health() {
68
+ return this.service('health', () => new Health(this.options.health));
69
+ }
70
+ /** Returns the provider-neutral mail service configured for this application. */
71
+ get mail() {
72
+ return this.service('mail', () => new Mail(this.options.mail));
73
+ }
74
+ /** Returns the notification coordinator for application-owned channel renderers. */
75
+ get notifications() {
76
+ return this.service('notifications', () => new Notifications(this.inApp, this.mail, this.options.auth?.identityModel ?? UserIdentity));
77
+ }
78
+ /** Returns authenticated WebSocket endpoints owned by this application's lifecycle. */
79
+ get webSockets() {
80
+ return this.service('webSockets', () => new WebSockets(this, this.options.webSockets));
81
+ }
49
82
  get auth() {
50
83
  return this.service('auth', () => new Auth({
51
84
  ...this.options.auth,
@@ -86,7 +119,7 @@ export class App {
86
119
  * @returns Pino-backed logging service with app lifecycle ownership.
87
120
  */
88
121
  get log() {
89
- return this.service('log', () => new Log(this.options.log));
122
+ return this.service('log', () => new Log(this.options.log, () => this.mail));
90
123
  }
91
124
  /**
92
125
  * Returns the canonical application URL generator.
@@ -111,7 +144,10 @@ export class App {
111
144
  });
112
145
  }
113
146
  get queue() {
114
- return this.service('queue', () => new Queue(this.db, this.options.queue));
147
+ return this.service('queue', () => new Queue(this.db, {
148
+ onLifecycleError: failure => this.log.error({ err: failure.error, component: 'queue', source: failure.source, hook: failure.hook, jobId: failure.event.jobId, jobName: failure.event.jobName, action: failure.event.action }, 'Queue lifecycle handler failed'),
149
+ ...this.options.queue,
150
+ }));
115
151
  }
116
152
  /**
117
153
  * Returns the application scheduler and attaches queue lifecycle recording.
@@ -179,15 +215,29 @@ export class App {
179
215
  * Closes shared resources owned by the default app.
180
216
  */
181
217
  async close() {
218
+ const errors = [];
219
+ /** Continues releasing host resources when an app or transport disposer fails. */
220
+ const release = async (cleanup) => {
221
+ try {
222
+ await cleanup();
223
+ }
224
+ catch (error) {
225
+ errors.push(error);
226
+ }
227
+ };
228
+ await release(() => this.services.get('apps')?.close());
229
+ await release(() => this.services.get('webSockets')?.close());
182
230
  clearActiveApp(this);
183
- this.services.get('scheduler')?.close();
184
- this.services.get('events')?.clear();
185
- await this.services.get('cache')?.close();
186
- await this.services.get('log')?.close();
231
+ await release(() => this.services.get('scheduler')?.close());
232
+ await release(() => this.services.get('events')?.clear());
233
+ await release(() => this.services.get('cache')?.close());
234
+ await release(() => this.services.get('log')?.close());
187
235
  if (!this.options.db) {
188
- await destroyDatabase();
236
+ await release(() => destroyDatabase());
189
237
  }
190
238
  this.services.clear();
239
+ if (errors.length)
240
+ throw new AggregateError(errors, 'Application shutdown failed.');
191
241
  }
192
242
  resolveDbConnection() {
193
243
  if (!this.options.db) {
@@ -0,0 +1,29 @@
1
+ import type { FastifyRequest } from 'fastify';
2
+ /** Application-owned mapping for deliberate HTTP failures, never arbitrary provider errors. */
3
+ export interface HttpErrorResponse {
4
+ /** HTTP failure status between 400 and 599. */
5
+ statusCode: number;
6
+ /** Public client-error copy. Production 5xx bodies are always replaced. */
7
+ body: {
8
+ error: string;
9
+ message: string;
10
+ };
11
+ }
12
+ /** Server-only diagnostics passed to an application's support-record store. */
13
+ export interface HttpServerErrorContext {
14
+ /** Request whose logger and ID correlate the failure. */
15
+ request: FastifyRequest;
16
+ /** Actual HTTP response status. */
17
+ statusCode: number;
18
+ /** Framework-generated reference shared by logs and the public response. */
19
+ reference: string;
20
+ /** Explicitly returned error body, if no exception reached the handler. Never public in production. */
21
+ responseBody?: string;
22
+ }
23
+ /** Application integration points for the framework's HTTP error boundary. */
24
+ export interface HttpErrorHandlerOptions {
25
+ /** Map only known application errors; returning undefined uses framework classification. */
26
+ mapError?: (error: unknown) => HttpErrorResponse | undefined;
27
+ /** Retain extra support records after framework logging. Failures here cannot leak diagnostics. */
28
+ onServerError?: (error: unknown, context: HttpServerErrorContext) => void;
29
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export type { HttpErrorHandlerOptions, HttpErrorResponse, HttpServerErrorContext } from './HttpErrorHandlerOptions.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,7 @@
1
+ export * from './contracts/index.js';
2
+ export { publicServerErrorMessage } from './publicServerErrorMessage.js';
3
+ export { registerBrowserJsonFormatting } from './registerBrowserJsonFormatting.js';
4
+ export { registerHttpErrorHandler } from './registerHttpErrorHandler.js';
1
5
  export { App, type AppOptions, } from './App.js';
2
6
  export { app, activeAppDatabase, activeAppRequestContext, clearActiveApp, setActiveApp, type AppDatabaseProvider, } from './appContext.js';
3
7
  export { RequestContext, type RequestContextValues, } from './RequestContext.js';
@@ -1,3 +1,7 @@
1
+ export * from './contracts/index.js';
2
+ export { publicServerErrorMessage } from './publicServerErrorMessage.js';
3
+ export { registerBrowserJsonFormatting } from './registerBrowserJsonFormatting.js';
4
+ export { registerHttpErrorHandler } from './registerHttpErrorHandler.js';
1
5
  export { App, } from './App.js';
2
6
  export { app, activeAppDatabase, activeAppRequestContext, clearActiveApp, setActiveApp, } from './appContext.js';
3
7
  export { RequestContext, } from './RequestContext.js';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Returns internal diagnostics only for explicitly named development environments.
3
+ *
4
+ * Production, staging, unknown and unset environments fail closed. This policy
5
+ * applies to every exception, without relying on database-specific signatures.
6
+ *
7
+ * @param error - Original server-side failure; never modified by this function.
8
+ * @param environment - Runtime environment, defaulting to NODE_ENV.
9
+ * @returns Detailed development message or the generic public failure message.
10
+ */
11
+ export declare function publicServerErrorMessage(error: unknown, environment?: string | undefined): string;
@@ -0,0 +1,16 @@
1
+ import { isDevelopmentEnvironment, unknownErrorMessage } from '@db3.ai/pure';
2
+ /**
3
+ * Returns internal diagnostics only for explicitly named development environments.
4
+ *
5
+ * Production, staging, unknown and unset environments fail closed. This policy
6
+ * applies to every exception, without relying on database-specific signatures.
7
+ *
8
+ * @param error - Original server-side failure; never modified by this function.
9
+ * @param environment - Runtime environment, defaulting to NODE_ENV.
10
+ * @returns Detailed development message or the generic public failure message.
11
+ */
12
+ export function publicServerErrorMessage(error, environment = process.env.NODE_ENV) {
13
+ return isDevelopmentEnvironment(environment)
14
+ ? unknownErrorMessage(error) || 'Unexpected server error'
15
+ : 'Unexpected server error';
16
+ }
@@ -0,0 +1,16 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ /**
3
+ * Formats small JSON responses for browser page navigations across a Fastify server.
4
+ *
5
+ * Register before routes and plugins so their replies inherit the send hook. The
6
+ * hook runs after Fastify response-schema serialization and only reformats GET
7
+ * requests with `Sec-Fetch-Mode: navigate`. Browser fetches, other methods,
8
+ * streams, encoded bodies, and responses with integrity headers retain their
9
+ * original bytes. Large JSON bodies remain compact to bound browser-only work.
10
+ *
11
+ * @param server - Fastify server that owns the response lifecycle.
12
+ * @example
13
+ * const server = Fastify();
14
+ * registerBrowserJsonFormatting(server);
15
+ */
16
+ export declare function registerBrowserJsonFormatting(server: FastifyInstance): void;
@@ -0,0 +1,100 @@
1
+ const MAX_PRETTY_JSON_CHARS = 1_000_000;
2
+ const MAX_PRETTY_JSON_DEPTH = 64;
3
+ const MAX_FORMATTED_JSON_CHARS = 4_000_000;
4
+ const JSON_CONTENT_TYPE = /^application\/json(?:\s*;|$)/i;
5
+ const JSON_TOKENS = /"(?:\\.|[^"\\])*"|[{}\[\],:]|[^\s{}\[\],:"]+/g;
6
+ const BODY_PRESERVING_HEADERS = ['content-encoding', 'content-disposition', 'etag', 'content-digest', 'digest', 'content-md5'];
7
+ /**
8
+ * Formats small JSON responses for browser page navigations across a Fastify server.
9
+ *
10
+ * Register before routes and plugins so their replies inherit the send hook. The
11
+ * hook runs after Fastify response-schema serialization and only reformats GET
12
+ * requests with `Sec-Fetch-Mode: navigate`. Browser fetches, other methods,
13
+ * streams, encoded bodies, and responses with integrity headers retain their
14
+ * original bytes. Large JSON bodies remain compact to bound browser-only work.
15
+ *
16
+ * @param server - Fastify server that owns the response lifecycle.
17
+ * @example
18
+ * const server = Fastify();
19
+ * registerBrowserJsonFormatting(server);
20
+ */
21
+ export function registerBrowserJsonFormatting(server) {
22
+ server.addHook('onSend', (request, reply, payload, done) => {
23
+ if (request.method !== 'GET' || typeof payload !== 'string' || payload.length > MAX_PRETTY_JSON_CHARS)
24
+ return done(null, payload);
25
+ const contentType = reply.getHeader('content-type');
26
+ if (typeof contentType !== 'string' || !JSON_CONTENT_TYPE.test(contentType))
27
+ return done(null, payload);
28
+ if (BODY_PRESERVING_HEADERS.some(header => reply.hasHeader(header)))
29
+ return done(null, payload);
30
+ varyByFetchMode(reply);
31
+ if (request.headers['sec-fetch-mode'] !== 'navigate')
32
+ return done(null, payload);
33
+ try {
34
+ JSON.parse(payload);
35
+ const formatted = formatJsonTokens(payload);
36
+ if (formatted === payload)
37
+ return done(null, payload);
38
+ reply.removeHeader('content-length');
39
+ return done(null, formatted);
40
+ }
41
+ catch {
42
+ return done(null, payload);
43
+ }
44
+ });
45
+ }
46
+ /**
47
+ * Inserts spacing around validated JSON tokens without changing numeric or string literals.
48
+ *
49
+ * @param source - Valid serialized JSON whose original value tokens must be retained.
50
+ * @returns Indented JSON, or the original body when depth or output limits are reached.
51
+ */
52
+ function formatJsonTokens(source) {
53
+ const tokens = source.match(JSON_TOKENS);
54
+ if (!tokens)
55
+ return source;
56
+ let depth = 0;
57
+ let formatted = '';
58
+ for (let index = 0; index < tokens.length; index++) {
59
+ const token = tokens[index];
60
+ if (token === '{' || token === '[') {
61
+ const next = tokens[index + 1];
62
+ if (next === (token === '{' ? '}' : ']')) {
63
+ formatted += token + next;
64
+ index++;
65
+ }
66
+ else {
67
+ if (depth >= MAX_PRETTY_JSON_DEPTH)
68
+ return source;
69
+ formatted += token + '\n' + ' '.repeat(++depth);
70
+ }
71
+ }
72
+ else if (token === '}' || token === ']') {
73
+ formatted += '\n' + ' '.repeat(--depth) + token;
74
+ }
75
+ else if (token === ',') {
76
+ formatted += ',\n' + ' '.repeat(depth);
77
+ }
78
+ else if (token === ':') {
79
+ formatted += ': ';
80
+ }
81
+ else {
82
+ formatted += token;
83
+ }
84
+ if (formatted.length > MAX_FORMATTED_JSON_CHARS)
85
+ return source;
86
+ }
87
+ return formatted;
88
+ }
89
+ /**
90
+ * Keeps cached compact and browser-readable JSON variants separate.
91
+ *
92
+ * @param reply - Response whose existing Vary fields must be preserved.
93
+ */
94
+ function varyByFetchMode(reply) {
95
+ const existing = reply.getHeader('vary');
96
+ const values = existing === undefined ? '' : String(existing);
97
+ if (values === '*' || values.split(',').some(value => value.trim().toLowerCase() === 'sec-fetch-mode'))
98
+ return;
99
+ reply.header('vary', values ? `${values}, Sec-Fetch-Mode` : 'Sec-Fetch-Mode');
100
+ }
@@ -0,0 +1,20 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import type * as server from './contracts/index.js';
3
+ /**
4
+ * Installs framework error logging and production-safe HTTP responses.
5
+ *
6
+ * Call immediately after constructing Fastify, before registering any routes or
7
+ * plugins. The inherited send hook also sanitizes explicit 5xx responses and
8
+ * child-plugin error handlers. Only deliberate mapped client errors and Fastify
9
+ * request errors retain public messages. Browser JSON formatting is installed
10
+ * after this boundary so it only sees the safe serialized response. Never send
11
+ * internal errors as 2xx data.
12
+ *
13
+ * @param fastify - HTTP host, still owned and closed by the caller.
14
+ * @param options - Application error classification and support-record observer.
15
+ * @example
16
+ * const server = Fastify({ logger: true });
17
+ * registerHttpErrorHandler(server);
18
+ * server.get('/example', async () => loadExample());
19
+ */
20
+ export declare function registerHttpErrorHandler(fastify: FastifyInstance, options?: server.HttpErrorHandlerOptions): void;