@db3.ai/app 0.1.0-beta.1

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 (1024) hide show
  1. package/LICENSE +31 -0
  2. package/README.md +241 -0
  3. package/agent-instructions.md +69 -0
  4. package/bin/db3-agents.mjs +140 -0
  5. package/bin/db3.mjs +11 -0
  6. package/dist/ai/AIErrors.d.ts +33 -0
  7. package/dist/ai/AIErrors.js +43 -0
  8. package/dist/ai/AIFailover.d.ts +25 -0
  9. package/dist/ai/AIFailover.js +96 -0
  10. package/dist/ai/AIProviders.d.ts +35 -0
  11. package/dist/ai/AIProviders.js +197 -0
  12. package/dist/ai/AIQuotaDeferredError.d.ts +19 -0
  13. package/dist/ai/AIQuotaDeferredError.js +25 -0
  14. package/dist/ai/AIRateLimiter.d.ts +103 -0
  15. package/dist/ai/AIRateLimiter.js +690 -0
  16. package/dist/ai/Agent.d.ts +633 -0
  17. package/dist/ai/Agent.js +2976 -0
  18. package/dist/ai/AgentHistory.d.ts +11 -0
  19. package/dist/ai/AgentHistory.js +495 -0
  20. package/dist/ai/AgentRunJob.d.ts +21 -0
  21. package/dist/ai/AgentRunJob.js +53 -0
  22. package/dist/ai/Ai.d.ts +375 -0
  23. package/dist/ai/Ai.js +1771 -0
  24. package/dist/ai/AiConversation.d.ts +17 -0
  25. package/dist/ai/AiConversation.js +38 -0
  26. package/dist/ai/AiExecutionContext.d.ts +7 -0
  27. package/dist/ai/AiExecutionContext.js +16 -0
  28. package/dist/ai/AiMessage.d.ts +43 -0
  29. package/dist/ai/AiMessage.js +105 -0
  30. package/dist/ai/AiRateLimitBucket.d.ts +69 -0
  31. package/dist/ai/AiRateLimitBucket.js +138 -0
  32. package/dist/ai/AiRateLimitReservation.d.ts +56 -0
  33. package/dist/ai/AiRateLimitReservation.js +101 -0
  34. package/dist/ai/AiRequest.d.ts +78 -0
  35. package/dist/ai/AiRequest.js +384 -0
  36. package/dist/ai/Estimates.d.ts +26 -0
  37. package/dist/ai/Estimates.js +34 -0
  38. package/dist/ai/Models.d.ts +88 -0
  39. package/dist/ai/Models.js +328 -0
  40. package/dist/ai/OpenAIProviderError.d.ts +30 -0
  41. package/dist/ai/OpenAIProviderError.js +77 -0
  42. package/dist/ai/OpenAIQuotaRetry.d.ts +27 -0
  43. package/dist/ai/OpenAIQuotaRetry.js +144 -0
  44. package/dist/ai/ProviderCosts.d.ts +55 -0
  45. package/dist/ai/ProviderCosts.js +108 -0
  46. package/dist/ai/ResponsesProviderCall.d.ts +13 -0
  47. package/dist/ai/ResponsesProviderCall.js +29 -0
  48. package/dist/ai/agentCitations.d.ts +27 -0
  49. package/dist/ai/agentCitations.js +153 -0
  50. package/dist/ai/contracts/AI.d.ts +347 -0
  51. package/dist/ai/contracts/AI.js +13 -0
  52. package/dist/ai/contracts/Agent.d.ts +476 -0
  53. package/dist/ai/contracts/Agent.js +1 -0
  54. package/dist/ai/contracts/AiRequestRunCostSummary.d.ts +31 -0
  55. package/dist/ai/contracts/AiRequestRunCostSummary.js +1 -0
  56. package/dist/ai/contracts/Pricing.d.ts +88 -0
  57. package/dist/ai/contracts/Pricing.js +1 -0
  58. package/dist/ai/contracts/Providers.d.ts +68 -0
  59. package/dist/ai/contracts/Providers.js +1 -0
  60. package/dist/ai/contracts/QuotaRetry.d.ts +38 -0
  61. package/dist/ai/contracts/QuotaRetry.js +1 -0
  62. package/dist/ai/contracts/RateLimits.d.ts +45 -0
  63. package/dist/ai/contracts/RateLimits.js +1 -0
  64. package/dist/ai/contracts/ResponsesProviderCall.d.ts +28 -0
  65. package/dist/ai/contracts/ResponsesProviderCall.js +1 -0
  66. package/dist/ai/contracts/index.d.ts +8 -0
  67. package/dist/ai/contracts/index.js +8 -0
  68. package/dist/ai/index.d.ts +27 -0
  69. package/dist/ai/index.js +27 -0
  70. package/dist/ai/registry.d.ts +28 -0
  71. package/dist/ai/registry.js +49 -0
  72. package/dist/ai/sdkNodeCompatibility.d.ts +76 -0
  73. package/dist/ai/toolCallRecovery.d.ts +16 -0
  74. package/dist/ai/toolCallRecovery.js +71 -0
  75. package/dist/ai/toolHelpers.d.ts +65 -0
  76. package/dist/ai/toolHelpers.js +106 -0
  77. package/dist/auth/Auth.d.ts +641 -0
  78. package/dist/auth/Auth.js +927 -0
  79. package/dist/auth/AuthProvider.d.ts +104 -0
  80. package/dist/auth/AuthProvider.js +185 -0
  81. package/dist/auth/AuthToken.d.ts +123 -0
  82. package/dist/auth/AuthToken.js +156 -0
  83. package/dist/auth/PasswordResetToken.d.ts +33 -0
  84. package/dist/auth/PasswordResetToken.js +64 -0
  85. package/dist/auth/UserIdentity.d.ts +46 -0
  86. package/dist/auth/UserIdentity.js +72 -0
  87. package/dist/auth/contracts/AuthProviderDriver.d.ts +94 -0
  88. package/dist/auth/contracts/AuthProviderDriver.js +1 -0
  89. package/dist/auth/contracts/index.d.ts +1 -0
  90. package/dist/auth/contracts/index.js +1 -0
  91. package/dist/auth/index.d.ts +8 -0
  92. package/dist/auth/index.js +8 -0
  93. package/dist/auth/passwordHash.d.ts +26 -0
  94. package/dist/auth/passwordHash.js +96 -0
  95. package/dist/auth/providers/GoogleAuthProvider.d.ts +135 -0
  96. package/dist/auth/providers/GoogleAuthProvider.js +305 -0
  97. package/dist/auth/providers/PasswordAuthProvider.d.ts +115 -0
  98. package/dist/auth/providers/PasswordAuthProvider.js +195 -0
  99. package/dist/auth/providers/index.d.ts +3 -0
  100. package/dist/auth/providers/index.js +3 -0
  101. package/dist/auth/providers/resolveAuthProviders.d.ts +29 -0
  102. package/dist/auth/providers/resolveAuthProviders.js +111 -0
  103. package/dist/cache/Cache.d.ts +67 -0
  104. package/dist/cache/Cache.js +115 -0
  105. package/dist/cache/contracts/CacheDriver.d.ts +10 -0
  106. package/dist/cache/contracts/CacheDriver.js +1 -0
  107. package/dist/cache/contracts/CacheOperations.d.ts +26 -0
  108. package/dist/cache/contracts/CacheOperations.js +1 -0
  109. package/dist/cache/contracts/CacheOptions.d.ts +51 -0
  110. package/dist/cache/contracts/CacheOptions.js +1 -0
  111. package/dist/cache/contracts/CacheRepository.d.ts +45 -0
  112. package/dist/cache/contracts/CacheRepository.js +1 -0
  113. package/dist/cache/contracts/index.d.ts +4 -0
  114. package/dist/cache/contracts/index.js +4 -0
  115. package/dist/cache/drivers/CacheManagerDriver.d.ts +55 -0
  116. package/dist/cache/drivers/CacheManagerDriver.js +68 -0
  117. package/dist/cache/drivers/createCacheDriver.d.ts +8 -0
  118. package/dist/cache/drivers/createCacheDriver.js +147 -0
  119. package/dist/cache/index.d.ts +2 -0
  120. package/dist/cache/index.js +2 -0
  121. package/dist/cli/Cli.d.ts +17 -0
  122. package/dist/cli/Cli.js +120 -0
  123. package/dist/cli/commands/repl.d.ts +9 -0
  124. package/dist/cli/commands/repl.js +27 -0
  125. package/dist/cli/contracts/CliCommand.d.ts +30 -0
  126. package/dist/cli/contracts/CliCommand.js +1 -0
  127. package/dist/cli/contracts/CliConfig.d.ts +9 -0
  128. package/dist/cli/contracts/CliConfig.js +1 -0
  129. package/dist/cli/contracts/CliOptions.d.ts +13 -0
  130. package/dist/cli/contracts/CliOptions.js +1 -0
  131. package/dist/cli/contracts/CommandDefinition.d.ts +18 -0
  132. package/dist/cli/contracts/CommandDefinition.js +1 -0
  133. package/dist/cli/contracts/ReplOptions.d.ts +11 -0
  134. package/dist/cli/contracts/ReplOptions.js +1 -0
  135. package/dist/cli/contracts/index.d.ts +5 -0
  136. package/dist/cli/contracts/index.js +1 -0
  137. package/dist/cli/defineCommand.d.ts +10 -0
  138. package/dist/cli/defineCommand.js +25 -0
  139. package/dist/cli/index.d.ts +5 -0
  140. package/dist/cli/index.js +5 -0
  141. package/dist/cli/runDb3.d.ts +11 -0
  142. package/dist/cli/runDb3.js +70 -0
  143. package/dist/cli/runRepl.d.ts +12 -0
  144. package/dist/cli/runRepl.js +54 -0
  145. package/dist/config/Config.d.ts +48 -0
  146. package/dist/config/Config.js +80 -0
  147. package/dist/config/env.d.ts +26 -0
  148. package/dist/config/env.js +117 -0
  149. package/dist/config/index.d.ts +2 -0
  150. package/dist/config/index.js +2 -0
  151. package/dist/db/ActiveProjection.d.ts +90 -0
  152. package/dist/db/ActiveProjection.js +134 -0
  153. package/dist/db/ActiveQueryBuilder.d.ts +268 -0
  154. package/dist/db/ActiveQueryBuilder.js +621 -0
  155. package/dist/db/ActiveRecord.d.ts +483 -0
  156. package/dist/db/ActiveRecord.js +765 -0
  157. package/dist/db/Database.d.ts +277 -0
  158. package/dist/db/Database.js +827 -0
  159. package/dist/db/FieldType.d.ts +540 -0
  160. package/dist/db/FieldType.js +706 -0
  161. package/dist/db/SoftDeletes.d.ts +30 -0
  162. package/dist/db/SoftDeletes.js +93 -0
  163. package/dist/db/commands/check.d.ts +6 -0
  164. package/dist/db/commands/check.js +8 -0
  165. package/dist/db/commands/index.d.ts +6 -0
  166. package/dist/db/commands/index.js +17 -0
  167. package/dist/db/commands/makeMigration.d.ts +7 -0
  168. package/dist/db/commands/makeMigration.js +9 -0
  169. package/dist/db/commands/migrate.d.ts +6 -0
  170. package/dist/db/commands/migrate.js +8 -0
  171. package/dist/db/connection.d.ts +10 -0
  172. package/dist/db/connection.js +55 -0
  173. package/dist/db/contracts/ActiveRecordDefinition.d.ts +64 -0
  174. package/dist/db/contracts/ActiveRecordDefinition.js +1 -0
  175. package/dist/db/contracts/DatabaseBackup.d.ts +7 -0
  176. package/dist/db/contracts/DatabaseBackup.js +1 -0
  177. package/dist/db/contracts/DatabaseMigrationsConfig.d.ts +9 -0
  178. package/dist/db/contracts/DatabaseMigrationsConfig.js +1 -0
  179. package/dist/db/contracts/index.d.ts +3 -0
  180. package/dist/db/contracts/index.js +3 -0
  181. package/dist/db/dialects/columnTypes.d.ts +20 -0
  182. package/dist/db/dialects/columnTypes.js +67 -0
  183. package/dist/db/dialects/index.d.ts +6 -0
  184. package/dist/db/dialects/index.js +6 -0
  185. package/dist/db/dialects/mariadb.d.ts +7 -0
  186. package/dist/db/dialects/mariadb.js +35 -0
  187. package/dist/db/dialects/mysql.d.ts +14 -0
  188. package/dist/db/dialects/mysql.js +203 -0
  189. package/dist/db/dialects/postgres.d.ts +5 -0
  190. package/dist/db/dialects/postgres.js +106 -0
  191. package/dist/db/dialects/resolveDialect.d.ts +14 -0
  192. package/dist/db/dialects/resolveDialect.js +57 -0
  193. package/dist/db/dialects/types.d.ts +44 -0
  194. package/dist/db/dialects/types.js +1 -0
  195. package/dist/db/errors.d.ts +15 -0
  196. package/dist/db/errors.js +20 -0
  197. package/dist/db/fields/BooleanField.d.ts +29 -0
  198. package/dist/db/fields/BooleanField.js +89 -0
  199. package/dist/db/fields/CharUuidField.d.ts +29 -0
  200. package/dist/db/fields/CharUuidField.js +63 -0
  201. package/dist/db/fields/ChoiceStringField.d.ts +25 -0
  202. package/dist/db/fields/ChoiceStringField.js +58 -0
  203. package/dist/db/fields/DecimalField.d.ts +20 -0
  204. package/dist/db/fields/DecimalField.js +105 -0
  205. package/dist/db/fields/EmailField.d.ts +31 -0
  206. package/dist/db/fields/EmailField.js +52 -0
  207. package/dist/db/fields/EncryptedJsonField.d.ts +82 -0
  208. package/dist/db/fields/EncryptedJsonField.js +169 -0
  209. package/dist/db/fields/IntegerField.d.ts +35 -0
  210. package/dist/db/fields/IntegerField.js +139 -0
  211. package/dist/db/fields/JsonField.d.ts +40 -0
  212. package/dist/db/fields/JsonField.js +79 -0
  213. package/dist/db/fields/JsonStringField.d.ts +21 -0
  214. package/dist/db/fields/JsonStringField.js +41 -0
  215. package/dist/db/fields/LinkField.d.ts +180 -0
  216. package/dist/db/fields/LinkField.js +359 -0
  217. package/dist/db/fields/PasswordField.d.ts +93 -0
  218. package/dist/db/fields/PasswordField.js +180 -0
  219. package/dist/db/fields/StringField.d.ts +43 -0
  220. package/dist/db/fields/StringField.js +102 -0
  221. package/dist/db/fields/StringListField.d.ts +54 -0
  222. package/dist/db/fields/StringListField.js +124 -0
  223. package/dist/db/fields/TextField.d.ts +25 -0
  224. package/dist/db/fields/TextField.js +44 -0
  225. package/dist/db/fields/TimestampField.d.ts +47 -0
  226. package/dist/db/fields/TimestampField.js +97 -0
  227. package/dist/db/fields/UlidField.d.ts +69 -0
  228. package/dist/db/fields/UlidField.js +114 -0
  229. package/dist/db/fields/UrlField.d.ts +30 -0
  230. package/dist/db/fields/UrlField.js +61 -0
  231. package/dist/db/fields/VectorField.d.ts +64 -0
  232. package/dist/db/fields/VectorField.js +180 -0
  233. package/dist/db/fields/createField.d.ts +2 -0
  234. package/dist/db/fields/createField.js +13 -0
  235. package/dist/db/fields/field.d.ts +36 -0
  236. package/dist/db/fields/field.js +101 -0
  237. package/dist/db/fields/index.d.ts +18 -0
  238. package/dist/db/fields/index.js +18 -0
  239. package/dist/db/fields/resolveFields.d.ts +17 -0
  240. package/dist/db/fields/resolveFields.js +38 -0
  241. package/dist/db/index.d.ts +13 -0
  242. package/dist/db/index.js +13 -0
  243. package/dist/db/migrations/DatabaseMigrationManager.d.ts +57 -0
  244. package/dist/db/migrations/DatabaseMigrationManager.js +589 -0
  245. package/dist/db/migrations/DatabaseSchemaInspector.d.ts +19 -0
  246. package/dist/db/migrations/DatabaseSchemaInspector.js +384 -0
  247. package/dist/db/migrations/KnexMigrationRenderer.d.ts +11 -0
  248. package/dist/db/migrations/KnexMigrationRenderer.js +390 -0
  249. package/dist/db/migrations/ModelSchemaCollector.d.ts +29 -0
  250. package/dist/db/migrations/ModelSchemaCollector.js +183 -0
  251. package/dist/db/migrations/SchemaDiffer.d.ts +13 -0
  252. package/dist/db/migrations/SchemaDiffer.js +427 -0
  253. package/dist/db/migrations/SchemaNames.d.ts +27 -0
  254. package/dist/db/migrations/SchemaNames.js +46 -0
  255. package/dist/db/migrations/SchemaSnapshotSerializer.d.ts +30 -0
  256. package/dist/db/migrations/SchemaSnapshotSerializer.js +49 -0
  257. package/dist/db/migrations/contracts/DatabaseMigration.d.ts +118 -0
  258. package/dist/db/migrations/contracts/DatabaseMigration.js +1 -0
  259. package/dist/db/migrations/contracts/SchemaChange.d.ts +83 -0
  260. package/dist/db/migrations/contracts/SchemaChange.js +1 -0
  261. package/dist/db/migrations/contracts/SchemaSnapshot.d.ts +94 -0
  262. package/dist/db/migrations/contracts/SchemaSnapshot.js +1 -0
  263. package/dist/db/migrations/contracts/index.d.ts +3 -0
  264. package/dist/db/migrations/contracts/index.js +3 -0
  265. package/dist/db/migrations/errors.d.ts +35 -0
  266. package/dist/db/migrations/errors.js +45 -0
  267. package/dist/db/migrations/index.d.ts +10 -0
  268. package/dist/db/migrations/index.js +10 -0
  269. package/dist/db/migrations/promoteDestructiveSchemaChanges.d.ts +19 -0
  270. package/dist/db/migrations/promoteDestructiveSchemaChanges.js +102 -0
  271. package/dist/db/queryMonitor.d.ts +142 -0
  272. package/dist/db/queryMonitor.js +357 -0
  273. package/dist/db/sqlErrors.d.ts +11 -0
  274. package/dist/db/sqlErrors.js +17 -0
  275. package/dist/db/test/db.d.ts +11 -0
  276. package/dist/db/test/db.js +109 -0
  277. package/dist/devtools/HttpEventDispatcher.d.ts +19 -0
  278. package/dist/devtools/HttpEventDispatcher.js +180 -0
  279. package/dist/devtools/contracts/DevtoolsEventDispatcher.d.ts +53 -0
  280. package/dist/devtools/contracts/DevtoolsEventDispatcher.js +1 -0
  281. package/dist/devtools/contracts/index.d.ts +1 -0
  282. package/dist/devtools/contracts/index.js +1 -0
  283. package/dist/devtools/environment.d.ts +10 -0
  284. package/dist/devtools/environment.js +14 -0
  285. package/dist/devtools/index.d.ts +3 -0
  286. package/dist/devtools/index.js +3 -0
  287. package/dist/events/Events.d.ts +70 -0
  288. package/dist/events/Events.js +126 -0
  289. package/dist/events/contracts/EventConstructor.d.ts +12 -0
  290. package/dist/events/contracts/EventConstructor.js +1 -0
  291. package/dist/events/contracts/EventListener.d.ts +6 -0
  292. package/dist/events/contracts/EventListener.js +1 -0
  293. package/dist/events/contracts/EventUnsubscribe.d.ts +4 -0
  294. package/dist/events/contracts/EventUnsubscribe.js +1 -0
  295. package/dist/events/contracts/index.d.ts +3 -0
  296. package/dist/events/contracts/index.js +3 -0
  297. package/dist/events/index.d.ts +2 -0
  298. package/dist/events/index.js +2 -0
  299. package/dist/flows/FlowBlockRegistry.d.ts +39 -0
  300. package/dist/flows/FlowBlockRegistry.js +66 -0
  301. package/dist/flows/FlowCompiler.d.ts +26 -0
  302. package/dist/flows/FlowCompiler.js +488 -0
  303. package/dist/flows/FlowDefinitionError.d.ts +21 -0
  304. package/dist/flows/FlowDefinitionError.js +16 -0
  305. package/dist/flows/FlowStepJob.d.ts +28 -0
  306. package/dist/flows/FlowStepJob.js +31 -0
  307. package/dist/flows/FlowValueValidator.d.ts +32 -0
  308. package/dist/flows/FlowValueValidator.js +105 -0
  309. package/dist/flows/Flows.d.ts +102 -0
  310. package/dist/flows/Flows.js +871 -0
  311. package/dist/flows/blocks/FlowInput.d.ts +10 -0
  312. package/dist/flows/blocks/FlowInput.js +29 -0
  313. package/dist/flows/blocks/FlowOutput.d.ts +10 -0
  314. package/dist/flows/blocks/FlowOutput.js +29 -0
  315. package/dist/flows/blocks/Subflow.d.ts +10 -0
  316. package/dist/flows/blocks/Subflow.js +21 -0
  317. package/dist/flows/blocks/index.d.ts +6 -0
  318. package/dist/flows/blocks/index.js +8 -0
  319. package/dist/flows/constants.d.ts +55 -0
  320. package/dist/flows/constants.js +47 -0
  321. package/dist/flows/contracts/FlowBlock.d.ts +64 -0
  322. package/dist/flows/contracts/FlowBlock.js +1 -0
  323. package/dist/flows/contracts/FlowCompiler.d.ts +30 -0
  324. package/dist/flows/contracts/FlowCompiler.js +1 -0
  325. package/dist/flows/contracts/FlowDefinition.d.ts +118 -0
  326. package/dist/flows/contracts/FlowDefinition.js +1 -0
  327. package/dist/flows/contracts/FlowDefinitionStore.d.ts +47 -0
  328. package/dist/flows/contracts/FlowDefinitionStore.js +1 -0
  329. package/dist/flows/contracts/FlowRun.d.ts +40 -0
  330. package/dist/flows/contracts/FlowRun.js +1 -0
  331. package/dist/flows/contracts/FlowValue.d.ts +49 -0
  332. package/dist/flows/contracts/FlowValue.js +1 -0
  333. package/dist/flows/contracts/FlowsService.d.ts +37 -0
  334. package/dist/flows/contracts/FlowsService.js +1 -0
  335. package/dist/flows/contracts/index.d.ts +7 -0
  336. package/dist/flows/contracts/index.js +7 -0
  337. package/dist/flows/defineBlock.d.ts +18 -0
  338. package/dist/flows/defineBlock.js +19 -0
  339. package/dist/flows/drivers/FileFlowDefinitionStore.d.ts +53 -0
  340. package/dist/flows/drivers/FileFlowDefinitionStore.js +313 -0
  341. package/dist/flows/drivers/index.d.ts +1 -0
  342. package/dist/flows/drivers/index.js +1 -0
  343. package/dist/flows/errors.d.ts +8 -0
  344. package/dist/flows/errors.js +19 -0
  345. package/dist/flows/index.d.ts +13 -0
  346. package/dist/flows/index.js +13 -0
  347. package/dist/flows/models/FlowRun.d.ts +55 -0
  348. package/dist/flows/models/FlowRun.js +126 -0
  349. package/dist/flows/models/FlowRunEvent.d.ts +41 -0
  350. package/dist/flows/models/FlowRunEvent.js +85 -0
  351. package/dist/flows/models/FlowStepRun.d.ts +56 -0
  352. package/dist/flows/models/FlowStepRun.js +137 -0
  353. package/dist/flows/models/index.d.ts +10 -0
  354. package/dist/flows/models/index.js +14 -0
  355. package/dist/index.d.ts +25 -0
  356. package/dist/index.js +16 -0
  357. package/dist/logging/Log.d.ts +66 -0
  358. package/dist/logging/Log.js +79 -0
  359. package/dist/logging/contracts/HttpExchange.d.ts +50 -0
  360. package/dist/logging/contracts/HttpExchange.js +1 -0
  361. package/dist/logging/contracts/Logger.d.ts +41 -0
  362. package/dist/logging/contracts/Logger.js +1 -0
  363. package/dist/logging/contracts/LoggerDriver.d.ts +16 -0
  364. package/dist/logging/contracts/LoggerDriver.js +1 -0
  365. package/dist/logging/contracts/LoggingOptions.d.ts +49 -0
  366. package/dist/logging/contracts/LoggingOptions.js +1 -0
  367. package/dist/logging/contracts/index.d.ts +4 -0
  368. package/dist/logging/contracts/index.js +4 -0
  369. package/dist/logging/drivers/PinoLoggerDriver.d.ts +24 -0
  370. package/dist/logging/drivers/PinoLoggerDriver.js +291 -0
  371. package/dist/logging/drivers/index.d.ts +1 -0
  372. package/dist/logging/drivers/index.js +1 -0
  373. package/dist/logging/index.d.ts +3 -0
  374. package/dist/logging/index.js +3 -0
  375. package/dist/logging/transports/DevtoolsLogTransport.d.ts +35 -0
  376. package/dist/logging/transports/DevtoolsLogTransport.js +96 -0
  377. package/dist/mail/Mail.d.ts +62 -0
  378. package/dist/mail/Mail.js +98 -0
  379. package/dist/mail/index.d.ts +4 -0
  380. package/dist/mail/index.js +4 -0
  381. package/dist/mail/transports/FileMailTransport.d.ts +12 -0
  382. package/dist/mail/transports/FileMailTransport.js +41 -0
  383. package/dist/mail/transports/MailgunTransport.d.ts +22 -0
  384. package/dist/mail/transports/MailgunTransport.js +57 -0
  385. package/dist/mail/transports/ResendTransport.d.ts +14 -0
  386. package/dist/mail/transports/ResendTransport.js +55 -0
  387. package/dist/media/MediaFile.d.ts +48 -0
  388. package/dist/media/MediaFile.js +104 -0
  389. package/dist/media/MediaItem.d.ts +47 -0
  390. package/dist/media/MediaItem.js +106 -0
  391. package/dist/media/MediaLibrary.d.ts +42 -0
  392. package/dist/media/MediaLibrary.js +94 -0
  393. package/dist/media/MediaManager.d.ts +159 -0
  394. package/dist/media/MediaManager.js +754 -0
  395. package/dist/media/constants.d.ts +27 -0
  396. package/dist/media/constants.js +19 -0
  397. package/dist/media/contracts/MediaOptions.d.ts +8 -0
  398. package/dist/media/contracts/MediaOptions.js +1 -0
  399. package/dist/media/contracts/index.d.ts +1 -0
  400. package/dist/media/contracts/index.js +1 -0
  401. package/dist/media/image/ImageReconstructionError.d.ts +15 -0
  402. package/dist/media/image/ImageReconstructionError.js +18 -0
  403. package/dist/media/image/ImageVariantRenderer.d.ts +44 -0
  404. package/dist/media/image/ImageVariantRenderer.js +337 -0
  405. package/dist/media/image/ImageVariantRequest.d.ts +28 -0
  406. package/dist/media/image/ImageVariantRequest.js +55 -0
  407. package/dist/media/image/contracts/ImageProcessor.d.ts +46 -0
  408. package/dist/media/image/contracts/ImageProcessor.js +1 -0
  409. package/dist/media/image/contracts/ImageVariant.d.ts +31 -0
  410. package/dist/media/image/contracts/ImageVariant.js +7 -0
  411. package/dist/media/image/contracts/ImageVariantCacheOptions.d.ts +20 -0
  412. package/dist/media/image/contracts/ImageVariantCacheOptions.js +1 -0
  413. package/dist/media/image/contracts/index.d.ts +3 -0
  414. package/dist/media/image/contracts/index.js +3 -0
  415. package/dist/media/image/index.d.ts +5 -0
  416. package/dist/media/image/index.js +5 -0
  417. package/dist/media/image/processors/SharpImageProcessor.d.ts +25 -0
  418. package/dist/media/image/processors/SharpImageProcessor.js +112 -0
  419. package/dist/media/image/processors/index.d.ts +1 -0
  420. package/dist/media/image/processors/index.js +1 -0
  421. package/dist/media/index.d.ts +8 -0
  422. package/dist/media/index.js +8 -0
  423. package/dist/media/types.d.ts +129 -0
  424. package/dist/media/types.js +1 -0
  425. package/dist/queue/FailedJob.d.ts +31 -0
  426. package/dist/queue/FailedJob.js +41 -0
  427. package/dist/queue/Queue.d.ts +208 -0
  428. package/dist/queue/Queue.js +685 -0
  429. package/dist/queue/QueueEvents.d.ts +31 -0
  430. package/dist/queue/QueueEvents.js +49 -0
  431. package/dist/queue/QueueRetryLaterError.d.ts +23 -0
  432. package/dist/queue/QueueRetryLaterError.js +34 -0
  433. package/dist/queue/QueueWorker.d.ts +72 -0
  434. package/dist/queue/QueueWorker.js +236 -0
  435. package/dist/queue/QueueableJob.d.ts +109 -0
  436. package/dist/queue/QueueableJob.js +137 -0
  437. package/dist/queue/QueuedJob.d.ts +31 -0
  438. package/dist/queue/QueuedJob.js +52 -0
  439. package/dist/queue/RetryPolicy.d.ts +51 -0
  440. package/dist/queue/RetryPolicy.js +84 -0
  441. package/dist/queue/commands/index.d.ts +4 -0
  442. package/dist/queue/commands/index.js +11 -0
  443. package/dist/queue/commands/makeJob.d.ts +7 -0
  444. package/dist/queue/commands/makeJob.js +9 -0
  445. package/dist/queue/console.d.ts +60 -0
  446. package/dist/queue/console.js +348 -0
  447. package/dist/queue/contracts/CreateJob.d.ts +12 -0
  448. package/dist/queue/contracts/CreateJob.js +1 -0
  449. package/dist/queue/contracts/QueueDriver.d.ts +122 -0
  450. package/dist/queue/contracts/QueueDriver.js +1 -0
  451. package/dist/queue/contracts/QueueEvents.d.ts +61 -0
  452. package/dist/queue/contracts/QueueEvents.js +1 -0
  453. package/dist/queue/contracts/QueuePayload.d.ts +136 -0
  454. package/dist/queue/contracts/QueuePayload.js +1 -0
  455. package/dist/queue/contracts/QueueRetry.d.ts +43 -0
  456. package/dist/queue/contracts/QueueRetry.js +1 -0
  457. package/dist/queue/contracts/QueueService.d.ts +199 -0
  458. package/dist/queue/contracts/QueueService.js +1 -0
  459. package/dist/queue/contracts/QueueWorkerLifecycle.d.ts +65 -0
  460. package/dist/queue/contracts/QueueWorkerLifecycle.js +1 -0
  461. package/dist/queue/contracts/QueueableJob.d.ts +50 -0
  462. package/dist/queue/contracts/QueueableJob.js +1 -0
  463. package/dist/queue/contracts/RedisQueueDriver.d.ts +37 -0
  464. package/dist/queue/contracts/RedisQueueDriver.js +1 -0
  465. package/dist/queue/contracts/index.d.ts +9 -0
  466. package/dist/queue/contracts/index.js +9 -0
  467. package/dist/queue/createJob.d.ts +18 -0
  468. package/dist/queue/createJob.js +52 -0
  469. package/dist/queue/drivers/DatabaseQueueDriver.d.ts +83 -0
  470. package/dist/queue/drivers/DatabaseQueueDriver.js +393 -0
  471. package/dist/queue/drivers/RedisQueueDriver.d.ts +102 -0
  472. package/dist/queue/drivers/RedisQueueDriver.js +641 -0
  473. package/dist/queue/index.d.ts +13 -0
  474. package/dist/queue/index.js +13 -0
  475. package/dist/queue/queueMonitor.d.ts +133 -0
  476. package/dist/queue/queueMonitor.js +238 -0
  477. package/dist/scheduler/ScheduledCall.d.ts +25 -0
  478. package/dist/scheduler/ScheduledCall.js +31 -0
  479. package/dist/scheduler/ScheduledEvent.d.ts +74 -0
  480. package/dist/scheduler/ScheduledEvent.js +115 -0
  481. package/dist/scheduler/ScheduledJob.d.ts +34 -0
  482. package/dist/scheduler/ScheduledJob.js +50 -0
  483. package/dist/scheduler/ScheduledOccurrence.d.ts +74 -0
  484. package/dist/scheduler/ScheduledOccurrence.js +194 -0
  485. package/dist/scheduler/ScheduledOccurrenceRecorder.d.ts +34 -0
  486. package/dist/scheduler/ScheduledOccurrenceRecorder.js +106 -0
  487. package/dist/scheduler/Scheduler.d.ts +76 -0
  488. package/dist/scheduler/Scheduler.js +186 -0
  489. package/dist/scheduler/SchedulerWorker.d.ts +37 -0
  490. package/dist/scheduler/SchedulerWorker.js +119 -0
  491. package/dist/scheduler/console.d.ts +18 -0
  492. package/dist/scheduler/console.js +288 -0
  493. package/dist/scheduler/constants.d.ts +13 -0
  494. package/dist/scheduler/constants.js +23 -0
  495. package/dist/scheduler/contracts/Scheduler.d.ts +104 -0
  496. package/dist/scheduler/contracts/Scheduler.js +1 -0
  497. package/dist/scheduler/contracts/SchedulerConsole.d.ts +37 -0
  498. package/dist/scheduler/contracts/SchedulerConsole.js +1 -0
  499. package/dist/scheduler/contracts/SchedulerWorker.d.ts +18 -0
  500. package/dist/scheduler/contracts/SchedulerWorker.js +1 -0
  501. package/dist/scheduler/contracts/index.d.ts +3 -0
  502. package/dist/scheduler/contracts/index.js +3 -0
  503. package/dist/scheduler/index.d.ts +9 -0
  504. package/dist/scheduler/index.js +9 -0
  505. package/dist/scheduler/scheduleTime.d.ts +30 -0
  506. package/dist/scheduler/scheduleTime.js +64 -0
  507. package/dist/security/Security.d.ts +60 -0
  508. package/dist/security/Security.js +252 -0
  509. package/dist/security/SecurityError.d.ts +13 -0
  510. package/dist/security/SecurityError.js +16 -0
  511. package/dist/security/contracts/SecurityOptions.d.ts +17 -0
  512. package/dist/security/contracts/SecurityOptions.js +1 -0
  513. package/dist/security/contracts/SecurityPayload.d.ts +13 -0
  514. package/dist/security/contracts/SecurityPayload.js +1 -0
  515. package/dist/security/contracts/index.d.ts +2 -0
  516. package/dist/security/contracts/index.js +2 -0
  517. package/dist/security/ensureAppKey.d.ts +16 -0
  518. package/dist/security/ensureAppKey.js +69 -0
  519. package/dist/security/index.d.ts +4 -0
  520. package/dist/security/index.js +4 -0
  521. package/dist/serialization/Serializable.d.ts +17 -0
  522. package/dist/serialization/Serializable.js +1 -0
  523. package/dist/serialization/SerializationError.d.ts +40 -0
  524. package/dist/serialization/SerializationError.js +42 -0
  525. package/dist/serialization/SerializationRegistry.d.ts +76 -0
  526. package/dist/serialization/SerializationRegistry.js +153 -0
  527. package/dist/serialization/SerializationRegistryError.d.ts +18 -0
  528. package/dist/serialization/SerializationRegistryError.js +18 -0
  529. package/dist/serialization/Serializer.d.ts +37 -0
  530. package/dist/serialization/Serializer.js +477 -0
  531. package/dist/serialization/contracts/SerializableClass.d.ts +20 -0
  532. package/dist/serialization/contracts/SerializableClass.js +1 -0
  533. package/dist/serialization/contracts/SerializedValue.d.ts +59 -0
  534. package/dist/serialization/contracts/SerializedValue.js +19 -0
  535. package/dist/serialization/contracts/SerializerOptions.d.ts +17 -0
  536. package/dist/serialization/contracts/SerializerOptions.js +1 -0
  537. package/dist/serialization/contracts/SerializerService.d.ts +26 -0
  538. package/dist/serialization/contracts/SerializerService.js +1 -0
  539. package/dist/serialization/contracts/index.d.ts +4 -0
  540. package/dist/serialization/contracts/index.js +4 -0
  541. package/dist/serialization/index.d.ts +6 -0
  542. package/dist/serialization/index.js +6 -0
  543. package/dist/server/App.d.ts +141 -0
  544. package/dist/server/App.js +225 -0
  545. package/dist/server/RequestContext.d.ts +42 -0
  546. package/dist/server/RequestContext.js +95 -0
  547. package/dist/server/appContext.d.ts +34 -0
  548. package/dist/server/appContext.js +42 -0
  549. package/dist/server/index.d.ts +3 -0
  550. package/dist/server/index.js +3 -0
  551. package/dist/ssr/constants.d.ts +6 -0
  552. package/dist/ssr/constants.js +6 -0
  553. package/dist/ssr/contracts/DocumentHead.d.ts +32 -0
  554. package/dist/ssr/contracts/DocumentHead.js +1 -0
  555. package/dist/ssr/contracts/SsrRenderContext.d.ts +23 -0
  556. package/dist/ssr/contracts/SsrRenderContext.js +1 -0
  557. package/dist/ssr/contracts/SsrRenderResult.d.ts +21 -0
  558. package/dist/ssr/contracts/SsrRenderResult.js +1 -0
  559. package/dist/ssr/contracts/SsrRenderer.d.ts +9 -0
  560. package/dist/ssr/contracts/SsrRenderer.js +1 -0
  561. package/dist/ssr/contracts/SsrRequest.d.ts +16 -0
  562. package/dist/ssr/contracts/SsrRequest.js +1 -0
  563. package/dist/ssr/contracts/index.d.ts +5 -0
  564. package/dist/ssr/contracts/index.js +1 -0
  565. package/dist/ssr/createSsrRenderContext.d.ts +9 -0
  566. package/dist/ssr/createSsrRenderContext.js +20 -0
  567. package/dist/ssr/fastify/contracts/FastifySsrOptions.d.ts +21 -0
  568. package/dist/ssr/fastify/contracts/FastifySsrOptions.js +1 -0
  569. package/dist/ssr/fastify/contracts/index.d.ts +1 -0
  570. package/dist/ssr/fastify/contracts/index.js +1 -0
  571. package/dist/ssr/fastify/fastifySsr.d.ts +25 -0
  572. package/dist/ssr/fastify/fastifySsr.js +89 -0
  573. package/dist/ssr/fastify/index.d.ts +2 -0
  574. package/dist/ssr/fastify/index.js +1 -0
  575. package/dist/ssr/index.d.ts +6 -0
  576. package/dist/ssr/index.js +5 -0
  577. package/dist/ssr/renderDocumentHead.d.ts +8 -0
  578. package/dist/ssr/renderDocumentHead.js +62 -0
  579. package/dist/ssr/renderSsrDocument.d.ts +14 -0
  580. package/dist/ssr/renderSsrDocument.js +28 -0
  581. package/dist/ssr/serializeSsrState.d.ts +10 -0
  582. package/dist/ssr/serializeSsrState.js +18 -0
  583. package/dist/ssr/vite/contracts/ViteSsrOptions.d.ts +45 -0
  584. package/dist/ssr/vite/contracts/ViteSsrOptions.js +1 -0
  585. package/dist/ssr/vite/contracts/index.d.ts +1 -0
  586. package/dist/ssr/vite/contracts/index.js +1 -0
  587. package/dist/ssr/vite/fastifyViteSsr.d.ts +24 -0
  588. package/dist/ssr/vite/fastifyViteSsr.js +213 -0
  589. package/dist/ssr/vite/index.d.ts +4 -0
  590. package/dist/ssr/vite/index.js +2 -0
  591. package/dist/ssr/vite/viteSsrManifest.d.ts +16 -0
  592. package/dist/ssr/vite/viteSsrManifest.js +63 -0
  593. package/dist/storage/Storage.d.ts +244 -0
  594. package/dist/storage/Storage.js +348 -0
  595. package/dist/storage/contents.d.ts +8 -0
  596. package/dist/storage/contents.js +18 -0
  597. package/dist/storage/contracts/StorageListing.d.ts +50 -0
  598. package/dist/storage/contracts/StorageListing.js +1 -0
  599. package/dist/storage/contracts/index.d.ts +1 -0
  600. package/dist/storage/contracts/index.js +1 -0
  601. package/dist/storage/drivers/FlystorageDisk.d.ts +185 -0
  602. package/dist/storage/drivers/FlystorageDisk.js +250 -0
  603. package/dist/storage/drivers/FlystorageListing.d.ts +27 -0
  604. package/dist/storage/drivers/FlystorageListing.js +69 -0
  605. package/dist/storage/drivers/LocalStorageDisk.d.ts +25 -0
  606. package/dist/storage/drivers/LocalStorageDisk.js +38 -0
  607. package/dist/storage/drivers/S3StorageDisk.d.ts +17 -0
  608. package/dist/storage/drivers/S3StorageDisk.js +102 -0
  609. package/dist/storage/drivers/index.d.ts +3 -0
  610. package/dist/storage/drivers/index.js +3 -0
  611. package/dist/storage/index.d.ts +7 -0
  612. package/dist/storage/index.js +7 -0
  613. package/dist/storage/mime.d.ts +7 -0
  614. package/dist/storage/mime.js +28 -0
  615. package/dist/storage/path.d.ts +22 -0
  616. package/dist/storage/path.js +61 -0
  617. package/dist/storage/types.d.ts +218 -0
  618. package/dist/storage/types.js +1 -0
  619. package/dist/url/UrlGenerator.d.ts +32 -0
  620. package/dist/url/UrlGenerator.js +61 -0
  621. package/dist/url/contracts/UrlGeneratorOptions.d.ts +13 -0
  622. package/dist/url/contracts/UrlGeneratorOptions.js +1 -0
  623. package/dist/url/contracts/index.d.ts +1 -0
  624. package/dist/url/contracts/index.js +1 -0
  625. package/dist/url/index.d.ts +2 -0
  626. package/dist/url/index.js +2 -0
  627. package/dist/validation/index.d.ts +28 -0
  628. package/dist/validation/index.js +260 -0
  629. package/package.json +290 -0
  630. package/src/ai/AIErrors.ts +46 -0
  631. package/src/ai/AIFailover.ts +101 -0
  632. package/src/ai/AIProviders.ts +228 -0
  633. package/src/ai/AIQuotaDeferredError.ts +26 -0
  634. package/src/ai/AIRateLimiter.ts +880 -0
  635. package/src/ai/Agent.ts +3630 -0
  636. package/src/ai/AgentHistory.ts +576 -0
  637. package/src/ai/AgentRunJob.ts +65 -0
  638. package/src/ai/Ai.ts +2176 -0
  639. package/src/ai/AiConversation.ts +49 -0
  640. package/src/ai/AiExecutionContext.ts +19 -0
  641. package/src/ai/AiMessage.ts +131 -0
  642. package/src/ai/AiRateLimitBucket.ts +163 -0
  643. package/src/ai/AiRateLimitReservation.ts +117 -0
  644. package/src/ai/AiRequest.ts +466 -0
  645. package/src/ai/Estimates.ts +36 -0
  646. package/src/ai/Models.ts +373 -0
  647. package/src/ai/OpenAIProviderError.ts +98 -0
  648. package/src/ai/OpenAIQuotaRetry.ts +183 -0
  649. package/src/ai/ProviderCosts.ts +156 -0
  650. package/src/ai/README.md +187 -0
  651. package/src/ai/ResponsesProviderCall.ts +34 -0
  652. package/src/ai/agentCitations.ts +186 -0
  653. package/src/ai/contracts/AI.ts +380 -0
  654. package/src/ai/contracts/Agent.ts +539 -0
  655. package/src/ai/contracts/AiRequestRunCostSummary.ts +31 -0
  656. package/src/ai/contracts/Pricing.ts +95 -0
  657. package/src/ai/contracts/Providers.ts +73 -0
  658. package/src/ai/contracts/QuotaRetry.ts +39 -0
  659. package/src/ai/contracts/RateLimits.ts +49 -0
  660. package/src/ai/contracts/ResponsesProviderCall.ts +30 -0
  661. package/src/ai/contracts/index.ts +8 -0
  662. package/src/ai/examples/Conversation.ts +12 -0
  663. package/src/ai/examples/HelpAgent.ts +27 -0
  664. package/src/ai/examples/createHelpImage.ts +13 -0
  665. package/src/ai/index.ts +27 -0
  666. package/src/ai/registry.ts +70 -0
  667. package/src/ai/sdkNodeCompatibility.d.ts +76 -0
  668. package/src/ai/toolCallRecovery.ts +82 -0
  669. package/src/ai/toolHelpers.ts +145 -0
  670. package/src/auth/Auth.ts +1422 -0
  671. package/src/auth/AuthProvider.ts +251 -0
  672. package/src/auth/AuthToken.ts +239 -0
  673. package/src/auth/PasswordResetToken.ts +93 -0
  674. package/src/auth/README.md +396 -0
  675. package/src/auth/UserIdentity.ts +112 -0
  676. package/src/auth/contracts/AuthProviderDriver.ts +114 -0
  677. package/src/auth/contracts/index.ts +1 -0
  678. package/src/auth/examples/runPasswordAuth.ts +45 -0
  679. package/src/auth/index.ts +8 -0
  680. package/src/auth/passwordHash.ts +160 -0
  681. package/src/auth/providers/GoogleAuthProvider.ts +470 -0
  682. package/src/auth/providers/PasswordAuthProvider.ts +256 -0
  683. package/src/auth/providers/index.ts +3 -0
  684. package/src/auth/providers/resolveAuthProviders.ts +166 -0
  685. package/src/cache/Cache.ts +151 -0
  686. package/src/cache/README.md +137 -0
  687. package/src/cache/contracts/CacheDriver.ts +11 -0
  688. package/src/cache/contracts/CacheOperations.ts +28 -0
  689. package/src/cache/contracts/CacheOptions.ts +56 -0
  690. package/src/cache/contracts/CacheRepository.ts +62 -0
  691. package/src/cache/contracts/index.ts +4 -0
  692. package/src/cache/drivers/CacheManagerDriver.ts +84 -0
  693. package/src/cache/drivers/createCacheDriver.ts +191 -0
  694. package/src/cache/examples/runNoteCache.ts +37 -0
  695. package/src/cache/index.ts +2 -0
  696. package/src/cli/Cli.ts +110 -0
  697. package/src/cli/README.md +164 -0
  698. package/src/cli/commands/repl.ts +29 -0
  699. package/src/cli/contracts/CliCommand.ts +33 -0
  700. package/src/cli/contracts/CliConfig.ts +10 -0
  701. package/src/cli/contracts/CliOptions.ts +13 -0
  702. package/src/cli/contracts/CommandDefinition.ts +19 -0
  703. package/src/cli/contracts/ReplOptions.ts +11 -0
  704. package/src/cli/contracts/index.ts +5 -0
  705. package/src/cli/defineCommand.ts +25 -0
  706. package/src/cli/index.ts +5 -0
  707. package/src/cli/runDb3.ts +63 -0
  708. package/src/cli/runRepl.ts +55 -0
  709. package/src/config/Config.ts +110 -0
  710. package/src/config/README.md +142 -0
  711. package/src/config/env.ts +164 -0
  712. package/src/config/examples/loadNotesConfig.ts +29 -0
  713. package/src/config/examples/runConfig.ts +40 -0
  714. package/src/config/index.ts +2 -0
  715. package/src/db/ActiveProjection.ts +311 -0
  716. package/src/db/ActiveQueryBuilder.ts +831 -0
  717. package/src/db/ActiveRecord.ts +1317 -0
  718. package/src/db/Database.ts +1283 -0
  719. package/src/db/FieldType.ts +1243 -0
  720. package/src/db/README.md +508 -0
  721. package/src/db/SoftDeletes.ts +158 -0
  722. package/src/db/commands/check.ts +10 -0
  723. package/src/db/commands/index.ts +19 -0
  724. package/src/db/commands/makeMigration.ts +11 -0
  725. package/src/db/commands/migrate.ts +10 -0
  726. package/src/db/connection.ts +68 -0
  727. package/src/db/contracts/ActiveRecordDefinition.ts +69 -0
  728. package/src/db/contracts/DatabaseBackup.ts +7 -0
  729. package/src/db/contracts/DatabaseMigrationsConfig.ts +10 -0
  730. package/src/db/contracts/index.ts +3 -0
  731. package/src/db/dialects/columnTypes.ts +103 -0
  732. package/src/db/dialects/index.ts +6 -0
  733. package/src/db/dialects/mariadb.ts +51 -0
  734. package/src/db/dialects/mysql.ts +277 -0
  735. package/src/db/dialects/postgres.ts +143 -0
  736. package/src/db/dialects/resolveDialect.ts +88 -0
  737. package/src/db/dialects/types.ts +59 -0
  738. package/src/db/errors.ts +22 -0
  739. package/src/db/examples/DefinedUser.ts +20 -0
  740. package/src/db/examples/FieldNote.ts +27 -0
  741. package/src/db/examples/KnowledgeNote.ts +29 -0
  742. package/src/db/examples/NoteCodeField.ts +9 -0
  743. package/src/db/examples/createNotesTogether.ts +24 -0
  744. package/src/db/examples/outputs/workspace-notes.json +9 -0
  745. package/src/db/examples/runFieldNotes.ts +51 -0
  746. package/src/db/examples/runNoteMigrations.ts +64 -0
  747. package/src/db/examples/runWorkspaceNotes.ts +86 -0
  748. package/src/db/examples/workspaceNotes.ts +57 -0
  749. package/src/db/fields/BooleanField.ts +128 -0
  750. package/src/db/fields/CharUuidField.ts +91 -0
  751. package/src/db/fields/ChoiceStringField.ts +97 -0
  752. package/src/db/fields/DecimalField.ts +157 -0
  753. package/src/db/fields/EmailField.ts +79 -0
  754. package/src/db/fields/EncryptedJsonField.ts +211 -0
  755. package/src/db/fields/IntegerField.ts +200 -0
  756. package/src/db/fields/JsonField.ts +108 -0
  757. package/src/db/fields/JsonStringField.ts +63 -0
  758. package/src/db/fields/LinkField.ts +502 -0
  759. package/src/db/fields/PasswordField.ts +294 -0
  760. package/src/db/fields/StringField.ts +154 -0
  761. package/src/db/fields/StringListField.ts +179 -0
  762. package/src/db/fields/TextField.ts +71 -0
  763. package/src/db/fields/TimestampField.ts +164 -0
  764. package/src/db/fields/UlidField.ts +189 -0
  765. package/src/db/fields/UrlField.ts +97 -0
  766. package/src/db/fields/VectorField.ts +266 -0
  767. package/src/db/fields/createField.ts +22 -0
  768. package/src/db/fields/field.ts +209 -0
  769. package/src/db/fields/index.ts +76 -0
  770. package/src/db/fields/resolveFields.ts +69 -0
  771. package/src/db/index.ts +13 -0
  772. package/src/db/migrations/DatabaseMigrationManager.ts +756 -0
  773. package/src/db/migrations/DatabaseSchemaInspector.ts +541 -0
  774. package/src/db/migrations/KnexMigrationRenderer.ts +490 -0
  775. package/src/db/migrations/ModelSchemaCollector.ts +240 -0
  776. package/src/db/migrations/SchemaDiffer.ts +541 -0
  777. package/src/db/migrations/SchemaNames.ts +62 -0
  778. package/src/db/migrations/SchemaSnapshotSerializer.ts +59 -0
  779. package/src/db/migrations/contracts/DatabaseMigration.ts +143 -0
  780. package/src/db/migrations/contracts/SchemaChange.ts +113 -0
  781. package/src/db/migrations/contracts/SchemaSnapshot.ts +122 -0
  782. package/src/db/migrations/contracts/index.ts +3 -0
  783. package/src/db/migrations/errors.ts +45 -0
  784. package/src/db/migrations/index.ts +10 -0
  785. package/src/db/migrations/promoteDestructiveSchemaChanges.ts +120 -0
  786. package/src/db/queryMonitor.ts +549 -0
  787. package/src/db/sqlErrors.ts +36 -0
  788. package/src/db/test/db.ts +159 -0
  789. package/src/devtools/HttpEventDispatcher.ts +214 -0
  790. package/src/devtools/contracts/DevtoolsEventDispatcher.ts +57 -0
  791. package/src/devtools/contracts/index.ts +1 -0
  792. package/src/devtools/environment.ts +18 -0
  793. package/src/devtools/index.ts +3 -0
  794. package/src/events/Events.ts +165 -0
  795. package/src/events/README.md +106 -0
  796. package/src/events/contracts/EventConstructor.ts +12 -0
  797. package/src/events/contracts/EventListener.ts +8 -0
  798. package/src/events/contracts/EventUnsubscribe.ts +4 -0
  799. package/src/events/contracts/index.ts +3 -0
  800. package/src/events/examples/NoteSaved.ts +9 -0
  801. package/src/events/examples/runNoteEvents.ts +31 -0
  802. package/src/events/index.ts +2 -0
  803. package/src/flows/FlowBlockRegistry.ts +79 -0
  804. package/src/flows/FlowCompiler.ts +624 -0
  805. package/src/flows/FlowDefinitionError.ts +24 -0
  806. package/src/flows/FlowStepJob.ts +54 -0
  807. package/src/flows/FlowValueValidator.ts +120 -0
  808. package/src/flows/Flows.ts +1118 -0
  809. package/src/flows/README.md +144 -0
  810. package/src/flows/blocks/FlowInput.ts +32 -0
  811. package/src/flows/blocks/FlowOutput.ts +32 -0
  812. package/src/flows/blocks/Subflow.ts +24 -0
  813. package/src/flows/blocks/index.ts +11 -0
  814. package/src/flows/constants.ts +62 -0
  815. package/src/flows/contracts/FlowBlock.ts +73 -0
  816. package/src/flows/contracts/FlowCompiler.ts +32 -0
  817. package/src/flows/contracts/FlowDefinition.ts +126 -0
  818. package/src/flows/contracts/FlowDefinitionStore.ts +52 -0
  819. package/src/flows/contracts/FlowRun.ts +44 -0
  820. package/src/flows/contracts/FlowValue.ts +54 -0
  821. package/src/flows/contracts/FlowsService.ts +39 -0
  822. package/src/flows/contracts/index.ts +7 -0
  823. package/src/flows/defineBlock.ts +25 -0
  824. package/src/flows/drivers/FileFlowDefinitionStore.ts +372 -0
  825. package/src/flows/drivers/index.ts +1 -0
  826. package/src/flows/errors.ts +22 -0
  827. package/src/flows/examples/FlowExampleApp.ts +15 -0
  828. package/src/flows/examples/createTextFlow.ts +14 -0
  829. package/src/flows/examples/normalizeTextBlock.ts +15 -0
  830. package/src/flows/examples/runTextFlow.ts +46 -0
  831. package/src/flows/examples/uppercaseTextBlock.ts +11 -0
  832. package/src/flows/index.ts +13 -0
  833. package/src/flows/models/FlowRun.ts +164 -0
  834. package/src/flows/models/FlowRunEvent.ts +108 -0
  835. package/src/flows/models/FlowStepRun.ts +176 -0
  836. package/src/flows/models/index.ts +16 -0
  837. package/src/index.ts +40 -0
  838. package/src/logging/Log.ts +100 -0
  839. package/src/logging/README.md +139 -0
  840. package/src/logging/contracts/HttpExchange.ts +53 -0
  841. package/src/logging/contracts/Logger.ts +45 -0
  842. package/src/logging/contracts/LoggerDriver.ts +19 -0
  843. package/src/logging/contracts/LoggingOptions.ts +51 -0
  844. package/src/logging/contracts/index.ts +4 -0
  845. package/src/logging/drivers/PinoLoggerDriver.ts +376 -0
  846. package/src/logging/drivers/index.ts +1 -0
  847. package/src/logging/examples/runNoteLogs.ts +38 -0
  848. package/src/logging/index.ts +3 -0
  849. package/src/logging/transports/DevtoolsLogTransport.ts +142 -0
  850. package/src/mail/Mail.ts +188 -0
  851. package/src/mail/README.md +206 -0
  852. package/src/mail/examples/runMailPreview.ts +44 -0
  853. package/src/mail/examples/welcomeMessage.ts +26 -0
  854. package/src/mail/index.ts +4 -0
  855. package/src/mail/transports/FileMailTransport.ts +58 -0
  856. package/src/mail/transports/MailgunTransport.ts +85 -0
  857. package/src/mail/transports/ResendTransport.ts +80 -0
  858. package/src/media/MediaFile.ts +132 -0
  859. package/src/media/MediaItem.ts +132 -0
  860. package/src/media/MediaLibrary.ts +117 -0
  861. package/src/media/MediaManager.ts +874 -0
  862. package/src/media/README.md +358 -0
  863. package/src/media/constants.ts +31 -0
  864. package/src/media/contracts/MediaOptions.ts +9 -0
  865. package/src/media/contracts/index.ts +1 -0
  866. package/src/media/examples/createPrivateFileServer.ts +55 -0
  867. package/src/media/examples/runPrivateFiles.ts +45 -0
  868. package/src/media/examples/runProjectMedia.ts +46 -0
  869. package/src/media/image/ImageReconstructionError.ts +18 -0
  870. package/src/media/image/ImageVariantRenderer.ts +386 -0
  871. package/src/media/image/ImageVariantRequest.ts +65 -0
  872. package/src/media/image/contracts/ImageProcessor.ts +53 -0
  873. package/src/media/image/contracts/ImageVariant.ts +37 -0
  874. package/src/media/image/contracts/ImageVariantCacheOptions.ts +21 -0
  875. package/src/media/image/contracts/index.ts +3 -0
  876. package/src/media/image/index.ts +5 -0
  877. package/src/media/image/processors/SharpImageProcessor.ts +121 -0
  878. package/src/media/image/processors/index.ts +1 -0
  879. package/src/media/index.ts +8 -0
  880. package/src/media/types.ts +168 -0
  881. package/src/queue/FailedJob.ts +58 -0
  882. package/src/queue/Queue.ts +938 -0
  883. package/src/queue/QueueEvents.ts +57 -0
  884. package/src/queue/QueueRetryLaterError.ts +40 -0
  885. package/src/queue/QueueWorker.ts +296 -0
  886. package/src/queue/QueueableJob.ts +167 -0
  887. package/src/queue/QueuedJob.ts +69 -0
  888. package/src/queue/README.md +368 -0
  889. package/src/queue/RetryPolicy.ts +129 -0
  890. package/src/queue/commands/index.ts +13 -0
  891. package/src/queue/commands/makeJob.ts +11 -0
  892. package/src/queue/console.ts +518 -0
  893. package/src/queue/contracts/CreateJob.ts +13 -0
  894. package/src/queue/contracts/QueueDriver.ts +135 -0
  895. package/src/queue/contracts/QueueEvents.ts +77 -0
  896. package/src/queue/contracts/QueuePayload.ts +150 -0
  897. package/src/queue/contracts/QueueRetry.ts +47 -0
  898. package/src/queue/contracts/QueueService.ts +219 -0
  899. package/src/queue/contracts/QueueWorkerLifecycle.ts +71 -0
  900. package/src/queue/contracts/QueueableJob.ts +56 -0
  901. package/src/queue/contracts/RedisQueueDriver.ts +37 -0
  902. package/src/queue/contracts/index.ts +9 -0
  903. package/src/queue/createJob.ts +54 -0
  904. package/src/queue/drivers/DatabaseQueueDriver.ts +449 -0
  905. package/src/queue/drivers/RedisQueueDriver.ts +733 -0
  906. package/src/queue/examples/DeferredReportJob.ts +25 -0
  907. package/src/queue/examples/GenerateReportJob.ts +37 -0
  908. package/src/queue/examples/WriteReportJob.ts +37 -0
  909. package/src/queue/examples/createAndProcessReportJob.ts +29 -0
  910. package/src/queue/examples/dispatchReportWorkflows.ts +40 -0
  911. package/src/queue/examples/manageReportRetries.ts +47 -0
  912. package/src/queue/examples/outputs/create-and-process-report-job.json +6 -0
  913. package/src/queue/examples/outputs/dispatch-report-workflows.json +14 -0
  914. package/src/queue/examples/outputs/manage-report-retries.json +24 -0
  915. package/src/queue/examples/outputs/queue-reports.json +11 -0
  916. package/src/queue/examples/reportConsole.ts +47 -0
  917. package/src/queue/examples/runBackpressure.ts +27 -0
  918. package/src/queue/examples/runQueueReports.ts +80 -0
  919. package/src/queue/examples/runQueueWorkflows.ts +43 -0
  920. package/src/queue/index.ts +13 -0
  921. package/src/queue/queueMonitor.ts +368 -0
  922. package/src/scheduler/README.md +139 -0
  923. package/src/scheduler/ScheduledCall.ts +36 -0
  924. package/src/scheduler/ScheduledEvent.ts +149 -0
  925. package/src/scheduler/ScheduledJob.ts +58 -0
  926. package/src/scheduler/ScheduledOccurrence.ts +250 -0
  927. package/src/scheduler/ScheduledOccurrenceRecorder.ts +125 -0
  928. package/src/scheduler/Scheduler.ts +225 -0
  929. package/src/scheduler/SchedulerWorker.ts +151 -0
  930. package/src/scheduler/console.ts +368 -0
  931. package/src/scheduler/constants.ts +27 -0
  932. package/src/scheduler/contracts/Scheduler.ts +123 -0
  933. package/src/scheduler/contracts/SchedulerConsole.ts +40 -0
  934. package/src/scheduler/contracts/SchedulerWorker.ts +23 -0
  935. package/src/scheduler/contracts/index.ts +3 -0
  936. package/src/scheduler/examples/RecoverableSummaryJob.ts +18 -0
  937. package/src/scheduler/examples/WriteDailySummaryJob.ts +17 -0
  938. package/src/scheduler/examples/registerDailySummary.ts +13 -0
  939. package/src/scheduler/examples/runDailySummary.ts +46 -0
  940. package/src/scheduler/examples/runScheduledReplay.ts +60 -0
  941. package/src/scheduler/index.ts +9 -0
  942. package/src/scheduler/scheduleTime.ts +78 -0
  943. package/src/security/README.md +130 -0
  944. package/src/security/Security.ts +346 -0
  945. package/src/security/SecurityError.ts +16 -0
  946. package/src/security/contracts/SecurityOptions.ts +20 -0
  947. package/src/security/contracts/SecurityPayload.ts +14 -0
  948. package/src/security/contracts/index.ts +2 -0
  949. package/src/security/ensureAppKey.ts +82 -0
  950. package/src/security/examples/runSecretRoundTrip.ts +42 -0
  951. package/src/security/index.ts +4 -0
  952. package/src/serialization/README.md +169 -0
  953. package/src/serialization/Serializable.ts +17 -0
  954. package/src/serialization/SerializationError.ts +91 -0
  955. package/src/serialization/SerializationRegistry.ts +208 -0
  956. package/src/serialization/SerializationRegistryError.ts +24 -0
  957. package/src/serialization/Serializer.ts +793 -0
  958. package/src/serialization/contracts/SerializableClass.ts +26 -0
  959. package/src/serialization/contracts/SerializedValue.ts +71 -0
  960. package/src/serialization/contracts/SerializerOptions.ts +19 -0
  961. package/src/serialization/contracts/SerializerService.ts +29 -0
  962. package/src/serialization/contracts/index.ts +4 -0
  963. package/src/serialization/examples/ExportRequest.ts +25 -0
  964. package/src/serialization/examples/runExportSerialization.ts +24 -0
  965. package/src/serialization/index.ts +6 -0
  966. package/src/server/App.ts +326 -0
  967. package/src/server/README.md +219 -0
  968. package/src/server/RequestContext.ts +122 -0
  969. package/src/server/appContext.ts +59 -0
  970. package/src/server/examples/createFirstServer.ts +25 -0
  971. package/src/server/examples/startFirstServer.ts +19 -0
  972. package/src/server/index.ts +16 -0
  973. package/src/ssr/README.md +158 -0
  974. package/src/ssr/constants.ts +8 -0
  975. package/src/ssr/contracts/DocumentHead.ts +35 -0
  976. package/src/ssr/contracts/SsrRenderContext.ts +25 -0
  977. package/src/ssr/contracts/SsrRenderResult.ts +23 -0
  978. package/src/ssr/contracts/SsrRenderer.ts +12 -0
  979. package/src/ssr/contracts/SsrRequest.ts +17 -0
  980. package/src/ssr/contracts/index.ts +19 -0
  981. package/src/ssr/createSsrRenderContext.ts +25 -0
  982. package/src/ssr/examples/createPublicPageServer.ts +32 -0
  983. package/src/ssr/examples/runPublicPages.ts +25 -0
  984. package/src/ssr/fastify/contracts/FastifySsrOptions.ts +24 -0
  985. package/src/ssr/fastify/contracts/index.ts +5 -0
  986. package/src/ssr/fastify/fastifySsr.ts +110 -0
  987. package/src/ssr/fastify/index.ts +2 -0
  988. package/src/ssr/index.ts +10 -0
  989. package/src/ssr/renderDocumentHead.ts +72 -0
  990. package/src/ssr/renderSsrDocument.ts +35 -0
  991. package/src/ssr/serializeSsrState.ts +19 -0
  992. package/src/ssr/vite/contracts/ViteSsrOptions.ts +52 -0
  993. package/src/ssr/vite/contracts/index.ts +6 -0
  994. package/src/ssr/vite/fastifyViteSsr.ts +279 -0
  995. package/src/ssr/vite/index.ts +4 -0
  996. package/src/ssr/vite/viteSsrManifest.ts +92 -0
  997. package/src/storage/README.md +310 -0
  998. package/src/storage/Storage.ts +392 -0
  999. package/src/storage/contents.ts +23 -0
  1000. package/src/storage/contracts/StorageListing.ts +55 -0
  1001. package/src/storage/contracts/index.ts +1 -0
  1002. package/src/storage/drivers/FlystorageDisk.ts +295 -0
  1003. package/src/storage/drivers/FlystorageListing.ts +78 -0
  1004. package/src/storage/drivers/LocalStorageDisk.ts +45 -0
  1005. package/src/storage/drivers/S3StorageDisk.ts +114 -0
  1006. package/src/storage/drivers/index.ts +3 -0
  1007. package/src/storage/examples/runStorage.ts +37 -0
  1008. package/src/storage/examples/runStreamExport.ts +41 -0
  1009. package/src/storage/examples/writeCsvExport.ts +45 -0
  1010. package/src/storage/index.ts +7 -0
  1011. package/src/storage/mime.ts +30 -0
  1012. package/src/storage/path.ts +76 -0
  1013. package/src/storage/types.ts +251 -0
  1014. package/src/url/README.md +41 -0
  1015. package/src/url/UrlGenerator.ts +72 -0
  1016. package/src/url/contracts/UrlGeneratorOptions.ts +14 -0
  1017. package/src/url/contracts/index.ts +1 -0
  1018. package/src/url/examples/runApplicationLinks.ts +33 -0
  1019. package/src/url/index.ts +2 -0
  1020. package/src/validation/README.md +433 -0
  1021. package/src/validation/examples/runNoteValidation.ts +18 -0
  1022. package/src/validation/examples/validateNoteInput.ts +31 -0
  1023. package/src/validation/index.ts +398 -0
  1024. package/templates/AGENTS.md +15 -0
@@ -0,0 +1,880 @@
1
+ import type { AIRateLimitAcquireInput, AIRateLimitLease, AIRateLimitSnapshot, AIProviderResponseMetadata } from './contracts/RateLimits';
2
+ export type { AIRateLimitAcquireInput, AIRateLimitLease, AIRateLimitSnapshot, AIProviderResponseMetadata } from './contracts/RateLimits';
3
+ import { QueueRetryLaterError } from '@db3.ai/app/queue';
4
+ import { ActiveRecord } from '@db3.ai/app/db';
5
+ import { app } from '../server/appContext';
6
+
7
+ import { AI_RATE_LIMIT_ENDPOINT, AiRateLimitBucket, type AiRateLimitEndpoint } from './AiRateLimitBucket';
8
+ import { AiRateLimitReservation } from './AiRateLimitReservation';
9
+ import { AI_PROVIDER, type AIProvider } from './contracts/AI.js';
10
+
11
+ const DEFAULT_RESERVATION_TTL_MS = 10 * 60 * 1000;
12
+ const UNKNOWN_ACTIVE_BUCKET_DELAY_SECONDS = 1;
13
+ const UNKNOWN_RESET_DELAY_SECONDS = 60;
14
+ const ONE_MINUTE_MS = 60 * 1000;
15
+
16
+ const OPENAI_GPT_IMAGE_2_TIER_1_RATE_LIMIT: ProviderDefaultRateLimit = {
17
+ limitRequests: 5,
18
+ limitTokens: 100_000,
19
+ windowMs: ONE_MINUTE_MS,
20
+ source: 'openai:gpt-image-2:tier-1',
21
+ };
22
+
23
+ const RATE_LIMIT_HEADER_NAMES = [
24
+ 'x-ratelimit-limit-requests',
25
+ 'x-ratelimit-limit-tokens',
26
+ 'x-ratelimit-remaining-requests',
27
+ 'x-ratelimit-remaining-tokens',
28
+ 'x-ratelimit-reset-requests',
29
+ 'x-ratelimit-reset-tokens',
30
+ 'x-ratelimit-limit-project-tokens',
31
+ 'x-ratelimit-remaining-project-tokens',
32
+ 'x-ratelimit-reset-project-tokens',
33
+ ] as const;
34
+
35
+ interface ActiveReservationTotals {
36
+ requests: number;
37
+ tokens: number;
38
+ }
39
+
40
+ interface CapacityDelay {
41
+ delaySeconds: number;
42
+ resetAt: Date | null;
43
+ reason: string;
44
+ }
45
+
46
+ /**
47
+ * Conservative local limit used when a provider publishes a limit but omits it
48
+ * from response headers for a known model/endpoint bucket.
49
+ */
50
+ interface ProviderDefaultRateLimit {
51
+ limitRequests: number | null;
52
+ limitTokens: number | null;
53
+ windowMs: number;
54
+ source: string;
55
+ }
56
+
57
+ /**
58
+ * Coordinates OpenAI provider calls against the latest observed rate-limit state.
59
+ */
60
+ export class AIRateLimiter {
61
+ /**
62
+ * Reserves capacity for one provider request.
63
+ *
64
+ * @param input - Provider endpoint, model, and estimated request size.
65
+ * @returns Reservation lease that must be observed or released after the call.
66
+ */
67
+ async acquire(input: AIRateLimitAcquireInput): Promise<AIRateLimitLease> {
68
+ const provider = input.provider ?? AI_PROVIDER.openai;
69
+ const bucketKey = aiRateLimitBucketKey(provider, input.endpoint, input.model);
70
+ const estimatedTokens = normalizeReservedTokens(input.estimatedTokens);
71
+
72
+ if (process.env.AI_RATE_LIMITER_DISABLED === 'true') {
73
+ return emptyLease(input, bucketKey);
74
+ }
75
+
76
+ return await app().db.transaction(async database => {
77
+ const now = new Date();
78
+ const bucket = await this.findOrCreateBucket({
79
+ provider,
80
+ endpoint: input.endpoint,
81
+ limitKey: input.model,
82
+ bucketKey,
83
+ });
84
+ const defaultRateLimit = providerDefaultRateLimit(provider, input.endpoint, input.model);
85
+
86
+ if (defaultRateLimit && applyDefaultRateLimitBucketState(bucket, defaultRateLimit, now)) {
87
+ await bucket.save();
88
+ }
89
+
90
+ const activeReservations = await activeReservationTotals(String(bucket.id), now);
91
+ const delay = capacityDelay(bucket, activeReservations, estimatedTokens, now);
92
+
93
+ if (delay) {
94
+ throw new AIRateLimitDeferredError(
95
+ delay.delaySeconds,
96
+ bucketKey,
97
+ delay.resetAt,
98
+ `AI rate limit bucket "${bucketKey}" is waiting for ${delay.reason}.`,
99
+ );
100
+ }
101
+
102
+ const reservation = await new AiRateLimitReservation({
103
+ bucket,
104
+ aiRequest: input.aiRequest ?? null,
105
+ operation: input.operation,
106
+ reservedRequests: 1,
107
+ reservedTokens: estimatedTokens,
108
+ expiresAt: new Date(now.getTime() + DEFAULT_RESERVATION_TTL_MS),
109
+ }).save();
110
+
111
+ return {
112
+ bucketKey,
113
+ bucket,
114
+ reservation,
115
+ endpoint: input.endpoint,
116
+ model: input.model,
117
+ operation: input.operation,
118
+ };
119
+ });
120
+ }
121
+
122
+ /**
123
+ * Updates bucket state from provider response headers and releases the lease.
124
+ *
125
+ * @param lease - Reservation returned from acquire().
126
+ * @param metadata - Parsed response header metadata.
127
+ */
128
+ async observe(
129
+ lease: AIRateLimitLease | null,
130
+ metadata: AIProviderResponseMetadata,
131
+ ): Promise<void> {
132
+ if (!lease?.bucket) return;
133
+
134
+ try {
135
+ const defaultRateLimit = providerDefaultRateLimit(
136
+ lease.bucket.provider as AIProvider,
137
+ lease.endpoint,
138
+ lease.model,
139
+ );
140
+ const shouldStoreMetadata = Boolean(metadata.rateLimitSnapshot || metadata.providerRequestId);
141
+
142
+ if (shouldStoreMetadata) {
143
+ applyRateLimitMetadata(lease.bucket, metadata);
144
+ }
145
+
146
+ const shouldConsumeDefault = defaultRateLimit
147
+ ? consumeDefaultRateLimitCapacity(
148
+ lease.bucket,
149
+ defaultRateLimit,
150
+ lease.reservation?.reservedTokens ?? 0,
151
+ metadata.rateLimitSnapshot,
152
+ new Date(),
153
+ )
154
+ : false;
155
+
156
+ if (shouldConsumeDefault || shouldStoreMetadata) {
157
+ await lease.bucket.save();
158
+ }
159
+ } finally {
160
+ await this.release(lease);
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Releases a lease without changing bucket state.
166
+ *
167
+ * @param lease - Reservation returned from acquire().
168
+ */
169
+ async release(lease: AIRateLimitLease | null): Promise<void> {
170
+ if (!lease?.reservation?.id) return;
171
+
172
+ if (!lease.reservation.releasedAt) {
173
+ lease.reservation.assign({
174
+ releasedAt: new Date(),
175
+ });
176
+
177
+ await lease.reservation.save();
178
+ }
179
+
180
+ try {
181
+ await AiRateLimitReservation.cleanupReleasedAndExpired();
182
+ } catch {
183
+ // The row is already released, so cleanup should not fail completed AI calls.
184
+ }
185
+ }
186
+
187
+ /**
188
+ * Finds or creates a bucket row in the current database scope.
189
+ *
190
+ * @param input - Stable bucket identity.
191
+ * @returns Persisted bucket row.
192
+ */
193
+ private async findOrCreateBucket(input: {
194
+ provider: AIProvider;
195
+ endpoint: AiRateLimitEndpoint;
196
+ limitKey: string;
197
+ bucketKey: string;
198
+ }): Promise<AiRateLimitBucket> {
199
+ const existing = await lockedBucket(input.bucketKey);
200
+
201
+ if (existing) return existing;
202
+
203
+ try {
204
+ return await new AiRateLimitBucket({
205
+ bucketKey: input.bucketKey,
206
+ provider: input.provider,
207
+ endpoint: input.endpoint,
208
+ limitKey: input.limitKey,
209
+ }).save();
210
+ } catch (error) {
211
+ const raced = await lockedBucket(input.bucketKey);
212
+
213
+ if (raced) return raced;
214
+
215
+ throw error;
216
+ }
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Rate-limit deferral that also satisfies the framework queue retry-later contract.
222
+ */
223
+ export class AIRateLimitDeferredError extends QueueRetryLaterError {
224
+ /**
225
+ * Create a provider rate-limit deferral.
226
+ *
227
+ * @param delaySeconds - Number of seconds before retrying the provider call.
228
+ * @param bucketKey - Rate-limit bucket that caused the deferral.
229
+ * @param resetAt - Absolute provider reset time, when known.
230
+ * @param message - Human-readable explanation.
231
+ */
232
+ constructor(
233
+ delaySeconds: number,
234
+ readonly bucketKey: string,
235
+ readonly resetAt: Date | null,
236
+ message: string,
237
+ ) {
238
+ super(delaySeconds, message);
239
+ this.name = 'AIRateLimitDeferredError';
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Builds the stable bucket key used to separate provider endpoint families.
245
+ *
246
+ * @param provider - AI provider id.
247
+ * @param endpoint - Provider endpoint family.
248
+ * @param limitKey - Model or shared-limit key.
249
+ * @returns Stable bucket key.
250
+ */
251
+ export function aiRateLimitBucketKey(
252
+ provider: AIProvider,
253
+ endpoint: AiRateLimitEndpoint,
254
+ limitKey: string,
255
+ ): string {
256
+ return `${provider}:${endpoint}:${limitKey}`;
257
+ }
258
+
259
+ /**
260
+ * Extracts request-id and rate-limit metadata from provider response headers.
261
+ *
262
+ * @param headers - HTTP response headers.
263
+ * @param observedAt - Time the response was observed.
264
+ * @returns Parsed provider metadata.
265
+ */
266
+ export function providerResponseMetadata(
267
+ headers: Headers,
268
+ observedAt: Date = new Date(),
269
+ ): AIProviderResponseMetadata {
270
+ const providerRequestId = headerString(headers, 'x-request-id');
271
+ const providerProcessingMs = integerHeader(headers, 'openai-processing-ms');
272
+
273
+ return {
274
+ providerRequestId,
275
+ providerProcessingMs,
276
+ rateLimitSnapshot: parseAIRateLimitHeaders(headers, observedAt),
277
+ };
278
+ }
279
+
280
+ /**
281
+ * Parses OpenAI x-ratelimit response headers into a JSON-safe snapshot.
282
+ *
283
+ * @param headers - HTTP response headers.
284
+ * @param observedAt - Time the response was observed.
285
+ * @returns Parsed snapshot, or null when no rate-limit headers are present.
286
+ */
287
+ export function parseAIRateLimitHeaders(
288
+ headers: Headers,
289
+ observedAt: Date = new Date(),
290
+ ): AIRateLimitSnapshot | null {
291
+ const rawHeaders = rateLimitHeaders(headers);
292
+
293
+ if (Object.keys(rawHeaders).length === 0) return null;
294
+
295
+ const requestsResetAfterMs = resetHeaderMs(headers, 'x-ratelimit-reset-requests');
296
+ const tokensResetAfterMs = resetHeaderMs(headers, 'x-ratelimit-reset-tokens');
297
+ const projectTokensResetAfterMs = resetHeaderMs(headers, 'x-ratelimit-reset-project-tokens');
298
+
299
+ return {
300
+ observedAt: observedAt.toISOString(),
301
+ headers: rawHeaders,
302
+ limitRequests: integerHeader(headers, 'x-ratelimit-limit-requests'),
303
+ remainingRequests: integerHeader(headers, 'x-ratelimit-remaining-requests'),
304
+ requestsResetAfterMs,
305
+ requestsResetAt: resetAtIso(observedAt, requestsResetAfterMs),
306
+ limitTokens: integerHeader(headers, 'x-ratelimit-limit-tokens'),
307
+ remainingTokens: integerHeader(headers, 'x-ratelimit-remaining-tokens'),
308
+ tokensResetAfterMs,
309
+ tokensResetAt: resetAtIso(observedAt, tokensResetAfterMs),
310
+ limitProjectTokens: integerHeader(headers, 'x-ratelimit-limit-project-tokens'),
311
+ remainingProjectTokens: integerHeader(headers, 'x-ratelimit-remaining-project-tokens'),
312
+ projectTokensResetAfterMs,
313
+ projectTokensResetAt: resetAtIso(observedAt, projectTokensResetAfterMs),
314
+ };
315
+ }
316
+
317
+ /**
318
+ * Parses OpenAI reset duration headers such as "1s", "6m0s", or "250ms".
319
+ *
320
+ * @param value - Header duration value.
321
+ * @returns Duration in milliseconds, or null when unparseable.
322
+ */
323
+ export function parseRateLimitResetMs(value: string | null): number | null {
324
+ if (!value) return null;
325
+
326
+ const normalized = value.trim().toLowerCase();
327
+ const pattern = /(\d+(?:\.\d+)?)(ms|s|m|h)/g;
328
+ let match: RegExpExecArray | null;
329
+ let total = 0;
330
+ let matched = false;
331
+
332
+ while ((match = pattern.exec(normalized)) !== null) {
333
+ matched = true;
334
+ const amount = Number(match[1]);
335
+ const unit = match[2];
336
+
337
+ if (!Number.isFinite(amount)) continue;
338
+
339
+ if (unit === 'ms') total += amount;
340
+ if (unit === 's') total += amount * 1000;
341
+ if (unit === 'm') total += amount * 60 * 1000;
342
+ if (unit === 'h') total += amount * 60 * 60 * 1000;
343
+ }
344
+
345
+ if (!matched) return null;
346
+
347
+ return Math.max(0, Math.ceil(total));
348
+ }
349
+
350
+ /**
351
+ * Returns the endpoint constant for Responses API calls.
352
+ *
353
+ * @returns Responses endpoint value.
354
+ */
355
+ export function responsesRateLimitEndpoint(): AiRateLimitEndpoint {
356
+ return AI_RATE_LIMIT_ENDPOINT.responses;
357
+ }
358
+
359
+ /**
360
+ * Returns the endpoint constant for Embeddings API calls.
361
+ *
362
+ * @returns Embeddings endpoint value.
363
+ */
364
+ export function embeddingsRateLimitEndpoint(): AiRateLimitEndpoint {
365
+ return AI_RATE_LIMIT_ENDPOINT.embeddings;
366
+ }
367
+
368
+ /**
369
+ * Returns the endpoint constant for Images API calls.
370
+ *
371
+ * @returns Images endpoint value.
372
+ */
373
+ export function imagesRateLimitEndpoint(): AiRateLimitEndpoint {
374
+ return AI_RATE_LIMIT_ENDPOINT.images;
375
+ }
376
+
377
+ /**
378
+ * Applies parsed provider metadata to a persisted bucket model.
379
+ *
380
+ * @param bucket - Bucket to update.
381
+ * @param metadata - Parsed provider response metadata.
382
+ */
383
+ function applyRateLimitMetadata(
384
+ bucket: AiRateLimitBucket,
385
+ metadata: AIProviderResponseMetadata,
386
+ ): void {
387
+ const snapshot = metadata.rateLimitSnapshot;
388
+ const changes: Record<string, unknown> = {
389
+ lastProviderRequestId: metadata.providerRequestId,
390
+ lastObservedAt: new Date(),
391
+ };
392
+
393
+ if (snapshot) {
394
+ assignPresentRateLimitSnapshot(changes, snapshot);
395
+ }
396
+
397
+ bucket.assign(changes);
398
+ }
399
+
400
+ /**
401
+ * Copies only observed header dimensions into a bucket update.
402
+ *
403
+ * Partial OpenAI responses should not erase dimensions that are maintained by a
404
+ * model-specific fallback, such as GPT Image 2 request-per-minute capacity.
405
+ *
406
+ * @param changes - Mutable bucket assignment object.
407
+ * @param snapshot - Parsed provider rate-limit snapshot.
408
+ */
409
+ function assignPresentRateLimitSnapshot(
410
+ changes: Record<string, unknown>,
411
+ snapshot: AIRateLimitSnapshot,
412
+ ): void {
413
+ if (snapshot.limitRequests !== null) changes.limitRequests = snapshot.limitRequests;
414
+ if (snapshot.remainingRequests !== null) changes.remainingRequests = snapshot.remainingRequests;
415
+ if (snapshot.requestsResetAt !== null) changes.requestsResetAt = new Date(snapshot.requestsResetAt);
416
+ if (snapshot.limitTokens !== null) changes.limitTokens = snapshot.limitTokens;
417
+ if (snapshot.remainingTokens !== null) changes.remainingTokens = snapshot.remainingTokens;
418
+ if (snapshot.tokensResetAt !== null) changes.tokensResetAt = new Date(snapshot.tokensResetAt);
419
+ if (snapshot.limitProjectTokens !== null) changes.limitProjectTokens = snapshot.limitProjectTokens;
420
+ if (snapshot.remainingProjectTokens !== null) changes.remainingProjectTokens = snapshot.remainingProjectTokens;
421
+ if (snapshot.projectTokensResetAt !== null) changes.projectTokensResetAt = new Date(snapshot.projectTokensResetAt);
422
+ }
423
+
424
+ /**
425
+ * Returns a conservative provider default for buckets whose headers are partial.
426
+ *
427
+ * GPT Image 2 publishes Tier 1 limits as TPM and IPM. The current image helper
428
+ * generates one image per provider call, so IPM is represented as request
429
+ * capacity for this bucket.
430
+ *
431
+ * @param provider - Provider id.
432
+ * @param endpoint - Provider endpoint family.
433
+ * @param model - Provider model or snapshot id.
434
+ * @returns Default limit details, or null when no fallback is known.
435
+ */
436
+ function providerDefaultRateLimit(
437
+ provider: AIProvider,
438
+ endpoint: AiRateLimitEndpoint,
439
+ model: string,
440
+ ): ProviderDefaultRateLimit | null {
441
+ if (
442
+ provider === AI_PROVIDER.openai
443
+ && endpoint === AI_RATE_LIMIT_ENDPOINT.images
444
+ && (model === 'gpt-image-2' || model.startsWith('gpt-image-2-'))
445
+ ) {
446
+ return OPENAI_GPT_IMAGE_2_TIER_1_RATE_LIMIT;
447
+ }
448
+
449
+ return null;
450
+ }
451
+
452
+ /**
453
+ * Initializes missing bucket dimensions from a provider default.
454
+ *
455
+ * Defaults are only used for unknown dimensions. Observed provider header values
456
+ * remain authoritative and are not lowered to the default.
457
+ *
458
+ * @param bucket - Bucket row being acquired.
459
+ * @param defaultRateLimit - Provider fallback limit.
460
+ * @param now - Current time.
461
+ * @returns True when the bucket was changed.
462
+ */
463
+ function applyDefaultRateLimitBucketState(
464
+ bucket: AiRateLimitBucket,
465
+ defaultRateLimit: ProviderDefaultRateLimit,
466
+ now: Date,
467
+ ): boolean {
468
+ let changed = false;
469
+
470
+ if (defaultRateLimit.limitRequests !== null) {
471
+ if (bucket.limitRequests === null || bucket.limitRequests === undefined) {
472
+ bucket.limitRequests = defaultRateLimit.limitRequests;
473
+ changed = true;
474
+ }
475
+
476
+ if (bucket.remainingRequests === null || bucket.remainingRequests === undefined) {
477
+ bucket.remainingRequests = defaultRateLimit.limitRequests;
478
+ changed = true;
479
+ }
480
+
481
+ if (!bucket.requestsResetAt) {
482
+ bucket.requestsResetAt = new Date(now.getTime() + defaultRateLimit.windowMs);
483
+ changed = true;
484
+ }
485
+ }
486
+
487
+ if (defaultRateLimit.limitTokens !== null) {
488
+ if (bucket.limitTokens === null || bucket.limitTokens === undefined) {
489
+ bucket.limitTokens = defaultRateLimit.limitTokens;
490
+ changed = true;
491
+ }
492
+
493
+ if (bucket.remainingTokens === null || bucket.remainingTokens === undefined) {
494
+ bucket.remainingTokens = defaultRateLimit.limitTokens;
495
+ changed = true;
496
+ }
497
+
498
+ if (!bucket.tokensResetAt) {
499
+ bucket.tokensResetAt = new Date(now.getTime() + defaultRateLimit.windowMs);
500
+ changed = true;
501
+ }
502
+ }
503
+
504
+ if (changed) {
505
+ bucket.metadata = {
506
+ ...(bucket.metadata ?? {}),
507
+ defaultRateLimit: {
508
+ source: defaultRateLimit.source,
509
+ appliedAt: now.toISOString(),
510
+ },
511
+ };
512
+ }
513
+
514
+ return changed;
515
+ }
516
+
517
+ /**
518
+ * Locally decrements fallback dimensions that were not returned by the provider.
519
+ *
520
+ * Provider response headers remain authoritative. This only maintains counters
521
+ * for missing dimensions so sequential image calls cannot bypass the Tier 1 IPM
522
+ * fallback once their short-lived reservations are released.
523
+ *
524
+ * @param bucket - Bucket row to update.
525
+ * @param defaultRateLimit - Provider fallback limit.
526
+ * @param reservedTokens - Token estimate reserved for the completed request.
527
+ * @param snapshot - Provider rate-limit snapshot, when returned.
528
+ * @param now - Current time.
529
+ * @returns True when the bucket was changed.
530
+ */
531
+ function consumeDefaultRateLimitCapacity(
532
+ bucket: AiRateLimitBucket,
533
+ defaultRateLimit: ProviderDefaultRateLimit,
534
+ reservedTokens: number,
535
+ snapshot: AIRateLimitSnapshot | null,
536
+ now: Date,
537
+ ): boolean {
538
+ let changed = applyDefaultRateLimitBucketState(bucket, defaultRateLimit, now);
539
+
540
+ if (defaultRateLimit.limitRequests !== null && missingSnapshotValue(snapshot?.remainingRequests)) {
541
+ const requestCapacity = currentWindowCapacity(
542
+ bucket.remainingRequests,
543
+ bucket.limitRequests,
544
+ bucket.requestsResetAt,
545
+ now,
546
+ ) ?? defaultRateLimit.limitRequests;
547
+
548
+ bucket.remainingRequests = Math.max(0, requestCapacity - 1);
549
+ bucket.requestsResetAt = currentOrNextReset(bucket.requestsResetAt, now, defaultRateLimit.windowMs);
550
+ changed = true;
551
+ }
552
+
553
+ if (defaultRateLimit.limitTokens !== null && reservedTokens > 0 && missingSnapshotValue(snapshot?.remainingTokens)) {
554
+ const tokenCapacity = currentWindowCapacity(
555
+ bucket.remainingTokens,
556
+ bucket.limitTokens,
557
+ bucket.tokensResetAt,
558
+ now,
559
+ ) ?? defaultRateLimit.limitTokens;
560
+
561
+ bucket.remainingTokens = Math.max(0, tokenCapacity - reservedTokens);
562
+ bucket.tokensResetAt = currentOrNextReset(bucket.tokensResetAt, now, defaultRateLimit.windowMs);
563
+ changed = true;
564
+ }
565
+
566
+ return changed;
567
+ }
568
+
569
+ /**
570
+ * Detects whether a provider snapshot omitted a rate-limit dimension.
571
+ *
572
+ * @param value - Parsed snapshot value.
573
+ * @returns True when the dimension was not supplied by the provider.
574
+ */
575
+ function missingSnapshotValue(value: number | null | undefined): boolean {
576
+ return value === null || value === undefined;
577
+ }
578
+
579
+ /**
580
+ * Returns the usable remaining capacity for a possibly elapsed local window.
581
+ *
582
+ * @param remaining - Stored remaining count.
583
+ * @param limit - Stored limit count.
584
+ * @param resetAt - Stored reset time.
585
+ * @param now - Current time.
586
+ * @returns Current capacity or null when unknown.
587
+ */
588
+ function currentWindowCapacity(
589
+ remaining: number | null,
590
+ limit: number | null,
591
+ resetAt: Date | null,
592
+ now: Date,
593
+ ): number | null {
594
+ if (remaining === null || remaining === undefined) return null;
595
+
596
+ if (resetAt && resetAt.getTime() <= now.getTime()) {
597
+ return limit ?? remaining;
598
+ }
599
+
600
+ return remaining;
601
+ }
602
+
603
+ /**
604
+ * Keeps an existing future reset or starts a new local fallback window.
605
+ *
606
+ * @param resetAt - Existing reset timestamp.
607
+ * @param now - Current time.
608
+ * @param windowMs - Fallback window duration.
609
+ * @returns Future reset timestamp.
610
+ */
611
+ function currentOrNextReset(
612
+ resetAt: Date | null,
613
+ now: Date,
614
+ windowMs: number,
615
+ ): Date {
616
+ if (resetAt && resetAt.getTime() > now.getTime()) return resetAt;
617
+
618
+ return new Date(now.getTime() + windowMs);
619
+ }
620
+
621
+ /**
622
+ * Reads an existing bucket row with a row-level lock.
623
+ *
624
+ * @param bucketKey - Stable bucket key.
625
+ * @returns Locked bucket, or null when not found.
626
+ */
627
+ async function lockedBucket(bucketKey: string): Promise<AiRateLimitBucket | null> {
628
+ const row = await AiRateLimitBucket
629
+ .where('bucketKey', bucketKey)
630
+ .toKnex()
631
+ .forUpdate()
632
+ .first();
633
+
634
+ return row ? AiRateLimitBucket.fromDb(row) : null;
635
+ }
636
+
637
+ /**
638
+ * Reads active in-flight reservations for a bucket.
639
+ *
640
+ * @param bucketId - Bucket id.
641
+ * @param now - Current time.
642
+ * @returns Active reserved request and token totals.
643
+ */
644
+ async function activeReservationTotals(
645
+ bucketId: string,
646
+ now: Date,
647
+ ): Promise<ActiveReservationTotals> {
648
+ const row = await ActiveRecord.getDb()(AiRateLimitReservation.table)
649
+ .where('bucket_id', bucketId)
650
+ .whereNull('released_at')
651
+ .where('expires_at', '>', now)
652
+ .sum({
653
+ requests: 'reserved_requests',
654
+ tokens: 'reserved_tokens',
655
+ })
656
+ .first() as { requests?: string | number | null; tokens?: string | number | null } | undefined;
657
+
658
+ return {
659
+ requests: numberOrZero(row?.requests),
660
+ tokens: numberOrZero(row?.tokens),
661
+ };
662
+ }
663
+
664
+ /**
665
+ * Determines whether a bucket has enough capacity for another request.
666
+ *
667
+ * @param bucket - Current bucket state.
668
+ * @param reservations - Active in-flight reservations.
669
+ * @param estimatedTokens - Estimated tokens for the next call.
670
+ * @param now - Current time.
671
+ * @returns Delay details when the request should be deferred.
672
+ */
673
+ function capacityDelay(
674
+ bucket: AiRateLimitBucket,
675
+ reservations: ActiveReservationTotals,
676
+ estimatedTokens: number,
677
+ now: Date,
678
+ ): CapacityDelay | null {
679
+ const delays: CapacityDelay[] = [];
680
+ const requestsRemaining = effectiveRemaining(bucket.remainingRequests, bucket.limitRequests, bucket.requestsResetAt, now);
681
+ const tokensRemaining = effectiveRemaining(bucket.remainingTokens, bucket.limitTokens, bucket.tokensResetAt, now);
682
+ const projectTokensRemaining = effectiveRemaining(bucket.remainingProjectTokens, bucket.limitProjectTokens, bucket.projectTokensResetAt, now);
683
+
684
+ if (requestsRemaining === null && reservations.requests >= 1) {
685
+ delays.push({
686
+ delaySeconds: UNKNOWN_ACTIVE_BUCKET_DELAY_SECONDS,
687
+ resetAt: null,
688
+ reason: 'initial request observation',
689
+ });
690
+ } else if (requestsRemaining !== null && requestsRemaining - reservations.requests < 1) {
691
+ delays.push(delayForReset(bucket.requestsResetAt, now, 'request reset'));
692
+ }
693
+
694
+ if (estimatedTokens > 0 && tokensRemaining !== null && tokensRemaining - reservations.tokens < estimatedTokens) {
695
+ delays.push(delayForReset(bucket.tokensResetAt, now, 'token reset'));
696
+ }
697
+
698
+ if (estimatedTokens > 0 && projectTokensRemaining !== null && projectTokensRemaining - reservations.tokens < estimatedTokens) {
699
+ delays.push(delayForReset(bucket.projectTokensResetAt, now, 'project token reset'));
700
+ }
701
+
702
+ if (delays.length === 0) return null;
703
+
704
+ return delays.reduce((latest, candidate) => {
705
+ return candidate.delaySeconds > latest.delaySeconds ? candidate : latest;
706
+ });
707
+ }
708
+
709
+ /**
710
+ * Returns current effective remaining capacity after a reset window elapses.
711
+ *
712
+ * @param remaining - Last observed remaining capacity.
713
+ * @param limit - Last observed maximum capacity.
714
+ * @param resetAt - Last observed reset time.
715
+ * @param now - Current time.
716
+ * @returns Effective remaining capacity, or null when unknown.
717
+ */
718
+ function effectiveRemaining(
719
+ remaining: number | null,
720
+ limit: number | null,
721
+ resetAt: Date | null,
722
+ now: Date,
723
+ ): number | null {
724
+ if (remaining === null || remaining === undefined) return null;
725
+
726
+ if (resetAt && resetAt.getTime() <= now.getTime()) {
727
+ return limit ?? remaining;
728
+ }
729
+
730
+ return remaining;
731
+ }
732
+
733
+ /**
734
+ * Builds a delay instruction from a reset timestamp.
735
+ *
736
+ * @param resetAt - Reset time, when known.
737
+ * @param now - Current time.
738
+ * @param reason - Delay reason.
739
+ * @returns Capacity delay details.
740
+ */
741
+ function delayForReset(
742
+ resetAt: Date | null,
743
+ now: Date,
744
+ reason: string,
745
+ ): CapacityDelay {
746
+ if (!resetAt) {
747
+ return {
748
+ delaySeconds: UNKNOWN_RESET_DELAY_SECONDS,
749
+ resetAt: null,
750
+ reason,
751
+ };
752
+ }
753
+
754
+ return {
755
+ delaySeconds: Math.max(1, Math.ceil((resetAt.getTime() - now.getTime()) / 1000)),
756
+ resetAt,
757
+ reason,
758
+ };
759
+ }
760
+
761
+ /**
762
+ * Creates an inert lease when the limiter is disabled.
763
+ *
764
+ * @param input - Provider request identity.
765
+ * @param bucketKey - Stable bucket key.
766
+ * @returns Empty lease.
767
+ */
768
+ function emptyLease(
769
+ input: AIRateLimitAcquireInput,
770
+ bucketKey: string,
771
+ ): AIRateLimitLease {
772
+ return {
773
+ bucketKey,
774
+ bucket: null,
775
+ reservation: null,
776
+ endpoint: input.endpoint,
777
+ model: input.model,
778
+ operation: input.operation,
779
+ };
780
+ }
781
+
782
+ /**
783
+ * Normalizes an estimated token count for reservation storage.
784
+ *
785
+ * @param value - Unknown estimated token count.
786
+ * @returns Non-negative integer token count.
787
+ */
788
+ function normalizeReservedTokens(value: number | null | undefined): number {
789
+ return typeof value === 'number' && Number.isFinite(value) && value > 0
790
+ ? Math.ceil(value)
791
+ : 0;
792
+ }
793
+
794
+ /**
795
+ * Reads all OpenAI rate-limit headers into a plain object.
796
+ *
797
+ * @param headers - HTTP response headers.
798
+ * @returns Present rate-limit headers keyed by lower-case header name.
799
+ */
800
+ function rateLimitHeaders(headers: Headers): Record<string, string> {
801
+ const result: Record<string, string> = {};
802
+
803
+ for (const name of RATE_LIMIT_HEADER_NAMES) {
804
+ const value = headerString(headers, name);
805
+
806
+ if (value !== null) {
807
+ result[name] = value;
808
+ }
809
+ }
810
+
811
+ return result;
812
+ }
813
+
814
+ /**
815
+ * Reads a trimmed string header.
816
+ *
817
+ * @param headers - HTTP response headers.
818
+ * @param name - Header name.
819
+ * @returns Header value or null.
820
+ */
821
+ function headerString(headers: Headers, name: string): string | null {
822
+ const value = headers.get(name);
823
+
824
+ return value && value.trim() ? value.trim() : null;
825
+ }
826
+
827
+ /**
828
+ * Reads an integer header value.
829
+ *
830
+ * @param headers - HTTP response headers.
831
+ * @param name - Header name.
832
+ * @returns Integer header value or null.
833
+ */
834
+ function integerHeader(headers: Headers, name: string): number | null {
835
+ const value = headerString(headers, name);
836
+ const number = value === null ? NaN : Number(value);
837
+
838
+ return Number.isFinite(number) ? Math.trunc(number) : null;
839
+ }
840
+
841
+ /**
842
+ * Parses a reset duration header.
843
+ *
844
+ * @param headers - HTTP response headers.
845
+ * @param name - Header name.
846
+ * @returns Reset duration in milliseconds or null.
847
+ */
848
+ function resetHeaderMs(headers: Headers, name: string): number | null {
849
+ return parseRateLimitResetMs(headerString(headers, name));
850
+ }
851
+
852
+ /**
853
+ * Converts a reset duration into an absolute ISO timestamp.
854
+ *
855
+ * @param observedAt - Time the response was observed.
856
+ * @param resetAfterMs - Duration until reset.
857
+ * @returns Reset ISO timestamp or null.
858
+ */
859
+ function resetAtIso(observedAt: Date, resetAfterMs: number | null): string | null {
860
+ return resetAfterMs === null
861
+ ? null
862
+ : new Date(observedAt.getTime() + resetAfterMs).toISOString();
863
+ }
864
+
865
+ /**
866
+ * Converts nullable aggregate values to numbers.
867
+ *
868
+ * @param value - Aggregate value returned by the database.
869
+ * @returns Number or zero.
870
+ */
871
+ function numberOrZero(value: string | number | null | undefined): number {
872
+ if (typeof value === 'number' && Number.isFinite(value)) return value;
873
+ if (typeof value === 'string' && value.trim()) {
874
+ const number = Number(value);
875
+
876
+ return Number.isFinite(number) ? number : 0;
877
+ }
878
+
879
+ return 0;
880
+ }