@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.
- package/LICENSE +31 -0
- package/README.md +241 -0
- package/agent-instructions.md +69 -0
- package/bin/db3-agents.mjs +140 -0
- package/bin/db3.mjs +11 -0
- package/dist/ai/AIErrors.d.ts +33 -0
- package/dist/ai/AIErrors.js +43 -0
- package/dist/ai/AIFailover.d.ts +25 -0
- package/dist/ai/AIFailover.js +96 -0
- package/dist/ai/AIProviders.d.ts +35 -0
- package/dist/ai/AIProviders.js +197 -0
- package/dist/ai/AIQuotaDeferredError.d.ts +19 -0
- package/dist/ai/AIQuotaDeferredError.js +25 -0
- package/dist/ai/AIRateLimiter.d.ts +103 -0
- package/dist/ai/AIRateLimiter.js +690 -0
- package/dist/ai/Agent.d.ts +633 -0
- package/dist/ai/Agent.js +2976 -0
- package/dist/ai/AgentHistory.d.ts +11 -0
- package/dist/ai/AgentHistory.js +495 -0
- package/dist/ai/AgentRunJob.d.ts +21 -0
- package/dist/ai/AgentRunJob.js +53 -0
- package/dist/ai/Ai.d.ts +375 -0
- package/dist/ai/Ai.js +1771 -0
- package/dist/ai/AiConversation.d.ts +17 -0
- package/dist/ai/AiConversation.js +38 -0
- package/dist/ai/AiExecutionContext.d.ts +7 -0
- package/dist/ai/AiExecutionContext.js +16 -0
- package/dist/ai/AiMessage.d.ts +43 -0
- package/dist/ai/AiMessage.js +105 -0
- package/dist/ai/AiRateLimitBucket.d.ts +69 -0
- package/dist/ai/AiRateLimitBucket.js +138 -0
- package/dist/ai/AiRateLimitReservation.d.ts +56 -0
- package/dist/ai/AiRateLimitReservation.js +101 -0
- package/dist/ai/AiRequest.d.ts +78 -0
- package/dist/ai/AiRequest.js +384 -0
- package/dist/ai/Estimates.d.ts +26 -0
- package/dist/ai/Estimates.js +34 -0
- package/dist/ai/Models.d.ts +88 -0
- package/dist/ai/Models.js +328 -0
- package/dist/ai/OpenAIProviderError.d.ts +30 -0
- package/dist/ai/OpenAIProviderError.js +77 -0
- package/dist/ai/OpenAIQuotaRetry.d.ts +27 -0
- package/dist/ai/OpenAIQuotaRetry.js +144 -0
- package/dist/ai/ProviderCosts.d.ts +55 -0
- package/dist/ai/ProviderCosts.js +108 -0
- package/dist/ai/ResponsesProviderCall.d.ts +13 -0
- package/dist/ai/ResponsesProviderCall.js +29 -0
- package/dist/ai/agentCitations.d.ts +27 -0
- package/dist/ai/agentCitations.js +153 -0
- package/dist/ai/contracts/AI.d.ts +347 -0
- package/dist/ai/contracts/AI.js +13 -0
- package/dist/ai/contracts/Agent.d.ts +476 -0
- package/dist/ai/contracts/Agent.js +1 -0
- package/dist/ai/contracts/AiRequestRunCostSummary.d.ts +31 -0
- package/dist/ai/contracts/AiRequestRunCostSummary.js +1 -0
- package/dist/ai/contracts/Pricing.d.ts +88 -0
- package/dist/ai/contracts/Pricing.js +1 -0
- package/dist/ai/contracts/Providers.d.ts +68 -0
- package/dist/ai/contracts/Providers.js +1 -0
- package/dist/ai/contracts/QuotaRetry.d.ts +38 -0
- package/dist/ai/contracts/QuotaRetry.js +1 -0
- package/dist/ai/contracts/RateLimits.d.ts +45 -0
- package/dist/ai/contracts/RateLimits.js +1 -0
- package/dist/ai/contracts/ResponsesProviderCall.d.ts +28 -0
- package/dist/ai/contracts/ResponsesProviderCall.js +1 -0
- package/dist/ai/contracts/index.d.ts +8 -0
- package/dist/ai/contracts/index.js +8 -0
- package/dist/ai/index.d.ts +27 -0
- package/dist/ai/index.js +27 -0
- package/dist/ai/registry.d.ts +28 -0
- package/dist/ai/registry.js +49 -0
- package/dist/ai/sdkNodeCompatibility.d.ts +76 -0
- package/dist/ai/toolCallRecovery.d.ts +16 -0
- package/dist/ai/toolCallRecovery.js +71 -0
- package/dist/ai/toolHelpers.d.ts +65 -0
- package/dist/ai/toolHelpers.js +106 -0
- package/dist/auth/Auth.d.ts +641 -0
- package/dist/auth/Auth.js +927 -0
- package/dist/auth/AuthProvider.d.ts +104 -0
- package/dist/auth/AuthProvider.js +185 -0
- package/dist/auth/AuthToken.d.ts +123 -0
- package/dist/auth/AuthToken.js +156 -0
- package/dist/auth/PasswordResetToken.d.ts +33 -0
- package/dist/auth/PasswordResetToken.js +64 -0
- package/dist/auth/UserIdentity.d.ts +46 -0
- package/dist/auth/UserIdentity.js +72 -0
- package/dist/auth/contracts/AuthProviderDriver.d.ts +94 -0
- package/dist/auth/contracts/AuthProviderDriver.js +1 -0
- package/dist/auth/contracts/index.d.ts +1 -0
- package/dist/auth/contracts/index.js +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/passwordHash.d.ts +26 -0
- package/dist/auth/passwordHash.js +96 -0
- package/dist/auth/providers/GoogleAuthProvider.d.ts +135 -0
- package/dist/auth/providers/GoogleAuthProvider.js +305 -0
- package/dist/auth/providers/PasswordAuthProvider.d.ts +115 -0
- package/dist/auth/providers/PasswordAuthProvider.js +195 -0
- package/dist/auth/providers/index.d.ts +3 -0
- package/dist/auth/providers/index.js +3 -0
- package/dist/auth/providers/resolveAuthProviders.d.ts +29 -0
- package/dist/auth/providers/resolveAuthProviders.js +111 -0
- package/dist/cache/Cache.d.ts +67 -0
- package/dist/cache/Cache.js +115 -0
- package/dist/cache/contracts/CacheDriver.d.ts +10 -0
- package/dist/cache/contracts/CacheDriver.js +1 -0
- package/dist/cache/contracts/CacheOperations.d.ts +26 -0
- package/dist/cache/contracts/CacheOperations.js +1 -0
- package/dist/cache/contracts/CacheOptions.d.ts +51 -0
- package/dist/cache/contracts/CacheOptions.js +1 -0
- package/dist/cache/contracts/CacheRepository.d.ts +45 -0
- package/dist/cache/contracts/CacheRepository.js +1 -0
- package/dist/cache/contracts/index.d.ts +4 -0
- package/dist/cache/contracts/index.js +4 -0
- package/dist/cache/drivers/CacheManagerDriver.d.ts +55 -0
- package/dist/cache/drivers/CacheManagerDriver.js +68 -0
- package/dist/cache/drivers/createCacheDriver.d.ts +8 -0
- package/dist/cache/drivers/createCacheDriver.js +147 -0
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.js +2 -0
- package/dist/cli/Cli.d.ts +17 -0
- package/dist/cli/Cli.js +120 -0
- package/dist/cli/commands/repl.d.ts +9 -0
- package/dist/cli/commands/repl.js +27 -0
- package/dist/cli/contracts/CliCommand.d.ts +30 -0
- package/dist/cli/contracts/CliCommand.js +1 -0
- package/dist/cli/contracts/CliConfig.d.ts +9 -0
- package/dist/cli/contracts/CliConfig.js +1 -0
- package/dist/cli/contracts/CliOptions.d.ts +13 -0
- package/dist/cli/contracts/CliOptions.js +1 -0
- package/dist/cli/contracts/CommandDefinition.d.ts +18 -0
- package/dist/cli/contracts/CommandDefinition.js +1 -0
- package/dist/cli/contracts/ReplOptions.d.ts +11 -0
- package/dist/cli/contracts/ReplOptions.js +1 -0
- package/dist/cli/contracts/index.d.ts +5 -0
- package/dist/cli/contracts/index.js +1 -0
- package/dist/cli/defineCommand.d.ts +10 -0
- package/dist/cli/defineCommand.js +25 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.js +5 -0
- package/dist/cli/runDb3.d.ts +11 -0
- package/dist/cli/runDb3.js +70 -0
- package/dist/cli/runRepl.d.ts +12 -0
- package/dist/cli/runRepl.js +54 -0
- package/dist/config/Config.d.ts +48 -0
- package/dist/config/Config.js +80 -0
- package/dist/config/env.d.ts +26 -0
- package/dist/config/env.js +117 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +2 -0
- package/dist/db/ActiveProjection.d.ts +90 -0
- package/dist/db/ActiveProjection.js +134 -0
- package/dist/db/ActiveQueryBuilder.d.ts +268 -0
- package/dist/db/ActiveQueryBuilder.js +621 -0
- package/dist/db/ActiveRecord.d.ts +483 -0
- package/dist/db/ActiveRecord.js +765 -0
- package/dist/db/Database.d.ts +277 -0
- package/dist/db/Database.js +827 -0
- package/dist/db/FieldType.d.ts +540 -0
- package/dist/db/FieldType.js +706 -0
- package/dist/db/SoftDeletes.d.ts +30 -0
- package/dist/db/SoftDeletes.js +93 -0
- package/dist/db/commands/check.d.ts +6 -0
- package/dist/db/commands/check.js +8 -0
- package/dist/db/commands/index.d.ts +6 -0
- package/dist/db/commands/index.js +17 -0
- package/dist/db/commands/makeMigration.d.ts +7 -0
- package/dist/db/commands/makeMigration.js +9 -0
- package/dist/db/commands/migrate.d.ts +6 -0
- package/dist/db/commands/migrate.js +8 -0
- package/dist/db/connection.d.ts +10 -0
- package/dist/db/connection.js +55 -0
- package/dist/db/contracts/ActiveRecordDefinition.d.ts +64 -0
- package/dist/db/contracts/ActiveRecordDefinition.js +1 -0
- package/dist/db/contracts/DatabaseBackup.d.ts +7 -0
- package/dist/db/contracts/DatabaseBackup.js +1 -0
- package/dist/db/contracts/DatabaseMigrationsConfig.d.ts +9 -0
- package/dist/db/contracts/DatabaseMigrationsConfig.js +1 -0
- package/dist/db/contracts/index.d.ts +3 -0
- package/dist/db/contracts/index.js +3 -0
- package/dist/db/dialects/columnTypes.d.ts +20 -0
- package/dist/db/dialects/columnTypes.js +67 -0
- package/dist/db/dialects/index.d.ts +6 -0
- package/dist/db/dialects/index.js +6 -0
- package/dist/db/dialects/mariadb.d.ts +7 -0
- package/dist/db/dialects/mariadb.js +35 -0
- package/dist/db/dialects/mysql.d.ts +14 -0
- package/dist/db/dialects/mysql.js +203 -0
- package/dist/db/dialects/postgres.d.ts +5 -0
- package/dist/db/dialects/postgres.js +106 -0
- package/dist/db/dialects/resolveDialect.d.ts +14 -0
- package/dist/db/dialects/resolveDialect.js +57 -0
- package/dist/db/dialects/types.d.ts +44 -0
- package/dist/db/dialects/types.js +1 -0
- package/dist/db/errors.d.ts +15 -0
- package/dist/db/errors.js +20 -0
- package/dist/db/fields/BooleanField.d.ts +29 -0
- package/dist/db/fields/BooleanField.js +89 -0
- package/dist/db/fields/CharUuidField.d.ts +29 -0
- package/dist/db/fields/CharUuidField.js +63 -0
- package/dist/db/fields/ChoiceStringField.d.ts +25 -0
- package/dist/db/fields/ChoiceStringField.js +58 -0
- package/dist/db/fields/DecimalField.d.ts +20 -0
- package/dist/db/fields/DecimalField.js +105 -0
- package/dist/db/fields/EmailField.d.ts +31 -0
- package/dist/db/fields/EmailField.js +52 -0
- package/dist/db/fields/EncryptedJsonField.d.ts +82 -0
- package/dist/db/fields/EncryptedJsonField.js +169 -0
- package/dist/db/fields/IntegerField.d.ts +35 -0
- package/dist/db/fields/IntegerField.js +139 -0
- package/dist/db/fields/JsonField.d.ts +40 -0
- package/dist/db/fields/JsonField.js +79 -0
- package/dist/db/fields/JsonStringField.d.ts +21 -0
- package/dist/db/fields/JsonStringField.js +41 -0
- package/dist/db/fields/LinkField.d.ts +180 -0
- package/dist/db/fields/LinkField.js +359 -0
- package/dist/db/fields/PasswordField.d.ts +93 -0
- package/dist/db/fields/PasswordField.js +180 -0
- package/dist/db/fields/StringField.d.ts +43 -0
- package/dist/db/fields/StringField.js +102 -0
- package/dist/db/fields/StringListField.d.ts +54 -0
- package/dist/db/fields/StringListField.js +124 -0
- package/dist/db/fields/TextField.d.ts +25 -0
- package/dist/db/fields/TextField.js +44 -0
- package/dist/db/fields/TimestampField.d.ts +47 -0
- package/dist/db/fields/TimestampField.js +97 -0
- package/dist/db/fields/UlidField.d.ts +69 -0
- package/dist/db/fields/UlidField.js +114 -0
- package/dist/db/fields/UrlField.d.ts +30 -0
- package/dist/db/fields/UrlField.js +61 -0
- package/dist/db/fields/VectorField.d.ts +64 -0
- package/dist/db/fields/VectorField.js +180 -0
- package/dist/db/fields/createField.d.ts +2 -0
- package/dist/db/fields/createField.js +13 -0
- package/dist/db/fields/field.d.ts +36 -0
- package/dist/db/fields/field.js +101 -0
- package/dist/db/fields/index.d.ts +18 -0
- package/dist/db/fields/index.js +18 -0
- package/dist/db/fields/resolveFields.d.ts +17 -0
- package/dist/db/fields/resolveFields.js +38 -0
- package/dist/db/index.d.ts +13 -0
- package/dist/db/index.js +13 -0
- package/dist/db/migrations/DatabaseMigrationManager.d.ts +57 -0
- package/dist/db/migrations/DatabaseMigrationManager.js +589 -0
- package/dist/db/migrations/DatabaseSchemaInspector.d.ts +19 -0
- package/dist/db/migrations/DatabaseSchemaInspector.js +384 -0
- package/dist/db/migrations/KnexMigrationRenderer.d.ts +11 -0
- package/dist/db/migrations/KnexMigrationRenderer.js +390 -0
- package/dist/db/migrations/ModelSchemaCollector.d.ts +29 -0
- package/dist/db/migrations/ModelSchemaCollector.js +183 -0
- package/dist/db/migrations/SchemaDiffer.d.ts +13 -0
- package/dist/db/migrations/SchemaDiffer.js +427 -0
- package/dist/db/migrations/SchemaNames.d.ts +27 -0
- package/dist/db/migrations/SchemaNames.js +46 -0
- package/dist/db/migrations/SchemaSnapshotSerializer.d.ts +30 -0
- package/dist/db/migrations/SchemaSnapshotSerializer.js +49 -0
- package/dist/db/migrations/contracts/DatabaseMigration.d.ts +118 -0
- package/dist/db/migrations/contracts/DatabaseMigration.js +1 -0
- package/dist/db/migrations/contracts/SchemaChange.d.ts +83 -0
- package/dist/db/migrations/contracts/SchemaChange.js +1 -0
- package/dist/db/migrations/contracts/SchemaSnapshot.d.ts +94 -0
- package/dist/db/migrations/contracts/SchemaSnapshot.js +1 -0
- package/dist/db/migrations/contracts/index.d.ts +3 -0
- package/dist/db/migrations/contracts/index.js +3 -0
- package/dist/db/migrations/errors.d.ts +35 -0
- package/dist/db/migrations/errors.js +45 -0
- package/dist/db/migrations/index.d.ts +10 -0
- package/dist/db/migrations/index.js +10 -0
- package/dist/db/migrations/promoteDestructiveSchemaChanges.d.ts +19 -0
- package/dist/db/migrations/promoteDestructiveSchemaChanges.js +102 -0
- package/dist/db/queryMonitor.d.ts +142 -0
- package/dist/db/queryMonitor.js +357 -0
- package/dist/db/sqlErrors.d.ts +11 -0
- package/dist/db/sqlErrors.js +17 -0
- package/dist/db/test/db.d.ts +11 -0
- package/dist/db/test/db.js +109 -0
- package/dist/devtools/HttpEventDispatcher.d.ts +19 -0
- package/dist/devtools/HttpEventDispatcher.js +180 -0
- package/dist/devtools/contracts/DevtoolsEventDispatcher.d.ts +53 -0
- package/dist/devtools/contracts/DevtoolsEventDispatcher.js +1 -0
- package/dist/devtools/contracts/index.d.ts +1 -0
- package/dist/devtools/contracts/index.js +1 -0
- package/dist/devtools/environment.d.ts +10 -0
- package/dist/devtools/environment.js +14 -0
- package/dist/devtools/index.d.ts +3 -0
- package/dist/devtools/index.js +3 -0
- package/dist/events/Events.d.ts +70 -0
- package/dist/events/Events.js +126 -0
- package/dist/events/contracts/EventConstructor.d.ts +12 -0
- package/dist/events/contracts/EventConstructor.js +1 -0
- package/dist/events/contracts/EventListener.d.ts +6 -0
- package/dist/events/contracts/EventListener.js +1 -0
- package/dist/events/contracts/EventUnsubscribe.d.ts +4 -0
- package/dist/events/contracts/EventUnsubscribe.js +1 -0
- package/dist/events/contracts/index.d.ts +3 -0
- package/dist/events/contracts/index.js +3 -0
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.js +2 -0
- package/dist/flows/FlowBlockRegistry.d.ts +39 -0
- package/dist/flows/FlowBlockRegistry.js +66 -0
- package/dist/flows/FlowCompiler.d.ts +26 -0
- package/dist/flows/FlowCompiler.js +488 -0
- package/dist/flows/FlowDefinitionError.d.ts +21 -0
- package/dist/flows/FlowDefinitionError.js +16 -0
- package/dist/flows/FlowStepJob.d.ts +28 -0
- package/dist/flows/FlowStepJob.js +31 -0
- package/dist/flows/FlowValueValidator.d.ts +32 -0
- package/dist/flows/FlowValueValidator.js +105 -0
- package/dist/flows/Flows.d.ts +102 -0
- package/dist/flows/Flows.js +871 -0
- package/dist/flows/blocks/FlowInput.d.ts +10 -0
- package/dist/flows/blocks/FlowInput.js +29 -0
- package/dist/flows/blocks/FlowOutput.d.ts +10 -0
- package/dist/flows/blocks/FlowOutput.js +29 -0
- package/dist/flows/blocks/Subflow.d.ts +10 -0
- package/dist/flows/blocks/Subflow.js +21 -0
- package/dist/flows/blocks/index.d.ts +6 -0
- package/dist/flows/blocks/index.js +8 -0
- package/dist/flows/constants.d.ts +55 -0
- package/dist/flows/constants.js +47 -0
- package/dist/flows/contracts/FlowBlock.d.ts +64 -0
- package/dist/flows/contracts/FlowBlock.js +1 -0
- package/dist/flows/contracts/FlowCompiler.d.ts +30 -0
- package/dist/flows/contracts/FlowCompiler.js +1 -0
- package/dist/flows/contracts/FlowDefinition.d.ts +118 -0
- package/dist/flows/contracts/FlowDefinition.js +1 -0
- package/dist/flows/contracts/FlowDefinitionStore.d.ts +47 -0
- package/dist/flows/contracts/FlowDefinitionStore.js +1 -0
- package/dist/flows/contracts/FlowRun.d.ts +40 -0
- package/dist/flows/contracts/FlowRun.js +1 -0
- package/dist/flows/contracts/FlowValue.d.ts +49 -0
- package/dist/flows/contracts/FlowValue.js +1 -0
- package/dist/flows/contracts/FlowsService.d.ts +37 -0
- package/dist/flows/contracts/FlowsService.js +1 -0
- package/dist/flows/contracts/index.d.ts +7 -0
- package/dist/flows/contracts/index.js +7 -0
- package/dist/flows/defineBlock.d.ts +18 -0
- package/dist/flows/defineBlock.js +19 -0
- package/dist/flows/drivers/FileFlowDefinitionStore.d.ts +53 -0
- package/dist/flows/drivers/FileFlowDefinitionStore.js +313 -0
- package/dist/flows/drivers/index.d.ts +1 -0
- package/dist/flows/drivers/index.js +1 -0
- package/dist/flows/errors.d.ts +8 -0
- package/dist/flows/errors.js +19 -0
- package/dist/flows/index.d.ts +13 -0
- package/dist/flows/index.js +13 -0
- package/dist/flows/models/FlowRun.d.ts +55 -0
- package/dist/flows/models/FlowRun.js +126 -0
- package/dist/flows/models/FlowRunEvent.d.ts +41 -0
- package/dist/flows/models/FlowRunEvent.js +85 -0
- package/dist/flows/models/FlowStepRun.d.ts +56 -0
- package/dist/flows/models/FlowStepRun.js +137 -0
- package/dist/flows/models/index.d.ts +10 -0
- package/dist/flows/models/index.js +14 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +16 -0
- package/dist/logging/Log.d.ts +66 -0
- package/dist/logging/Log.js +79 -0
- package/dist/logging/contracts/HttpExchange.d.ts +50 -0
- package/dist/logging/contracts/HttpExchange.js +1 -0
- package/dist/logging/contracts/Logger.d.ts +41 -0
- package/dist/logging/contracts/Logger.js +1 -0
- package/dist/logging/contracts/LoggerDriver.d.ts +16 -0
- package/dist/logging/contracts/LoggerDriver.js +1 -0
- package/dist/logging/contracts/LoggingOptions.d.ts +49 -0
- package/dist/logging/contracts/LoggingOptions.js +1 -0
- package/dist/logging/contracts/index.d.ts +4 -0
- package/dist/logging/contracts/index.js +4 -0
- package/dist/logging/drivers/PinoLoggerDriver.d.ts +24 -0
- package/dist/logging/drivers/PinoLoggerDriver.js +291 -0
- package/dist/logging/drivers/index.d.ts +1 -0
- package/dist/logging/drivers/index.js +1 -0
- package/dist/logging/index.d.ts +3 -0
- package/dist/logging/index.js +3 -0
- package/dist/logging/transports/DevtoolsLogTransport.d.ts +35 -0
- package/dist/logging/transports/DevtoolsLogTransport.js +96 -0
- package/dist/mail/Mail.d.ts +62 -0
- package/dist/mail/Mail.js +98 -0
- package/dist/mail/index.d.ts +4 -0
- package/dist/mail/index.js +4 -0
- package/dist/mail/transports/FileMailTransport.d.ts +12 -0
- package/dist/mail/transports/FileMailTransport.js +41 -0
- package/dist/mail/transports/MailgunTransport.d.ts +22 -0
- package/dist/mail/transports/MailgunTransport.js +57 -0
- package/dist/mail/transports/ResendTransport.d.ts +14 -0
- package/dist/mail/transports/ResendTransport.js +55 -0
- package/dist/media/MediaFile.d.ts +48 -0
- package/dist/media/MediaFile.js +104 -0
- package/dist/media/MediaItem.d.ts +47 -0
- package/dist/media/MediaItem.js +106 -0
- package/dist/media/MediaLibrary.d.ts +42 -0
- package/dist/media/MediaLibrary.js +94 -0
- package/dist/media/MediaManager.d.ts +159 -0
- package/dist/media/MediaManager.js +754 -0
- package/dist/media/constants.d.ts +27 -0
- package/dist/media/constants.js +19 -0
- package/dist/media/contracts/MediaOptions.d.ts +8 -0
- package/dist/media/contracts/MediaOptions.js +1 -0
- package/dist/media/contracts/index.d.ts +1 -0
- package/dist/media/contracts/index.js +1 -0
- package/dist/media/image/ImageReconstructionError.d.ts +15 -0
- package/dist/media/image/ImageReconstructionError.js +18 -0
- package/dist/media/image/ImageVariantRenderer.d.ts +44 -0
- package/dist/media/image/ImageVariantRenderer.js +337 -0
- package/dist/media/image/ImageVariantRequest.d.ts +28 -0
- package/dist/media/image/ImageVariantRequest.js +55 -0
- package/dist/media/image/contracts/ImageProcessor.d.ts +46 -0
- package/dist/media/image/contracts/ImageProcessor.js +1 -0
- package/dist/media/image/contracts/ImageVariant.d.ts +31 -0
- package/dist/media/image/contracts/ImageVariant.js +7 -0
- package/dist/media/image/contracts/ImageVariantCacheOptions.d.ts +20 -0
- package/dist/media/image/contracts/ImageVariantCacheOptions.js +1 -0
- package/dist/media/image/contracts/index.d.ts +3 -0
- package/dist/media/image/contracts/index.js +3 -0
- package/dist/media/image/index.d.ts +5 -0
- package/dist/media/image/index.js +5 -0
- package/dist/media/image/processors/SharpImageProcessor.d.ts +25 -0
- package/dist/media/image/processors/SharpImageProcessor.js +112 -0
- package/dist/media/image/processors/index.d.ts +1 -0
- package/dist/media/image/processors/index.js +1 -0
- package/dist/media/index.d.ts +8 -0
- package/dist/media/index.js +8 -0
- package/dist/media/types.d.ts +129 -0
- package/dist/media/types.js +1 -0
- package/dist/queue/FailedJob.d.ts +31 -0
- package/dist/queue/FailedJob.js +41 -0
- package/dist/queue/Queue.d.ts +208 -0
- package/dist/queue/Queue.js +685 -0
- package/dist/queue/QueueEvents.d.ts +31 -0
- package/dist/queue/QueueEvents.js +49 -0
- package/dist/queue/QueueRetryLaterError.d.ts +23 -0
- package/dist/queue/QueueRetryLaterError.js +34 -0
- package/dist/queue/QueueWorker.d.ts +72 -0
- package/dist/queue/QueueWorker.js +236 -0
- package/dist/queue/QueueableJob.d.ts +109 -0
- package/dist/queue/QueueableJob.js +137 -0
- package/dist/queue/QueuedJob.d.ts +31 -0
- package/dist/queue/QueuedJob.js +52 -0
- package/dist/queue/RetryPolicy.d.ts +51 -0
- package/dist/queue/RetryPolicy.js +84 -0
- package/dist/queue/commands/index.d.ts +4 -0
- package/dist/queue/commands/index.js +11 -0
- package/dist/queue/commands/makeJob.d.ts +7 -0
- package/dist/queue/commands/makeJob.js +9 -0
- package/dist/queue/console.d.ts +60 -0
- package/dist/queue/console.js +348 -0
- package/dist/queue/contracts/CreateJob.d.ts +12 -0
- package/dist/queue/contracts/CreateJob.js +1 -0
- package/dist/queue/contracts/QueueDriver.d.ts +122 -0
- package/dist/queue/contracts/QueueDriver.js +1 -0
- package/dist/queue/contracts/QueueEvents.d.ts +61 -0
- package/dist/queue/contracts/QueueEvents.js +1 -0
- package/dist/queue/contracts/QueuePayload.d.ts +136 -0
- package/dist/queue/contracts/QueuePayload.js +1 -0
- package/dist/queue/contracts/QueueRetry.d.ts +43 -0
- package/dist/queue/contracts/QueueRetry.js +1 -0
- package/dist/queue/contracts/QueueService.d.ts +199 -0
- package/dist/queue/contracts/QueueService.js +1 -0
- package/dist/queue/contracts/QueueWorkerLifecycle.d.ts +65 -0
- package/dist/queue/contracts/QueueWorkerLifecycle.js +1 -0
- package/dist/queue/contracts/QueueableJob.d.ts +50 -0
- package/dist/queue/contracts/QueueableJob.js +1 -0
- package/dist/queue/contracts/RedisQueueDriver.d.ts +37 -0
- package/dist/queue/contracts/RedisQueueDriver.js +1 -0
- package/dist/queue/contracts/index.d.ts +9 -0
- package/dist/queue/contracts/index.js +9 -0
- package/dist/queue/createJob.d.ts +18 -0
- package/dist/queue/createJob.js +52 -0
- package/dist/queue/drivers/DatabaseQueueDriver.d.ts +83 -0
- package/dist/queue/drivers/DatabaseQueueDriver.js +393 -0
- package/dist/queue/drivers/RedisQueueDriver.d.ts +102 -0
- package/dist/queue/drivers/RedisQueueDriver.js +641 -0
- package/dist/queue/index.d.ts +13 -0
- package/dist/queue/index.js +13 -0
- package/dist/queue/queueMonitor.d.ts +133 -0
- package/dist/queue/queueMonitor.js +238 -0
- package/dist/scheduler/ScheduledCall.d.ts +25 -0
- package/dist/scheduler/ScheduledCall.js +31 -0
- package/dist/scheduler/ScheduledEvent.d.ts +74 -0
- package/dist/scheduler/ScheduledEvent.js +115 -0
- package/dist/scheduler/ScheduledJob.d.ts +34 -0
- package/dist/scheduler/ScheduledJob.js +50 -0
- package/dist/scheduler/ScheduledOccurrence.d.ts +74 -0
- package/dist/scheduler/ScheduledOccurrence.js +194 -0
- package/dist/scheduler/ScheduledOccurrenceRecorder.d.ts +34 -0
- package/dist/scheduler/ScheduledOccurrenceRecorder.js +106 -0
- package/dist/scheduler/Scheduler.d.ts +76 -0
- package/dist/scheduler/Scheduler.js +186 -0
- package/dist/scheduler/SchedulerWorker.d.ts +37 -0
- package/dist/scheduler/SchedulerWorker.js +119 -0
- package/dist/scheduler/console.d.ts +18 -0
- package/dist/scheduler/console.js +288 -0
- package/dist/scheduler/constants.d.ts +13 -0
- package/dist/scheduler/constants.js +23 -0
- package/dist/scheduler/contracts/Scheduler.d.ts +104 -0
- package/dist/scheduler/contracts/Scheduler.js +1 -0
- package/dist/scheduler/contracts/SchedulerConsole.d.ts +37 -0
- package/dist/scheduler/contracts/SchedulerConsole.js +1 -0
- package/dist/scheduler/contracts/SchedulerWorker.d.ts +18 -0
- package/dist/scheduler/contracts/SchedulerWorker.js +1 -0
- package/dist/scheduler/contracts/index.d.ts +3 -0
- package/dist/scheduler/contracts/index.js +3 -0
- package/dist/scheduler/index.d.ts +9 -0
- package/dist/scheduler/index.js +9 -0
- package/dist/scheduler/scheduleTime.d.ts +30 -0
- package/dist/scheduler/scheduleTime.js +64 -0
- package/dist/security/Security.d.ts +60 -0
- package/dist/security/Security.js +252 -0
- package/dist/security/SecurityError.d.ts +13 -0
- package/dist/security/SecurityError.js +16 -0
- package/dist/security/contracts/SecurityOptions.d.ts +17 -0
- package/dist/security/contracts/SecurityOptions.js +1 -0
- package/dist/security/contracts/SecurityPayload.d.ts +13 -0
- package/dist/security/contracts/SecurityPayload.js +1 -0
- package/dist/security/contracts/index.d.ts +2 -0
- package/dist/security/contracts/index.js +2 -0
- package/dist/security/ensureAppKey.d.ts +16 -0
- package/dist/security/ensureAppKey.js +69 -0
- package/dist/security/index.d.ts +4 -0
- package/dist/security/index.js +4 -0
- package/dist/serialization/Serializable.d.ts +17 -0
- package/dist/serialization/Serializable.js +1 -0
- package/dist/serialization/SerializationError.d.ts +40 -0
- package/dist/serialization/SerializationError.js +42 -0
- package/dist/serialization/SerializationRegistry.d.ts +76 -0
- package/dist/serialization/SerializationRegistry.js +153 -0
- package/dist/serialization/SerializationRegistryError.d.ts +18 -0
- package/dist/serialization/SerializationRegistryError.js +18 -0
- package/dist/serialization/Serializer.d.ts +37 -0
- package/dist/serialization/Serializer.js +477 -0
- package/dist/serialization/contracts/SerializableClass.d.ts +20 -0
- package/dist/serialization/contracts/SerializableClass.js +1 -0
- package/dist/serialization/contracts/SerializedValue.d.ts +59 -0
- package/dist/serialization/contracts/SerializedValue.js +19 -0
- package/dist/serialization/contracts/SerializerOptions.d.ts +17 -0
- package/dist/serialization/contracts/SerializerOptions.js +1 -0
- package/dist/serialization/contracts/SerializerService.d.ts +26 -0
- package/dist/serialization/contracts/SerializerService.js +1 -0
- package/dist/serialization/contracts/index.d.ts +4 -0
- package/dist/serialization/contracts/index.js +4 -0
- package/dist/serialization/index.d.ts +6 -0
- package/dist/serialization/index.js +6 -0
- package/dist/server/App.d.ts +141 -0
- package/dist/server/App.js +225 -0
- package/dist/server/RequestContext.d.ts +42 -0
- package/dist/server/RequestContext.js +95 -0
- package/dist/server/appContext.d.ts +34 -0
- package/dist/server/appContext.js +42 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +3 -0
- package/dist/ssr/constants.d.ts +6 -0
- package/dist/ssr/constants.js +6 -0
- package/dist/ssr/contracts/DocumentHead.d.ts +32 -0
- package/dist/ssr/contracts/DocumentHead.js +1 -0
- package/dist/ssr/contracts/SsrRenderContext.d.ts +23 -0
- package/dist/ssr/contracts/SsrRenderContext.js +1 -0
- package/dist/ssr/contracts/SsrRenderResult.d.ts +21 -0
- package/dist/ssr/contracts/SsrRenderResult.js +1 -0
- package/dist/ssr/contracts/SsrRenderer.d.ts +9 -0
- package/dist/ssr/contracts/SsrRenderer.js +1 -0
- package/dist/ssr/contracts/SsrRequest.d.ts +16 -0
- package/dist/ssr/contracts/SsrRequest.js +1 -0
- package/dist/ssr/contracts/index.d.ts +5 -0
- package/dist/ssr/contracts/index.js +1 -0
- package/dist/ssr/createSsrRenderContext.d.ts +9 -0
- package/dist/ssr/createSsrRenderContext.js +20 -0
- package/dist/ssr/fastify/contracts/FastifySsrOptions.d.ts +21 -0
- package/dist/ssr/fastify/contracts/FastifySsrOptions.js +1 -0
- package/dist/ssr/fastify/contracts/index.d.ts +1 -0
- package/dist/ssr/fastify/contracts/index.js +1 -0
- package/dist/ssr/fastify/fastifySsr.d.ts +25 -0
- package/dist/ssr/fastify/fastifySsr.js +89 -0
- package/dist/ssr/fastify/index.d.ts +2 -0
- package/dist/ssr/fastify/index.js +1 -0
- package/dist/ssr/index.d.ts +6 -0
- package/dist/ssr/index.js +5 -0
- package/dist/ssr/renderDocumentHead.d.ts +8 -0
- package/dist/ssr/renderDocumentHead.js +62 -0
- package/dist/ssr/renderSsrDocument.d.ts +14 -0
- package/dist/ssr/renderSsrDocument.js +28 -0
- package/dist/ssr/serializeSsrState.d.ts +10 -0
- package/dist/ssr/serializeSsrState.js +18 -0
- package/dist/ssr/vite/contracts/ViteSsrOptions.d.ts +45 -0
- package/dist/ssr/vite/contracts/ViteSsrOptions.js +1 -0
- package/dist/ssr/vite/contracts/index.d.ts +1 -0
- package/dist/ssr/vite/contracts/index.js +1 -0
- package/dist/ssr/vite/fastifyViteSsr.d.ts +24 -0
- package/dist/ssr/vite/fastifyViteSsr.js +213 -0
- package/dist/ssr/vite/index.d.ts +4 -0
- package/dist/ssr/vite/index.js +2 -0
- package/dist/ssr/vite/viteSsrManifest.d.ts +16 -0
- package/dist/ssr/vite/viteSsrManifest.js +63 -0
- package/dist/storage/Storage.d.ts +244 -0
- package/dist/storage/Storage.js +348 -0
- package/dist/storage/contents.d.ts +8 -0
- package/dist/storage/contents.js +18 -0
- package/dist/storage/contracts/StorageListing.d.ts +50 -0
- package/dist/storage/contracts/StorageListing.js +1 -0
- package/dist/storage/contracts/index.d.ts +1 -0
- package/dist/storage/contracts/index.js +1 -0
- package/dist/storage/drivers/FlystorageDisk.d.ts +185 -0
- package/dist/storage/drivers/FlystorageDisk.js +250 -0
- package/dist/storage/drivers/FlystorageListing.d.ts +27 -0
- package/dist/storage/drivers/FlystorageListing.js +69 -0
- package/dist/storage/drivers/LocalStorageDisk.d.ts +25 -0
- package/dist/storage/drivers/LocalStorageDisk.js +38 -0
- package/dist/storage/drivers/S3StorageDisk.d.ts +17 -0
- package/dist/storage/drivers/S3StorageDisk.js +102 -0
- package/dist/storage/drivers/index.d.ts +3 -0
- package/dist/storage/drivers/index.js +3 -0
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.js +7 -0
- package/dist/storage/mime.d.ts +7 -0
- package/dist/storage/mime.js +28 -0
- package/dist/storage/path.d.ts +22 -0
- package/dist/storage/path.js +61 -0
- package/dist/storage/types.d.ts +218 -0
- package/dist/storage/types.js +1 -0
- package/dist/url/UrlGenerator.d.ts +32 -0
- package/dist/url/UrlGenerator.js +61 -0
- package/dist/url/contracts/UrlGeneratorOptions.d.ts +13 -0
- package/dist/url/contracts/UrlGeneratorOptions.js +1 -0
- package/dist/url/contracts/index.d.ts +1 -0
- package/dist/url/contracts/index.js +1 -0
- package/dist/url/index.d.ts +2 -0
- package/dist/url/index.js +2 -0
- package/dist/validation/index.d.ts +28 -0
- package/dist/validation/index.js +260 -0
- package/package.json +290 -0
- package/src/ai/AIErrors.ts +46 -0
- package/src/ai/AIFailover.ts +101 -0
- package/src/ai/AIProviders.ts +228 -0
- package/src/ai/AIQuotaDeferredError.ts +26 -0
- package/src/ai/AIRateLimiter.ts +880 -0
- package/src/ai/Agent.ts +3630 -0
- package/src/ai/AgentHistory.ts +576 -0
- package/src/ai/AgentRunJob.ts +65 -0
- package/src/ai/Ai.ts +2176 -0
- package/src/ai/AiConversation.ts +49 -0
- package/src/ai/AiExecutionContext.ts +19 -0
- package/src/ai/AiMessage.ts +131 -0
- package/src/ai/AiRateLimitBucket.ts +163 -0
- package/src/ai/AiRateLimitReservation.ts +117 -0
- package/src/ai/AiRequest.ts +466 -0
- package/src/ai/Estimates.ts +36 -0
- package/src/ai/Models.ts +373 -0
- package/src/ai/OpenAIProviderError.ts +98 -0
- package/src/ai/OpenAIQuotaRetry.ts +183 -0
- package/src/ai/ProviderCosts.ts +156 -0
- package/src/ai/README.md +187 -0
- package/src/ai/ResponsesProviderCall.ts +34 -0
- package/src/ai/agentCitations.ts +186 -0
- package/src/ai/contracts/AI.ts +380 -0
- package/src/ai/contracts/Agent.ts +539 -0
- package/src/ai/contracts/AiRequestRunCostSummary.ts +31 -0
- package/src/ai/contracts/Pricing.ts +95 -0
- package/src/ai/contracts/Providers.ts +73 -0
- package/src/ai/contracts/QuotaRetry.ts +39 -0
- package/src/ai/contracts/RateLimits.ts +49 -0
- package/src/ai/contracts/ResponsesProviderCall.ts +30 -0
- package/src/ai/contracts/index.ts +8 -0
- package/src/ai/examples/Conversation.ts +12 -0
- package/src/ai/examples/HelpAgent.ts +27 -0
- package/src/ai/examples/createHelpImage.ts +13 -0
- package/src/ai/index.ts +27 -0
- package/src/ai/registry.ts +70 -0
- package/src/ai/sdkNodeCompatibility.d.ts +76 -0
- package/src/ai/toolCallRecovery.ts +82 -0
- package/src/ai/toolHelpers.ts +145 -0
- package/src/auth/Auth.ts +1422 -0
- package/src/auth/AuthProvider.ts +251 -0
- package/src/auth/AuthToken.ts +239 -0
- package/src/auth/PasswordResetToken.ts +93 -0
- package/src/auth/README.md +396 -0
- package/src/auth/UserIdentity.ts +112 -0
- package/src/auth/contracts/AuthProviderDriver.ts +114 -0
- package/src/auth/contracts/index.ts +1 -0
- package/src/auth/examples/runPasswordAuth.ts +45 -0
- package/src/auth/index.ts +8 -0
- package/src/auth/passwordHash.ts +160 -0
- package/src/auth/providers/GoogleAuthProvider.ts +470 -0
- package/src/auth/providers/PasswordAuthProvider.ts +256 -0
- package/src/auth/providers/index.ts +3 -0
- package/src/auth/providers/resolveAuthProviders.ts +166 -0
- package/src/cache/Cache.ts +151 -0
- package/src/cache/README.md +137 -0
- package/src/cache/contracts/CacheDriver.ts +11 -0
- package/src/cache/contracts/CacheOperations.ts +28 -0
- package/src/cache/contracts/CacheOptions.ts +56 -0
- package/src/cache/contracts/CacheRepository.ts +62 -0
- package/src/cache/contracts/index.ts +4 -0
- package/src/cache/drivers/CacheManagerDriver.ts +84 -0
- package/src/cache/drivers/createCacheDriver.ts +191 -0
- package/src/cache/examples/runNoteCache.ts +37 -0
- package/src/cache/index.ts +2 -0
- package/src/cli/Cli.ts +110 -0
- package/src/cli/README.md +164 -0
- package/src/cli/commands/repl.ts +29 -0
- package/src/cli/contracts/CliCommand.ts +33 -0
- package/src/cli/contracts/CliConfig.ts +10 -0
- package/src/cli/contracts/CliOptions.ts +13 -0
- package/src/cli/contracts/CommandDefinition.ts +19 -0
- package/src/cli/contracts/ReplOptions.ts +11 -0
- package/src/cli/contracts/index.ts +5 -0
- package/src/cli/defineCommand.ts +25 -0
- package/src/cli/index.ts +5 -0
- package/src/cli/runDb3.ts +63 -0
- package/src/cli/runRepl.ts +55 -0
- package/src/config/Config.ts +110 -0
- package/src/config/README.md +142 -0
- package/src/config/env.ts +164 -0
- package/src/config/examples/loadNotesConfig.ts +29 -0
- package/src/config/examples/runConfig.ts +40 -0
- package/src/config/index.ts +2 -0
- package/src/db/ActiveProjection.ts +311 -0
- package/src/db/ActiveQueryBuilder.ts +831 -0
- package/src/db/ActiveRecord.ts +1317 -0
- package/src/db/Database.ts +1283 -0
- package/src/db/FieldType.ts +1243 -0
- package/src/db/README.md +508 -0
- package/src/db/SoftDeletes.ts +158 -0
- package/src/db/commands/check.ts +10 -0
- package/src/db/commands/index.ts +19 -0
- package/src/db/commands/makeMigration.ts +11 -0
- package/src/db/commands/migrate.ts +10 -0
- package/src/db/connection.ts +68 -0
- package/src/db/contracts/ActiveRecordDefinition.ts +69 -0
- package/src/db/contracts/DatabaseBackup.ts +7 -0
- package/src/db/contracts/DatabaseMigrationsConfig.ts +10 -0
- package/src/db/contracts/index.ts +3 -0
- package/src/db/dialects/columnTypes.ts +103 -0
- package/src/db/dialects/index.ts +6 -0
- package/src/db/dialects/mariadb.ts +51 -0
- package/src/db/dialects/mysql.ts +277 -0
- package/src/db/dialects/postgres.ts +143 -0
- package/src/db/dialects/resolveDialect.ts +88 -0
- package/src/db/dialects/types.ts +59 -0
- package/src/db/errors.ts +22 -0
- package/src/db/examples/DefinedUser.ts +20 -0
- package/src/db/examples/FieldNote.ts +27 -0
- package/src/db/examples/KnowledgeNote.ts +29 -0
- package/src/db/examples/NoteCodeField.ts +9 -0
- package/src/db/examples/createNotesTogether.ts +24 -0
- package/src/db/examples/outputs/workspace-notes.json +9 -0
- package/src/db/examples/runFieldNotes.ts +51 -0
- package/src/db/examples/runNoteMigrations.ts +64 -0
- package/src/db/examples/runWorkspaceNotes.ts +86 -0
- package/src/db/examples/workspaceNotes.ts +57 -0
- package/src/db/fields/BooleanField.ts +128 -0
- package/src/db/fields/CharUuidField.ts +91 -0
- package/src/db/fields/ChoiceStringField.ts +97 -0
- package/src/db/fields/DecimalField.ts +157 -0
- package/src/db/fields/EmailField.ts +79 -0
- package/src/db/fields/EncryptedJsonField.ts +211 -0
- package/src/db/fields/IntegerField.ts +200 -0
- package/src/db/fields/JsonField.ts +108 -0
- package/src/db/fields/JsonStringField.ts +63 -0
- package/src/db/fields/LinkField.ts +502 -0
- package/src/db/fields/PasswordField.ts +294 -0
- package/src/db/fields/StringField.ts +154 -0
- package/src/db/fields/StringListField.ts +179 -0
- package/src/db/fields/TextField.ts +71 -0
- package/src/db/fields/TimestampField.ts +164 -0
- package/src/db/fields/UlidField.ts +189 -0
- package/src/db/fields/UrlField.ts +97 -0
- package/src/db/fields/VectorField.ts +266 -0
- package/src/db/fields/createField.ts +22 -0
- package/src/db/fields/field.ts +209 -0
- package/src/db/fields/index.ts +76 -0
- package/src/db/fields/resolveFields.ts +69 -0
- package/src/db/index.ts +13 -0
- package/src/db/migrations/DatabaseMigrationManager.ts +756 -0
- package/src/db/migrations/DatabaseSchemaInspector.ts +541 -0
- package/src/db/migrations/KnexMigrationRenderer.ts +490 -0
- package/src/db/migrations/ModelSchemaCollector.ts +240 -0
- package/src/db/migrations/SchemaDiffer.ts +541 -0
- package/src/db/migrations/SchemaNames.ts +62 -0
- package/src/db/migrations/SchemaSnapshotSerializer.ts +59 -0
- package/src/db/migrations/contracts/DatabaseMigration.ts +143 -0
- package/src/db/migrations/contracts/SchemaChange.ts +113 -0
- package/src/db/migrations/contracts/SchemaSnapshot.ts +122 -0
- package/src/db/migrations/contracts/index.ts +3 -0
- package/src/db/migrations/errors.ts +45 -0
- package/src/db/migrations/index.ts +10 -0
- package/src/db/migrations/promoteDestructiveSchemaChanges.ts +120 -0
- package/src/db/queryMonitor.ts +549 -0
- package/src/db/sqlErrors.ts +36 -0
- package/src/db/test/db.ts +159 -0
- package/src/devtools/HttpEventDispatcher.ts +214 -0
- package/src/devtools/contracts/DevtoolsEventDispatcher.ts +57 -0
- package/src/devtools/contracts/index.ts +1 -0
- package/src/devtools/environment.ts +18 -0
- package/src/devtools/index.ts +3 -0
- package/src/events/Events.ts +165 -0
- package/src/events/README.md +106 -0
- package/src/events/contracts/EventConstructor.ts +12 -0
- package/src/events/contracts/EventListener.ts +8 -0
- package/src/events/contracts/EventUnsubscribe.ts +4 -0
- package/src/events/contracts/index.ts +3 -0
- package/src/events/examples/NoteSaved.ts +9 -0
- package/src/events/examples/runNoteEvents.ts +31 -0
- package/src/events/index.ts +2 -0
- package/src/flows/FlowBlockRegistry.ts +79 -0
- package/src/flows/FlowCompiler.ts +624 -0
- package/src/flows/FlowDefinitionError.ts +24 -0
- package/src/flows/FlowStepJob.ts +54 -0
- package/src/flows/FlowValueValidator.ts +120 -0
- package/src/flows/Flows.ts +1118 -0
- package/src/flows/README.md +144 -0
- package/src/flows/blocks/FlowInput.ts +32 -0
- package/src/flows/blocks/FlowOutput.ts +32 -0
- package/src/flows/blocks/Subflow.ts +24 -0
- package/src/flows/blocks/index.ts +11 -0
- package/src/flows/constants.ts +62 -0
- package/src/flows/contracts/FlowBlock.ts +73 -0
- package/src/flows/contracts/FlowCompiler.ts +32 -0
- package/src/flows/contracts/FlowDefinition.ts +126 -0
- package/src/flows/contracts/FlowDefinitionStore.ts +52 -0
- package/src/flows/contracts/FlowRun.ts +44 -0
- package/src/flows/contracts/FlowValue.ts +54 -0
- package/src/flows/contracts/FlowsService.ts +39 -0
- package/src/flows/contracts/index.ts +7 -0
- package/src/flows/defineBlock.ts +25 -0
- package/src/flows/drivers/FileFlowDefinitionStore.ts +372 -0
- package/src/flows/drivers/index.ts +1 -0
- package/src/flows/errors.ts +22 -0
- package/src/flows/examples/FlowExampleApp.ts +15 -0
- package/src/flows/examples/createTextFlow.ts +14 -0
- package/src/flows/examples/normalizeTextBlock.ts +15 -0
- package/src/flows/examples/runTextFlow.ts +46 -0
- package/src/flows/examples/uppercaseTextBlock.ts +11 -0
- package/src/flows/index.ts +13 -0
- package/src/flows/models/FlowRun.ts +164 -0
- package/src/flows/models/FlowRunEvent.ts +108 -0
- package/src/flows/models/FlowStepRun.ts +176 -0
- package/src/flows/models/index.ts +16 -0
- package/src/index.ts +40 -0
- package/src/logging/Log.ts +100 -0
- package/src/logging/README.md +139 -0
- package/src/logging/contracts/HttpExchange.ts +53 -0
- package/src/logging/contracts/Logger.ts +45 -0
- package/src/logging/contracts/LoggerDriver.ts +19 -0
- package/src/logging/contracts/LoggingOptions.ts +51 -0
- package/src/logging/contracts/index.ts +4 -0
- package/src/logging/drivers/PinoLoggerDriver.ts +376 -0
- package/src/logging/drivers/index.ts +1 -0
- package/src/logging/examples/runNoteLogs.ts +38 -0
- package/src/logging/index.ts +3 -0
- package/src/logging/transports/DevtoolsLogTransport.ts +142 -0
- package/src/mail/Mail.ts +188 -0
- package/src/mail/README.md +206 -0
- package/src/mail/examples/runMailPreview.ts +44 -0
- package/src/mail/examples/welcomeMessage.ts +26 -0
- package/src/mail/index.ts +4 -0
- package/src/mail/transports/FileMailTransport.ts +58 -0
- package/src/mail/transports/MailgunTransport.ts +85 -0
- package/src/mail/transports/ResendTransport.ts +80 -0
- package/src/media/MediaFile.ts +132 -0
- package/src/media/MediaItem.ts +132 -0
- package/src/media/MediaLibrary.ts +117 -0
- package/src/media/MediaManager.ts +874 -0
- package/src/media/README.md +358 -0
- package/src/media/constants.ts +31 -0
- package/src/media/contracts/MediaOptions.ts +9 -0
- package/src/media/contracts/index.ts +1 -0
- package/src/media/examples/createPrivateFileServer.ts +55 -0
- package/src/media/examples/runPrivateFiles.ts +45 -0
- package/src/media/examples/runProjectMedia.ts +46 -0
- package/src/media/image/ImageReconstructionError.ts +18 -0
- package/src/media/image/ImageVariantRenderer.ts +386 -0
- package/src/media/image/ImageVariantRequest.ts +65 -0
- package/src/media/image/contracts/ImageProcessor.ts +53 -0
- package/src/media/image/contracts/ImageVariant.ts +37 -0
- package/src/media/image/contracts/ImageVariantCacheOptions.ts +21 -0
- package/src/media/image/contracts/index.ts +3 -0
- package/src/media/image/index.ts +5 -0
- package/src/media/image/processors/SharpImageProcessor.ts +121 -0
- package/src/media/image/processors/index.ts +1 -0
- package/src/media/index.ts +8 -0
- package/src/media/types.ts +168 -0
- package/src/queue/FailedJob.ts +58 -0
- package/src/queue/Queue.ts +938 -0
- package/src/queue/QueueEvents.ts +57 -0
- package/src/queue/QueueRetryLaterError.ts +40 -0
- package/src/queue/QueueWorker.ts +296 -0
- package/src/queue/QueueableJob.ts +167 -0
- package/src/queue/QueuedJob.ts +69 -0
- package/src/queue/README.md +368 -0
- package/src/queue/RetryPolicy.ts +129 -0
- package/src/queue/commands/index.ts +13 -0
- package/src/queue/commands/makeJob.ts +11 -0
- package/src/queue/console.ts +518 -0
- package/src/queue/contracts/CreateJob.ts +13 -0
- package/src/queue/contracts/QueueDriver.ts +135 -0
- package/src/queue/contracts/QueueEvents.ts +77 -0
- package/src/queue/contracts/QueuePayload.ts +150 -0
- package/src/queue/contracts/QueueRetry.ts +47 -0
- package/src/queue/contracts/QueueService.ts +219 -0
- package/src/queue/contracts/QueueWorkerLifecycle.ts +71 -0
- package/src/queue/contracts/QueueableJob.ts +56 -0
- package/src/queue/contracts/RedisQueueDriver.ts +37 -0
- package/src/queue/contracts/index.ts +9 -0
- package/src/queue/createJob.ts +54 -0
- package/src/queue/drivers/DatabaseQueueDriver.ts +449 -0
- package/src/queue/drivers/RedisQueueDriver.ts +733 -0
- package/src/queue/examples/DeferredReportJob.ts +25 -0
- package/src/queue/examples/GenerateReportJob.ts +37 -0
- package/src/queue/examples/WriteReportJob.ts +37 -0
- package/src/queue/examples/createAndProcessReportJob.ts +29 -0
- package/src/queue/examples/dispatchReportWorkflows.ts +40 -0
- package/src/queue/examples/manageReportRetries.ts +47 -0
- package/src/queue/examples/outputs/create-and-process-report-job.json +6 -0
- package/src/queue/examples/outputs/dispatch-report-workflows.json +14 -0
- package/src/queue/examples/outputs/manage-report-retries.json +24 -0
- package/src/queue/examples/outputs/queue-reports.json +11 -0
- package/src/queue/examples/reportConsole.ts +47 -0
- package/src/queue/examples/runBackpressure.ts +27 -0
- package/src/queue/examples/runQueueReports.ts +80 -0
- package/src/queue/examples/runQueueWorkflows.ts +43 -0
- package/src/queue/index.ts +13 -0
- package/src/queue/queueMonitor.ts +368 -0
- package/src/scheduler/README.md +139 -0
- package/src/scheduler/ScheduledCall.ts +36 -0
- package/src/scheduler/ScheduledEvent.ts +149 -0
- package/src/scheduler/ScheduledJob.ts +58 -0
- package/src/scheduler/ScheduledOccurrence.ts +250 -0
- package/src/scheduler/ScheduledOccurrenceRecorder.ts +125 -0
- package/src/scheduler/Scheduler.ts +225 -0
- package/src/scheduler/SchedulerWorker.ts +151 -0
- package/src/scheduler/console.ts +368 -0
- package/src/scheduler/constants.ts +27 -0
- package/src/scheduler/contracts/Scheduler.ts +123 -0
- package/src/scheduler/contracts/SchedulerConsole.ts +40 -0
- package/src/scheduler/contracts/SchedulerWorker.ts +23 -0
- package/src/scheduler/contracts/index.ts +3 -0
- package/src/scheduler/examples/RecoverableSummaryJob.ts +18 -0
- package/src/scheduler/examples/WriteDailySummaryJob.ts +17 -0
- package/src/scheduler/examples/registerDailySummary.ts +13 -0
- package/src/scheduler/examples/runDailySummary.ts +46 -0
- package/src/scheduler/examples/runScheduledReplay.ts +60 -0
- package/src/scheduler/index.ts +9 -0
- package/src/scheduler/scheduleTime.ts +78 -0
- package/src/security/README.md +130 -0
- package/src/security/Security.ts +346 -0
- package/src/security/SecurityError.ts +16 -0
- package/src/security/contracts/SecurityOptions.ts +20 -0
- package/src/security/contracts/SecurityPayload.ts +14 -0
- package/src/security/contracts/index.ts +2 -0
- package/src/security/ensureAppKey.ts +82 -0
- package/src/security/examples/runSecretRoundTrip.ts +42 -0
- package/src/security/index.ts +4 -0
- package/src/serialization/README.md +169 -0
- package/src/serialization/Serializable.ts +17 -0
- package/src/serialization/SerializationError.ts +91 -0
- package/src/serialization/SerializationRegistry.ts +208 -0
- package/src/serialization/SerializationRegistryError.ts +24 -0
- package/src/serialization/Serializer.ts +793 -0
- package/src/serialization/contracts/SerializableClass.ts +26 -0
- package/src/serialization/contracts/SerializedValue.ts +71 -0
- package/src/serialization/contracts/SerializerOptions.ts +19 -0
- package/src/serialization/contracts/SerializerService.ts +29 -0
- package/src/serialization/contracts/index.ts +4 -0
- package/src/serialization/examples/ExportRequest.ts +25 -0
- package/src/serialization/examples/runExportSerialization.ts +24 -0
- package/src/serialization/index.ts +6 -0
- package/src/server/App.ts +326 -0
- package/src/server/README.md +219 -0
- package/src/server/RequestContext.ts +122 -0
- package/src/server/appContext.ts +59 -0
- package/src/server/examples/createFirstServer.ts +25 -0
- package/src/server/examples/startFirstServer.ts +19 -0
- package/src/server/index.ts +16 -0
- package/src/ssr/README.md +158 -0
- package/src/ssr/constants.ts +8 -0
- package/src/ssr/contracts/DocumentHead.ts +35 -0
- package/src/ssr/contracts/SsrRenderContext.ts +25 -0
- package/src/ssr/contracts/SsrRenderResult.ts +23 -0
- package/src/ssr/contracts/SsrRenderer.ts +12 -0
- package/src/ssr/contracts/SsrRequest.ts +17 -0
- package/src/ssr/contracts/index.ts +19 -0
- package/src/ssr/createSsrRenderContext.ts +25 -0
- package/src/ssr/examples/createPublicPageServer.ts +32 -0
- package/src/ssr/examples/runPublicPages.ts +25 -0
- package/src/ssr/fastify/contracts/FastifySsrOptions.ts +24 -0
- package/src/ssr/fastify/contracts/index.ts +5 -0
- package/src/ssr/fastify/fastifySsr.ts +110 -0
- package/src/ssr/fastify/index.ts +2 -0
- package/src/ssr/index.ts +10 -0
- package/src/ssr/renderDocumentHead.ts +72 -0
- package/src/ssr/renderSsrDocument.ts +35 -0
- package/src/ssr/serializeSsrState.ts +19 -0
- package/src/ssr/vite/contracts/ViteSsrOptions.ts +52 -0
- package/src/ssr/vite/contracts/index.ts +6 -0
- package/src/ssr/vite/fastifyViteSsr.ts +279 -0
- package/src/ssr/vite/index.ts +4 -0
- package/src/ssr/vite/viteSsrManifest.ts +92 -0
- package/src/storage/README.md +310 -0
- package/src/storage/Storage.ts +392 -0
- package/src/storage/contents.ts +23 -0
- package/src/storage/contracts/StorageListing.ts +55 -0
- package/src/storage/contracts/index.ts +1 -0
- package/src/storage/drivers/FlystorageDisk.ts +295 -0
- package/src/storage/drivers/FlystorageListing.ts +78 -0
- package/src/storage/drivers/LocalStorageDisk.ts +45 -0
- package/src/storage/drivers/S3StorageDisk.ts +114 -0
- package/src/storage/drivers/index.ts +3 -0
- package/src/storage/examples/runStorage.ts +37 -0
- package/src/storage/examples/runStreamExport.ts +41 -0
- package/src/storage/examples/writeCsvExport.ts +45 -0
- package/src/storage/index.ts +7 -0
- package/src/storage/mime.ts +30 -0
- package/src/storage/path.ts +76 -0
- package/src/storage/types.ts +251 -0
- package/src/url/README.md +41 -0
- package/src/url/UrlGenerator.ts +72 -0
- package/src/url/contracts/UrlGeneratorOptions.ts +14 -0
- package/src/url/contracts/index.ts +1 -0
- package/src/url/examples/runApplicationLinks.ts +33 -0
- package/src/url/index.ts +2 -0
- package/src/validation/README.md +433 -0
- package/src/validation/examples/runNoteValidation.ts +18 -0
- package/src/validation/examples/validateNoteInput.ts +31 -0
- package/src/validation/index.ts +398 -0
- package/templates/AGENTS.md +15 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
# @db3.ai/app/auth
|
|
2
|
+
|
|
3
|
+
`@db3.ai/app/auth` provides account identities, pluggable login providers,
|
|
4
|
+
bearer tokens, password reset tokens, password hashing, and request-scoped
|
|
5
|
+
authenticated-user state.
|
|
6
|
+
|
|
7
|
+
The package is deliberately HTTP-framework agnostic. An app owns its routes,
|
|
8
|
+
request validation, cookies or bearer-token transport, rate limiting, and UI.
|
|
9
|
+
The auth service owns provider verification, account/provider persistence, and
|
|
10
|
+
token issuance.
|
|
11
|
+
|
|
12
|
+
## Mental Model
|
|
13
|
+
|
|
14
|
+
An account and a login method are different things:
|
|
15
|
+
|
|
16
|
+
- `UserIdentity` is the account. It stores the stable application identity:
|
|
17
|
+
name, email, email verification time, account avatar, and account timestamps.
|
|
18
|
+
- `AuthProvider` is one way to prove control of that account. A user may have a
|
|
19
|
+
password provider, Google provider, and future providers at the same time.
|
|
20
|
+
- `AuthProviderDriver` verifies provider-specific proof and returns one
|
|
21
|
+
normalized `AuthProviderProfile`.
|
|
22
|
+
- `Auth` connects verified profiles to accounts, manages provider links, and
|
|
23
|
+
issues sessions.
|
|
24
|
+
- `AuthToken` stores hashed bearer tokens. The plaintext token is returned only
|
|
25
|
+
when it is created.
|
|
26
|
+
- `PasswordResetToken` stores hashed, expiring, single-use reset tokens.
|
|
27
|
+
|
|
28
|
+
The important relationship is:
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
users (account)
|
|
32
|
+
1
|
|
33
|
+
+-- many auth_providers (password, google, future providers)
|
|
34
|
+
+-- many auth_tokens (bearer sessions)
|
|
35
|
+
+-- many password_reset_tokens
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Password authentication is a provider even though it is first-party rather
|
|
39
|
+
than OAuth. This keeps application routes and account settings consistent:
|
|
40
|
+
every login starts with a provider, and providers can be listed, linked, or
|
|
41
|
+
removed through the same auth service.
|
|
42
|
+
|
|
43
|
+
## App Setup
|
|
44
|
+
|
|
45
|
+
Apps normally extend `UserIdentity` and pass the model to the framework app:
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import { UserIdentity } from '@db3.ai/app/auth';
|
|
49
|
+
import type { FieldBuilder } from '@db3.ai/app/db';
|
|
50
|
+
|
|
51
|
+
export class User extends UserIdentity {
|
|
52
|
+
static override table = 'users';
|
|
53
|
+
|
|
54
|
+
static override fields(field: FieldBuilder) {
|
|
55
|
+
return {
|
|
56
|
+
...UserIdentity.fields(field),
|
|
57
|
+
selectedWebsiteId: field.string({
|
|
58
|
+
column: 'selected_website_id',
|
|
59
|
+
}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import { App } from '@db3.ai/app/server';
|
|
67
|
+
import auth from './config/auth.js';
|
|
68
|
+
import { User } from './models/User.js';
|
|
69
|
+
|
|
70
|
+
const app = new App({
|
|
71
|
+
config: {
|
|
72
|
+
auth,
|
|
73
|
+
},
|
|
74
|
+
auth: {
|
|
75
|
+
identityModel: User,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The framework `App` constructs one `Auth` service with the application
|
|
81
|
+
database, config repository, identity model, and request context. Normal app
|
|
82
|
+
code accesses it through `app.auth`.
|
|
83
|
+
|
|
84
|
+
`UserIdentity.avatarUrl` is the account-owned avatar. An external provider can
|
|
85
|
+
supply its initial value. Later provider logins only backfill a missing account
|
|
86
|
+
avatar, so a user-selected avatar is not overwritten. The provider's latest
|
|
87
|
+
reported image remains available on its `AuthProvider.avatarUrl` row.
|
|
88
|
+
|
|
89
|
+
## Provider Configuration
|
|
90
|
+
|
|
91
|
+
Apps configure enabled providers under `auth.providers`. A provider entry can
|
|
92
|
+
be `true`, `false`, an options object, or a concrete custom driver instance.
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
import { GOOGLE_AUTH_PROVIDER, PASSWORD_AUTH_PROVIDER, type AuthProviderRegistry } from '@db3.ai/app/auth';
|
|
96
|
+
import { defineConfig, env } from '@db3.ai/app/config';
|
|
97
|
+
import type { User } from '../models/User.js';
|
|
98
|
+
|
|
99
|
+
const googleClientIds = [
|
|
100
|
+
...env.array('GOOGLE_AUTH_CLIENT_IDS', []),
|
|
101
|
+
env.string('GOOGLE_AUTH_CLIENT_ID'),
|
|
102
|
+
].filter((value): value is string => Boolean(value));
|
|
103
|
+
|
|
104
|
+
export default defineConfig({
|
|
105
|
+
providers: {
|
|
106
|
+
[PASSWORD_AUTH_PROVIDER]: {
|
|
107
|
+
driver: PASSWORD_AUTH_PROVIDER,
|
|
108
|
+
},
|
|
109
|
+
[GOOGLE_AUTH_PROVIDER]: {
|
|
110
|
+
driver: GOOGLE_AUTH_PROVIDER,
|
|
111
|
+
enabled: googleClientIds.length > 0,
|
|
112
|
+
clientIds: googleClientIds,
|
|
113
|
+
hostedDomain: env.string('GOOGLE_AUTH_HOSTED_DOMAIN'),
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
} satisfies {
|
|
117
|
+
providers: AuthProviderRegistry<User>;
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The auth package reads config values; it does not impose environment variable
|
|
122
|
+
names. The names above are examples; choose names that fit your application.
|
|
123
|
+
|
|
124
|
+
## Password Provider
|
|
125
|
+
|
|
126
|
+
Enable the built-in password driver with:
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
[PASSWORD_AUTH_PROVIDER]: {
|
|
130
|
+
driver: PASSWORD_AUTH_PROVIDER,
|
|
131
|
+
},
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Register a password-backed account and issue its first bearer token:
|
|
135
|
+
|
|
136
|
+
```ts
|
|
137
|
+
const issued = await app.auth.registerWithPassword({
|
|
138
|
+
name: 'Ada Lovelace',
|
|
139
|
+
email: 'ada@example.com',
|
|
140
|
+
password: submittedPassword,
|
|
141
|
+
});
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Authenticate an existing password provider:
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
const issued = await app.auth.issueTokenForProvider(PASSWORD_AUTH_PROVIDER, {
|
|
148
|
+
email: submittedEmail,
|
|
149
|
+
password: submittedPassword,
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
if (!issued) {
|
|
153
|
+
// Return the app's generic invalid-credentials response.
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Password hashes live on `auth_providers.password`, not on the user row. The
|
|
158
|
+
field hashes plaintext during database serialization and never exposes the
|
|
159
|
+
stored hash through JSON.
|
|
160
|
+
|
|
161
|
+
Password-reset routes should find the user without revealing whether the email
|
|
162
|
+
exists, call `createPasswordResetToken(user)`, send the plaintext token once,
|
|
163
|
+
and later redeem it with `resetPassword(...)`.
|
|
164
|
+
|
|
165
|
+
## Google Provider
|
|
166
|
+
|
|
167
|
+
The built-in Google driver accepts a Google Identity Services ID token. It
|
|
168
|
+
verifies the signature against Google's JWK set and validates the issuer,
|
|
169
|
+
audience, expiry, subject, and optional hosted-domain restriction. It then
|
|
170
|
+
normalizes Google claims such as email, name, picture, locale, and Google `sub`.
|
|
171
|
+
|
|
172
|
+
### Google Cloud setup
|
|
173
|
+
|
|
174
|
+
1. Create or select a project in Google Cloud Console.
|
|
175
|
+
2. Configure the OAuth consent screen and branding.
|
|
176
|
+
3. Create an OAuth client with application type **Web application**.
|
|
177
|
+
4. Add every browser origin under **Authorized JavaScript origins**, including
|
|
178
|
+
scheme and port for development, such as `http://localhost:5173`.
|
|
179
|
+
5. Put the web client id in `GOOGLE_AUTH_CLIENT_ID`. Use
|
|
180
|
+
`GOOGLE_AUTH_CLIENT_IDS` as a comma-separated list while accepting multiple
|
|
181
|
+
deployments or rotating client ids.
|
|
182
|
+
6. Optionally set `GOOGLE_AUTH_HOSTED_DOMAIN` to restrict authentication to one
|
|
183
|
+
Google Workspace domain.
|
|
184
|
+
7. Load Google Identity Services in the browser, render its official button,
|
|
185
|
+
and send the callback's `credential` ID token to the app's backend.
|
|
186
|
+
|
|
187
|
+
Useful Google guides:
|
|
188
|
+
|
|
189
|
+
- Setup and create a web client:
|
|
190
|
+
<https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid>
|
|
191
|
+
- Render the official sign-in/sign-up button:
|
|
192
|
+
<https://developers.google.com/identity/gsi/web/guides/display-button>
|
|
193
|
+
- Verify Google ID tokens on a backend:
|
|
194
|
+
<https://developers.google.com/identity/gsi/web/guides/verify-google-id-token>
|
|
195
|
+
|
|
196
|
+
No Google client secret is required to verify a Google Sign-In ID token. OAuth
|
|
197
|
+
access and refresh tokens for Search Console, Analytics, Calendar, or other
|
|
198
|
+
Google APIs are a separate integration concern and should not be stored on the
|
|
199
|
+
authentication provider row.
|
|
200
|
+
|
|
201
|
+
Authenticate or create the account from a Google credential:
|
|
202
|
+
|
|
203
|
+
```ts
|
|
204
|
+
const issued = await app.auth.issueTokenForProvider(GOOGLE_AUTH_PROVIDER, {
|
|
205
|
+
credential: request.body.credential,
|
|
206
|
+
});
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
The first verified use creates a user and Google provider row. Later uses find
|
|
210
|
+
the account through Google's stable `sub` claim. If an account already exists
|
|
211
|
+
with the same email but Google is not linked, auth throws
|
|
212
|
+
`AuthIdentityExistsError`; the app should ask the authenticated user to link
|
|
213
|
+
Google explicitly rather than automatically merging accounts by email.
|
|
214
|
+
|
|
215
|
+
### AI assistant prompt
|
|
216
|
+
|
|
217
|
+
An app developer can give an AI coding assistant this focused instruction:
|
|
218
|
+
|
|
219
|
+
```text
|
|
220
|
+
Configure Google Sign-In using @db3.ai/app/auth and the app config repository.
|
|
221
|
+
Use Google Identity Services in the browser and send its credential ID token to
|
|
222
|
+
the backend. Configure the Google provider with GOOGLE_AUTH_CLIENT_ID or
|
|
223
|
+
GOOGLE_AUTH_CLIENT_IDS, verify through app.auth.issueTokenForProvider('google',
|
|
224
|
+
...), and return the app's normal session response. Do not store Google access
|
|
225
|
+
or refresh tokens in auth_providers, do not auto-link accounts by matching email,
|
|
226
|
+
and add explicit rate limiting to the public auth route.
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Provider Account Management
|
|
230
|
+
|
|
231
|
+
List linked login methods:
|
|
232
|
+
|
|
233
|
+
```ts
|
|
234
|
+
const providers = await app.auth.providersFor(user);
|
|
235
|
+
const summaries = providers.map(provider => provider.toSummary());
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
`toSummary()` is the settings-safe API projection. It excludes password hashes,
|
|
239
|
+
provider-owned identifiers, and raw provider profile metadata.
|
|
240
|
+
|
|
241
|
+
Link a verified provider to an already-authenticated account:
|
|
242
|
+
|
|
243
|
+
```ts
|
|
244
|
+
const provider = await app.auth.linkProvider(user, GOOGLE_AUTH_PROVIDER, {
|
|
245
|
+
credential: googleCredential,
|
|
246
|
+
});
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Remove a provider by row id or provider name:
|
|
250
|
+
|
|
251
|
+
```ts
|
|
252
|
+
await app.auth.unlinkProvider(user, GOOGLE_AUTH_PROVIDER);
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
`unlinkProvider` throws `AuthLastProviderError` when removal would leave the
|
|
256
|
+
account with no login method. Provider linking and removal routes must require a
|
|
257
|
+
recently authenticated user; the package does not make that HTTP policy choice
|
|
258
|
+
for the app.
|
|
259
|
+
|
|
260
|
+
## Custom Providers
|
|
261
|
+
|
|
262
|
+
A custom provider implements `AuthProviderDriver` and translates its proof into
|
|
263
|
+
an `AuthProviderProfile`. Drivers verify proof only; they do not create users or
|
|
264
|
+
issue sessions.
|
|
265
|
+
|
|
266
|
+
```ts
|
|
267
|
+
import type { AuthProviderDriver, AuthProviderProfile } from '@db3.ai/app/auth';
|
|
268
|
+
|
|
269
|
+
export class ExampleAuthProvider implements AuthProviderDriver<{
|
|
270
|
+
token: string;
|
|
271
|
+
}> {
|
|
272
|
+
readonly provider = 'example';
|
|
273
|
+
|
|
274
|
+
async verify(input: { token: string }): Promise<AuthProviderProfile | null> {
|
|
275
|
+
const externalUser = await verifyExampleToken(input.token);
|
|
276
|
+
|
|
277
|
+
if (!externalUser) return null;
|
|
278
|
+
|
|
279
|
+
return {
|
|
280
|
+
provider: this.provider,
|
|
281
|
+
providerUserId: externalUser.id,
|
|
282
|
+
email: externalUser.email,
|
|
283
|
+
emailVerifiedAt: externalUser.emailVerified ? new Date() : null,
|
|
284
|
+
name: externalUser.name,
|
|
285
|
+
avatarUrl: externalUser.avatarUrl,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Register the concrete driver through `AuthOptions.providers` or the app's auth
|
|
292
|
+
provider config. Magic-link authentication can use the same normalized profile
|
|
293
|
+
contract, but token generation, email delivery, expiry, and single-use
|
|
294
|
+
redemption must be implemented as a dedicated first-party driver/service.
|
|
295
|
+
|
|
296
|
+
## Bearer Sessions
|
|
297
|
+
|
|
298
|
+
`issueTokenForProvider(...)` returns an `IssuedAuthToken` containing the
|
|
299
|
+
plaintext bearer token once. Persist only the hashed `AuthToken` record.
|
|
300
|
+
|
|
301
|
+
At an HTTP boundary, read the bearer value and authenticate it:
|
|
302
|
+
|
|
303
|
+
```ts
|
|
304
|
+
const user = await app.auth.authenticateToken(bearerToken);
|
|
305
|
+
|
|
306
|
+
if (!user) {
|
|
307
|
+
// Return 401.
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
With the framework request context enabled, repeated authentication of the same
|
|
312
|
+
token during one request is memoized and `app.auth.user` is request-scoped.
|
|
313
|
+
Use `app.auth.requireUser()` only after the route has established authentication.
|
|
314
|
+
|
|
315
|
+
Browser apps can attach session metadata through `AuthTokenOptions` when issuing
|
|
316
|
+
a token:
|
|
317
|
+
|
|
318
|
+
```ts
|
|
319
|
+
const issued = await app.auth.issueTokenForProvider('password', credentials, {
|
|
320
|
+
name: 'Chrome on macOS',
|
|
321
|
+
ipAddress: request.ip,
|
|
322
|
+
userAgent: request.headers['user-agent'],
|
|
323
|
+
browser: 'Chrome',
|
|
324
|
+
operatingSystem: 'macOS',
|
|
325
|
+
device: 'Desktop',
|
|
326
|
+
});
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
The framework stores the raw user agent for server-side diagnostics but hides it,
|
|
330
|
+
along with the token hash, from model JSON. `AuthToken.toSessionData()` returns a
|
|
331
|
+
safe account-management projection.
|
|
332
|
+
|
|
333
|
+
List and revoke active sessions through the authenticated account:
|
|
334
|
+
|
|
335
|
+
```ts
|
|
336
|
+
const sessions = await app.auth.tokensFor(user);
|
|
337
|
+
await app.auth.revokeToken(user, sessionId);
|
|
338
|
+
await app.auth.revokeCurrentToken();
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Revocation sets `revokedAt`; the next bearer-token authentication rejects the
|
|
342
|
+
session before loading its user. `tokensFor(...)` excludes revoked and expired
|
|
343
|
+
sessions. The current authenticated token is available as `app.auth.token`
|
|
344
|
+
inside the request context so an app can mark the current browser session.
|
|
345
|
+
|
|
346
|
+
## Security Responsibilities
|
|
347
|
+
|
|
348
|
+
The auth package validates credentials and tokens, but the application still
|
|
349
|
+
owns HTTP security controls:
|
|
350
|
+
|
|
351
|
+
- Rate-limit public sign-in, sign-up, provider, forgot-password, and reset routes.
|
|
352
|
+
- Use generic invalid-credential and forgot-password responses to reduce account
|
|
353
|
+
enumeration.
|
|
354
|
+
- Accept bearer tokens only over HTTPS in production.
|
|
355
|
+
- Configure Fastify `trustProxy` only for known reverse proxies before using
|
|
356
|
+
request IPs as rate-limit keys.
|
|
357
|
+
- Use a shared rate-limit store when API traffic is handled by multiple processes.
|
|
358
|
+
- Let users inspect and revoke active bearer sessions, and revoke the current
|
|
359
|
+
token during sign-out rather than only deleting browser storage.
|
|
360
|
+
- Keep provider client secrets and integration refresh tokens out of JSON,
|
|
361
|
+
browser config, and `auth_providers.profile`.
|
|
362
|
+
- Require an authenticated user before linking or unlinking providers.
|
|
363
|
+
- Do not automatically link an external provider to an existing account solely
|
|
364
|
+
because an email claim matches.
|
|
365
|
+
|
|
366
|
+
Applications can provide explicit route middleware with tools such as
|
|
367
|
+
`@fastify/rate-limit`; keep the concrete limits and store configuration in the
|
|
368
|
+
consuming application's server configuration.
|
|
369
|
+
|
|
370
|
+
Revocable bearer sessions do not prevent JavaScript from reading a token stored
|
|
371
|
+
in `localStorage`. Browser apps with an XSS-sensitive threat model should use a
|
|
372
|
+
Secure, `HttpOnly`, `SameSite` cookie transport and add CSRF protection for
|
|
373
|
+
state-changing requests. That transport is app-owned and is not automatically
|
|
374
|
+
selected by this HTTP-framework-agnostic package.
|
|
375
|
+
|
|
376
|
+
## Verification
|
|
377
|
+
|
|
378
|
+
The [password auth lab](./examples/runPasswordAuth.ts) exercises real SQL
|
|
379
|
+
registration, correct/incorrect sign-in, bearer authentication, password reset,
|
|
380
|
+
sequential reset-token reuse rejection and revocation. Copy it from the installed
|
|
381
|
+
package into `examples` and run `npx tsx examples/runPasswordAuth.ts` with a
|
|
382
|
+
dedicated test account allowed to create/drop `db3_app_test_*` databases.
|
|
383
|
+
It creates a unique database and removes it in `finally`; no email is sent and
|
|
384
|
+
no token is logged. It is not a public HTTP auth endpoint.
|
|
385
|
+
|
|
386
|
+
The lab does not establish race-safety for concurrent registration or reset
|
|
387
|
+
redemption. Resetting a password does not automatically revoke existing bearer
|
|
388
|
+
sessions; the application must choose and enforce that policy. The website's
|
|
389
|
+
Auth page includes the exact test to copy into an independent application.
|
|
390
|
+
|
|
391
|
+
Run the auth package tests from the repository root:
|
|
392
|
+
|
|
393
|
+
```sh
|
|
394
|
+
npm run test:service --workspace packages/app -- auth
|
|
395
|
+
npm run check --workspace packages/app
|
|
396
|
+
```
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ActiveRecord,
|
|
3
|
+
type ActiveRecordClass,
|
|
4
|
+
type FieldBuilder,
|
|
5
|
+
} from '../db';
|
|
6
|
+
|
|
7
|
+
type RecoveryCodes = string[];
|
|
8
|
+
|
|
9
|
+
export type UserIdentityModel<TIdentity extends UserIdentity = UserIdentity> =
|
|
10
|
+
ActiveRecordClass<TIdentity> & {
|
|
11
|
+
identityField: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Auth-owned base user model.
|
|
16
|
+
*
|
|
17
|
+
* Apps can extend this model to add domain-specific fields and behaviour while
|
|
18
|
+
* the auth package keeps ownership of account identity fields. Credential
|
|
19
|
+
* storage lives on `AuthProvider` rows so users can link multiple login methods.
|
|
20
|
+
*/
|
|
21
|
+
export class UserIdentity extends ActiveRecord {
|
|
22
|
+
static override table = 'users';
|
|
23
|
+
static override primaryKey = 'id';
|
|
24
|
+
static identityField = 'email';
|
|
25
|
+
|
|
26
|
+
static override fields(field: FieldBuilder) {
|
|
27
|
+
return {
|
|
28
|
+
id: field.ulid(),
|
|
29
|
+
|
|
30
|
+
name: field.string({
|
|
31
|
+
required: true,
|
|
32
|
+
maxLength: 255,
|
|
33
|
+
length: 255,
|
|
34
|
+
}),
|
|
35
|
+
|
|
36
|
+
email: field.email({
|
|
37
|
+
required: true,
|
|
38
|
+
maxLength: 255,
|
|
39
|
+
length: 255,
|
|
40
|
+
unique: true,
|
|
41
|
+
}),
|
|
42
|
+
|
|
43
|
+
emailVerifiedAt: field.timestamp({
|
|
44
|
+
column: 'email_verified_at',
|
|
45
|
+
}),
|
|
46
|
+
|
|
47
|
+
avatarUrl: field.string({
|
|
48
|
+
column: 'avatar_url',
|
|
49
|
+
maxLength: 2048,
|
|
50
|
+
length: 2048,
|
|
51
|
+
comment: 'Account avatar URL. External providers may supply the initial value, while the account owns later changes.',
|
|
52
|
+
}),
|
|
53
|
+
|
|
54
|
+
rememberToken: field.string({
|
|
55
|
+
column: 'remember_token',
|
|
56
|
+
maxLength: 100,
|
|
57
|
+
length: 100,
|
|
58
|
+
hidden: true,
|
|
59
|
+
}),
|
|
60
|
+
|
|
61
|
+
createdAt: field.timestamp({
|
|
62
|
+
column: 'created_at',
|
|
63
|
+
auto: 'create',
|
|
64
|
+
}),
|
|
65
|
+
|
|
66
|
+
updatedAt: field.timestamp({
|
|
67
|
+
column: 'updated_at',
|
|
68
|
+
auto: 'update',
|
|
69
|
+
}),
|
|
70
|
+
|
|
71
|
+
twoFactorSecret: field.text({
|
|
72
|
+
column: 'two_factor_secret',
|
|
73
|
+
hidden: true,
|
|
74
|
+
}),
|
|
75
|
+
|
|
76
|
+
twoFactorRecoveryCodes: field.jsonText<RecoveryCodes>({
|
|
77
|
+
column: 'two_factor_recovery_codes',
|
|
78
|
+
hidden: true,
|
|
79
|
+
}),
|
|
80
|
+
|
|
81
|
+
twoFactorConfirmedAt: field.timestamp({
|
|
82
|
+
column: 'two_factor_confirmed_at',
|
|
83
|
+
}),
|
|
84
|
+
|
|
85
|
+
lastLoginAt: field.timestamp({
|
|
86
|
+
column: 'last_login_at',
|
|
87
|
+
}),
|
|
88
|
+
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
declare id: string | null;
|
|
93
|
+
declare name: string | null;
|
|
94
|
+
declare email: string | null;
|
|
95
|
+
declare emailVerifiedAt: Date | null;
|
|
96
|
+
declare avatarUrl: string | null;
|
|
97
|
+
declare rememberToken: string | null;
|
|
98
|
+
declare createdAt: Date | null;
|
|
99
|
+
declare updatedAt: Date | null;
|
|
100
|
+
declare twoFactorSecret: string | null;
|
|
101
|
+
declare twoFactorRecoveryCodes: RecoveryCodes | null;
|
|
102
|
+
declare twoFactorConfirmedAt: Date | null;
|
|
103
|
+
declare lastLoginAt: Date | null;
|
|
104
|
+
|
|
105
|
+
get emailDomain(): string | null {
|
|
106
|
+
return this.email ? this.email.split('@')[1] : null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
markEmailVerified(date = new Date()): void {
|
|
110
|
+
this.emailVerifiedAt = date;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { UserIdentity } from '../UserIdentity';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Normalized identity details returned by an authentication provider.
|
|
5
|
+
*
|
|
6
|
+
* Provider drivers translate their own proof mechanism into this shape. The
|
|
7
|
+
* auth service owns persistence and session issuance after the driver proves
|
|
8
|
+
* that the caller controls the provider account.
|
|
9
|
+
*/
|
|
10
|
+
export interface AuthProviderProfile {
|
|
11
|
+
/**
|
|
12
|
+
* Stable provider name, such as `password`, `google`, or `magic_link`.
|
|
13
|
+
*/
|
|
14
|
+
provider: string;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Stable provider-owned account id.
|
|
18
|
+
*
|
|
19
|
+
* For OAuth/OIDC providers this should be the provider subject/id, not an
|
|
20
|
+
* email address. The built-in password and magic-link providers use the
|
|
21
|
+
* normalized email address because the email inbox/account is the proof.
|
|
22
|
+
*/
|
|
23
|
+
providerUserId: string;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Email address reported or proven by the provider.
|
|
27
|
+
*/
|
|
28
|
+
email?: string | null;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* When the provider proved the email address belongs to the user.
|
|
32
|
+
*/
|
|
33
|
+
emailVerifiedAt?: Date | null;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Human-friendly provider account name.
|
|
37
|
+
*/
|
|
38
|
+
name?: string | null;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Provider account avatar URL for account settings displays.
|
|
42
|
+
*/
|
|
43
|
+
avatarUrl?: string | null;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Optional UI label for the linked provider row.
|
|
47
|
+
*/
|
|
48
|
+
label?: string | null;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Safe provider metadata that callers may need to inspect later.
|
|
52
|
+
*/
|
|
53
|
+
profile?: Record<string, unknown> | null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Pluggable authentication provider driver.
|
|
58
|
+
*
|
|
59
|
+
* Drivers perform provider-specific verification. They should not create users
|
|
60
|
+
* or sessions; provider-owned helpers may update provider rows when the auth
|
|
61
|
+
* service explicitly calls them for flows such as password setup.
|
|
62
|
+
*/
|
|
63
|
+
export interface AuthProviderDriver<TInput = unknown, TIdentity extends UserIdentity = UserIdentity> {
|
|
64
|
+
/**
|
|
65
|
+
* Stable provider name used in `auth_providers.provider`.
|
|
66
|
+
*/
|
|
67
|
+
provider: string;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Verifies provider-specific input and returns a normalized profile.
|
|
71
|
+
*
|
|
72
|
+
* @param input - Provider-specific credential payload.
|
|
73
|
+
* @returns Normalized provider profile, or null when verification fails.
|
|
74
|
+
*/
|
|
75
|
+
verify(input: TInput): Promise<AuthProviderProfile | null>;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Object-style provider config read from the app config repository.
|
|
80
|
+
*/
|
|
81
|
+
export interface AuthProviderOptions {
|
|
82
|
+
/**
|
|
83
|
+
* Built-in or custom driver name. Defaults to the provider key.
|
|
84
|
+
*/
|
|
85
|
+
driver?: string;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Whether this provider should be registered. Defaults to true.
|
|
89
|
+
*/
|
|
90
|
+
enabled?: boolean;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Provider-specific configuration values.
|
|
94
|
+
*/
|
|
95
|
+
[option: string]: unknown;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Provider configuration accepted by the auth service.
|
|
100
|
+
*
|
|
101
|
+
* `true` enables a built-in provider such as `password`; driver instances
|
|
102
|
+
* enable external or custom first-party providers.
|
|
103
|
+
*/
|
|
104
|
+
export type AuthProviderConfig<TIdentity extends UserIdentity = UserIdentity> =
|
|
105
|
+
| true
|
|
106
|
+
| false
|
|
107
|
+
| AuthProviderOptions
|
|
108
|
+
| AuthProviderDriver<unknown, TIdentity>;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Map of provider names enabled for an app.
|
|
112
|
+
*/
|
|
113
|
+
export type AuthProviderRegistry<TIdentity extends UserIdentity = UserIdentity> =
|
|
114
|
+
Record<string, AuthProviderConfig<TIdentity>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './AuthProviderDriver';
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { pathToFileURL } from 'node:url';
|
|
2
|
+
import { AuthProvider, AuthToken, PasswordResetToken, UserIdentity, PASSWORD_AUTH_PROVIDER } from '@db3.ai/app/auth';
|
|
3
|
+
import { createGeneratedTestDatabase } from '@db3.ai/app/db/test/db';
|
|
4
|
+
import { App } from '@db3.ai/app/server';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Exercises password registration, sessions, reset and revocation in a disposable database.
|
|
8
|
+
*
|
|
9
|
+
* Requires a test SQL account allowed to create/drop db3_app_test_* databases.
|
|
10
|
+
* This is a service lab, not a public sign-up route. Real routes must validate
|
|
11
|
+
* requests, rate-limit access and choose a secure session transport.
|
|
12
|
+
*
|
|
13
|
+
* @returns Non-secret outcomes; passwords and issued tokens are never logged.
|
|
14
|
+
*/
|
|
15
|
+
export async function runPasswordAuth() {
|
|
16
|
+
const database = await createGeneratedTestDatabase('auth_guide');
|
|
17
|
+
const application = new App({ db: database.db, config: { auth: { providers: { password: true } } } });
|
|
18
|
+
try {
|
|
19
|
+
// Lab-only schema setup. Use committed migrations in an application.
|
|
20
|
+
await application.db.install(UserIdentity, AuthProvider, AuthToken, PasswordResetToken);
|
|
21
|
+
const credentials = { name: 'Ada', email: 'ada@example.test', password: 'example-only-password-123' };
|
|
22
|
+
const issued = await application.auth.registerWithPassword(credentials, { expiresInMs: 60 * 60 * 1000 });
|
|
23
|
+
const wrongPasswordRejected = await application.auth.issueTokenForProvider(PASSWORD_AUTH_PROVIDER, { ...credentials, password: 'wrong-password' }) === null;
|
|
24
|
+
const signedIn = await application.auth.issueTokenForProvider(PASSWORD_AUTH_PROVIDER, credentials);
|
|
25
|
+
const authenticated = await application.requestContext.run(async () => {
|
|
26
|
+
const user = await application.auth.authenticateToken(issued.token);
|
|
27
|
+
return user?.id === issued.user.id;
|
|
28
|
+
});
|
|
29
|
+
const reset = await application.auth.createPasswordResetToken(issued.user);
|
|
30
|
+
const replacement = { token: reset.token, password: 'replacement-example-password-456' };
|
|
31
|
+
const passwordChanged = Boolean(await application.auth.resetPassword(replacement));
|
|
32
|
+
const usedResetRejected = await application.auth.resetPassword(replacement) === null;
|
|
33
|
+
const oldPasswordRejected = await application.auth.issueTokenForProvider(PASSWORD_AUTH_PROVIDER, credentials) === null;
|
|
34
|
+
const sessions = await application.auth.tokensFor(issued.user);
|
|
35
|
+
for (const session of sessions) await application.auth.revokeToken(issued.user, session.id!);
|
|
36
|
+
const revokedTokenRejected = await application.requestContext.run(async () => await application.auth.authenticateToken(issued.token) === null);
|
|
37
|
+
return { authenticated, signedIn: Boolean(signedIn), wrongPasswordRejected, passwordChanged, usedResetRejected, oldPasswordRejected, revokedTokenRejected };
|
|
38
|
+
} finally {
|
|
39
|
+
try { await application.close(); } finally { await database.destroy(); }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
44
|
+
console.log(JSON.stringify(await runPasswordAuth(), null, 2));
|
|
45
|
+
}
|