@harperfast/harper 5.1.20 → 5.2.0-alpha.5
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/agent/operations.ts +13 -16
- package/components/Application.ts +188 -7
- package/components/ApplicationScope.ts +3 -0
- package/components/Scope.ts +12 -0
- package/components/anthropic/index.ts +9 -2
- package/components/bedrock/index.ts +25 -2
- package/components/componentLoader.ts +56 -7
- package/components/componentSecrets.ts +451 -0
- package/components/deploymentRecorder.ts +7 -1
- package/components/mcp/adapters/fastify.ts +3 -0
- package/components/mcp/adapters/harperHttp.ts +3 -0
- package/components/mcp/audit.ts +21 -6
- package/components/mcp/customResourceRegistry.ts +17 -38
- package/components/mcp/listChanged.ts +37 -20
- package/components/mcp/quota.ts +145 -0
- package/components/mcp/rateLimit.ts +152 -14
- package/components/mcp/resources.ts +2 -4
- package/components/mcp/toolRegistry.ts +73 -4
- package/components/mcp/tools/application.ts +77 -8
- package/components/mcp/tools/operations.ts +106 -36
- package/components/mcp/tools/schemas/operationDescriptions.ts +4 -4
- package/components/mcp/tools/schemas/operations.ts +5 -0
- package/components/mcp/transport.ts +55 -4
- package/components/ollama/index.ts +6 -2
- package/components/openai/index.ts +9 -2
- package/components/operations.js +204 -10
- package/components/operationsValidation.js +173 -0
- package/components/secretOperations.ts +498 -0
- package/config/configUtils.ts +25 -1
- package/config-app.schema.json +81 -0
- package/config-root.schema.json +8 -1
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +4 -3
- package/dataLayer/readAuditLog.ts +14 -0
- package/dataLayer/schemaDescribe.ts +1 -0
- package/dist/agent/operations.d.ts +7 -4
- package/dist/agent/operations.js +13 -15
- package/dist/agent/operations.js.map +1 -1
- package/dist/components/Application.d.ts +25 -2
- package/dist/components/Application.js +166 -7
- package/dist/components/Application.js.map +1 -1
- package/dist/components/ApplicationScope.d.ts +2 -0
- package/dist/components/ApplicationScope.js +3 -0
- package/dist/components/ApplicationScope.js.map +1 -1
- package/dist/components/Scope.d.ts +8 -0
- package/dist/components/Scope.js +11 -0
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/anthropic/index.d.ts +4 -1
- package/dist/components/anthropic/index.js +4 -2
- package/dist/components/anthropic/index.js.map +1 -1
- package/dist/components/bedrock/index.d.ts +4 -1
- package/dist/components/bedrock/index.js +22 -2
- package/dist/components/bedrock/index.js.map +1 -1
- package/dist/components/componentLoader.d.ts +2 -0
- package/dist/components/componentLoader.js +52 -10
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/componentSecrets.d.ts +63 -0
- package/dist/components/componentSecrets.js +405 -0
- package/dist/components/componentSecrets.js.map +1 -0
- package/dist/components/deploymentRecorder.d.ts +3 -0
- package/dist/components/deploymentRecorder.js +4 -3
- package/dist/components/deploymentRecorder.js.map +1 -1
- package/dist/components/mcp/adapters/fastify.d.ts +2 -0
- package/dist/components/mcp/adapters/fastify.js +1 -0
- package/dist/components/mcp/adapters/fastify.js.map +1 -1
- package/dist/components/mcp/adapters/harperHttp.d.ts +2 -0
- package/dist/components/mcp/adapters/harperHttp.js +1 -0
- package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
- package/dist/components/mcp/audit.d.ts +2 -2
- package/dist/components/mcp/audit.js +20 -5
- package/dist/components/mcp/audit.js.map +1 -1
- package/dist/components/mcp/customResourceRegistry.d.ts +5 -12
- package/dist/components/mcp/customResourceRegistry.js +15 -30
- package/dist/components/mcp/customResourceRegistry.js.map +1 -1
- package/dist/components/mcp/listChanged.d.ts +7 -2
- package/dist/components/mcp/listChanged.js +28 -0
- package/dist/components/mcp/listChanged.js.map +1 -1
- package/dist/components/mcp/quota.d.ts +31 -0
- package/dist/components/mcp/quota.js +155 -0
- package/dist/components/mcp/quota.js.map +1 -0
- package/dist/components/mcp/rateLimit.d.ts +19 -3
- package/dist/components/mcp/rateLimit.js +129 -13
- package/dist/components/mcp/rateLimit.js.map +1 -1
- package/dist/components/mcp/resources.js.map +1 -1
- package/dist/components/mcp/toolRegistry.d.ts +39 -1
- package/dist/components/mcp/toolRegistry.js +60 -5
- package/dist/components/mcp/toolRegistry.js.map +1 -1
- package/dist/components/mcp/tools/application.d.ts +8 -1
- package/dist/components/mcp/tools/application.js +65 -5
- package/dist/components/mcp/tools/application.js.map +1 -1
- package/dist/components/mcp/tools/operations.d.ts +15 -3
- package/dist/components/mcp/tools/operations.js +99 -38
- package/dist/components/mcp/tools/operations.js.map +1 -1
- package/dist/components/mcp/tools/schemas/operationDescriptions.js +4 -4
- package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
- package/dist/components/mcp/tools/schemas/operations.js +4 -0
- package/dist/components/mcp/tools/schemas/operations.js.map +1 -1
- package/dist/components/mcp/transport.d.ts +6 -0
- package/dist/components/mcp/transport.js +47 -3
- package/dist/components/mcp/transport.js.map +1 -1
- package/dist/components/ollama/index.d.ts +4 -1
- package/dist/components/ollama/index.js +4 -2
- package/dist/components/ollama/index.js.map +1 -1
- package/dist/components/openai/index.d.ts +4 -1
- package/dist/components/openai/index.js +4 -2
- package/dist/components/openai/index.js.map +1 -1
- package/dist/components/operations.d.ts +39 -0
- package/dist/components/operations.js +194 -2
- package/dist/components/operations.js.map +1 -1
- package/dist/components/operationsValidation.d.ts +38 -0
- package/dist/components/operationsValidation.js +155 -0
- package/dist/components/operationsValidation.js.map +1 -1
- package/dist/components/secretOperations.d.ts +113 -0
- package/dist/components/secretOperations.js +475 -0
- package/dist/components/secretOperations.js.map +1 -0
- package/dist/config/configUtils.d.ts +4 -1
- package/dist/config/configUtils.js +18 -1
- package/dist/config/configUtils.js.map +1 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +4 -3
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js.map +1 -1
- package/dist/dataLayer/readAuditLog.js +11 -0
- package/dist/dataLayer/readAuditLog.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +2 -0
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/globals.d.ts +1 -1
- package/dist/globals.js +1 -0
- package/dist/globals.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/json/systemSchema.json +38 -0
- package/dist/resources/DatabaseTransaction.d.ts +31 -3
- package/dist/resources/DatabaseTransaction.js +190 -29
- package/dist/resources/DatabaseTransaction.js.map +1 -1
- package/dist/resources/LMDBTransaction.d.ts +1 -1
- package/dist/resources/LMDBTransaction.js +43 -5
- package/dist/resources/LMDBTransaction.js.map +1 -1
- package/dist/resources/PrimaryRocksDatabase.d.ts +51 -0
- package/dist/resources/PrimaryRocksDatabase.js +194 -0
- package/dist/resources/PrimaryRocksDatabase.js.map +1 -0
- package/dist/resources/RecordEncoder.d.ts +1 -0
- package/dist/resources/RecordEncoder.js +81 -75
- package/dist/resources/RecordEncoder.js.map +1 -1
- package/dist/resources/RequestTarget.d.ts +19 -0
- package/dist/resources/RequestTarget.js.map +1 -1
- package/dist/resources/Resource.d.ts +0 -1
- package/dist/resources/Resource.js +103 -16
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/ResourceInterface.d.ts +6 -2
- package/dist/resources/ResourceInterface.js.map +1 -1
- package/dist/resources/Resources.js.map +1 -1
- package/dist/resources/Table.d.ts +6 -4
- package/dist/resources/Table.js +247 -24
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +25 -28
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/blob.js +165 -22
- package/dist/resources/blob.js.map +1 -1
- package/dist/resources/crdt.d.ts +2 -0
- package/dist/resources/crdt.js +45 -36
- package/dist/resources/crdt.js.map +1 -1
- package/dist/resources/databases.d.ts +1 -0
- package/dist/resources/databases.js +134 -7
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/graphql.js +8 -0
- package/dist/resources/graphql.js.map +1 -1
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +35 -5
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +239 -14
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
- package/dist/resources/jsResource.js +6 -0
- package/dist/resources/jsResource.js.map +1 -1
- package/dist/resources/loadEnv.js +30 -3
- package/dist/resources/loadEnv.js.map +1 -1
- package/dist/resources/login.js +2 -2
- package/dist/resources/login.js.map +1 -1
- package/dist/resources/models/Models.js +14 -3
- package/dist/resources/models/Models.js.map +1 -1
- package/dist/resources/models/embedHook.js +10 -2
- package/dist/resources/models/embedHook.js.map +1 -1
- package/dist/resources/models/openaiStream.d.ts +56 -0
- package/dist/resources/models/openaiStream.js +94 -0
- package/dist/resources/models/openaiStream.js.map +1 -0
- package/dist/resources/replayLogs.js +4 -3
- package/dist/resources/replayLogs.js.map +1 -1
- package/dist/resources/search.d.ts +1 -1
- package/dist/resources/search.js +104 -11
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/secretDecryptor.d.ts +54 -0
- package/dist/resources/secretDecryptor.js +131 -0
- package/dist/resources/secretDecryptor.js.map +1 -0
- package/dist/resources/tracked.js +15 -5
- package/dist/resources/tracked.js.map +1 -1
- package/dist/security/auth.js +71 -8
- package/dist/security/auth.js.map +1 -1
- package/dist/security/jsLoader.js +11 -0
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/tokenAuthentication.d.ts +9 -1
- package/dist/security/tokenAuthentication.js +31 -1
- package/dist/security/tokenAuthentication.js.map +1 -1
- package/dist/server/DurableSubscriptionsSession.d.ts +1 -1
- package/dist/server/DurableSubscriptionsSession.js +8 -4
- package/dist/server/DurableSubscriptionsSession.js.map +1 -1
- package/dist/server/REST.js +28 -9
- package/dist/server/REST.js.map +1 -1
- package/dist/server/fastifyRoutes.js +11 -1
- package/dist/server/fastifyRoutes.js.map +1 -1
- package/dist/server/graphqlQuerying.js +4 -3
- package/dist/server/graphqlQuerying.js.map +1 -1
- package/dist/server/http.d.ts +40 -2
- package/dist/server/http.js +560 -77
- package/dist/server/http.js.map +1 -1
- package/dist/server/itc/serverHandlers.js +64 -0
- package/dist/server/itc/serverHandlers.js.map +1 -1
- package/dist/server/liveSubscriptionAuth.d.ts +12 -0
- package/dist/server/liveSubscriptionAuth.js +140 -0
- package/dist/server/liveSubscriptionAuth.js.map +1 -0
- package/dist/server/loadRootComponents.js +2 -1
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/middlewareChain.d.ts +44 -1
- package/dist/server/middlewareChain.js +86 -10
- package/dist/server/middlewareChain.js.map +1 -1
- package/dist/server/mqtt.js +2 -1
- package/dist/server/mqtt.js.map +1 -1
- package/dist/server/operationsServer.js +1 -1
- package/dist/server/operationsServer.js.map +1 -1
- package/dist/server/serverHelpers/Headers.d.ts +9 -0
- package/dist/server/serverHelpers/Headers.js +22 -0
- package/dist/server/serverHelpers/Headers.js.map +1 -1
- package/dist/server/serverHelpers/JSONStream.js +3 -3
- package/dist/server/serverHelpers/JSONStream.js.map +1 -1
- package/dist/server/serverHelpers/Request.d.ts +52 -1
- package/dist/server/serverHelpers/Request.js +122 -1
- package/dist/server/serverHelpers/Request.js.map +1 -1
- package/dist/server/serverHelpers/contentTypes.js +3 -8
- package/dist/server/serverHelpers/contentTypes.js.map +1 -1
- package/dist/server/serverHelpers/progressEmitter.d.ts +19 -0
- package/dist/server/serverHelpers/progressEmitter.js +52 -4
- package/dist/server/serverHelpers/progressEmitter.js.map +1 -1
- package/dist/server/serverHelpers/registeredOperations.d.ts +40 -0
- package/dist/server/serverHelpers/registeredOperations.js +286 -0
- package/dist/server/serverHelpers/registeredOperations.js.map +1 -0
- package/dist/server/serverHelpers/serverHandlers.js +11 -5
- package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
- package/dist/server/serverHelpers/serverUtilities.d.ts +1 -0
- package/dist/server/serverHelpers/serverUtilities.js +67 -5
- package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
- package/dist/server/serverHelpers/uwsServer.d.ts +80 -0
- package/dist/server/serverHelpers/uwsServer.js +433 -0
- package/dist/server/serverHelpers/uwsServer.js.map +1 -0
- package/dist/server/static.d.ts +0 -15
- package/dist/server/static.js +161 -2
- package/dist/server/static.js.map +1 -1
- package/dist/server/status/index.d.ts +4 -1
- package/dist/server/status/index.js +64 -4
- package/dist/server/status/index.js.map +1 -1
- package/dist/server/threads/manageThreads.d.ts +10 -0
- package/dist/server/threads/manageThreads.js +107 -4
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.js +5 -1
- package/dist/server/threads/socketRouter.js.map +1 -1
- package/dist/server/threads/threadServer.js +92 -14
- package/dist/server/threads/threadServer.js.map +1 -1
- package/dist/upgrade/directives/5-2-0.d.ts +7 -0
- package/dist/upgrade/directives/5-2-0.js +108 -0
- package/dist/upgrade/directives/5-2-0.js.map +1 -0
- package/dist/upgrade/directives/directivesController.js +2 -1
- package/dist/upgrade/directives/directivesController.js.map +1 -1
- package/dist/utility/common_utils.js +5 -0
- package/dist/utility/common_utils.js.map +1 -1
- package/dist/utility/envFile.d.ts +41 -0
- package/dist/utility/envFile.js +221 -0
- package/dist/utility/envFile.js.map +1 -0
- package/dist/utility/globalSchema.d.ts +9 -0
- package/dist/utility/hdbTerms.d.ts +25 -0
- package/dist/utility/hdbTerms.js +31 -0
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/logging/harper_logger.d.ts +21 -0
- package/dist/utility/logging/harper_logger.js +160 -8
- package/dist/utility/logging/harper_logger.js.map +1 -1
- package/dist/utility/logging/logRotator.js +29 -17
- package/dist/utility/logging/logRotator.js.map +1 -1
- package/dist/utility/logging/readLog.d.ts +1 -1
- package/dist/utility/logging/readLog.js +305 -2
- package/dist/utility/logging/readLog.js.map +1 -1
- package/dist/utility/operationPermissions.d.ts +18 -0
- package/dist/utility/operationPermissions.js +35 -1
- package/dist/utility/operationPermissions.js.map +1 -1
- package/dist/utility/operation_authorization.d.ts +17 -0
- package/dist/utility/operation_authorization.js +38 -0
- package/dist/utility/operation_authorization.js.map +1 -1
- package/dist/utility/secretEnvelope.d.ts +30 -0
- package/dist/utility/secretEnvelope.js +94 -0
- package/dist/utility/secretEnvelope.js.map +1 -0
- package/dist/utility/signalling.d.ts +7 -0
- package/dist/utility/signalling.js +16 -0
- package/dist/utility/signalling.js.map +1 -1
- package/dist/validation/configValidator.js +70 -24
- package/dist/validation/configValidator.js.map +1 -1
- package/index.ts +4 -0
- package/json/systemSchema.json +38 -0
- package/npm-shrinkwrap.json +15066 -9347
- package/package.json +14 -9
- package/resources/DESIGN.md +15 -12
- package/resources/DatabaseTransaction.ts +206 -37
- package/resources/LMDBTransaction.ts +43 -9
- package/resources/PrimaryRocksDatabase.ts +201 -0
- package/resources/RecordEncoder.ts +81 -69
- package/resources/RequestTarget.ts +21 -0
- package/resources/Resource.ts +109 -25
- package/resources/ResourceInterface.ts +6 -2
- package/resources/Resources.ts +1 -3
- package/resources/Table.ts +238 -29
- package/resources/analytics/read.ts +25 -30
- package/resources/blob.ts +159 -23
- package/resources/crdt.ts +37 -31
- package/resources/databases.ts +143 -6
- package/resources/graphql.ts +8 -0
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +251 -17
- package/resources/jsResource.ts +6 -0
- package/resources/loadEnv.ts +34 -3
- package/resources/login.ts +2 -2
- package/resources/models/Models.ts +19 -3
- package/resources/models/embedHook.ts +13 -2
- package/resources/models/openaiStream.ts +133 -0
- package/resources/replayLogs.ts +4 -3
- package/resources/search.ts +113 -11
- package/resources/secretDecryptor.ts +159 -0
- package/resources/tracked.ts +24 -17
- package/security/auth.ts +70 -10
- package/security/jsLoader.ts +12 -0
- package/security/tokenAuthentication.ts +42 -1
- package/server/DESIGN.md +10 -0
- package/server/DurableSubscriptionsSession.ts +8 -4
- package/server/REST.ts +26 -9
- package/server/fastifyRoutes.ts +10 -1
- package/server/graphqlQuerying.ts +4 -3
- package/server/http.ts +563 -77
- package/server/itc/serverHandlers.js +70 -0
- package/server/liveSubscriptionAuth.ts +152 -0
- package/server/loadRootComponents.js +2 -1
- package/server/middlewareChain.ts +107 -17
- package/server/mqtt.ts +2 -1
- package/server/operationsServer.ts +2 -2
- package/server/serverHelpers/Headers.ts +24 -0
- package/server/serverHelpers/JSONStream.ts +3 -3
- package/server/serverHelpers/Request.ts +127 -0
- package/server/serverHelpers/contentTypes.ts +3 -8
- package/server/serverHelpers/progressEmitter.ts +55 -5
- package/server/serverHelpers/registeredOperations.ts +259 -0
- package/server/serverHelpers/serverHandlers.js +11 -5
- package/server/serverHelpers/serverUtilities.ts +88 -5
- package/server/serverHelpers/uwsServer.ts +488 -0
- package/server/static.ts +180 -2
- package/server/status/index.ts +72 -4
- package/server/threads/manageThreads.js +102 -4
- package/server/threads/socketRouter.ts +5 -1
- package/server/threads/threadServer.js +93 -10
- package/studio/web/assets/{Chat-SdD1EZca.js → Chat-Cv_2paZE.js} +2 -2
- package/studio/web/assets/{Chat-SdD1EZca.js.map → Chat-Cv_2paZE.js.map} +1 -1
- package/studio/web/assets/{FloatingChat-GMq6tHK9.js → FloatingChat-CPyPIcVR.js} +4 -4
- package/studio/web/assets/{FloatingChat-GMq6tHK9.js.map → FloatingChat-CPyPIcVR.js.map} +1 -1
- package/studio/web/assets/{applications-B5hhv7uA.js → applications-C0jT2vdZ.js} +2 -2
- package/studio/web/assets/{applications-B5hhv7uA.js.map → applications-C0jT2vdZ.js.map} +1 -1
- package/studio/web/assets/{index-VFcpNWgq.js → index-D_GKOkhn.js} +6 -6
- package/studio/web/assets/index-D_GKOkhn.js.map +1 -0
- package/studio/web/assets/{index.lazy-DgcJojIA.js → index.lazy-CAmCIA65.js} +4 -4
- package/studio/web/assets/{index.lazy-DgcJojIA.js.map → index.lazy-CAmCIA65.js.map} +1 -1
- package/studio/web/assets/{profile-BqN-8vzm.js → profile-CaF-4aZe.js} +2 -2
- package/studio/web/assets/{profile-BqN-8vzm.js.map → profile-CaF-4aZe.js.map} +1 -1
- package/studio/web/assets/{setComponentFile-CHFvFq9u.js → setComponentFile-DLW1DHCt.js} +2 -2
- package/studio/web/assets/{setComponentFile-CHFvFq9u.js.map → setComponentFile-DLW1DHCt.js.map} +1 -1
- package/studio/web/assets/{setup-CQ3vWJSr.js → setup-TGCErIhq.js} +2 -2
- package/studio/web/assets/{setup-CQ3vWJSr.js.map → setup-TGCErIhq.js.map} +1 -1
- package/studio/web/assets/{status-BsW5fjuh.js → status-DG0Maoao.js} +2 -2
- package/studio/web/assets/{status-BsW5fjuh.js.map → status-DG0Maoao.js.map} +1 -1
- package/studio/web/assets/{swagger-ui-react-DITdeB9-.js → swagger-ui-react-8T4SgQ1m.js} +2 -2
- package/studio/web/assets/{swagger-ui-react-DITdeB9-.js.map → swagger-ui-react-8T4SgQ1m.js.map} +1 -1
- package/studio/web/assets/{tsMode-Dyph-OUs.js → tsMode-DJ6Sl24Q.js} +2 -2
- package/studio/web/assets/{tsMode-Dyph-OUs.js.map → tsMode-DJ6Sl24Q.js.map} +1 -1
- package/studio/web/assets/{useEntityRestURL-D0QTUqex.js → useEntityRestURL-JO2mfWTQ.js} +2 -2
- package/studio/web/assets/{useEntityRestURL-D0QTUqex.js.map → useEntityRestURL-JO2mfWTQ.js.map} +1 -1
- package/studio/web/index.html +1 -1
- package/upgrade/directives/5-2-0.ts +82 -0
- package/upgrade/directives/directivesController.ts +2 -1
- package/utility/common_utils.ts +5 -0
- package/utility/envFile.ts +218 -0
- package/utility/hdbTerms.ts +31 -0
- package/utility/logging/harper_logger.ts +156 -8
- package/utility/logging/logRotator.ts +24 -14
- package/utility/logging/readLog.ts +323 -2
- package/utility/operationPermissions.ts +35 -1
- package/utility/operation_authorization.ts +74 -1
- package/utility/secretEnvelope.ts +113 -0
- package/utility/signalling.ts +15 -0
- package/validation/configValidator.ts +78 -25
- package/studio/web/assets/index-VFcpNWgq.js.map +0 -1
package/resources/databases.ts
CHANGED
|
@@ -27,6 +27,7 @@ import { deleteRootBlobPathsForDB } from './blob.ts';
|
|
|
27
27
|
import { CUSTOM_INDEXES } from './indexes/customIndexes.ts';
|
|
28
28
|
import { OpenDBIObject } from '../utility/lmdb/OpenDBIObject.ts';
|
|
29
29
|
import { RocksDatabase, type RocksDatabaseOptions } from '@harperfast/rocksdb-js';
|
|
30
|
+
import { PrimaryRocksDatabase } from './PrimaryRocksDatabase.ts';
|
|
30
31
|
import { replayLogs } from './replayLogs.ts';
|
|
31
32
|
import { totalmem } from 'node:os';
|
|
32
33
|
import { RocksIndexStore } from './RocksIndexStore.ts';
|
|
@@ -194,7 +195,7 @@ function openRocksDatabase(path: string, options: RocksDatabaseOptions & { dupSo
|
|
|
194
195
|
if (options.dupSort) {
|
|
195
196
|
db = new RocksIndexStore(path, options).open() as any;
|
|
196
197
|
} else {
|
|
197
|
-
db =
|
|
198
|
+
db = new PrimaryRocksDatabase(path, options).open() as unknown as RocksRootDatabase;
|
|
198
199
|
// the RocksDB put and remove return promises, which masks thrown errors in non-awaiting calls to put/remove,
|
|
199
200
|
// making them unsafe to replace LMDB methods, which will synchronously throw errors if there is a problem
|
|
200
201
|
db.put = db.putSync as any;
|
|
@@ -582,6 +583,7 @@ function initStores(
|
|
|
582
583
|
const expiration = primaryAttribute.expiration;
|
|
583
584
|
const eviction = primaryAttribute.eviction;
|
|
584
585
|
const sealed = primaryAttribute.sealed;
|
|
586
|
+
const cacheControl = primaryAttribute.cacheControl;
|
|
585
587
|
const splitSegments = primaryAttribute.splitSegments;
|
|
586
588
|
const replicate = primaryAttribute.replicate;
|
|
587
589
|
if (table && !recreateForEngineChange) {
|
|
@@ -614,7 +616,7 @@ function initStores(
|
|
|
614
616
|
dbiInit.randomAccessStructure = primaryAttribute.randomAccessFields;
|
|
615
617
|
if (rootStore instanceof RocksDatabase) {
|
|
616
618
|
primaryStore = handleLocalTimeForGets(
|
|
617
|
-
openRocksDatabase(rootStore.path, { ...dbiInit, name: primaryAttribute.key } as any),
|
|
619
|
+
openRocksDatabase(rootStore.path, { ...dbiInit, name: primaryAttribute.key, cache: true } as any),
|
|
618
620
|
rootStore
|
|
619
621
|
);
|
|
620
622
|
} else {
|
|
@@ -720,6 +722,7 @@ function initStores(
|
|
|
720
722
|
replicate,
|
|
721
723
|
expirationMS: expiration && expiration * 1000,
|
|
722
724
|
evictionMS: eviction && eviction * 1000,
|
|
725
|
+
cacheControl,
|
|
723
726
|
trackDeletes,
|
|
724
727
|
tableName,
|
|
725
728
|
tableId,
|
|
@@ -773,6 +776,9 @@ interface TableDefinition {
|
|
|
773
776
|
description?: string;
|
|
774
777
|
properties?: Record<string, any>;
|
|
775
778
|
hidden?: boolean;
|
|
779
|
+
// default Cache-Control for anonymous REST reads; null = schema explicitly has none (clears a
|
|
780
|
+
// prior value on reload), undefined = caller is not schema-defining (leave the current value)
|
|
781
|
+
cacheControl?: string | null;
|
|
776
782
|
}
|
|
777
783
|
/**
|
|
778
784
|
* Ensure that we have this database object (that holds a set of tables) set up
|
|
@@ -932,6 +938,68 @@ export async function dropDatabase(databaseName) {
|
|
|
932
938
|
|
|
933
939
|
await deleteRootBlobPathsForDB(rootStore);
|
|
934
940
|
}
|
|
941
|
+
// HNSW_NO_AUTOVERSION kill-switch: when set, a NEW index initializes as legacy rather than
|
|
942
|
+
// versioned. process.env values are strings, so a bare truthiness check would treat "0"/"false"
|
|
943
|
+
// as enabling the switch — the opposite of intent. Treat "" / "0" / "false" (and unset) as NOT set.
|
|
944
|
+
function hnswAutoVersionDisabled(): boolean {
|
|
945
|
+
const value = process.env.HNSW_NO_AUTOVERSION;
|
|
946
|
+
return value != null && value !== '' && value !== '0' && value.toLowerCase() !== 'false';
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
/**
|
|
950
|
+
* Resolve the storage format of a custom-index object store (e.g. HNSW): `'versioned'` (each node
|
|
951
|
+
* value is prefixed with a monotonic version the RocksDB Verification Table can extract → cached,
|
|
952
|
+
* decode-free graph traversal) or `'legacy'` (un-versioned, un-cached).
|
|
953
|
+
*
|
|
954
|
+
* The format is decided ONCE — when the index is created — and persisted on the attribute
|
|
955
|
+
* descriptor (`indexFormat`), so every worker and every reload reads the same authoritative value
|
|
956
|
+
* rather than re-deriving it from the store's current contents. Re-deriving per-open is racy: a
|
|
957
|
+
* store that is non-empty mid-backfill would be mis-read as legacy, and opening a versioned store
|
|
958
|
+
* with the legacy decoder corrupts reads. table() persists the resolved value (and always persists
|
|
959
|
+
* it BEFORE the first node is written, so by the time a store is non-empty its format is on disk).
|
|
960
|
+
*
|
|
961
|
+
* The empty-guard below is only the INITIALIZER for the first open under this feature (no format
|
|
962
|
+
* persisted yet): an empty store will be written versioned; a pre-existing non-empty store holds
|
|
963
|
+
* legacy un-prefixed values (incl. small-int id mappings the versioned decoder would misread) and
|
|
964
|
+
* stays legacy until an explicit reindex rebuilds it. The HNSW_NO_AUTOVERSION kill-switch only
|
|
965
|
+
* blocks a NEW index from initializing as versioned — an already-versioned store is still resolved
|
|
966
|
+
* versioned so its reads stay correct. The resolved value is stamped back onto `attribute` so the
|
|
967
|
+
* caller's attributesDbi.put persists it.
|
|
968
|
+
*/
|
|
969
|
+
function resolveIndexFormat(
|
|
970
|
+
dbiKey: string,
|
|
971
|
+
rootStore: RootDatabaseKind,
|
|
972
|
+
dbi: any,
|
|
973
|
+
attribute: any
|
|
974
|
+
): 'versioned' | 'legacy' {
|
|
975
|
+
const persisted = (rootStore as any).dbisDb?.getSync(dbiKey)?.indexFormat;
|
|
976
|
+
let format: 'versioned' | 'legacy' = persisted ?? attribute.indexFormat;
|
|
977
|
+
if (format == null) {
|
|
978
|
+
format = 'legacy';
|
|
979
|
+
let isEmpty = true;
|
|
980
|
+
// Probe with no start/end so any key type is counted — numeric, string-pk
|
|
981
|
+
// safeKeys, and Symbol/array keys (e.g. entryPoint, KEY_PREFIX) are all
|
|
982
|
+
// included. The old { start: 0, end: Infinity } range missed symbol-array and
|
|
983
|
+
// string keys, misclassifying non-empty stores as empty after a delete-all.
|
|
984
|
+
for (const _key of dbi.getKeys({ limit: 1 })) {
|
|
985
|
+
isEmpty = false;
|
|
986
|
+
break;
|
|
987
|
+
}
|
|
988
|
+
if (isEmpty && !hnswAutoVersionDisabled()) format = 'versioned';
|
|
989
|
+
}
|
|
990
|
+
attribute.indexFormat = format;
|
|
991
|
+
return format;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
// Arm a custom-index object store for versioned (VT-cacheable) reads and writes: enable the
|
|
995
|
+
// metadata-prefix encode/decode (isRocksDB) and self-versioning (autoVersion) on its encoder.
|
|
996
|
+
// Idempotent — safe to call again on a re-opened or reindexed store.
|
|
997
|
+
function armVersionedIndexEncoder(dbi: any, rootStore: any) {
|
|
998
|
+
if (dbi.encoder?.autoVersion) return;
|
|
999
|
+
handleLocalTimeForGets(dbi, rootStore);
|
|
1000
|
+
if (dbi.encoder) dbi.encoder.autoVersion = true;
|
|
1001
|
+
}
|
|
1002
|
+
|
|
935
1003
|
// opens an index, consulting with custom indexes that may use alternate store configuration
|
|
936
1004
|
function openIndex(dbiKey: string, rootStore: RootDatabaseKind, attribute: any) {
|
|
937
1005
|
const objectStorage =
|
|
@@ -953,9 +1021,23 @@ function openIndex(dbiKey: string, rootStore: RootDatabaseKind, attribute: any)
|
|
|
953
1021
|
indexNulls?: boolean;
|
|
954
1022
|
rootStore?: RocksRootDatabase;
|
|
955
1023
|
});
|
|
1024
|
+
const isCustomObjectIndex = !!(attribute.indexed?.type && CUSTOM_INDEXES[attribute.indexed.type]?.useObjectStore);
|
|
956
1025
|
if (rootStore instanceof RocksDatabase) {
|
|
957
|
-
|
|
1026
|
+
// Enable cache (WeakLRUCache + VT) for all custom-object index stores so the VT is
|
|
1027
|
+
// available before resolveIndexFormat decides the format. Versioned stores need the VT
|
|
1028
|
+
// for cached traversal; legacy stores pay a small per-write cache.delete() overhead only.
|
|
1029
|
+
dbi = openRocksDatabase(rootStore.path, { ...dbiInit, name: dbiKey, cache: isCustomObjectIndex } as any) as any;
|
|
958
1030
|
(dbi as any).rootStore = rootStore;
|
|
1031
|
+
// Custom-index object stores (e.g. HNSW) write graph nodes via plain put() with no staged
|
|
1032
|
+
// transaction timestamp, so their values carry no version and the PrimaryRocksDatabase
|
|
1033
|
+
// Verification-Table cache can't track them. A versioned index initialises its encoder as a
|
|
1034
|
+
// versioned RocksDB store (isRocksDB → metadata-prefix encode/decode) and marks it
|
|
1035
|
+
// self-versioning, so each node gets a monotonic version the VT can extract — enabling cached,
|
|
1036
|
+
// decode-free graph traversal. The format is resolved from the persisted attribute descriptor
|
|
1037
|
+
// (decided once at create — see resolveIndexFormat) so every worker and reload agree on it.
|
|
1038
|
+
if (isCustomObjectIndex && resolveIndexFormat(dbiKey, rootStore, dbi, attribute) === 'versioned') {
|
|
1039
|
+
armVersionedIndexEncoder(dbi, rootStore);
|
|
1040
|
+
}
|
|
959
1041
|
} else {
|
|
960
1042
|
dbi = (rootStore as any).openDB(dbiKey, dbiInit as any);
|
|
961
1043
|
}
|
|
@@ -1003,6 +1085,7 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
|
|
|
1003
1085
|
description,
|
|
1004
1086
|
properties,
|
|
1005
1087
|
hidden,
|
|
1088
|
+
cacheControl,
|
|
1006
1089
|
} = tableDefinition;
|
|
1007
1090
|
if (!databaseName) databaseName = DEFAULT_DATABASE_NAME;
|
|
1008
1091
|
const rootStore = database({ database: databaseName, table: tableName });
|
|
@@ -1049,6 +1132,8 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
|
|
|
1049
1132
|
Table.description = description;
|
|
1050
1133
|
Table.properties = properties;
|
|
1051
1134
|
Table.hidden = hidden;
|
|
1135
|
+
// undefined means a non-schema caller (add_attribute, cluster schema events) — don't clobber
|
|
1136
|
+
if (cacheControl !== undefined) Table.cacheControl = cacheControl;
|
|
1052
1137
|
} else {
|
|
1053
1138
|
const auditStore = rootStore.auditStore;
|
|
1054
1139
|
primaryKeyAttribute = attributes.find((attribute) => attribute.isPrimaryKey) || {};
|
|
@@ -1062,6 +1147,12 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
|
|
|
1062
1147
|
audit = primaryKeyAttribute.audit = typeof audit === 'boolean' ? audit : envGet(CONFIG_PARAMS.LOGGING_AUDITLOG);
|
|
1063
1148
|
if (expiration) primaryKeyAttribute.expiration = expiration;
|
|
1064
1149
|
if (eviction) primaryKeyAttribute.eviction = eviction;
|
|
1150
|
+
// persist cacheControl so all threads (and future boots) see it; undefined callers inherit
|
|
1151
|
+
// a descriptor value carried by cluster schema events; null (schema has no directive)
|
|
1152
|
+
// clears a stale value the carried descriptor may hold
|
|
1153
|
+
if (cacheControl === undefined) cacheControl = primaryKeyAttribute.cacheControl;
|
|
1154
|
+
else if (cacheControl === null) delete primaryKeyAttribute.cacheControl;
|
|
1155
|
+
else primaryKeyAttribute.cacheControl = cacheControl;
|
|
1065
1156
|
splitSegments ??= false;
|
|
1066
1157
|
primaryKeyAttribute.splitSegments = splitSegments; // always default to not splitting segments going forward
|
|
1067
1158
|
if (typeof sealed === 'boolean') primaryKeyAttribute.sealed = sealed;
|
|
@@ -1116,7 +1207,7 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
|
|
|
1116
1207
|
completeInterruptedDrop(rootStore, attributesDbi, databaseName, tableName);
|
|
1117
1208
|
}
|
|
1118
1209
|
if (rootStore instanceof RocksDatabase) {
|
|
1119
|
-
primaryStore = openRocksDatabase(rootStore.path, { ...dbiInit, name: dbiName } as any);
|
|
1210
|
+
primaryStore = openRocksDatabase(rootStore.path, { ...dbiInit, name: dbiName, cache: true } as any);
|
|
1120
1211
|
} else {
|
|
1121
1212
|
primaryStore = (rootStore as any).openDB(dbiName, dbiInit as any);
|
|
1122
1213
|
}
|
|
@@ -1153,6 +1244,7 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
|
|
|
1153
1244
|
description,
|
|
1154
1245
|
properties,
|
|
1155
1246
|
hidden,
|
|
1247
|
+
cacheControl,
|
|
1156
1248
|
})
|
|
1157
1249
|
);
|
|
1158
1250
|
Table.schemaVersion = 1;
|
|
@@ -1300,8 +1392,18 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
|
|
|
1300
1392
|
// on the main thread, where workerData is undefined (and it is initialized to 1).
|
|
1301
1393
|
const currentRestartGeneration = workerData?.restartNumber ?? manageThreads.restartNumber;
|
|
1302
1394
|
const dbi = openIndex(dbiKey, rootStore, attribute);
|
|
1395
|
+
// openIndex resolves and stamps attribute.indexFormat for a versioned-capable (RocksDB
|
|
1396
|
+
// custom-object) index. An index created before this field existed has no indexFormat on
|
|
1397
|
+
// disk; persist the resolved value now — even when nothing else changed — so the format is
|
|
1398
|
+
// durable BEFORE any node is written. Otherwise an empty pre-existing index would resolve
|
|
1399
|
+
// 'versioned', write versioned nodes, and on the next load re-derive 'legacy' from the
|
|
1400
|
+
// now-non-empty store, opening versioned data with the legacy decoder (silent corruption).
|
|
1401
|
+
// (Scoped by attribute.indexFormat != null: only RocksDB custom-object indexes set it.)
|
|
1402
|
+
const indexFormatNeedsPersist =
|
|
1403
|
+
attribute.indexFormat != null && attributeDescriptor?.indexFormat !== attribute.indexFormat;
|
|
1303
1404
|
if (
|
|
1304
1405
|
changed ||
|
|
1406
|
+
indexFormatNeedsPersist ||
|
|
1305
1407
|
attributeDescriptor?.indexingFailed ||
|
|
1306
1408
|
(attributeDescriptor?.indexingPID && attributeDescriptor?.indexingPID !== process.pid) ||
|
|
1307
1409
|
attributeDescriptor?.restartNumber < currentRestartGeneration
|
|
@@ -1336,6 +1438,23 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
|
|
|
1336
1438
|
attribute.lastIndexedKey = indexOptionsChanged
|
|
1337
1439
|
? undefined
|
|
1338
1440
|
: (attributeDescriptor?.lastIndexedKey ?? undefined);
|
|
1441
|
+
// Explicit reindex is the upgrade path from a legacy (un-versioned) custom-index
|
|
1442
|
+
// object store to the versioned, VT-cacheable format. A full rebuild from scratch
|
|
1443
|
+
// (lastIndexedKey === undefined) clears the store and rewrites every node, so the
|
|
1444
|
+
// new nodes can carry versions: flip the persisted format and re-arm the dbi encoder
|
|
1445
|
+
// (openIndex armed it from the pre-rebuild format, which for a legacy index was
|
|
1446
|
+
// un-versioned). A crash-recovery resume (lastIndexedKey preserved) keeps the
|
|
1447
|
+
// existing format — its partial graph was already written under it.
|
|
1448
|
+
if (
|
|
1449
|
+
rootStore instanceof RocksDatabase &&
|
|
1450
|
+
indexType &&
|
|
1451
|
+
CUSTOM_INDEXES[indexType]?.useObjectStore &&
|
|
1452
|
+
!hnswAutoVersionDisabled() &&
|
|
1453
|
+
attribute.lastIndexedKey === undefined
|
|
1454
|
+
) {
|
|
1455
|
+
attribute.indexFormat = 'versioned';
|
|
1456
|
+
armVersionedIndexEncoder(dbi, rootStore);
|
|
1457
|
+
}
|
|
1339
1458
|
attribute.indexingPID = process.pid;
|
|
1340
1459
|
// Persist the owning restart generation (see currentRestartGeneration above) so
|
|
1341
1460
|
// the trigger can re-detect an incomplete index after a worker restart even when
|
|
@@ -1542,9 +1661,14 @@ async function runIndexing(Table, attributes, indicesToRemove) {
|
|
|
1542
1661
|
} catch (error) {
|
|
1543
1662
|
hadIndexingErrors = true;
|
|
1544
1663
|
if (!attributeErrorReported[property]) {
|
|
1545
|
-
// just report an indexing error once per attribute so we don't spam the logs
|
|
1664
|
+
// just report an indexing error once per attribute so we don't spam the logs.
|
|
1665
|
+
// A store closed by worker shutdown surfaces here as "Database not open"; that is
|
|
1666
|
+
// a benign interruption (the next generation re-runs the backfill), so don't log
|
|
1667
|
+
// it as an error — the outer catch returns quietly once the iterator also throws.
|
|
1546
1668
|
attributeErrorReported[property] = true;
|
|
1547
|
-
|
|
1669
|
+
if (Table.primaryStore?.rootStore?.status === 'closed')
|
|
1670
|
+
logger.debug(`Indexing attribute ${property} interrupted by store shutdown`, error);
|
|
1671
|
+
else logger.error(`Error indexing attribute ${property}`, error);
|
|
1548
1672
|
}
|
|
1549
1673
|
}
|
|
1550
1674
|
}
|
|
@@ -1638,6 +1762,19 @@ async function runIndexing(Table, attributes, indicesToRemove) {
|
|
|
1638
1762
|
logger.info(`Finished indexing ${Table.tableName} attributes`, attributes);
|
|
1639
1763
|
}
|
|
1640
1764
|
} catch (error) {
|
|
1765
|
+
// A worker shutting down closes its stores mid-backfill, so the range iterator or a
|
|
1766
|
+
// put throws (e.g. "Database not open" / "Iterator not initialized"). This is an
|
|
1767
|
+
// interruption, not a data error: the next worker generation re-runs the backfill via
|
|
1768
|
+
// the crash-recovery trigger (indexingPID / restartNumber mismatch), and persisting
|
|
1769
|
+
// indexingFailed here would fail anyway against the closed store. Treat it as a benign
|
|
1770
|
+
// interruption instead of logging a misleading error and a "failed to persist" warning.
|
|
1771
|
+
if (Table.primaryStore?.rootStore?.status === 'closed') {
|
|
1772
|
+
logger.debug(
|
|
1773
|
+
`Indexing of ${Table.tableName} interrupted by store shutdown; recovery resumes on the next worker generation`,
|
|
1774
|
+
error
|
|
1775
|
+
);
|
|
1776
|
+
return;
|
|
1777
|
+
}
|
|
1641
1778
|
logger.error('Error in indexing', error);
|
|
1642
1779
|
// Persist indexingFailed so the next restart re-triggers the rebuild from an
|
|
1643
1780
|
// explicitly failed state rather than silently looping. Without this,
|
package/resources/graphql.ts
CHANGED
|
@@ -118,6 +118,14 @@ async function processGraphQLSchema(gqlContent, urlPath, filePath, resources) {
|
|
|
118
118
|
// Boolean directive args arrive as actual booleans; tolerate string forms too.
|
|
119
119
|
if (typeDef.randomAccessFields !== undefined)
|
|
120
120
|
typeDef.randomAccessFields = typeDef.randomAccessFields === true || typeDef.randomAccessFields === 'true';
|
|
121
|
+
// schema is authoritative for cacheControl: null (vs undefined) clears a removed directive on reload;
|
|
122
|
+
// coerce to a header-safe string so a non-string arg or CRLF can't reach the HTTP response
|
|
123
|
+
typeDef.cacheControl =
|
|
124
|
+
typeDef.cacheControl == null
|
|
125
|
+
? null
|
|
126
|
+
: String(typeDef.cacheControl)
|
|
127
|
+
.replace(/[\r\n]+/g, ' ')
|
|
128
|
+
.trim();
|
|
121
129
|
tables.push(typeDef);
|
|
122
130
|
}
|
|
123
131
|
if (directive.name.value === 'sealed') typeDef.sealed = true;
|