@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
@@ -0,0 +1,162 @@
1
+ import { StringDecoder } from 'node:string_decoder';
2
+ import { Writable } from 'node:stream';
3
+ import { stripVTControlCharacters } from 'node:util';
4
+ import { PrettyLogFormatter } from './PrettyLogFormatter.js';
5
+ /**
6
+ * Owns grouped log output and a bounded live pending area in one terminal.
7
+ * Multi-process launchers must pipe every child's output through this owner;
8
+ * unrelated processes writing directly to the same TTY cannot be coordinated.
9
+ */
10
+ export class DevelopmentConsole {
11
+ #output;
12
+ #write;
13
+ #formatter;
14
+ #interactive;
15
+ #restore = [];
16
+ #lines = [];
17
+ #timer;
18
+ #closed = false;
19
+ /**
20
+ * Creates a console owner without starting an HTTP server or taking stream ownership.
21
+ * @param options - Destination, terminal capability and stdio coordination.
22
+ */
23
+ constructor(options = {}) {
24
+ this.#output = options.output ?? process.stdout;
25
+ this.#write = this.#output.write.bind(this.#output);
26
+ this.#interactive = options.interactive ?? Boolean(this.#output.isTTY && process.env.TERM !== 'dumb');
27
+ this.#formatter = new PrettyLogFormatter(options.color ?? consoleColor(Boolean(this.#output.isTTY), process.env));
28
+ if (this.#interactive) {
29
+ if (options.coordinateStdio !== false && this.#output === process.stdout) {
30
+ this.#coordinate(process.stdout);
31
+ this.#coordinate(process.stderr);
32
+ }
33
+ this.#timer = setInterval(() => {
34
+ if (this.#lines.length && !this.#output.writableNeedDrain)
35
+ this.#render('');
36
+ }, 250);
37
+ this.#timer.unref();
38
+ const resize = () => { this.#render(''); };
39
+ this.#output.on('resize', resize);
40
+ this.#restore.push(() => { this.#output.off('resize', resize); });
41
+ }
42
+ const exit = () => { this.close(); };
43
+ process.once('exit', exit);
44
+ this.#restore.push(() => { process.off('exit', exit); });
45
+ }
46
+ /** Accepts a complete Pino JSON line, retaining ordinary non-log text verbatim. */
47
+ write(line) {
48
+ if (this.#closed)
49
+ return;
50
+ try {
51
+ const record = JSON.parse(line);
52
+ if (record && typeof record === 'object' && typeof record.level === 'number') {
53
+ this.#render(this.#formatter.format(record));
54
+ return;
55
+ }
56
+ }
57
+ catch { /* Non-JSON output from tools is ordinary terminal text. */ }
58
+ this.writeText(line);
59
+ }
60
+ /** Writes tool output above pending rows, removing controls that clear terminal history. */
61
+ writeText(text) {
62
+ if (this.#closed || !text)
63
+ return;
64
+ const safe = stripVTControlCharacters(text).replace(/\r/g, '').replace(/[\x00-\x08\x0b-\x1f\x7f]/g, '');
65
+ this.#render(safe.endsWith('\n') ? safe : `${safe}\n`);
66
+ }
67
+ /**
68
+ * Creates a separately buffered child stdout/stderr sink, handling split UTF-8
69
+ * and final unterminated lines. Long non-JSON lines are forwarded in bounded chunks.
70
+ * @returns A writable input; end it when its child stream closes.
71
+ */
72
+ createInput() {
73
+ const decoder = new StringDecoder('utf8');
74
+ let pending = '';
75
+ const consume = (text) => {
76
+ pending += text;
77
+ let newline;
78
+ while ((newline = pending.indexOf('\n')) !== -1) {
79
+ this.write(pending.slice(0, newline));
80
+ pending = pending.slice(newline + 1);
81
+ }
82
+ if (pending.length > 256 * 1024) {
83
+ this.writeText(pending);
84
+ pending = '';
85
+ }
86
+ };
87
+ return new Writable({
88
+ write: (chunk, _encoding, callback) => { consume(decoder.write(chunk)); callback(); },
89
+ final: callback => { consume(decoder.end()); if (pending)
90
+ this.write(pending); callback(); },
91
+ });
92
+ }
93
+ /** Finalizes pending work from an exited child without disturbing other children. */
94
+ endSource(pid) { this.#render(this.#formatter.finish(pid)); }
95
+ /** Waits for previously rendered output to reach the caller-owned destination. */
96
+ async flush() {
97
+ await new Promise((resolve, reject) => { this.#write('', error => error ? reject(error) : resolve()); });
98
+ }
99
+ /** Clears only owned rows, releases timers/listeners and restores patched stdio. */
100
+ close() {
101
+ if (this.#closed)
102
+ return;
103
+ clearInterval(this.#timer);
104
+ this.#render(this.#formatter.finish());
105
+ this.#closed = true;
106
+ for (const restore of this.#restore.reverse())
107
+ restore();
108
+ }
109
+ /** Replaces only the live footer and appends immutable completed output above it. */
110
+ #render(text) {
111
+ if (this.#closed)
112
+ return;
113
+ if (!this.#interactive) {
114
+ if (text)
115
+ this.#write(text);
116
+ return;
117
+ }
118
+ const columns = Math.max(1, this.#output.columns ?? 80);
119
+ const occupied = this.#lines.reduce((rows, line) => rows + Math.max(1, Math.ceil(line.length / columns)), 0);
120
+ const clear = occupied ? `\u001b[${occupied}A\r\u001b[J` : '';
121
+ const pending = this.#formatter.pending();
122
+ const maximum = Math.max(1, Math.min(5, (this.#output.rows ?? 24) - 3));
123
+ const visible = pending.slice(0, maximum);
124
+ if (pending.length > maximum)
125
+ visible[maximum - 1] = `[http] … ${pending.length - maximum + 1} more requests waiting`;
126
+ // ASCII in mutable rows gives exact terminal-cell counts across resizes.
127
+ this.#lines = columns < 20 ? [] : visible.map(line => line.replace(/→/g, '->').replace(/[^\x20-\x7e]/g, ' ').slice(0, columns - 1));
128
+ const footer = this.#lines.length ? this.#lines.join('\n') + '\n' : '';
129
+ if (clear || text || footer)
130
+ this.#write(clear + text + footer);
131
+ }
132
+ /** Serializes same-process writes with redraws while preserving write callbacks. */
133
+ #coordinate(stream) {
134
+ const original = stream.write;
135
+ const write = (chunk, encoding, callback) => {
136
+ this.writeText(typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString(typeof encoding === 'string' ? encoding : 'utf8'));
137
+ const done = typeof encoding === 'function' ? encoding : callback;
138
+ return this.#write('', done);
139
+ };
140
+ stream.write = write;
141
+ this.#restore.push(() => { if (stream.write === write)
142
+ stream.write = original; });
143
+ }
144
+ }
145
+ /**
146
+ * Whether the pretty console uses colour. `NO_COLOR` turns it off; a set
147
+ * `FORCE_COLOR` (other than `0` or `false`) turns it on even without a TTY, as
148
+ * when a process manager pipes output into its own terminal view; otherwise a
149
+ * TTY decides.
150
+ *
151
+ * @param isTTY - Whether the output stream is a terminal.
152
+ * @param env - Process environment.
153
+ * @returns Whether to emit ANSI colours.
154
+ */
155
+ export function consoleColor(isTTY, env) {
156
+ if (env.NO_COLOR !== undefined)
157
+ return false;
158
+ const force = env.FORCE_COLOR;
159
+ if (force === '0' || force === 'false')
160
+ return false;
161
+ return force !== undefined || isTTY;
162
+ }
@@ -1,4 +1,5 @@
1
1
  import type { ChildLoggerOptions } from 'pino';
2
+ import type { Mail } from '../mail/index.js';
2
3
  import type * as logging from './contracts/index.js';
3
4
  /**
4
5
  * Application logging service exposed as `app().log`.
@@ -15,8 +16,9 @@ export declare class Log implements logging.Logger {
15
16
  * Creates the application logger from explicit options or the Pino driver.
16
17
  *
17
18
  * @param options - Logging level, destinations, context, and driver overrides.
19
+ * @param mail - Lazy application Mail resolver, required when email is configured.
18
20
  */
19
- constructor(options?: logging.LoggingOptions);
21
+ constructor(options?: logging.LoggingOptions, mail?: () => Mail);
20
22
  /** Returns the current trace function, respecting runtime level changes. */
21
23
  get trace(): logging.Logger['trace'];
22
24
  /** Returns the current debug function, respecting runtime level changes. */
@@ -14,9 +14,12 @@ export class Log {
14
14
  * Creates the application logger from explicit options or the Pino driver.
15
15
  *
16
16
  * @param options - Logging level, destinations, context, and driver overrides.
17
+ * @param mail - Lazy application Mail resolver, required when email is configured.
17
18
  */
18
- constructor(options = {}) {
19
- this.#driver = options.driver ?? new PinoLoggerDriver(options);
19
+ constructor(options = {}, mail) {
20
+ if (options.driver && options.transports !== undefined)
21
+ throw new Error('Configured logging transports require the default Pino driver.');
22
+ this.#driver = options.driver ?? new PinoLoggerDriver(options, undefined, mail);
20
23
  }
21
24
  /** Returns the current trace function, respecting runtime level changes. */
22
25
  get trace() { return this.#driver.logger.trace.bind(this.#driver.logger); }
@@ -0,0 +1,16 @@
1
+ /** Groups redacted HTTP lifecycle records while preserving ordinary diagnostic logs. */
2
+ export declare class PrettyLogFormatter {
3
+ #private;
4
+ /** Creates a formatter; terminal capability is resolved by the console owner. */
5
+ constructor(color?: boolean);
6
+ /**
7
+ * Accepts one redacted Pino record and returns any completed output.
8
+ * Request context is bounded to 1,000 entries. Eviction is explicitly reported;
9
+ * later completions still print even when their earlier context is unavailable.
10
+ */
11
+ format(record: Record<string, unknown>, now?: number): string;
12
+ /** Returns waiting rows without mutating completed output or request order. */
13
+ pending(now?: number): string[];
14
+ /** Finalizes requests whose transport ended before a completion record arrived. */
15
+ finish(sourcePid?: number): string;
16
+ }
@@ -0,0 +1,151 @@
1
+ import { STATUS_CODES } from 'node:http';
2
+ import { highlightQueueMessage } from './highlightQueueMessage.js';
3
+ /** Groups redacted HTTP lifecycle records while preserving ordinary diagnostic logs. */
4
+ export class PrettyLogFormatter {
5
+ #requests = new Map();
6
+ #ended = new Set();
7
+ #color;
8
+ /** Creates a formatter; terminal capability is resolved by the console owner. */
9
+ constructor(color = false) { this.#color = color; }
10
+ /**
11
+ * Accepts one redacted Pino record and returns any completed output.
12
+ * Request context is bounded to 1,000 entries. Eviction is explicitly reported;
13
+ * later completions still print even when their earlier context is unavailable.
14
+ */
15
+ format(record, now = Date.now()) {
16
+ const message = record.msg;
17
+ const key = requestKey(record);
18
+ const request = object(record.req);
19
+ const exchange = object(record.httpExchange);
20
+ const route = requestRoute(request);
21
+ if (message === 'incoming request' && record.reqId != null && route) {
22
+ this.#ended.delete(key);
23
+ let evicted = '';
24
+ if (this.#requests.size >= 1000) {
25
+ const oldest = this.#requests.keys().next().value;
26
+ const pending = this.#requests.get(oldest);
27
+ evicted = this.#http(pending.record, pending, 'tracking limit reached; response still pending');
28
+ this.#requests.delete(oldest);
29
+ }
30
+ this.#requests.set(key, { record, route, started: now });
31
+ return evicted;
32
+ }
33
+ if (message === 'request exchange' && exchange && Number(record.level ?? 30) <= 30) {
34
+ if (record.reqId != null && this.#ended.has(key))
35
+ return '';
36
+ const pending = this.#requests.get(key);
37
+ if (pending) {
38
+ pending.exchange = exchange;
39
+ return '';
40
+ }
41
+ // A missing arrival (e.g. a filtered log level) must not lose the payload.
42
+ return this.#http(record, { record, route: requestRoute(object(exchange.request)) || 'Request', started: now, exchange });
43
+ }
44
+ if (['request completed', 'request errored', 'request aborted', 'request timed out'].includes(String(message))) {
45
+ if (record.reqId != null) {
46
+ if (this.#ended.has(key))
47
+ return '';
48
+ if (this.#ended.size >= 1000)
49
+ this.#ended.delete(this.#ended.values().next().value);
50
+ this.#ended.add(key);
51
+ }
52
+ const pending = this.#requests.get(key);
53
+ this.#requests.delete(key);
54
+ const outcome = message === 'request completed' ? undefined : message === 'request errored' ? 'failed' : message === 'request aborted' ? 'cancelled' : 'timed out';
55
+ return this.#http(record, pending ?? { record, route: route || 'Request', started: now }, outcome);
56
+ }
57
+ const severity = Number(record.level ?? 30);
58
+ const category = severity >= 50 ? 'error' : severity >= 40 ? 'warn' : typeof record.component === 'string' ? record.component : severity <= 20 ? 'debug' : 'app';
59
+ const context = Object.entries(record).filter(([key, value]) => !hiddenFields.has(key) && value != null).slice(0, 8).map(([key, value]) => `${compact(key, 40)}=${compact(value, 100)}`).join(' ');
60
+ const details = errorDetails(record.err ?? record.error);
61
+ return `${this.#paint(timestamp(record.time), 90)} ${this.#paint(`[${compact(category, 30)}]`, severity >= 50 ? 31 : severity >= 40 ? 33 : 36)} ${this.#message(compact(record.msg ?? '', 500))}${context ? ` ${this.#paint(context, 90)}` : ''}\n${details ? indent(details) + '\n' : ''}`;
62
+ }
63
+ /** Returns waiting rows without mutating completed output or request order. */
64
+ pending(now = Date.now()) {
65
+ return [...this.#requests.values()].map(request => {
66
+ const elapsed = Math.max(0, now - request.started);
67
+ return `[http] ${request.route} ${elapsed >= 5000 ? 'slow · ' : ''}waiting · ${(elapsed / 1000).toFixed(1)} s #${request.record.reqId}`;
68
+ });
69
+ }
70
+ /** Finalizes requests whose transport ended before a completion record arrived. */
71
+ finish(sourcePid) {
72
+ let output = '';
73
+ for (const [key, pending] of this.#requests) {
74
+ if (sourcePid !== undefined && pending.record.pid !== sourcePid)
75
+ continue;
76
+ output += this.#http(pending.record, pending, 'interrupted · process stopped before response');
77
+ this.#requests.delete(key);
78
+ }
79
+ return output;
80
+ }
81
+ /** Renders a single immutable HTTP block, including readable payload previews. */
82
+ #http(record, pending, outcome) {
83
+ const status = object(record.res)?.statusCode ?? object(pending.exchange?.response)?.statusCode;
84
+ const statusText = typeof status === 'number' ? `${status} ${STATUS_CODES[status] ?? ''}`.trim() : '';
85
+ const elapsed = typeof record.responseTime === 'number' && Number.isFinite(record.responseTime) ? ` · ${Math.round(record.responseTime)} ms` : '';
86
+ const tone = outcome || Number(status) >= 500 ? 31 : Number(status) >= 400 ? 33 : 32;
87
+ const reference = record.reqId == null ? '' : ` #${compact(record.reqId, 60)}`;
88
+ const bodies = bodyPreview(object(object(pending.exchange?.request)?.body), '> request') + bodyPreview(object(object(pending.exchange?.response)?.body), '< response');
89
+ const details = errorDetails(record.err ?? record.error);
90
+ return `${this.#paint(timestamp(pending.record.time), 90)} ${this.#paint('[http]', 36)} ${compact(pending.route, 240)} ${this.#paint(outcome ?? (statusText || 'response'), tone)}${elapsed}${this.#paint(reference, 90)}\n${bodies}${details ? indent(details) + '\n' : ''}\n`;
91
+ }
92
+ /** Colours structural labels only, never application-controlled terminal escapes. */
93
+ #paint(text, code) { return this.#color ? `\u001b[${code}m${text}\u001b[0m` : text; }
94
+ /** Highlights queue states and job labels when colouring. */
95
+ #message(text) { return this.#color ? highlightQueueMessage(text, (part, code) => this.#paint(part, code)) : text; }
96
+ }
97
+ const hiddenFields = new Set(['level', 'time', 'pid', 'hostname', 'source', 'environment', 'release', 'component', 'msg', 'req', 'res', 'httpExchange', 'responseTime', 'err', 'error']);
98
+ /** Separates processes and sources that independently allocate Fastify request IDs. */
99
+ function requestKey(record) { return JSON.stringify([record.pid, record.source, record.reqId]); }
100
+ /** Narrows optional parsed context without trusting arbitrary application values. */
101
+ function object(value) { return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : undefined; }
102
+ /** Extracts the method and URL without headers or payload duplication. */
103
+ function requestRoute(request) { return typeof request?.method === 'string' && typeof request.url === 'string' ? `${request.method} → ${request.url}` : ''; }
104
+ /** Formats local wall time with a stable fallback for non-Pino input. */
105
+ function timestamp(value) {
106
+ const date = new Date(typeof value === 'number' || typeof value === 'string' ? value : NaN);
107
+ return Number.isNaN(date.getTime()) ? '--:--:--' : [date.getHours(), date.getMinutes(), date.getSeconds()].map(part => String(part).padStart(2, '0')).join(':');
108
+ }
109
+ /** Prevents control injection and bounds single-line summaries. */
110
+ function compact(value, limit) {
111
+ const text = clean(typeof value === 'string' ? value : JSON.stringify(value) ?? String(value)).replace(/\s+/g, ' ');
112
+ return text.length > limit ? `${text.slice(0, limit - 1)}…` : text;
113
+ }
114
+ /** Strips terminal controls while retaining readable line breaks. */
115
+ function clean(text) { return text.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g, '').replace(/[\u0000-\u0009\u000b-\u001f\u007f-\u009f]/g, ''); }
116
+ /** Indents diagnostic text consistently beneath its owning request or message. */
117
+ function indent(text) { return text.split('\n').map(line => ` ${line}`).join('\n'); }
118
+ /** Shows small JSON inline and larger JSON as a bounded, explicitly shortened preview. */
119
+ function bodyPreview(body, label) {
120
+ if (!body || body.kind === 'empty')
121
+ return '';
122
+ let text;
123
+ if (body.value === undefined)
124
+ text = String(body.note ?? `${body.kind} body omitted`);
125
+ else if (body.kind === 'json' && !body.truncated) {
126
+ const expanded = JSON.stringify(body.value, null, 2);
127
+ const inline = expanded.replace(/\n\s*/g, ' ');
128
+ text = inline.length <= 90 ? inline : expanded;
129
+ }
130
+ else
131
+ text = String(body.value);
132
+ const lines = clean(text).split('\n');
133
+ const visible = lines.slice(0, 20).map(line => line.length > 160 ? `${line.slice(0, 159)}… [line shortened]` : line);
134
+ if (lines.length > 20)
135
+ visible.push(`… ${lines.length - 20} more lines (full captured body in JSON logs/devtools)`);
136
+ if (body.truncated)
137
+ visible.push(`… capture truncated (${body.sizeBytes ?? 'unknown'} bytes before limit)`);
138
+ return ` ${label}\n${indent(visible.join('\n'))}\n`;
139
+ }
140
+ /** Preserves bounded error stacks and nested causes without terminal control sequences. */
141
+ function errorDetails(value, depth = 0) {
142
+ if (value == null || depth > 4)
143
+ return '';
144
+ const error = object(value);
145
+ if (!error)
146
+ return compact(value, 2000);
147
+ const stack = typeof error.stack === 'string' ? clean(error.stack) : compact(`${error.type ?? 'Error'}: ${error.message ?? JSON.stringify(error)}`, 2000);
148
+ const detail = stack.length > 16000 ? stack.slice(0, 16000) + '\n… stack shortened' : stack;
149
+ const cause = errorDetails(error.cause, depth + 1);
150
+ return `${detail}${cause ? `\nCaused by: ${cause}` : ''}`;
151
+ }
@@ -0,0 +1,6 @@
1
+ import { DevelopmentConsole } from './DevelopmentConsole.js';
2
+ /** Shares one terminal owner across application loggers in the same process. */
3
+ export declare function acquireDevelopmentConsole(): {
4
+ console: DevelopmentConsole;
5
+ release: () => void;
6
+ };
@@ -0,0 +1,21 @@
1
+ import { DevelopmentConsole } from './DevelopmentConsole.js';
2
+ let active;
3
+ let leases = 0;
4
+ /** Shares one terminal owner across application loggers in the same process. */
5
+ export function acquireDevelopmentConsole() {
6
+ active ??= new DevelopmentConsole();
7
+ leases++;
8
+ let released = false;
9
+ return {
10
+ console: active,
11
+ release: () => {
12
+ if (released)
13
+ return;
14
+ released = true;
15
+ if (--leases === 0) {
16
+ active?.close();
17
+ active = undefined;
18
+ }
19
+ },
20
+ };
21
+ }
@@ -0,0 +1,16 @@
1
+ import type { Writable } from 'node:stream';
2
+ /** Terminal capabilities for the one renderer that owns a development output stream. */
3
+ export interface DevelopmentConsoleOptions {
4
+ /** Output destination; defaults to process.stdout. The caller retains stream ownership. */
5
+ output?: Writable & {
6
+ isTTY?: boolean;
7
+ columns?: number;
8
+ rows?: number;
9
+ };
10
+ /** Enable pending-row redraws. Defaults to the output's terminal capability. */
11
+ interactive?: boolean;
12
+ /** Enable structural ANSI colours. Defaults to terminal support, respecting NO_COLOR. */
13
+ color?: boolean;
14
+ /** Coordinate console.log/warn and direct stdout/stderr writes in this process. Defaults to true for interactive stdout. */
15
+ coordinateStdio?: boolean;
16
+ }
@@ -0,0 +1,8 @@
1
+ import type { MailAddress } from '../../mail/index.js';
2
+ /** Sends each error or fatal record to the configured operator through the application's Mail service. */
3
+ export interface EmailLogOptions {
4
+ /** Explicit operator destination; disabled unless configured. */
5
+ to: MailAddress | MailAddress[];
6
+ /** Optional subject prefix identifying the application. Defaults to Application error. */
7
+ subjectPrefix?: string;
8
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { FastifyRequest } from 'fastify';
2
+ /** Development HTTP payload capture policy, owned by the host application. */
3
+ export interface HttpExchangeMonitorOptions {
4
+ /** Defaults to NODE_ENV; production and test never capture payloads. */
5
+ environment?: string;
6
+ /** Explicitly disables body capture independently of console presentation. */
7
+ enabled?: boolean;
8
+ /** Maximum bytes retained per body; defaults to 16 KiB, capped at 64 KiB. */
9
+ maxBodyBytes?: number;
10
+ /** Excludes sensitive routes from payload capture. Request summaries remain governed by route logging. */
11
+ exclude?: (request: FastifyRequest) => boolean;
12
+ }
@@ -0,0 +1,19 @@
1
+ import type { EmailLogOptions } from './EmailLogOptions.js';
2
+ import type { LogLevel } from './Logger.js';
3
+ import type { DevtoolsLogOptions } from './LoggingOptions.js';
4
+ /** A configured destination receiving records at its minimum severity or above. */
5
+ export type LogTransportOptions = {
6
+ type: 'console';
7
+ level?: LogLevel;
8
+ } | {
9
+ type: 'file';
10
+ level?: LogLevel;
11
+ destination: string;
12
+ } | ({
13
+ type: 'email';
14
+ level?: LogLevel;
15
+ } & EmailLogOptions) | {
16
+ type: 'devtools';
17
+ level?: LogLevel;
18
+ options?: DevtoolsLogOptions;
19
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,4 @@
1
+ import type { LogTransportOptions } from './LogTransportOptions.js';
1
2
  import type { LoggerDriver } from './LoggerDriver.js';
2
3
  import type { LogBindings, LogLevel } from './Logger.js';
3
4
  /**
@@ -23,6 +24,10 @@ export interface DevtoolsLogOptions {
23
24
  * Application logging configuration.
24
25
  */
25
26
  export interface LoggingOptions {
27
+ /** Explicit destinations replace default console/file/devtools selection. An empty array disables output. */
28
+ transports?: LogTransportOptions[];
29
+ /** Optional JSON log file retained outside the process/container. The operator owns rotation and retention. */
30
+ file?: string;
26
31
  /** Injectable logging driver used by tests or alternate implementations. */
27
32
  driver?: LoggerDriver;
28
33
  /** Minimum emitted severity. Defaults to info, or silent in tests. */
@@ -37,8 +42,14 @@ export interface LoggingOptions {
37
42
  bindings?: LogBindings;
38
43
  /** Sensitive field paths removed before records reach any destination. */
39
44
  redact?: false | string[];
40
- /** Writes newline-delimited JSON to standard output. Defaults to true. */
45
+ /** Writes logs to standard output. Defaults to true. */
41
46
  console?: boolean;
47
+ /**
48
+ * Console presentation only; files and devtools always retain structured JSON.
49
+ * Auto (the default) uses pretty output in development terminals and JSON
50
+ * elsewhere. Set PLATFORM_LOG_FORMAT to override the default process-wide.
51
+ */
52
+ consoleFormat?: 'auto' | 'pretty' | 'json';
42
53
  /**
43
54
  * Streams logs to Platform devtools.
44
55
  *
@@ -2,3 +2,7 @@ export * from './HttpExchange.js';
2
2
  export * from './Logger.js';
3
3
  export * from './LoggerDriver.js';
4
4
  export * from './LoggingOptions.js';
5
+ export * from './EmailLogOptions.js';
6
+ export * from './DevelopmentConsoleOptions.js';
7
+ export * from './HttpExchangeMonitorOptions.js';
8
+ export * from './LogTransportOptions.js';
@@ -2,3 +2,7 @@ export * from './HttpExchange.js';
2
2
  export * from './Logger.js';
3
3
  export * from './LoggerDriver.js';
4
4
  export * from './LoggingOptions.js';
5
+ export * from './EmailLogOptions.js';
6
+ export * from './DevelopmentConsoleOptions.js';
7
+ export * from './HttpExchangeMonitorOptions.js';
8
+ export * from './LogTransportOptions.js';
@@ -1,5 +1,6 @@
1
1
  import { type DestinationStream, type Logger as PinoLogger } from 'pino';
2
2
  import type * as logging from '../contracts/index.js';
3
+ import type { Mail } from '../../mail/index.js';
3
4
  /**
4
5
  * Pino-backed logger driver with optional worker-thread devtools delivery.
5
6
  */
@@ -11,8 +12,9 @@ export declare class PinoLoggerDriver implements logging.LoggerDriver {
11
12
  *
12
13
  * @param options - Framework logging configuration.
13
14
  * @param destination - Optional direct destination used by focused tests.
15
+ * @param mail - Application-owned mail service used by the email destination.
14
16
  */
15
- constructor(options?: logging.LoggingOptions, destination?: DestinationStream);
17
+ constructor(options?: logging.LoggingOptions, destination?: DestinationStream, mail?: () => Mail);
16
18
  /**
17
19
  * Waits until Pino has handed accepted records to its destination.
18
20
  */