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

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 +68 -9
  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
package/src/ai/Ai.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  /// <reference path="./sdkNodeCompatibility.d.ts" preserve="true" />
2
+ import type { GenerateEmbeddingOptions } from './contracts/AI';
3
+ import { AIProviderAdmission, AIProviderDeferredError, AIProviderStoppedError } from './AIProviderAdmission';
4
+ import { isQueueRetryLaterError } from '@db3.ai/app/queue';
2
5
  import OpenAI from 'openai';
3
6
  import { OpenAIProvider, type ModelProvider } from '@openai/agents';
4
7
  import { aiExecutionContext, scopedAiOptions } from './AiExecutionContext';
@@ -10,15 +13,18 @@ import { AiMessage, AI_MESSAGE_ROLE, type AiMessageRole } from './AiMessage';
10
13
  import { AiRequest, AI_REQUEST_STATUS } from './AiRequest';
11
14
  const defaultAIConfig = { model: 'gpt-4.1-mini' };
12
15
  import { estimateTokensFromText } from './Estimates.js';
13
- import { calculateAIImageRequestCostUSD, calculateAIRequestCostUSD } from './Models.js';
16
+ import { calculateAIImageRequestCostUSD, calculateAIRequestCostUSD } from './modelPricing.js';
14
17
  import { AI_PROVIDER } from './contracts/AI.js';
15
18
  import { AIAllowanceExceededError, AIConfigurationError, AIRequestError } from './AIErrors.js';
19
+ import { AIRequestTrackingError } from './AIRequestTrackingError.js';
16
20
  import { isFailoverableFailure, isFailoverableResponse } from './AIFailover.js';
17
21
  import { providerChainFromEnvironment, resolveProviderChain, simulatedProviderOutage, type AIProviderAttempt, type AIProviderAttemptFailure } from './AIProviders.js';
18
22
  import { AIRateLimitDeferredError, AIRateLimiter, embeddingsRateLimitEndpoint, imagesRateLimitEndpoint, providerResponseMetadata, responsesRateLimitEndpoint, type AIProviderResponseMetadata, type AIRateLimitLease } from './AIRateLimiter.js';
19
23
  import { isOpenAIQuotaError, openAIProviderError } from './OpenAIProviderError.js';
20
24
  import { providerReportedCostUSD } from './ProviderCosts.js';
21
25
  import { sendResponsesRequest } from './ResponsesProviderCall.js';
26
+ import type { AIServiceTier } from './contracts/AIServiceTier';
27
+ import { assertAIServiceTier, effectiveAIServiceTier } from './aiServiceTier';
22
28
  import type { AIAllowanceCheckInput, AIRecordIdentity, AIModels, AIConfig, AIOptions, AIProvider, AIProviderSelection, AIResponseLogOptions, EmbeddingResponsePayloadWithUsage, GenerateEmbeddingResult, GenerateImageInput, GenerateImageOptions, GenerateImageResult, GenerateStructuredInput, GenerateTextInput, GenerateTextResult, ImageResponsePayloadWithUsage, RequestLogOptions, TextResponsePayloadWithUsage, TokenUsage, TrackedEmbeddingRequest, TrackedImageRequest, TrackedRequest } from './contracts/AI.js';
23
29
 
24
30
  /**
@@ -94,6 +100,7 @@ export class Ai {
94
100
  /** Logical ownership field used by this application. */
95
101
  readonly scopeField: string;
96
102
  private readonly rateLimiter: AIRateLimiter | null;
103
+ readonly providerAdmission: AIProviderAdmission;
97
104
 
98
105
  /**
99
106
  * Create an AI service instance.
@@ -106,6 +113,8 @@ export class Ai {
106
113
  private readonly modelConfig: AIConfig = defaultAIConfig,
107
114
  ) {
108
115
  if (options.timeoutMs !== undefined && (!Number.isFinite(options.timeoutMs) || options.timeoutMs <= 0)) throw new AIConfigurationError('timeoutMs must be positive.');
116
+ this.providerAdmission = new AIProviderAdmission({ recoveryLeaseSeconds: (options.timeoutMs ?? 60_000) / 1000 + 30, ...options.providerAdmission });
117
+ if ((options.providerAdmission?.recoveryLeaseSeconds ?? Infinity) * 1000 <= (options.timeoutMs ?? 60_000)) throw new AIConfigurationError('Recovery lease must exceed provider timeout.');
109
118
  this.models = { conversation: AiConversation, request: AiRequest, message: AiMessage, ...options.models };
110
119
  this.scopeField = options.scopeField ?? 'scope';
111
120
  this.rateLimiter = options.rateLimiter === false
@@ -247,6 +256,8 @@ export class Ai {
247
256
  const result = await this.generateTextResult({
248
257
  model: input.model,
249
258
  provider: input.provider,
259
+ transientFailureScope: input.transientFailureScope,
260
+ serviceTier: input.serviceTier,
250
261
  instructions: input.instructions,
251
262
  input: input.input,
252
263
  maxOutputTokens: input.maxOutputTokens,
@@ -303,6 +314,9 @@ export class Ai {
303
314
  const operation = options.operation ?? 'responses.create';
304
315
  const attempts = this.resolveProviders(input.provider ?? null, input.model ?? null)
305
316
  .filter(attempt => attempt.supportsResponsesApi);
317
+ const serviceTier = input.serviceTier ?? 'default';
318
+ for (const attempt of attempts) assertAIServiceTier(attempt.provider, serviceTier);
319
+ const timeoutMs = this.requestTimeoutMs(serviceTier);
306
320
  const attemptFailures: AIProviderAttemptFailure[] = [];
307
321
  let tracked: TrackedRequest | null = null;
308
322
  let trackedSettled = false;
@@ -312,7 +326,7 @@ export class Ai {
312
326
  }
313
327
 
314
328
  for (let index = 0; index < attempts.length; index++) {
315
- const attempt = attempts[index]!;
329
+ const attempt = { ...attempts[index]!, transientFailureScope: input.transientFailureScope };
316
330
  const hasFallback = index < attempts.length - 1;
317
331
  const attemptStartMs = Date.now();
318
332
  const request = {
@@ -320,7 +334,7 @@ export class Ai {
320
334
  instructions: input.instructions,
321
335
  input: input.input,
322
336
  store: false,
323
- ...(attempt.provider === AI_PROVIDER.openai ? { service_tier: 'default' } : {}),
337
+ ...(attempt.provider === AI_PROVIDER.openai ? { service_tier: serviceTier } : {}),
324
338
  ...maxOutputTokensPayload(input.maxOutputTokens),
325
339
  ...extraRequest,
326
340
  };
@@ -371,14 +385,15 @@ export class Ai {
371
385
  baseUrl: attempt.baseUrl,
372
386
  apiKey: attempt.apiKey,
373
387
  request,
374
- fetcher: this.fetcher(),
388
+ fetcher: this.providerAdmission.transport(attempt, this.fetcher(timeoutMs), timeoutMs),
375
389
  });
376
390
  const { payload, metadata } = result;
391
+ const admissionFailure = this.providerAdmission.requestFailure(attempt, null);
377
392
 
378
- if (!result.ok) {
393
+ if (!result.ok || admissionFailure) {
379
394
  const message = responseErrorMessage(payload) || `AI provider ${attempt.provider} request failed with HTTP ${result.status}.`;
380
395
 
381
- if (hasFallback && isFailoverableResponse(result.status, payload)) {
396
+ if (hasFallback && (isFailoverableFailure(admissionFailure) || isFailoverableResponse(result.status, payload))) {
382
397
  const failure = providerAttemptFailure(attempt, attemptStartMs, message, result.status, responseErrorCode(payload));
383
398
 
384
399
  attemptFailures.push(failure);
@@ -401,9 +416,9 @@ export class Ai {
401
416
  continue;
402
417
  }
403
418
 
404
- const deferred = isRateLimitFailure(result.status, payload)
419
+ const deferred = admissionFailure ?? (isRateLimitFailure(result.status, payload)
405
420
  ? rateLimitDeferredError(lease, metadata, message)
406
- : null;
421
+ : null);
407
422
 
408
423
  if (tracked) {
409
424
  attachProviderAttempts(tracked.aiRequest, attemptFailures);
@@ -416,7 +431,7 @@ export class Ai {
416
431
 
417
432
  if (deferred) throw deferred;
418
433
 
419
- throw new AIRequestError(message, responseErrorCode(payload));
434
+ throw new AIRequestError(message, responseErrorCode(payload), { status: result.status, requestId: metadata.providerRequestId });
420
435
  }
421
436
 
422
437
  const text = payload?.status !== undefined && payload.status !== 'completed' ? null : responseOutputText(payload);
@@ -497,15 +512,15 @@ export class Ai {
497
512
  continue;
498
513
  }
499
514
 
500
- if (tracked && !trackedSettled && !(error instanceof AIRequestError) && !(error instanceof AIRateLimitDeferredError)) {
515
+ if (tracked && !trackedSettled && (!(error instanceof AIRequestError) || error instanceof AIProviderStoppedError) && !(error instanceof AIRateLimitDeferredError)) {
501
516
  attachProviderAttempts(tracked.aiRequest, attemptFailures);
502
517
  await this.failTrackedRequest(
503
518
  tracked,
504
- null,
519
+ providerAdmissionResponse(error),
505
520
  errorMessage(error),
506
- emptyProviderResponseMetadata(),
521
+ providerAdmissionMetadata(error),
507
522
  failedLease,
508
- providerStarted,
523
+ providerAdmissionStarted(error, providerStarted),
509
524
  );
510
525
  }
511
526
 
@@ -558,7 +573,7 @@ export class Ai {
558
573
  input: TrackedProviderAttemptFailure,
559
574
  ): Promise<void> {
560
575
  const usage = tokenUsage(input.response);
561
- const modelCostUSD = textRequestCostUSD(input.attempt.provider, input.attempt.model, usage, input.response);
576
+ const modelCostUSD = textRequestCostUSD(input.attempt.provider, input.attempt.model, usage, input.response, input.request.service_tier);
562
577
 
563
578
  const aiRequest = new this.models.request({
564
579
  conversation: tracked.conversation,
@@ -693,7 +708,7 @@ export class Ai {
693
708
  lease: AIRateLimitLease | null = null,
694
709
  ): Promise<void> {
695
710
  const usage = tokenUsage(response);
696
- const costUSD = textRequestCostUSD(tracked.provider, tracked.model, usage, response);
711
+ const costUSD = textRequestCostUSD(tracked.provider, tracked.model, usage, response, asRecord(tracked.aiRequest.request)?.service_tier);
697
712
 
698
713
  tracked.aiRequest.assign({
699
714
  response,
@@ -738,7 +753,7 @@ export class Ai {
738
753
  const usage = tokenUsage(response);
739
754
  const costUSD = !providerStarted
740
755
  ? 0
741
- : textRequestCostUSD(tracked.provider, tracked.model, usage, response);
756
+ : textRequestCostUSD(tracked.provider, tracked.model, usage, response, asRecord(tracked.aiRequest.request)?.service_tier);
742
757
 
743
758
  tracked.aiRequest.assign({
744
759
  response,
@@ -890,7 +905,12 @@ export class Ai {
890
905
  request,
891
906
  metadata: options.metadata ?? null,
892
907
  startedAt: new Date(),
893
- }).save();
908
+ });
909
+ try {
910
+ await aiRequest.save();
911
+ } catch (error) {
912
+ throw new AIRequestTrackingError(error);
913
+ }
894
914
 
895
915
  return {
896
916
  aiRequest,
@@ -907,12 +927,13 @@ export class Ai {
907
927
  response: EmbeddingResponsePayloadWithUsage | null,
908
928
  metadata: AIProviderResponseMetadata = emptyProviderResponseMetadata(),
909
929
  lease: AIRateLimitLease | null = null,
930
+ retainResult = false,
910
931
  ): Promise<void> {
911
932
  const usage = embeddingTokenUsage(response);
912
933
  const costUSD = calculateAIRequestCostUSD(tracked.model, usage);
913
934
 
914
935
  tracked.aiRequest.assign({
915
- response: compactEmbeddingResponse(response),
936
+ response: retainResult ? response : compactEmbeddingResponse(response),
916
937
  providerRequestId: metadata.providerRequestId,
917
938
  providerProcessingMs: metadata.providerProcessingMs,
918
939
  rateLimitBucket: lease?.bucket ?? null,
@@ -1153,9 +1174,11 @@ export class Ai {
1153
1174
  * @param initialLease - Optional preflight reservation consumed by the first request.
1154
1175
  * @returns SDK provider using the service's transport and rate-limit lifecycle.
1155
1176
  */
1156
- createAgentProvider(attempt: AIProviderAttempt, initialLease: AIRateLimitLease | null = null): ModelProvider {
1177
+ createAgentProvider(attempt: AIProviderAttempt, initialLease: AIRateLimitLease | null = null, serviceTier: AIServiceTier = 'default'): ModelProvider {
1178
+ assertAIServiceTier(attempt.provider, serviceTier);
1179
+ const timeoutMs = this.requestTimeoutMs(serviceTier);
1157
1180
  return new OpenAIProvider({
1158
- openAIClient: new OpenAI({ apiKey: attempt.apiKey, baseURL: attempt.baseUrl, fetch: this.agentFetcher(attempt, initialLease), timeout: this.options.timeoutMs ?? 60_000, maxRetries: 0 }),
1181
+ openAIClient: new OpenAI({ apiKey: attempt.apiKey, baseURL: attempt.baseUrl, fetch: this.agentFetcher(attempt, initialLease, timeoutMs), timeout: timeoutMs, maxRetries: 0 }),
1159
1182
  useResponses: attempt.supportsResponsesApi,
1160
1183
  });
1161
1184
  }
@@ -1172,9 +1195,9 @@ export class Ai {
1172
1195
  * @param initialLease - First-request reservation, if acquired by the agent.
1173
1196
  * @returns Transport that maintains provider capacity and request diagnostics.
1174
1197
  */
1175
- private agentFetcher(attempt: AIProviderAttempt, initialLease: AIRateLimitLease | null): typeof fetch {
1198
+ private agentFetcher(attempt: AIProviderAttempt, initialLease: AIRateLimitLease | null, timeoutMs: number): typeof fetch {
1176
1199
  let pendingLease = initialLease;
1177
- const transport = this.fetcher();
1200
+ const transport = this.providerAdmission.transport(attempt, this.fetcher(timeoutMs), timeoutMs);
1178
1201
  return async (url, init) => {
1179
1202
  const aiRequest = aiExecutionContext.getStore()?.aiRequest ?? null;
1180
1203
  const lease = pendingLease ?? await this.acquireRateLimit({
@@ -1213,12 +1236,22 @@ export class Ai {
1213
1236
  };
1214
1237
  }
1215
1238
 
1239
+ /** Resolves the account connection for OpenAI-only images and embeddings. */
1240
+ private openAIAdmissionAttempt(model: string): AIProviderAttempt {
1241
+ return { provider: AI_PROVIDER.openai, model, apiKey: this.requireApiKey(), baseUrl: this.baseUrl(), supportsResponsesApi: true };
1242
+ }
1243
+
1244
+ /** Resolves a tier-aware request timeout while respecting an explicit service override. */
1245
+ private requestTimeoutMs(serviceTier: AIServiceTier): number {
1246
+ return this.options.timeoutMs ?? (serviceTier === 'flex' ? 900_000 : 60_000);
1247
+ }
1248
+
1216
1249
  /**
1217
1250
  * Fetch implementation used by provider calls.
1218
1251
  */
1219
- private fetcher(): typeof fetch {
1252
+ private fetcher(timeoutMs = this.options.timeoutMs ?? 60_000): typeof fetch {
1220
1253
  const transport = this.options.fetch || fetch;
1221
- return (url, init) => transport(url, { ...init, signal: init?.signal ?? AbortSignal.timeout(this.options.timeoutMs ?? 60_000) });
1254
+ return (url, init) => transport(url, { ...init, signal: init?.signal ?? AbortSignal.timeout(timeoutMs) });
1222
1255
  }
1223
1256
 
1224
1257
  /**
@@ -1325,6 +1358,7 @@ export class Ai {
1325
1358
  const model = input.model || this.config('ImageGeneration', 'gpt-image-2');
1326
1359
  const prompt = input.prompt.replace(/\s+/g, ' ').trim();
1327
1360
  const outputFormat = input.outputFormat ?? 'png';
1361
+ const admissionAttempt = this.openAIAdmissionAttempt(model);
1328
1362
  const operation = options.operation ?? 'images.generate';
1329
1363
  const request = {
1330
1364
  model,
@@ -1378,7 +1412,7 @@ export class Ai {
1378
1412
  await this.attachRateLimitRequest(lease, tracked?.aiRequest ?? null);
1379
1413
 
1380
1414
  providerStarted = true;
1381
- const response = await this.fetcher()(this.imagesUrl(), {
1415
+ const response = await this.providerAdmission.transport(admissionAttempt, this.fetcher())(this.imagesUrl(), {
1382
1416
  method: 'POST',
1383
1417
  headers: {
1384
1418
  authorization: `Bearer ${apiKey}`,
@@ -1389,11 +1423,12 @@ export class Ai {
1389
1423
  const metadata = providerResponseMetadata(response.headers);
1390
1424
  const payload = await response.json().catch(() => null) as ImageResponsePayloadWithUsage | null;
1391
1425
 
1392
- if (!response.ok) {
1426
+ const admissionFailure = this.providerAdmission.requestFailure(admissionAttempt, null);
1427
+ if (!response.ok || admissionFailure) {
1393
1428
  const message = responseErrorMessage(payload as TextResponsePayloadWithUsage | null) || `OpenAI image request failed with HTTP ${response.status}.`;
1394
- const deferred = isRateLimitFailure(response.status, payload)
1429
+ const deferred = admissionFailure ?? (isRateLimitFailure(response.status, payload)
1395
1430
  ? rateLimitDeferredError(lease, metadata, message)
1396
- : null;
1431
+ : null);
1397
1432
 
1398
1433
  if (tracked) {
1399
1434
  await this.failTrackedImageRequest(tracked, payload, message, metadata, lease);
@@ -1405,7 +1440,7 @@ export class Ai {
1405
1440
 
1406
1441
  if (deferred) throw deferred;
1407
1442
 
1408
- throw new AIRequestError(message, responseErrorCode(payload));
1443
+ throw new AIRequestError(message, responseErrorCode(payload), { status: response.status, requestId: metadata.providerRequestId });
1409
1444
  }
1410
1445
 
1411
1446
  const b64Json = imageBase64(payload);
@@ -1477,18 +1512,18 @@ export class Ai {
1477
1512
 
1478
1513
  await this.releaseRateLimit(lease);
1479
1514
 
1480
- if (tracked && !trackedSettled && !(error instanceof AIRequestError) && !(error instanceof AIRateLimitDeferredError)) {
1515
+ if (tracked && !trackedSettled) {
1481
1516
  await this.failTrackedImageRequest(
1482
1517
  tracked,
1483
- null,
1518
+ providerAdmissionResponse(error),
1484
1519
  errorMessage(error),
1485
- emptyProviderResponseMetadata(),
1520
+ providerAdmissionMetadata(error),
1486
1521
  lease,
1487
- providerStarted,
1522
+ providerAdmissionStarted(error, providerStarted),
1488
1523
  );
1489
1524
  }
1490
1525
 
1491
- if (error instanceof AIRateLimitDeferredError) throw error;
1526
+ if (isQueueRetryLaterError(error) || error instanceof AIProviderStoppedError) throw error;
1492
1527
  if (error instanceof AIAllowanceExceededError) throw error;
1493
1528
  if (error instanceof AIRequestError) throw error;
1494
1529
 
@@ -1507,7 +1542,7 @@ export class Ai {
1507
1542
  async generateEmbedding(
1508
1543
  input: string,
1509
1544
  model: string = 'text-embedding-3-small',
1510
- options: RequestLogOptions = {},
1545
+ options: GenerateEmbeddingOptions = {},
1511
1546
  ): Promise<GenerateEmbeddingResult> {
1512
1547
  options = scopedAiOptions(options, this.scopeField);
1513
1548
  assertIndependentUsage(options);
@@ -1515,6 +1550,7 @@ export class Ai {
1515
1550
  if (!input) throw new Error('Input is required for embedding generation.');
1516
1551
 
1517
1552
  const apiKey = this.requireApiKey();
1553
+ const admissionAttempt = this.openAIAdmissionAttempt(model);
1518
1554
  const operation = options.operation ?? 'embeddings.create';
1519
1555
  const request = {
1520
1556
  model,
@@ -1556,7 +1592,7 @@ export class Ai {
1556
1592
 
1557
1593
  await this.attachRateLimitRequest(lease, tracked?.aiRequest ?? null);
1558
1594
  providerStarted = true;
1559
- const response = await this.fetcher()(this.embeddingsUrl(), {
1595
+ const response = await this.providerAdmission.transport(admissionAttempt, this.fetcher())(this.embeddingsUrl(), {
1560
1596
  method: 'POST',
1561
1597
  headers: {
1562
1598
  authorization: `Bearer ${apiKey}`,
@@ -1567,11 +1603,12 @@ export class Ai {
1567
1603
  const metadata = providerResponseMetadata(response.headers);
1568
1604
  const payload = await response.json().catch(() => null) as EmbeddingResponsePayloadWithUsage | null;
1569
1605
 
1570
- if (!response.ok) {
1606
+ const admissionFailure = this.providerAdmission.requestFailure(admissionAttempt, null);
1607
+ if (!response.ok || admissionFailure) {
1571
1608
  const message = responseErrorMessage(payload as TextResponsePayloadWithUsage | null) || `OpenAI embedding request failed with HTTP ${response.status}.`;
1572
- const deferred = isRateLimitFailure(response.status, payload)
1609
+ const deferred = admissionFailure ?? (isRateLimitFailure(response.status, payload)
1573
1610
  ? rateLimitDeferredError(lease, metadata, message)
1574
- : null;
1611
+ : null);
1575
1612
 
1576
1613
  if (tracked) {
1577
1614
  await this.failTrackedEmbeddingRequest(tracked, payload, message, metadata, lease);
@@ -1583,7 +1620,7 @@ export class Ai {
1583
1620
 
1584
1621
  if (deferred) throw deferred;
1585
1622
 
1586
- throw new AIRequestError(message, responseErrorCode(payload));
1623
+ throw new AIRequestError(message, responseErrorCode(payload), { status: response.status, requestId: metadata.providerRequestId });
1587
1624
  }
1588
1625
 
1589
1626
  const vector = payload?.data?.[0]?.embedding;
@@ -1602,7 +1639,7 @@ export class Ai {
1602
1639
  }
1603
1640
 
1604
1641
  if (tracked) {
1605
- await this.completeTrackedEmbeddingRequest(tracked, payload, metadata, lease);
1642
+ await this.completeTrackedEmbeddingRequest(tracked, payload, metadata, lease, options.retainResult === true);
1606
1643
  trackedSettled = true;
1607
1644
  }
1608
1645
 
@@ -1625,18 +1662,19 @@ export class Ai {
1625
1662
 
1626
1663
  await this.releaseRateLimit(lease);
1627
1664
 
1628
- if (tracked && !trackedSettled && !(error instanceof AIRequestError) && !(error instanceof AIRateLimitDeferredError)) {
1665
+ if (tracked && !trackedSettled && (!(error instanceof AIRequestError) || error instanceof AIProviderStoppedError) && !(error instanceof AIRateLimitDeferredError)) {
1629
1666
  await this.failTrackedEmbeddingRequest(
1630
1667
  tracked,
1631
- null,
1668
+ providerAdmissionResponse(error),
1632
1669
  errorMessage(error),
1633
- emptyProviderResponseMetadata(),
1670
+ providerAdmissionMetadata(error),
1634
1671
  lease,
1635
- providerStarted,
1672
+ providerAdmissionStarted(error, providerStarted),
1636
1673
  );
1637
1674
  }
1638
1675
 
1639
- if (error instanceof AIRateLimitDeferredError) throw error;
1676
+ if (isQueueRetryLaterError(error) || error instanceof AIProviderStoppedError) throw error;
1677
+ if (error instanceof AIRequestTrackingError) throw error;
1640
1678
  if (error instanceof AIRequestError) throw error;
1641
1679
 
1642
1680
  throw new AIRequestError(errorMessage(error));
@@ -1839,7 +1877,9 @@ function attachProviderAttempts(aiRequest: AiRequest, failures: AIProviderAttemp
1839
1877
  * @returns True when the provider indicates a rate-limit failure.
1840
1878
  */
1841
1879
  function isRateLimitFailure(status: number, payload: unknown): boolean {
1842
- if (isOpenAIQuotaError(payload)) return false;
1880
+ // Some credit-exhaustion responses omit a stable code. Do not turn their
1881
+ // explicit billing failure into an unlimited queue capacity deferral.
1882
+ if (isOpenAIQuotaError(payload) || /\b(?:you have )?no credits remaining\b/i.test(openAIProviderError(payload).message)) return false;
1843
1883
 
1844
1884
  const code = responseErrorCode(payload);
1845
1885
 
@@ -1930,9 +1970,10 @@ function textRequestCostUSD(
1930
1970
  model: string,
1931
1971
  usage: TokenUsage,
1932
1972
  payload: TextResponsePayloadWithUsage | null,
1973
+ requestedTier?: unknown,
1933
1974
  ): number | null {
1934
1975
  if (provider === AI_PROVIDER.openai) {
1935
- return calculateAIRequestCostUSD(model, usage);
1976
+ return calculateAIRequestCostUSD(typeof payload?.model === 'string' ? payload.model : model, { ...usage, serviceTier: effectiveAIServiceTier(payload?.service_tier, requestedTier) });
1936
1977
  }
1937
1978
 
1938
1979
  return providerReportedCostUSD(provider, payload);
@@ -2174,3 +2215,18 @@ function scopeRecordId(scope: AIRecordIdentity | string | null): string | null {
2174
2215
 
2175
2216
  return id === null || id === undefined ? null : String(id);
2176
2217
  }
2218
+
2219
+ /** Retains safe provider diagnostics for admission failures in the existing audit trail. */
2220
+ function providerAdmissionResponse(error: unknown): null | { error: { code: string | null; message: string } } {
2221
+ return error instanceof AIProviderStoppedError ? { error: { code: error.providerCode ?? error.code, message: error.message } } : null;
2222
+ }
2223
+
2224
+ /** Distinguishes actual provider rejection from blocked-before-provider work. */
2225
+ function providerAdmissionStarted(error: unknown, fallback: boolean): boolean {
2226
+ return error instanceof AIProviderStoppedError || error instanceof AIProviderDeferredError ? error.providerStarted : fallback;
2227
+ }
2228
+
2229
+ /** Keeps provider support identifiers without duplicating response bodies. */
2230
+ function providerAdmissionMetadata(error: unknown): AIProviderResponseMetadata {
2231
+ return { ...emptyProviderResponseMetadata(), providerRequestId: error instanceof AIProviderStoppedError ? error.requestId : null };
2232
+ }
@@ -58,7 +58,7 @@ export function openAIProviderError(value: unknown): OpenAIProviderErrorDetails
58
58
  export function isOpenAIQuotaError(value: unknown): boolean {
59
59
  const code = openAIProviderError(value).code;
60
60
 
61
- return code !== null && OPENAI_QUOTA_ERROR_CODES.has(code);
61
+ return (code !== null && OPENAI_QUOTA_ERROR_CODES.has(code)) || /\b(?:you have )?no credits remaining\b/i.test(openAIProviderError(value).message);
62
62
  }
63
63
 
64
64
  /**
@@ -0,0 +1,89 @@
1
+ /** Maximum retained decoded characters for one SSE line or joined data event. */
2
+ const MAX_EVENT_CHARACTERS = 1_048_576;
3
+
4
+ /**
5
+ * Observes SSE framing without rewriting transport bytes or dispatching SDK events.
6
+ * CR, LF and CRLF terminate lines; blank lines dispatch joined data fields. An
7
+ * oversized event is discarded until its blank boundary, allowing later errors
8
+ * to remain observable. Malformed or unfinished input permanently disqualifies
9
+ * this observer from asserting recovery, even if a later event completes.
10
+ */
11
+ export class ProviderSseObserver {
12
+ #line = '';
13
+ #lineNonempty = false;
14
+ #skipLf = false;
15
+ #data: string[] = [];
16
+ #dataLength = 0;
17
+ #eventOpen = false;
18
+ #discardEvent = false;
19
+ #valid = true;
20
+
21
+ /** Receives complete joined data fields; the caller owns provider semantics. */
22
+ constructor(readonly onData: (data: string) => Promise<void>) {}
23
+
24
+ /** Records malformed JSON/encoding while continuing to observe later events. */
25
+ invalidate(): void { this.#valid = false; }
26
+
27
+ /** True only when every observed event is valid and ends at a blank boundary. */
28
+ get complete(): boolean { return this.#valid && !this.#lineNonempty && !this.#eventOpen && !this.#discardEvent; }
29
+
30
+ /** Consumes one decoded fragment; CRLF may be split between calls. */
31
+ async push(text: string): Promise<void> {
32
+ let start = 0;
33
+ for (let index = 0; index < text.length; index++) {
34
+ const character = text[index];
35
+ if (this.#skipLf) {
36
+ this.#skipLf = false;
37
+ if (character === '\n') { start = index + 1; continue; }
38
+ }
39
+ if (character !== '\r' && character !== '\n') continue;
40
+ this.#append(text.slice(start, index));
41
+ await this.#finishLine();
42
+ this.#skipLf = character === '\r';
43
+ start = index + 1;
44
+ }
45
+ this.#append(text.slice(start));
46
+ }
47
+
48
+ /** Bounds retained line and event storage before adding another fragment. */
49
+ #append(fragment: string): void {
50
+ if (!fragment.length) return;
51
+ this.#lineNonempty = true;
52
+ if (this.#discardEvent) return;
53
+ if (this.#line.length + this.#dataLength + fragment.length > MAX_EVENT_CHARACTERS) {
54
+ this.invalidate();
55
+ this.#discardEvent = true;
56
+ this.#line = '';
57
+ this.#data = [];
58
+ this.#dataLength = 0;
59
+ } else this.#line += fragment;
60
+ }
61
+
62
+ /** Dispatches only complete events, retaining SSE's joined-data semantics. */
63
+ async #finishLine(): Promise<void> {
64
+ const line = this.#line;
65
+ const nonempty = this.#lineNonempty;
66
+ this.#line = '';
67
+ this.#lineNonempty = false;
68
+ if (!nonempty) {
69
+ const data = this.#discardEvent || !this.#data.length ? null : this.#data.join('\n');
70
+ this.#data = [];
71
+ this.#dataLength = 0;
72
+ this.#eventOpen = false;
73
+ this.#discardEvent = false;
74
+ if (data !== null) await this.onData(data);
75
+ return;
76
+ }
77
+ if (this.#discardEvent || line.startsWith(':')) return;
78
+ this.#eventOpen = true;
79
+ if (line !== 'data' && !line.startsWith('data:')) return;
80
+ const data = line === 'data' ? '' : line.slice(line[5] === ' ' ? 6 : 5);
81
+ this.#dataLength += data.length + 1;
82
+ if (this.#dataLength > MAX_EVENT_CHARACTERS) {
83
+ this.invalidate();
84
+ this.#discardEvent = true;
85
+ this.#data = [];
86
+ this.#dataLength = 0;
87
+ } else this.#data.push(data);
88
+ }
89
+ }