@harperfast/harper-pro 5.0.30 → 5.1.0-beta.2
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/analytics/profile.ts +4 -0
- package/core/AGENTS.md +94 -6
- package/core/DESIGN.md +36 -0
- package/core/README.md +11 -10
- package/core/agent/agent.ts +203 -0
- package/core/agent/loop.ts +205 -0
- package/core/agent/operations.ts +148 -0
- package/core/agent/session.ts +187 -0
- package/core/agent/tools/fsTools.ts +276 -0
- package/core/agent/tools/httpFetchTool.ts +112 -0
- package/core/agent/tools/scheduleTool.ts +68 -0
- package/core/agent/toolset.ts +43 -0
- package/core/agent/types.ts +85 -0
- package/core/benchmarks/hnsw-search.js +157 -0
- package/core/benchmarks/ycsb/README.md +144 -0
- package/core/benchmarks/ycsb/analyze-profile.mts +120 -0
- package/core/benchmarks/ycsb/app/config.yaml +3 -0
- package/core/benchmarks/ycsb/app/schema.graphql +17 -0
- package/core/benchmarks/ycsb/harness.mts +328 -0
- package/core/benchmarks/ycsb/restClient.mts +120 -0
- package/core/benchmarks/ycsb/run-single-node.mts +97 -0
- package/core/benchmarks/ycsb/to-benchmark-json.mts +58 -0
- package/core/benchmarks/ycsb/workload.mts +499 -0
- package/core/benchmarks/ycsb/workload.test.mts +174 -0
- package/core/bin/{BinObjects.js → BinObjects.ts} +4 -5
- package/core/bin/cliCredentials.ts +133 -0
- package/core/bin/cliOperations.ts +339 -0
- package/core/bin/copyDb.ts +10 -10
- package/core/bin/deployRenderer.ts +196 -0
- package/core/bin/{harper.js → harper.ts} +48 -24
- package/core/bin/{install.js → install.ts} +3 -3
- package/core/bin/lite.ts +2 -0
- package/core/bin/login.ts +134 -0
- package/core/bin/logout.ts +11 -0
- package/core/bin/mcp/client.ts +407 -0
- package/core/bin/mcp/doctor.ts +189 -0
- package/core/bin/mcp/index.ts +80 -0
- package/core/bin/mcp/options.ts +122 -0
- package/core/bin/mcp/printConfig.ts +89 -0
- package/core/bin/multipartBuilder.ts +74 -0
- package/core/bin/{restart.js → restart.ts} +31 -32
- package/core/bin/{run.js → run.ts} +57 -46
- package/core/bin/sseConsumer.ts +126 -0
- package/core/bin/{status.js → status.ts} +10 -10
- package/core/bin/stop.ts +21 -0
- package/core/bin/upgrade.js +17 -24
- package/core/components/Application.ts +144 -18
- package/core/components/ApplicationScope.ts +2 -2
- package/core/components/ComponentV1.ts +2 -2
- package/core/components/EntryHandler.ts +159 -9
- package/core/components/OptionsWatcher.ts +75 -11
- package/core/components/Scope.ts +132 -18
- package/core/components/anthropic/index.ts +547 -0
- package/core/components/bedrock/index.ts +823 -0
- package/core/components/componentLoader.ts +64 -32
- package/core/components/deployLifecycle.ts +161 -0
- package/core/components/deploymentOperations.ts +173 -0
- package/core/components/deploymentRecorder.ts +427 -0
- package/core/components/deriveURLPath.ts +4 -4
- package/core/components/mcp/adapters/fastify.ts +87 -0
- package/core/components/mcp/adapters/harperHttp.ts +103 -0
- package/core/components/mcp/audit.ts +75 -0
- package/core/components/mcp/index.ts +134 -0
- package/core/components/mcp/jsonrpc.ts +134 -0
- package/core/components/mcp/lifecycle.ts +105 -0
- package/core/components/mcp/listChanged.ts +270 -0
- package/core/components/mcp/rateLimit.ts +217 -0
- package/core/components/mcp/resources.ts +607 -0
- package/core/components/mcp/session.ts +151 -0
- package/core/components/mcp/sessionRegistry.ts +140 -0
- package/core/components/mcp/toolRegistry.ts +294 -0
- package/core/components/mcp/tools/application.ts +761 -0
- package/core/components/mcp/tools/operations.ts +311 -0
- package/core/components/mcp/tools/schemas/derive.ts +356 -0
- package/core/components/mcp/tools/schemas/operationDescriptions.ts +241 -0
- package/core/components/mcp/tools/schemas/operations.ts +301 -0
- package/core/components/mcp/transport.ts +517 -0
- package/core/components/ollama/index.ts +316 -0
- package/core/components/openai/index.ts +563 -0
- package/core/components/operations.js +217 -60
- package/core/components/operationsValidation.js +12 -4
- package/core/components/packageComponent.ts +97 -29
- package/core/components/requestRestart.ts +17 -2
- package/core/components/status/crossThread.ts +14 -5
- package/core/components/status/errors.ts +1 -1
- package/core/config/RootConfigWatcher.ts +56 -2
- package/core/config/configUtils.js +29 -8
- package/core/config/harperConfigEnvVars.ts +1 -1
- package/core/dataLayer/{CreateAttributeObject.js → CreateAttributeObject.ts} +4 -3
- package/core/dataLayer/{CreateTableObject.js → CreateTableObject.ts} +2 -1
- package/core/dataLayer/{DataLayerObjects.js → DataLayerObjects.ts} +17 -9
- package/core/dataLayer/{DeleteBeforeObject.js → DeleteBeforeObject.ts} +2 -1
- package/core/dataLayer/{DeleteObject.js → DeleteObject.ts} +3 -2
- package/core/dataLayer/{DropAttributeObject.js → DropAttributeObject.ts} +2 -1
- package/core/dataLayer/{GetBackupObject.js → GetBackupObject.ts} +3 -2
- package/core/dataLayer/{InsertObject.js → InsertObject.ts} +3 -2
- package/core/dataLayer/{ReadAuditLogObject.js → ReadAuditLogObject.ts} +3 -2
- package/core/dataLayer/{SQLSearch.js → SQLSearch.ts} +97 -43
- package/core/dataLayer/{SearchByConditionsObject.js → SearchByConditionsObject.ts} +5 -6
- package/core/dataLayer/{SearchByHashObject.js → SearchByHashObject.ts} +2 -1
- package/core/dataLayer/{SearchObject.js → SearchObject.ts} +2 -1
- package/core/dataLayer/{SqlSearchObject.js → SqlSearchObject.ts} +2 -1
- package/core/dataLayer/{UpdateObject.js → UpdateObject.ts} +3 -2
- package/core/dataLayer/{UpsertObject.js → UpsertObject.ts} +3 -2
- package/core/dataLayer/{bulkLoad.js → bulkLoad.ts} +40 -49
- package/core/dataLayer/{delete.js → delete.ts} +21 -26
- package/core/dataLayer/{export.js → export.ts} +22 -26
- package/core/dataLayer/{getBackup.js → getBackup.ts} +7 -9
- package/core/dataLayer/harperBridge/BridgeMethods.ts +102 -0
- package/core/dataLayer/harperBridge/ResourceBridge.ts +27 -26
- package/core/dataLayer/harperBridge/TableSizeObject.ts +1 -0
- package/core/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +4 -4
- package/core/dataLayer/harperBridge/{harperBridge.js → harperBridge.ts} +3 -3
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +8 -6
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +4 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +1 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +6 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +5 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +4 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +6 -5
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +5 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +5 -5
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +1 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +3 -3
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +1 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +3 -2
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +5 -5
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +10 -8
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +1 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +4 -3
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +3 -3
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +6 -5
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +2 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +3 -2
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +2 -2
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +5 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +6 -3
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.ts +1 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +4 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +5 -5
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +4 -4
- package/core/dataLayer/{hdbInfoController.js → hdbInfoController.ts} +20 -26
- package/core/dataLayer/{insert.js → insert.ts} +24 -24
- package/core/dataLayer/{readAuditLog.js → readAuditLog.ts} +8 -10
- package/core/dataLayer/{schema.js → schema.ts} +32 -44
- package/core/dataLayer/{schemaDescribe.js → schemaDescribe.ts} +23 -26
- package/core/dataLayer/{search.js → search.ts} +9 -15
- package/core/dataLayer/{transaction.js → transaction.ts} +2 -5
- package/core/dataLayer/{update.js → update.ts} +19 -22
- package/core/index.ts +5 -0
- package/core/json/systemSchema.json +65 -0
- package/core/launchServiceScripts/utility/checkNodeVersion.js +2 -0
- package/core/package-lock.json +9087 -4345
- package/core/resources/DESIGN.md +98 -0
- package/core/resources/DatabaseTransaction.ts +58 -30
- package/core/resources/ErrorResource.ts +2 -1
- package/core/resources/LMDBTransaction.ts +38 -29
- package/core/resources/RecordEncoder.ts +41 -39
- package/core/resources/RequestTarget.ts +2 -0
- package/core/resources/Resource.ts +96 -56
- package/core/resources/ResourceInterface.ts +44 -21
- package/core/resources/Resources.ts +8 -8
- package/core/resources/RocksIndexStore.ts +3 -0
- package/core/resources/RocksTransactionLogStore.ts +13 -4
- package/core/resources/Table.ts +440 -223
- package/core/resources/analytics/metadata.ts +1 -0
- package/core/resources/analytics/read.ts +99 -10
- package/core/resources/analytics/write.ts +240 -17
- package/core/resources/auditStore.ts +30 -19
- package/core/resources/blob.ts +53 -53
- package/core/resources/dataLoader.ts +4 -4
- package/core/resources/databases.ts +208 -74
- package/core/resources/graphql.ts +267 -165
- package/core/resources/indexes/HierarchicalNavigableSmallWorld.ts +310 -65
- package/core/resources/indexes/vector.ts +17 -0
- package/core/resources/jsonSchemaTypes.ts +102 -0
- package/core/resources/loadEnv.ts +21 -17
- package/core/resources/login.ts +5 -3
- package/core/resources/models/Models.ts +304 -0
- package/core/resources/models/TestBackend.ts +83 -0
- package/core/resources/models/agentLoop.ts +895 -0
- package/core/resources/models/analyticsTable.ts +199 -0
- package/core/resources/models/backendHelpers.ts +116 -0
- package/core/resources/models/backendRegistry.ts +66 -0
- package/core/resources/models/bootstrap.ts +135 -0
- package/core/resources/models/embedHook.ts +138 -0
- package/core/resources/models/types.ts +296 -0
- package/core/resources/openApi.ts +65 -31
- package/core/resources/replayLogs.ts +20 -9
- package/core/resources/replayLogsGuards.ts +45 -0
- package/core/resources/roles.ts +62 -67
- package/core/resources/search.ts +355 -135
- package/core/resources/tracked.ts +18 -9
- package/core/resources/transaction.ts +8 -8
- package/core/resources/transactionBroadcast.ts +3 -3
- package/core/security/auth.ts +35 -26
- package/core/security/certificateVerification/crlVerification.ts +11 -4
- package/core/security/{cryptoHash.js → cryptoHash.ts} +3 -8
- package/core/security/data_objects/{PermissionAttributeResponseObject.js → PermissionAttributeResponseObject.ts} +4 -4
- package/core/security/data_objects/{PermissionResponseObject.js → PermissionResponseObject.ts} +12 -11
- package/core/security/data_objects/{PermissionTableResponseObject.js → PermissionTableResponseObject.ts} +6 -4
- package/core/security/{fastifyAuth.js → fastifyAuth.ts} +93 -20
- package/core/security/impersonation.ts +3 -3
- package/core/security/jsLoader.ts +22 -8
- package/core/security/{keys.js → keys.ts} +113 -121
- package/core/security/permissionsTranslator.js +2 -2
- package/core/security/{role.js → role.ts} +26 -33
- package/core/security/tokenAuthentication.ts +34 -7
- package/core/security/user.ts +26 -22
- package/core/server/DESIGN.md +139 -0
- package/core/server/DurableSubscriptionsSession.ts +67 -50
- package/core/server/REST.ts +120 -107
- package/core/server/Server.ts +31 -12
- package/core/server/fastifyRoutes/helpers/getCORSOptions.js +1 -1
- package/core/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +1 -1
- package/core/server/fastifyRoutes/helpers/getServerOptions.js +1 -1
- package/core/server/fastifyRoutes.ts +37 -33
- package/core/server/graphqlQuerying.ts +6 -5
- package/core/server/http.ts +517 -26
- package/core/server/itc/serverHandlers.js +75 -14
- package/core/server/jobs/{JobObject.js → JobObject.ts} +13 -6
- package/core/server/jobs/{jobProcess.js → jobProcess.ts} +20 -16
- package/core/server/jobs/{jobRunner.js → jobRunner.ts} +20 -21
- package/core/server/jobs/{jobs.js → jobs.ts} +41 -44
- package/core/server/loadRootComponents.js +1 -1
- package/core/server/middlewareChain.ts +270 -0
- package/core/server/mqtt.ts +35 -26
- package/core/server/nodeName.ts +3 -1
- package/core/server/operationsServer.ts +85 -10
- package/core/server/serverHelpers/Headers.ts +10 -8
- package/core/server/serverHelpers/JSONStream.ts +15 -5
- package/core/server/serverHelpers/Request.ts +370 -13
- package/core/server/serverHelpers/contentTypes.ts +42 -11
- package/core/server/serverHelpers/multipartParser.ts +152 -0
- package/core/server/serverHelpers/progressEmitter.ts +110 -0
- package/core/server/serverHelpers/serverHandlers.js +43 -7
- package/core/server/serverHelpers/serverUtilities.ts +40 -30
- package/core/server/static.ts +9 -6
- package/core/server/status/index.ts +2 -2
- package/core/server/storageReclamation.ts +39 -2
- package/core/server/threads/itc.js +7 -4
- package/core/server/threads/manageThreads.js +100 -26
- package/core/server/threads/socketRouter.ts +12 -275
- package/core/server/threads/threadServer.js +345 -105
- package/core/server/threads/workerProcessGuard.ts +93 -0
- package/core/server/throttle.ts +18 -0
- package/core/sqlTranslator/{SelectValidator.js → SelectValidator.ts} +41 -49
- package/core/sqlTranslator/{alasqlFunctionImporter.js → alasqlFunctionImporter.ts} +5 -5
- package/core/sqlTranslator/{deleteTranslator.js → deleteTranslator.ts} +13 -18
- package/core/sqlTranslator/{index.js → index.ts} +30 -33
- package/core/sqlTranslator/{sql_statement_bucket.js → sql_statement_bucket.ts} +49 -20
- package/core/static/README.md +10 -9
- package/core/static/defaultConfig.yaml +0 -1
- package/core/system/000004.log +0 -0
- package/core/system/CURRENT +1 -0
- package/core/system/IDENTITY +1 -0
- package/core/system/LOCK +0 -0
- package/core/system/LOG +1351 -0
- package/core/system/MANIFEST-000005 +0 -0
- package/core/system/OPTIONS-000013 +607 -0
- package/core/system/OPTIONS-000015 +734 -0
- package/core/upgrade/{UpgradeObjects.js → UpgradeObjects.ts} +3 -6
- package/core/upgrade/directives/5-1-0.ts +89 -0
- package/core/upgrade/directives/{directivesController.js → directivesController.ts} +16 -16
- package/core/upgrade/{directivesManager.js → directivesManager.ts} +7 -11
- package/core/upgrade/{upgradePrompt.js → upgradePrompt.ts} +6 -54
- package/core/upgrade/{upgradeUtilities.js → upgradeUtilities.ts} +3 -7
- package/core/utility/{OperationFunctionCaller.js → OperationFunctionCaller.ts} +7 -7
- package/core/utility/{assignCmdEnvVariables.js → assignCmdEnvVariables.ts} +6 -8
- package/core/utility/{common_utils.js → common_utils.ts} +113 -139
- package/core/utility/environment/{environmentManager.js → environmentManager.ts} +34 -33
- package/core/utility/environment/systemInformation.ts +18 -4
- package/core/utility/errors/{commonErrors.js → commonErrors.ts} +9 -9
- package/core/utility/errors/{hdbError.js → hdbError.ts} +39 -45
- package/core/utility/expandEnvVar.ts +110 -0
- package/core/utility/functions/geo.js +2 -2
- package/core/utility/functions/sql/alaSQLExtension.js +1 -1
- package/core/utility/globalSchema.ts +30 -0
- package/core/utility/hdbTerms.ts +54 -1
- package/core/utility/install/checkJWTTokensExist.js +1 -1
- package/core/utility/install/{installer.js → installer.ts} +86 -62
- package/core/utility/installation.ts +2 -2
- package/core/utility/lmdb/{DBIDefinition.js → DBIDefinition.ts} +4 -1
- package/core/utility/lmdb/{DeleteRecordsResponseObject.js → DeleteRecordsResponseObject.ts} +2 -1
- package/core/utility/lmdb/{InsertRecordsResponseObject.js → InsertRecordsResponseObject.ts} +2 -1
- package/core/utility/lmdb/OpenDBIObject.ts +57 -0
- package/core/utility/lmdb/{OpenEnvironmentObject.js → OpenEnvironmentObject.ts} +19 -6
- package/core/utility/lmdb/{UpdateRecordsResponseObject.js → UpdateRecordsResponseObject.ts} +2 -1
- package/core/utility/lmdb/{UpsertRecordsResponseObject.js → UpsertRecordsResponseObject.ts} +2 -1
- package/core/utility/lmdb/{cleanLMDBMap.js → cleanLMDBMap.ts} +5 -5
- package/core/utility/lmdb/{commonUtility.js → commonUtility.ts} +13 -21
- package/core/utility/lmdb/{deleteUtility.js → deleteUtility.ts} +8 -12
- package/core/utility/lmdb/{environmentUtility.js → environmentUtility.ts} +43 -52
- package/core/utility/lmdb/{searchCursorFunctions.js → searchCursorFunctions.ts} +12 -26
- package/core/utility/lmdb/{searchUtility.js → searchUtility.ts} +75 -64
- package/core/utility/lmdb/{terms.js → terms.ts} +10 -23
- package/core/utility/lmdb/{writeUtility.js → writeUtility.ts} +37 -22
- package/core/utility/logging/{harper_logger.js → harper_logger.ts} +137 -90
- package/core/utility/logging/{logRotator.js → logRotator.ts} +15 -18
- package/core/utility/logging/logger.ts +1 -1
- package/core/utility/logging/{readLog.js → readLog.ts} +19 -19
- package/core/utility/logging/{transactionLog.js → transactionLog.ts} +10 -14
- package/core/utility/{mount_hdb.js → mount_hdb.ts} +15 -16
- package/core/utility/{npmUtilities.js → npmUtilities.ts} +14 -17
- package/core/utility/{operation_authorization.js → operation_authorization.ts} +173 -124
- package/core/utility/packageUtils.js +7 -16
- package/core/utility/password.ts +1 -1
- package/core/utility/processManagement/processManagement.js +2 -2
- package/core/utility/processManagement/servicesConfig.js +1 -1
- package/core/utility/{signalling.js → signalling.ts} +6 -11
- package/core/utility/watcherFallback.ts +74 -0
- package/core/validation/analyticsValidator.ts +44 -0
- package/core/validation/{bulkDeleteValidator.js → bulkDeleteValidator.ts} +5 -5
- package/core/validation/{check_permissions.js → check_permissions.ts} +3 -3
- package/core/validation/{common_validators.js → common_validators.ts} +12 -24
- package/core/validation/{configValidator.js → configValidator.ts} +114 -18
- package/core/validation/{deleteValidator.js → deleteValidator.ts} +5 -5
- package/core/validation/{fileLoadValidator.js → fileLoadValidator.ts} +12 -19
- package/core/validation/{insertValidator.js → insertValidator.ts} +5 -5
- package/core/validation/{installValidator.js → installValidator.ts} +8 -8
- package/core/validation/{readLogValidator.js → readLogValidator.ts} +10 -10
- package/core/validation/{role_validation.js → role_validation.ts} +26 -32
- package/core/validation/{schemaMetadataValidator.js → schemaMetadataValidator.ts} +5 -11
- package/core/validation/{searchValidator.js → searchValidator.ts} +12 -11
- package/core/validation/statusValidator.ts +1 -1
- package/core/validation/{transactionLogValidator.js → transactionLogValidator.ts} +4 -9
- package/core/validation/{user_validation.js → user_validation.ts} +4 -10
- package/core/validation/{validationWrapper.js → validationWrapper.ts} +3 -9
- package/dist/analytics/profile.js +4 -0
- package/dist/analytics/profile.js.map +1 -1
- package/dist/cloneNode/cloneNode.js +224 -12
- package/dist/cloneNode/cloneNode.js.map +1 -1
- package/dist/core/agent/agent.js +175 -0
- package/dist/core/agent/agent.js.map +1 -0
- package/dist/core/agent/loop.js +176 -0
- package/dist/core/agent/loop.js.map +1 -0
- package/dist/core/agent/operations.js +137 -0
- package/dist/core/agent/operations.js.map +1 -0
- package/dist/core/agent/session.js +182 -0
- package/dist/core/agent/session.js.map +1 -0
- package/dist/core/agent/tools/fsTools.js +286 -0
- package/dist/core/agent/tools/fsTools.js.map +1 -0
- package/dist/core/agent/tools/httpFetchTool.js +116 -0
- package/dist/core/agent/tools/httpFetchTool.js.map +1 -0
- package/dist/core/agent/tools/scheduleTool.js +54 -0
- package/dist/core/agent/tools/scheduleTool.js.map +1 -0
- package/dist/core/agent/toolset.js +33 -0
- package/dist/core/agent/toolset.js.map +1 -0
- package/dist/core/agent/types.js +10 -0
- package/dist/core/agent/types.js.map +1 -0
- package/dist/core/bin/BinObjects.js +6 -3
- package/dist/core/bin/BinObjects.js.map +1 -1
- package/dist/core/bin/cliCredentials.js +130 -0
- package/dist/core/bin/cliCredentials.js.map +1 -0
- package/dist/core/bin/cliOperations.js +254 -40
- package/dist/core/bin/cliOperations.js.map +1 -1
- package/dist/core/bin/copyDb.js +16 -16
- package/dist/core/bin/copyDb.js.map +1 -1
- package/dist/core/bin/deployRenderer.js +185 -0
- package/dist/core/bin/deployRenderer.js.map +1 -0
- package/dist/core/bin/harper.js +92 -31
- package/dist/core/bin/harper.js.map +1 -1
- package/dist/core/bin/install.js +41 -4
- package/dist/core/bin/install.js.map +1 -1
- package/dist/core/bin/lite.js +3 -4
- package/dist/core/bin/lite.js.map +1 -1
- package/dist/core/bin/login.js +123 -0
- package/dist/core/bin/login.js.map +1 -0
- package/dist/core/bin/logout.js +16 -0
- package/dist/core/bin/logout.js.map +1 -0
- package/dist/core/bin/mcp/client.js +395 -0
- package/dist/core/bin/mcp/client.js.map +1 -0
- package/dist/core/bin/mcp/doctor.js +193 -0
- package/dist/core/bin/mcp/doctor.js.map +1 -0
- package/dist/core/bin/mcp/index.js +81 -0
- package/dist/core/bin/mcp/index.js.map +1 -0
- package/dist/core/bin/mcp/options.js +113 -0
- package/dist/core/bin/mcp/options.js.map +1 -0
- package/dist/core/bin/mcp/printConfig.js +85 -0
- package/dist/core/bin/mcp/printConfig.js.map +1 -0
- package/dist/core/bin/multipartBuilder.js +55 -0
- package/dist/core/bin/multipartBuilder.js.map +1 -0
- package/dist/core/bin/restart.js +85 -48
- package/dist/core/bin/restart.js.map +1 -1
- package/dist/core/bin/run.js +123 -77
- package/dist/core/bin/run.js.map +1 -1
- package/dist/core/bin/sseConsumer.js +127 -0
- package/dist/core/bin/sseConsumer.js.map +1 -0
- package/dist/core/bin/status.js +48 -11
- package/dist/core/bin/status.js.map +1 -1
- package/dist/core/bin/stop.js +44 -7
- package/dist/core/bin/stop.js.map +1 -1
- package/dist/core/bin/upgrade.js +14 -22
- package/dist/core/bin/upgrade.js.map +1 -1
- package/dist/core/components/Application.js +134 -28
- package/dist/core/components/Application.js.map +1 -1
- package/dist/core/components/ApplicationScope.js +2 -2
- package/dist/core/components/ComponentV1.js +5 -5
- package/dist/core/components/ComponentV1.js.map +1 -1
- package/dist/core/components/EntryHandler.js +153 -13
- package/dist/core/components/EntryHandler.js.map +1 -1
- package/dist/core/components/OptionsWatcher.js +72 -10
- package/dist/core/components/OptionsWatcher.js.map +1 -1
- package/dist/core/components/Scope.js +112 -12
- package/dist/core/components/Scope.js.map +1 -1
- package/dist/core/components/anthropic/index.js +428 -0
- package/dist/core/components/anthropic/index.js.map +1 -0
- package/dist/core/components/bedrock/index.js +734 -0
- package/dist/core/components/bedrock/index.js.map +1 -0
- package/dist/core/components/componentLoader.js +65 -38
- package/dist/core/components/componentLoader.js.map +1 -1
- package/dist/core/components/deployLifecycle.js +156 -0
- package/dist/core/components/deployLifecycle.js.map +1 -0
- package/dist/core/components/deploymentOperations.js +185 -0
- package/dist/core/components/deploymentOperations.js.map +1 -0
- package/dist/core/components/deploymentRecorder.js +425 -0
- package/dist/core/components/deploymentRecorder.js.map +1 -0
- package/dist/core/components/deriveURLPath.js +2 -2
- package/dist/core/components/deriveURLPath.js.map +1 -1
- package/dist/core/components/mcp/adapters/fastify.js +66 -0
- package/dist/core/components/mcp/adapters/fastify.js.map +1 -0
- package/dist/core/components/mcp/adapters/harperHttp.js +78 -0
- package/dist/core/components/mcp/adapters/harperHttp.js.map +1 -0
- package/dist/core/components/mcp/audit.js +73 -0
- package/dist/core/components/mcp/audit.js.map +1 -0
- package/dist/core/components/mcp/index.js +109 -0
- package/dist/core/components/mcp/index.js.map +1 -0
- package/dist/core/components/mcp/jsonrpc.js +93 -0
- package/dist/core/components/mcp/jsonrpc.js.map +1 -0
- package/dist/core/components/mcp/lifecycle.js +79 -0
- package/dist/core/components/mcp/lifecycle.js.map +1 -0
- package/dist/core/components/mcp/listChanged.js +257 -0
- package/dist/core/components/mcp/listChanged.js.map +1 -0
- package/dist/core/components/mcp/rateLimit.js +226 -0
- package/dist/core/components/mcp/rateLimit.js.map +1 -0
- package/dist/core/components/mcp/resources.js +526 -0
- package/dist/core/components/mcp/resources.js.map +1 -0
- package/dist/core/components/mcp/session.js +170 -0
- package/dist/core/components/mcp/session.js.map +1 -0
- package/dist/core/components/mcp/sessionRegistry.js +124 -0
- package/dist/core/components/mcp/sessionRegistry.js.map +1 -0
- package/dist/core/components/mcp/toolRegistry.js +177 -0
- package/dist/core/components/mcp/toolRegistry.js.map +1 -0
- package/dist/core/components/mcp/tools/application.js +660 -0
- package/dist/core/components/mcp/tools/application.js.map +1 -0
- package/dist/core/components/mcp/tools/operations.js +331 -0
- package/dist/core/components/mcp/tools/operations.js.map +1 -0
- package/dist/core/components/mcp/tools/schemas/derive.js +291 -0
- package/dist/core/components/mcp/tools/schemas/derive.js.map +1 -0
- package/dist/core/components/mcp/tools/schemas/operationDescriptions.js +179 -0
- package/dist/core/components/mcp/tools/schemas/operationDescriptions.js.map +1 -0
- package/dist/core/components/mcp/tools/schemas/operations.js +299 -0
- package/dist/core/components/mcp/tools/schemas/operations.js.map +1 -0
- package/dist/core/components/mcp/transport.js +467 -0
- package/dist/core/components/mcp/transport.js.map +1 -0
- package/dist/core/components/ollama/index.js +239 -0
- package/dist/core/components/ollama/index.js.map +1 -0
- package/dist/core/components/openai/index.js +475 -0
- package/dist/core/components/openai/index.js.map +1 -0
- package/dist/core/components/operations.js +205 -52
- package/dist/core/components/operations.js.map +1 -1
- package/dist/core/components/operationsValidation.js +13 -4
- package/dist/core/components/operationsValidation.js.map +1 -1
- package/dist/core/components/packageComponent.js +87 -26
- package/dist/core/components/packageComponent.js.map +1 -1
- package/dist/core/components/requestRestart.js +12 -1
- package/dist/core/components/requestRestart.js.map +1 -1
- package/dist/core/components/status/crossThread.js +12 -5
- package/dist/core/components/status/crossThread.js.map +1 -1
- package/dist/core/components/status/errors.js +7 -7
- package/dist/core/config/RootConfigWatcher.js +52 -1
- package/dist/core/config/RootConfigWatcher.js.map +1 -1
- package/dist/core/config/configUtils.js +31 -8
- package/dist/core/config/configUtils.js.map +1 -1
- package/dist/core/config/harperConfigEnvVars.js +1 -1
- package/dist/core/config/harperConfigEnvVars.js.map +1 -1
- package/dist/core/dataLayer/CreateAttributeObject.js +4 -3
- package/dist/core/dataLayer/CreateAttributeObject.js.map +1 -1
- package/dist/core/dataLayer/CreateTableObject.js +2 -1
- package/dist/core/dataLayer/CreateTableObject.js.map +1 -1
- package/dist/core/dataLayer/DataLayerObjects.js +19 -5
- package/dist/core/dataLayer/DataLayerObjects.js.map +1 -1
- package/dist/core/dataLayer/DeleteBeforeObject.js +2 -1
- package/dist/core/dataLayer/DeleteBeforeObject.js.map +1 -1
- package/dist/core/dataLayer/DeleteObject.js +4 -3
- package/dist/core/dataLayer/DeleteObject.js.map +1 -1
- package/dist/core/dataLayer/DropAttributeObject.js +2 -1
- package/dist/core/dataLayer/DropAttributeObject.js.map +1 -1
- package/dist/core/dataLayer/GetBackupObject.js +4 -3
- package/dist/core/dataLayer/GetBackupObject.js.map +1 -1
- package/dist/core/dataLayer/InsertObject.js +4 -3
- package/dist/core/dataLayer/InsertObject.js.map +1 -1
- package/dist/core/dataLayer/ReadAuditLogObject.js +4 -3
- package/dist/core/dataLayer/ReadAuditLogObject.js.map +1 -1
- package/dist/core/dataLayer/SQLSearch.js +140 -78
- package/dist/core/dataLayer/SQLSearch.js.map +1 -1
- package/dist/core/dataLayer/SearchByConditionsObject.js +5 -7
- package/dist/core/dataLayer/SearchByConditionsObject.js.map +1 -1
- package/dist/core/dataLayer/SearchByHashObject.js +2 -1
- package/dist/core/dataLayer/SearchByHashObject.js.map +1 -1
- package/dist/core/dataLayer/SearchObject.js +2 -1
- package/dist/core/dataLayer/SearchObject.js.map +1 -1
- package/dist/core/dataLayer/SqlSearchObject.js +2 -1
- package/dist/core/dataLayer/SqlSearchObject.js.map +1 -1
- package/dist/core/dataLayer/UpdateObject.js +4 -3
- package/dist/core/dataLayer/UpdateObject.js.map +1 -1
- package/dist/core/dataLayer/UpsertObject.js +4 -3
- package/dist/core/dataLayer/UpsertObject.js.map +1 -1
- package/dist/core/dataLayer/bulkLoad.js +122 -88
- package/dist/core/dataLayer/bulkLoad.js.map +1 -1
- package/dist/core/dataLayer/delete.js +74 -39
- package/dist/core/dataLayer/delete.js.map +1 -1
- package/dist/core/dataLayer/export.js +90 -55
- package/dist/core/dataLayer/export.js.map +1 -1
- package/dist/core/dataLayer/getBackup.js +43 -11
- package/dist/core/dataLayer/getBackup.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/BridgeMethods.js +41 -20
- package/dist/core/dataLayer/harperBridge/BridgeMethods.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/ResourceBridge.js +26 -25
- package/dist/core/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/TableSizeObject.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +4 -4
- package/dist/core/dataLayer/harperBridge/harperBridge.js +38 -4
- package/dist/core/dataLayer/harperBridge/harperBridge.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +7 -6
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +5 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +5 -5
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +5 -5
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +3 -3
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +2 -2
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +5 -5
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +8 -8
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +3 -3
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +3 -3
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +5 -5
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +2 -2
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +2 -2
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +5 -3
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +2 -2
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +5 -5
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +4 -4
- package/dist/core/dataLayer/hdbInfoController.js +66 -31
- package/dist/core/dataLayer/hdbInfoController.js.map +1 -1
- package/dist/core/dataLayer/insert.js +63 -28
- package/dist/core/dataLayer/insert.js.map +1 -1
- package/dist/core/dataLayer/readAuditLog.js +45 -13
- package/dist/core/dataLayer/readAuditLog.js.map +1 -1
- package/dist/core/dataLayer/schema.js +124 -89
- package/dist/core/dataLayer/schema.js.map +1 -1
- package/dist/core/dataLayer/schemaDescribe.js +78 -41
- package/dist/core/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/core/dataLayer/search.js +12 -13
- package/dist/core/dataLayer/search.js.map +1 -1
- package/dist/core/dataLayer/transaction.js +3 -4
- package/dist/core/dataLayer/transaction.js.map +1 -1
- package/dist/core/dataLayer/update.js +53 -18
- package/dist/core/dataLayer/update.js.map +1 -1
- package/dist/core/globals.js +1 -0
- package/dist/core/globals.js.map +1 -1
- package/dist/core/index.js +4 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/json/systemSchema.json +65 -0
- package/dist/core/launchServiceScripts/utility/checkNodeVersion.js +3 -0
- package/dist/core/launchServiceScripts/utility/checkNodeVersion.js.map +1 -1
- package/dist/core/resources/DatabaseTransaction.js +39 -15
- package/dist/core/resources/DatabaseTransaction.js.map +1 -1
- package/dist/core/resources/ErrorResource.js +3 -1
- package/dist/core/resources/ErrorResource.js.map +1 -1
- package/dist/core/resources/LMDBTransaction.js +18 -7
- package/dist/core/resources/LMDBTransaction.js.map +1 -1
- package/dist/core/resources/RecordEncoder.js +38 -38
- package/dist/core/resources/RecordEncoder.js.map +1 -1
- package/dist/core/resources/RequestTarget.js.map +1 -1
- package/dist/core/resources/Resource.js +43 -10
- package/dist/core/resources/Resource.js.map +1 -1
- package/dist/core/resources/ResourceInterface.js +20 -0
- package/dist/core/resources/ResourceInterface.js.map +1 -1
- package/dist/core/resources/Resources.js +7 -6
- package/dist/core/resources/Resources.js.map +1 -1
- package/dist/core/resources/RocksIndexStore.js +3 -0
- package/dist/core/resources/RocksIndexStore.js.map +1 -1
- package/dist/core/resources/RocksTransactionLogStore.js +10 -3
- package/dist/core/resources/RocksTransactionLogStore.js.map +1 -1
- package/dist/core/resources/Table.js +306 -116
- package/dist/core/resources/Table.js.map +1 -1
- package/dist/core/resources/analytics/metadata.js +1 -0
- package/dist/core/resources/analytics/metadata.js.map +1 -1
- package/dist/core/resources/analytics/read.js +69 -8
- package/dist/core/resources/analytics/read.js.map +1 -1
- package/dist/core/resources/analytics/write.js +232 -20
- package/dist/core/resources/analytics/write.js.map +1 -1
- package/dist/core/resources/auditStore.js +16 -8
- package/dist/core/resources/auditStore.js.map +1 -1
- package/dist/core/resources/blob.js +8 -8
- package/dist/core/resources/blob.js.map +1 -1
- package/dist/core/resources/dataLoader.js +13 -13
- package/dist/core/resources/databases.js +175 -59
- package/dist/core/resources/databases.js.map +1 -1
- package/dist/core/resources/graphql.js +267 -173
- package/dist/core/resources/graphql.js.map +1 -1
- package/dist/core/resources/indexes/HierarchicalNavigableSmallWorld.js +327 -59
- package/dist/core/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
- package/dist/core/resources/indexes/vector.js +14 -0
- package/dist/core/resources/indexes/vector.js.map +1 -1
- package/dist/core/resources/jsonSchemaTypes.js +78 -0
- package/dist/core/resources/jsonSchemaTypes.js.map +1 -0
- package/dist/core/resources/loadEnv.js +21 -18
- package/dist/core/resources/loadEnv.js.map +1 -1
- package/dist/core/resources/login.js +5 -4
- package/dist/core/resources/login.js.map +1 -1
- package/dist/core/resources/models/Models.js +265 -0
- package/dist/core/resources/models/Models.js.map +1 -0
- package/dist/core/resources/models/TestBackend.js +71 -0
- package/dist/core/resources/models/TestBackend.js.map +1 -0
- package/dist/core/resources/models/agentLoop.js +746 -0
- package/dist/core/resources/models/agentLoop.js.map +1 -0
- package/dist/core/resources/models/analyticsTable.js +166 -0
- package/dist/core/resources/models/analyticsTable.js.map +1 -0
- package/dist/core/resources/models/backendHelpers.js +109 -0
- package/dist/core/resources/models/backendHelpers.js.map +1 -0
- package/dist/core/resources/models/backendRegistry.js +54 -0
- package/dist/core/resources/models/backendRegistry.js.map +1 -0
- package/dist/core/resources/models/bootstrap.js +112 -0
- package/dist/core/resources/models/bootstrap.js.map +1 -0
- package/dist/core/resources/models/embedHook.js +127 -0
- package/dist/core/resources/models/embedHook.js.map +1 -0
- package/dist/core/resources/models/types.js +11 -0
- package/dist/core/resources/models/types.js.map +1 -0
- package/dist/core/resources/openApi.js +74 -34
- package/dist/core/resources/openApi.js.map +1 -1
- package/dist/core/resources/replayLogs.js +7 -1
- package/dist/core/resources/replayLogs.js.map +1 -1
- package/dist/core/resources/replayLogsGuards.js +47 -0
- package/dist/core/resources/replayLogsGuards.js.map +1 -1
- package/dist/core/resources/roles.js +67 -71
- package/dist/core/resources/roles.js.map +1 -1
- package/dist/core/resources/search.js +349 -140
- package/dist/core/resources/search.js.map +1 -1
- package/dist/core/resources/tracked.js +23 -15
- package/dist/core/resources/tracked.js.map +1 -1
- package/dist/core/resources/transaction.js +1 -1
- package/dist/core/resources/transaction.js.map +1 -1
- package/dist/core/resources/transactionBroadcast.js.map +1 -1
- package/dist/core/security/auth.js +34 -25
- package/dist/core/security/auth.js.map +1 -1
- package/dist/core/security/certificateVerification/crlVerification.js +7 -1
- package/dist/core/security/certificateVerification/crlVerification.js.map +1 -1
- package/dist/core/security/cryptoHash.js +37 -5
- package/dist/core/security/cryptoHash.js.map +1 -1
- package/dist/core/security/data_objects/PermissionAttributeResponseObject.js +4 -1
- package/dist/core/security/data_objects/PermissionAttributeResponseObject.js.map +1 -1
- package/dist/core/security/data_objects/PermissionResponseObject.js +15 -8
- package/dist/core/security/data_objects/PermissionResponseObject.js.map +1 -1
- package/dist/core/security/data_objects/PermissionTableResponseObject.js +6 -1
- package/dist/core/security/data_objects/PermissionTableResponseObject.js.map +1 -1
- package/dist/core/security/fastifyAuth.js +131 -22
- package/dist/core/security/fastifyAuth.js.map +1 -1
- package/dist/core/security/impersonation.js +15 -15
- package/dist/core/security/jsLoader.js +18 -5
- package/dist/core/security/jsLoader.js.map +1 -1
- package/dist/core/security/keys.js +160 -114
- package/dist/core/security/keys.js.map +1 -1
- package/dist/core/security/permissionsTranslator.js +2 -2
- package/dist/core/security/role.js +70 -35
- package/dist/core/security/role.js.map +1 -1
- package/dist/core/security/tokenAuthentication.js +57 -27
- package/dist/core/security/tokenAuthentication.js.map +1 -1
- package/dist/core/security/user.js +74 -38
- package/dist/core/security/user.js.map +1 -1
- package/dist/core/server/DurableSubscriptionsSession.js +71 -55
- package/dist/core/server/DurableSubscriptionsSession.js.map +1 -1
- package/dist/core/server/REST.js +17 -16
- package/dist/core/server/REST.js.map +1 -1
- package/dist/core/server/Server.js +1 -1
- package/dist/core/server/Server.js.map +1 -1
- package/dist/core/server/fastifyRoutes/helpers/getCORSOptions.js +1 -1
- package/dist/core/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +1 -1
- package/dist/core/server/fastifyRoutes/helpers/getServerOptions.js +1 -1
- package/dist/core/server/fastifyRoutes.js +34 -30
- package/dist/core/server/fastifyRoutes.js.map +1 -1
- package/dist/core/server/graphqlQuerying.js +8 -7
- package/dist/core/server/graphqlQuerying.js.map +1 -1
- package/dist/core/server/http.js +523 -47
- package/dist/core/server/http.js.map +1 -1
- package/dist/core/server/itc/serverHandlers.js +66 -15
- package/dist/core/server/itc/serverHandlers.js.map +1 -1
- package/dist/core/server/jobs/JobObject.js +53 -7
- package/dist/core/server/jobs/JobObject.js.map +1 -1
- package/dist/core/server/jobs/jobProcess.js +64 -24
- package/dist/core/server/jobs/jobProcess.js.map +1 -1
- package/dist/core/server/jobs/jobRunner.js +68 -30
- package/dist/core/server/jobs/jobRunner.js.map +1 -1
- package/dist/core/server/jobs/jobs.js +93 -61
- package/dist/core/server/jobs/jobs.js.map +1 -1
- package/dist/core/server/loadRootComponents.js +1 -1
- package/dist/core/server/middlewareChain.js +252 -0
- package/dist/core/server/middlewareChain.js.map +1 -0
- package/dist/core/server/mqtt.js +22 -17
- package/dist/core/server/mqtt.js.map +1 -1
- package/dist/core/server/nodeName.js +46 -13
- package/dist/core/server/nodeName.js.map +1 -1
- package/dist/core/server/operationsServer.js +106 -33
- package/dist/core/server/operationsServer.js.map +1 -1
- package/dist/core/server/serverHelpers/Headers.js +2 -0
- package/dist/core/server/serverHelpers/Headers.js.map +1 -1
- package/dist/core/server/serverHelpers/JSONStream.js +12 -3
- package/dist/core/server/serverHelpers/JSONStream.js.map +1 -1
- package/dist/core/server/serverHelpers/Request.js +370 -9
- package/dist/core/server/serverHelpers/Request.js.map +1 -1
- package/dist/core/server/serverHelpers/contentTypes.js +36 -7
- package/dist/core/server/serverHelpers/contentTypes.js.map +1 -1
- package/dist/core/server/serverHelpers/multipartParser.js +142 -0
- package/dist/core/server/serverHelpers/multipartParser.js.map +1 -0
- package/dist/core/server/serverHelpers/progressEmitter.js +103 -0
- package/dist/core/server/serverHelpers/progressEmitter.js.map +1 -0
- package/dist/core/server/serverHelpers/serverHandlers.js +38 -7
- package/dist/core/server/serverHelpers/serverHandlers.js.map +1 -1
- package/dist/core/server/serverHelpers/serverUtilities.js +97 -93
- package/dist/core/server/serverHelpers/serverUtilities.js.map +1 -1
- package/dist/core/server/static.js +8 -5
- package/dist/core/server/static.js.map +1 -1
- package/dist/core/server/status/index.js +3 -3
- package/dist/core/server/storageReclamation.js +68 -9
- package/dist/core/server/storageReclamation.js.map +1 -1
- package/dist/core/server/threads/itc.js +7 -4
- package/dist/core/server/threads/itc.js.map +1 -1
- package/dist/core/server/threads/manageThreads.js +110 -26
- package/dist/core/server/threads/manageThreads.js.map +1 -1
- package/dist/core/server/threads/socketRouter.js +8 -271
- package/dist/core/server/threads/socketRouter.js.map +1 -1
- package/dist/core/server/threads/threadServer.js +360 -118
- package/dist/core/server/threads/threadServer.js.map +1 -1
- package/dist/core/server/threads/workerProcessGuard.js +114 -0
- package/dist/core/server/threads/workerProcessGuard.js.map +1 -0
- package/dist/core/server/throttle.js +17 -0
- package/dist/core/server/throttle.js.map +1 -1
- package/dist/core/sqlTranslator/SelectValidator.js +86 -47
- package/dist/core/sqlTranslator/SelectValidator.js.map +1 -1
- package/dist/core/sqlTranslator/alasqlFunctionImporter.js +40 -3
- package/dist/core/sqlTranslator/alasqlFunctionImporter.js.map +1 -1
- package/dist/core/sqlTranslator/deleteTranslator.js +48 -14
- package/dist/core/sqlTranslator/deleteTranslator.js.map +1 -1
- package/dist/core/sqlTranslator/index.js +69 -30
- package/dist/core/sqlTranslator/index.js.map +1 -1
- package/dist/core/sqlTranslator/sql_statement_bucket.js +55 -13
- package/dist/core/sqlTranslator/sql_statement_bucket.js.map +1 -1
- package/dist/core/upgrade/UpgradeObjects.js +37 -4
- package/dist/core/upgrade/UpgradeObjects.js.map +1 -1
- package/dist/core/upgrade/directives/5-1-0.js +114 -0
- package/dist/core/upgrade/directives/5-1-0.js.map +1 -0
- package/dist/core/upgrade/directives/directivesController.js +52 -11
- package/dist/core/upgrade/directives/directivesController.js.map +1 -1
- package/dist/core/upgrade/directivesManager.js +53 -18
- package/dist/core/upgrade/directivesManager.js.map +1 -1
- package/dist/core/upgrade/upgradePrompt.js +55 -60
- package/dist/core/upgrade/upgradePrompt.js.map +1 -1
- package/dist/core/upgrade/upgradeUtilities.js +37 -5
- package/dist/core/upgrade/upgradeUtilities.js.map +1 -1
- package/dist/core/utility/OperationFunctionCaller.js +45 -10
- package/dist/core/utility/OperationFunctionCaller.js.map +1 -1
- package/dist/core/utility/assignCmdEnvVariables.js +8 -4
- package/dist/core/utility/assignCmdEnvVariables.js.map +1 -1
- package/dist/core/utility/common_utils.js +140 -79
- package/dist/core/utility/common_utils.js.map +1 -1
- package/dist/core/utility/environment/environmentManager.js +75 -29
- package/dist/core/utility/environment/environmentManager.js.map +1 -1
- package/dist/core/utility/environment/systemInformation.js +27 -16
- package/dist/core/utility/environment/systemInformation.js.map +1 -1
- package/dist/core/utility/errors/commonErrors.js +49 -18
- package/dist/core/utility/errors/commonErrors.js.map +1 -1
- package/dist/core/utility/errors/hdbError.js +65 -26
- package/dist/core/utility/errors/hdbError.js.map +1 -1
- package/dist/core/utility/expandEnvVar.js +113 -0
- package/dist/core/utility/expandEnvVar.js.map +1 -0
- package/dist/core/utility/functions/geo.js +2 -2
- package/dist/core/utility/functions/sql/alaSQLExtension.js +1 -1
- package/dist/core/utility/globalSchema.js +14 -11
- package/dist/core/utility/globalSchema.js.map +1 -1
- package/dist/core/utility/hdbTerms.js +54 -1
- package/dist/core/utility/hdbTerms.js.map +1 -1
- package/dist/core/utility/install/checkJWTTokensExist.js +1 -1
- package/dist/core/utility/install/installer.js +136 -73
- package/dist/core/utility/install/installer.js.map +1 -1
- package/dist/core/utility/installation.js +3 -3
- package/dist/core/utility/lmdb/DBIDefinition.js +5 -1
- package/dist/core/utility/lmdb/DBIDefinition.js.map +1 -1
- package/dist/core/utility/lmdb/DeleteRecordsResponseObject.js +2 -1
- package/dist/core/utility/lmdb/DeleteRecordsResponseObject.js.map +1 -1
- package/dist/core/utility/lmdb/InsertRecordsResponseObject.js +2 -1
- package/dist/core/utility/lmdb/InsertRecordsResponseObject.js.map +1 -1
- package/dist/core/utility/lmdb/OpenDBIObject.js +68 -6
- package/dist/core/utility/lmdb/OpenDBIObject.js.map +1 -1
- package/dist/core/utility/lmdb/OpenEnvironmentObject.js +52 -4
- package/dist/core/utility/lmdb/OpenEnvironmentObject.js.map +1 -1
- package/dist/core/utility/lmdb/UpdateRecordsResponseObject.js +2 -1
- package/dist/core/utility/lmdb/UpdateRecordsResponseObject.js.map +1 -1
- package/dist/core/utility/lmdb/UpsertRecordsResponseObject.js +2 -1
- package/dist/core/utility/lmdb/UpsertRecordsResponseObject.js.map +1 -1
- package/dist/core/utility/lmdb/cleanLMDBMap.js +44 -7
- package/dist/core/utility/lmdb/cleanLMDBMap.js.map +1 -1
- package/dist/core/utility/lmdb/commonUtility.js +46 -17
- package/dist/core/utility/lmdb/commonUtility.js.map +1 -1
- package/dist/core/utility/lmdb/deleteUtility.js +51 -16
- package/dist/core/utility/lmdb/deleteUtility.js.map +1 -1
- package/dist/core/utility/lmdb/environmentUtility.js +91 -51
- package/dist/core/utility/lmdb/environmentUtility.js.map +1 -1
- package/dist/core/utility/lmdb/searchCursorFunctions.js +46 -14
- package/dist/core/utility/lmdb/searchCursorFunctions.js.map +1 -1
- package/dist/core/utility/lmdb/searchUtility.js +91 -55
- package/dist/core/utility/lmdb/searchUtility.js.map +1 -1
- package/dist/core/utility/lmdb/terms.js +12 -22
- package/dist/core/utility/lmdb/terms.js.map +1 -1
- package/dist/core/utility/lmdb/writeUtility.js +61 -28
- package/dist/core/utility/lmdb/writeUtility.js.map +1 -1
- package/dist/core/utility/logging/harper_logger.js +177 -82
- package/dist/core/utility/logging/harper_logger.js.map +1 -1
- package/dist/core/utility/logging/logRotator.js +67 -32
- package/dist/core/utility/logging/logRotator.js.map +1 -1
- package/dist/core/utility/logging/logger.js +4 -4
- package/dist/core/utility/logging/readLog.js +54 -17
- package/dist/core/utility/logging/readLog.js.map +1 -1
- package/dist/core/utility/logging/transactionLog.js +51 -16
- package/dist/core/utility/logging/transactionLog.js.map +1 -1
- package/dist/core/utility/mount_hdb.js +54 -17
- package/dist/core/utility/mount_hdb.js.map +1 -1
- package/dist/core/utility/npmUtilities.js +54 -19
- package/dist/core/utility/npmUtilities.js.map +1 -1
- package/dist/core/utility/operation_authorization.js +135 -86
- package/dist/core/utility/operation_authorization.js.map +1 -1
- package/dist/core/utility/packageUtils.js +7 -17
- package/dist/core/utility/packageUtils.js.map +1 -1
- package/dist/core/utility/password.js +2 -2
- package/dist/core/utility/processManagement/processManagement.js +2 -2
- package/dist/core/utility/processManagement/servicesConfig.js +1 -1
- package/dist/core/utility/signalling.js +51 -16
- package/dist/core/utility/signalling.js.map +1 -1
- package/dist/core/utility/watcherFallback.js +73 -0
- package/dist/core/utility/watcherFallback.js.map +1 -0
- package/dist/core/validation/analyticsValidator.js +80 -0
- package/dist/core/validation/analyticsValidator.js.map +1 -0
- package/dist/core/validation/bulkDeleteValidator.js +49 -11
- package/dist/core/validation/bulkDeleteValidator.js.map +1 -1
- package/dist/core/validation/check_permissions.js +38 -3
- package/dist/core/validation/check_permissions.js.map +1 -1
- package/dist/core/validation/common_validators.js +62 -31
- package/dist/core/validation/common_validators.js.map +1 -1
- package/dist/core/validation/configValidator.js +189 -54
- package/dist/core/validation/configValidator.js.map +1 -1
- package/dist/core/validation/deleteValidator.js +49 -11
- package/dist/core/validation/deleteValidator.js.map +1 -1
- package/dist/core/validation/fileLoadValidator.js +67 -32
- package/dist/core/validation/fileLoadValidator.js.map +1 -1
- package/dist/core/validation/insertValidator.js +48 -10
- package/dist/core/validation/insertValidator.js.map +1 -1
- package/dist/core/validation/installValidator.js +47 -10
- package/dist/core/validation/installValidator.js.map +1 -1
- package/dist/core/validation/readLogValidator.js +60 -22
- package/dist/core/validation/readLogValidator.js.map +1 -1
- package/dist/core/validation/role_validation.js +55 -19
- package/dist/core/validation/role_validation.js.map +1 -1
- package/dist/core/validation/schemaMetadataValidator.js +11 -12
- package/dist/core/validation/schemaMetadataValidator.js.map +1 -1
- package/dist/core/validation/searchValidator.js +82 -43
- package/dist/core/validation/searchValidator.js.map +1 -1
- package/dist/core/validation/transactionLogValidator.js +52 -17
- package/dist/core/validation/transactionLogValidator.js.map +1 -1
- package/dist/core/validation/user_validation.js +38 -6
- package/dist/core/validation/user_validation.js.map +1 -1
- package/dist/core/validation/validationWrapper.js +4 -5
- package/dist/core/validation/validationWrapper.js.map +1 -1
- package/dist/licensing/usageLicensing.js +30 -21
- package/dist/licensing/usageLicensing.js.map +1 -1
- package/dist/replication/knownNodes.js +171 -41
- package/dist/replication/knownNodes.js.map +1 -1
- package/dist/replication/replicationConnection.js +441 -85
- package/dist/replication/replicationConnection.js.map +1 -1
- package/dist/replication/replicator.js +56 -28
- package/dist/replication/replicator.js.map +1 -1
- package/dist/replication/setNode.js +24 -4
- package/dist/replication/setNode.js.map +1 -1
- package/dist/replication/subscriptionManager.js +195 -16
- package/dist/replication/subscriptionManager.js.map +1 -1
- package/dist/security/certificate.js +41 -6
- package/dist/security/certificate.js.map +1 -1
- package/dist/security/sshKeyOperations.js +35 -2
- package/dist/security/sshKeyOperations.js.map +1 -1
- package/licensing/usageLicensing.ts +32 -37
- package/npm-shrinkwrap.json +9032 -4334
- package/package.json +17 -12
- package/replication/DESIGN.md +139 -0
- package/replication/knownNodes.ts +165 -44
- package/replication/replicationConnection.ts +475 -92
- package/replication/replicator.ts +54 -27
- package/replication/setNode.ts +29 -10
- package/replication/subscriptionManager.ts +227 -21
- package/security/certificate.ts +8 -4
- package/security/sshKeyOperations.ts +1 -1
- package/static/defaultConfig.yaml +1 -0
- package/studio/web/assets/{index-CybLScHg.js → index-Dqr9oVhe.js} +5 -5
- package/studio/web/assets/index-Dqr9oVhe.js.map +1 -0
- package/studio/web/assets/{index.lazy-DKx5-iXF.js → index.lazy-CpKcKb7M.js} +2 -2
- package/studio/web/assets/{index.lazy-DKx5-iXF.js.map → index.lazy-CpKcKb7M.js.map} +1 -1
- package/studio/web/assets/{profile-BOjes0Wl.js → profile-C1cujdsg.js} +2 -2
- package/studio/web/assets/{profile-BOjes0Wl.js.map → profile-C1cujdsg.js.map} +1 -1
- package/studio/web/assets/{status-EWKUIrjT.js → status-CTiIIQlY.js} +2 -2
- package/studio/web/assets/{status-EWKUIrjT.js.map → status-CTiIIQlY.js.map} +1 -1
- package/studio/web/index.html +1 -1
- package/core/bin/cliOperations.js +0 -159
- package/core/bin/lite.js +0 -5
- package/core/bin/stop.js +0 -21
- package/core/dataLayer/harperBridge/BridgeMethods.js +0 -85
- package/core/utility/globalSchema.js +0 -35
- package/core/utility/lmdb/OpenDBIObject.js +0 -31
- package/studio/web/assets/index-CybLScHg.js.map +0 -1
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations-profile tool generation. Walks Harper's `OPERATION_FUNCTION_MAP`
|
|
3
|
+
* and registers one MCP tool per operation that survives the
|
|
4
|
+
* `mcp.operations.allow` / `deny` filter.
|
|
5
|
+
*
|
|
6
|
+
* The default v1 allow list is read-only and intentionally narrow:
|
|
7
|
+
* `describe_*`, `list_*`, `search_*`, plus an explicit set of safe
|
|
8
|
+
* getters (`get_job`, `get_status`, `get_analytics`, `get_metrics`),
|
|
9
|
+
* `system_information`, `read_log`, `read_audit_log`. A `get_*` glob
|
|
10
|
+
* was rejected because it would have matched `get_configuration`
|
|
11
|
+
* (TLS/S3/auth secrets), `get_components` + `get_component_file` +
|
|
12
|
+
* `get_custom_function*` (component source code, which can embed
|
|
13
|
+
* secrets), `get_backup`, and `get_deployment{,_payload}` — none of
|
|
14
|
+
* which should default into the MCP surface even though
|
|
15
|
+
* `verifyPerms` still gates the actual call. Operators who want any
|
|
16
|
+
* of those opt in via `mcp.operations.allow`. Destructive ops carry
|
|
17
|
+
* `destructiveHint: true` so well-behaved MCP clients can surface a
|
|
18
|
+
* confirmation prompt.
|
|
19
|
+
*
|
|
20
|
+
* Tool dispatch delegates to `chooseOperation` + `processLocalTransaction`
|
|
21
|
+
* — the same path Harper's REST `/operation` endpoint uses. That means
|
|
22
|
+
* `verifyPerms` runs unchanged, replication catchup runs unchanged, and
|
|
23
|
+
* server-side validation errors surface as `isError: true` results without
|
|
24
|
+
* the MCP layer needing to know what each operation expects.
|
|
25
|
+
*/
|
|
26
|
+
import * as env from '../../../utility/environment/environmentManager.ts';
|
|
27
|
+
import { CONFIG_PARAMS } from '../../../utility/hdbTerms.ts';
|
|
28
|
+
import harperLogger from '../../../utility/logging/harper_logger.ts';
|
|
29
|
+
import { addTool, canRoleInvokeOperation, type AuthedUser, type ToolResult } from '../toolRegistry.ts';
|
|
30
|
+
import { OPERATION_INPUT_SCHEMAS, PERMISSIVE_SCHEMA } from './schemas/operations.ts';
|
|
31
|
+
import { OPERATION_DESCRIPTIONS } from './schemas/operationDescriptions.ts';
|
|
32
|
+
|
|
33
|
+
// Eager-resolved at module load. The map is built at Harper boot and
|
|
34
|
+
// doesn't mutate, so caching here is safe.
|
|
35
|
+
type OperationFunction = (json: object) => unknown | Promise<unknown>;
|
|
36
|
+
type OperationFunctionMap = Map<string, { operation_function: OperationFunction }>;
|
|
37
|
+
|
|
38
|
+
type ChooseOperation = (body: object) => OperationFunction;
|
|
39
|
+
type ProcessLocalTransaction = (req: { body: object }, fn: OperationFunction) => Promise<unknown>;
|
|
40
|
+
|
|
41
|
+
interface OperationsConfig {
|
|
42
|
+
allow?: readonly string[];
|
|
43
|
+
deny?: readonly string[];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Test seams. Avoids importing Harper's heavy server-helpers graph from unit
|
|
47
|
+
// tests that only want to exercise the registration logic.
|
|
48
|
+
let _opMapOverride: OperationFunctionMap | undefined;
|
|
49
|
+
let _chooseOperationOverride: ChooseOperation | undefined;
|
|
50
|
+
let _processLocalTransactionOverride: ProcessLocalTransaction | undefined;
|
|
51
|
+
|
|
52
|
+
export function _setOperationFunctionMapForTest(m: OperationFunctionMap | undefined): void {
|
|
53
|
+
_opMapOverride = m;
|
|
54
|
+
}
|
|
55
|
+
export function _setChooseOperationForTest(fn: ChooseOperation | undefined): void {
|
|
56
|
+
_chooseOperationOverride = fn;
|
|
57
|
+
}
|
|
58
|
+
export function _setProcessLocalTransactionForTest(fn: ProcessLocalTransaction | undefined): void {
|
|
59
|
+
_processLocalTransactionOverride = fn;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function loadServerUtilities():
|
|
63
|
+
| {
|
|
64
|
+
OPERATION_FUNCTION_MAP?: OperationFunctionMap;
|
|
65
|
+
chooseOperation?: ChooseOperation;
|
|
66
|
+
processLocalTransaction?: ProcessLocalTransaction;
|
|
67
|
+
}
|
|
68
|
+
| undefined {
|
|
69
|
+
try {
|
|
70
|
+
// Lazy require: Harper's server-helpers graph initializes eagerly
|
|
71
|
+
// (RocksDB lock acquisition, schema preload). Loading it from a unit
|
|
72
|
+
// test that hasn't booted Harper throws; treat that as "we're not in
|
|
73
|
+
// a Harper process" and let callers gracefully no-op.
|
|
74
|
+
return require('../../../server/serverHelpers/serverUtilities');
|
|
75
|
+
} catch (err) {
|
|
76
|
+
harperLogger.trace(`MCP operations tools: serverUtilities unavailable (${(err as Error).message})`);
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function getOperationFunctionMap(): OperationFunctionMap | undefined {
|
|
82
|
+
if (_opMapOverride) return _opMapOverride;
|
|
83
|
+
const utils = loadServerUtilities();
|
|
84
|
+
return utils?.OPERATION_FUNCTION_MAP;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function getChooseOperation(): ChooseOperation | undefined {
|
|
88
|
+
if (_chooseOperationOverride) return _chooseOperationOverride;
|
|
89
|
+
return loadServerUtilities()?.chooseOperation;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function getProcessLocalTransaction(): ProcessLocalTransaction | undefined {
|
|
93
|
+
if (_processLocalTransactionOverride) return _processLocalTransactionOverride;
|
|
94
|
+
return loadServerUtilities()?.processLocalTransaction;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Default v1 allow list — read-only operations only. Operators who want
|
|
99
|
+
* destructive ops on the MCP surface opt in via `mcp.operations.allow`.
|
|
100
|
+
*/
|
|
101
|
+
export const DEFAULT_ALLOW: readonly string[] = [
|
|
102
|
+
'describe_*',
|
|
103
|
+
'list_*',
|
|
104
|
+
'search_*',
|
|
105
|
+
// Explicit safe getters only — see file-header rationale. `get_*` would
|
|
106
|
+
// pull in `get_configuration`, `get_components`, `get_custom_function*`,
|
|
107
|
+
// `get_backup`, and `get_deployment*`, all of which can leak secrets or
|
|
108
|
+
// source code into the LLM context even with `verifyPerms` enforcing.
|
|
109
|
+
'get_job',
|
|
110
|
+
'get_status',
|
|
111
|
+
'get_analytics',
|
|
112
|
+
'get_metrics',
|
|
113
|
+
'system_information',
|
|
114
|
+
'read_log',
|
|
115
|
+
'read_audit_log',
|
|
116
|
+
];
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Operations that carry `destructiveHint: true` when opted into the allow
|
|
120
|
+
* list. The hint lets MCP clients surface a confirmation prompt before
|
|
121
|
+
* calling. It is **not** an authorization check — Harper's `verifyPerms`
|
|
122
|
+
* still runs at the actual dispatch site.
|
|
123
|
+
*/
|
|
124
|
+
const DESTRUCTIVE_OPERATIONS: ReadonlySet<string> = new Set([
|
|
125
|
+
'drop_schema',
|
|
126
|
+
'drop_database',
|
|
127
|
+
'drop_table',
|
|
128
|
+
'drop_attribute',
|
|
129
|
+
'delete',
|
|
130
|
+
'delete_files_before',
|
|
131
|
+
'delete_records_before',
|
|
132
|
+
'delete_audit_logs_before',
|
|
133
|
+
'delete_transaction_logs_before',
|
|
134
|
+
'drop_user',
|
|
135
|
+
'drop_role',
|
|
136
|
+
'restart',
|
|
137
|
+
'restart_service',
|
|
138
|
+
'set_configuration',
|
|
139
|
+
'remove_node',
|
|
140
|
+
]);
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Read-only operations carry `readOnlyHint: true`. The category is wider
|
|
144
|
+
* than the default allow list (some custom-allowed ops are also read-only
|
|
145
|
+
* — `system_information`, for example). Any op matching one of these
|
|
146
|
+
* prefixes or names is treated as read-only.
|
|
147
|
+
*/
|
|
148
|
+
const READ_ONLY_PREFIXES: readonly string[] = ['describe_', 'list_', 'search_', 'get_', 'read_'];
|
|
149
|
+
const READ_ONLY_NAMES: ReadonlySet<string> = new Set(['system_information', 'status']);
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Operations annotated with `idempotentHint: true`. Under MCP semantics this
|
|
153
|
+
* is a STRONGER claim than "doesn't crash on retry": the second call must
|
|
154
|
+
* produce the same observable outcome as the first. `add_user` is NOT
|
|
155
|
+
* idempotent in this sense — the second call returns an "already exists"
|
|
156
|
+
* error rather than the created user.
|
|
157
|
+
*
|
|
158
|
+
* Default-empty. Entries are added only after verifying the handler's
|
|
159
|
+
* repeat-call behavior end-to-end. Under-annotate before mis-annotate.
|
|
160
|
+
*
|
|
161
|
+
* Note: read-only operations (DESCRIBE_*, LIST_*, SEARCH_*, GET_*, READ_*,
|
|
162
|
+
* system_information) are covered by `readOnlyHint: true` — that's the
|
|
163
|
+
* stronger and correct signal for queries.
|
|
164
|
+
*/
|
|
165
|
+
const IDEMPOTENT_OPERATIONS: ReadonlySet<string> = new Set([
|
|
166
|
+
// Intentionally empty for v1. Candidates that need pre-merge verification:
|
|
167
|
+
// - upsert (atomic insert-or-update; same payload should yield same state)
|
|
168
|
+
// - set_configuration (state-set semantics — confirm; if it's state-merge, NOT idempotent)
|
|
169
|
+
]);
|
|
170
|
+
|
|
171
|
+
function isReadOnly(operationName: string): boolean {
|
|
172
|
+
if (READ_ONLY_NAMES.has(operationName)) return true;
|
|
173
|
+
return READ_ONLY_PREFIXES.some((p) => operationName.startsWith(p));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function isDestructive(operationName: string): boolean {
|
|
177
|
+
return DESTRUCTIVE_OPERATIONS.has(operationName);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function isIdempotent(operationName: string): boolean {
|
|
181
|
+
return IDEMPOTENT_OPERATIONS.has(operationName);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Translates a single glob pattern (only `*` is supported) into a regex.
|
|
186
|
+
* `describe_*` matches `describe_schema`, `describe_table`, etc.; literals
|
|
187
|
+
* like `system_information` match exactly. No escape hatch yet — operators
|
|
188
|
+
* should use literals when they need them; the glob language is delibarately
|
|
189
|
+
* minimal to keep behavior predictable in audit/security reviews.
|
|
190
|
+
*/
|
|
191
|
+
function globToRegex(pattern: string): RegExp {
|
|
192
|
+
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
|
|
193
|
+
return new RegExp(`^${escaped}$`);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function matchesAny(operation: string, patterns: readonly string[] | undefined): boolean {
|
|
197
|
+
if (!patterns || patterns.length === 0) return false;
|
|
198
|
+
for (const p of patterns) {
|
|
199
|
+
if (globToRegex(p).test(operation)) return true;
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function isOperationAllowed(operation: string, config: OperationsConfig): boolean {
|
|
205
|
+
const allowList = config.allow && config.allow.length > 0 ? config.allow : DEFAULT_ALLOW;
|
|
206
|
+
if (!matchesAny(operation, allowList)) return false;
|
|
207
|
+
if (matchesAny(operation, config.deny)) return false;
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function getOperationsConfig(): OperationsConfig {
|
|
212
|
+
const allow = env.get(CONFIG_PARAMS.MCP_OPERATIONS_ALLOW);
|
|
213
|
+
const deny = env.get(CONFIG_PARAMS.MCP_OPERATIONS_DENY);
|
|
214
|
+
return {
|
|
215
|
+
allow: Array.isArray(allow) ? (allow as readonly string[]) : undefined,
|
|
216
|
+
deny: Array.isArray(deny) ? (deny as readonly string[]) : undefined,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function buildDescription(operationName: string, hasCuratedSchema: boolean): string {
|
|
221
|
+
const curated = OPERATION_DESCRIPTIONS[operationName];
|
|
222
|
+
if (curated) return curated;
|
|
223
|
+
const base = `Harper operation '${operationName}'.`;
|
|
224
|
+
const schemaNote = hasCuratedSchema
|
|
225
|
+
? ' Arguments validated against the curated schema below.'
|
|
226
|
+
: ' Arguments forwarded as-is; the server validates and returns a structured error on rejection.';
|
|
227
|
+
return base + schemaNote;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Build the dispatch handler for one operation. Returns a function suitable
|
|
232
|
+
* for `ToolDef.handler` that delegates to Harper's normal operation pipeline.
|
|
233
|
+
*
|
|
234
|
+
* Errors from `chooseOperation` (permission denied) or from the operation
|
|
235
|
+
* itself surface as `isError: true` MCP results, not JSON-RPC errors —
|
|
236
|
+
* matches the MCP spec's `tools/call` convention so the LLM sees and can
|
|
237
|
+
* adapt to the failure.
|
|
238
|
+
*/
|
|
239
|
+
function makeOperationToolHandler(operationName: string) {
|
|
240
|
+
return async function operationToolHandler(args: unknown, context: { user: AuthedUser }): Promise<ToolResult> {
|
|
241
|
+
const body: Record<string, unknown> = {
|
|
242
|
+
...(args && typeof args === 'object' ? (args as Record<string, unknown>) : {}),
|
|
243
|
+
operation: operationName,
|
|
244
|
+
hdb_user: context.user,
|
|
245
|
+
};
|
|
246
|
+
try {
|
|
247
|
+
const chooseOperation = getChooseOperation();
|
|
248
|
+
const processLocalTransaction = getProcessLocalTransaction();
|
|
249
|
+
if (!chooseOperation || !processLocalTransaction) {
|
|
250
|
+
throw new Error('Harper operations runtime unavailable');
|
|
251
|
+
}
|
|
252
|
+
const operationFn = chooseOperation(body);
|
|
253
|
+
const data = await processLocalTransaction({ body }, operationFn);
|
|
254
|
+
const text = typeof data === 'string' ? data : JSON.stringify(data ?? null);
|
|
255
|
+
const result: ToolResult = {
|
|
256
|
+
content: [{ type: 'text', text }],
|
|
257
|
+
};
|
|
258
|
+
if (data !== null && typeof data === 'object') {
|
|
259
|
+
result.structuredContent = data as object;
|
|
260
|
+
}
|
|
261
|
+
return result;
|
|
262
|
+
} catch (err) {
|
|
263
|
+
const e = err as { message?: string; http_resp_msg?: string; statusCode?: number };
|
|
264
|
+
const message = e?.http_resp_msg ?? e?.message ?? `operation '${operationName}' failed`;
|
|
265
|
+
harperLogger.trace(`MCP operations/${operationName} threw: ${(err as Error).stack ?? message}`);
|
|
266
|
+
return {
|
|
267
|
+
isError: true,
|
|
268
|
+
content: [
|
|
269
|
+
{
|
|
270
|
+
type: 'text',
|
|
271
|
+
text: JSON.stringify({ kind: 'harper_error', operation: operationName, message }),
|
|
272
|
+
},
|
|
273
|
+
],
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Idempotent registration: walk the op map, register every operation that
|
|
281
|
+
* passes the allow/deny filter. Safe to invoke multiple times — `addTool`
|
|
282
|
+
* is `Map.set`-backed.
|
|
283
|
+
*/
|
|
284
|
+
export function registerOperationsTools(): void {
|
|
285
|
+
const opMap = getOperationFunctionMap();
|
|
286
|
+
if (!opMap) {
|
|
287
|
+
harperLogger.warn('MCP operations profile: OPERATION_FUNCTION_MAP not available; no tools registered');
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
const config = getOperationsConfig();
|
|
291
|
+
let registered = 0;
|
|
292
|
+
for (const operationName of opMap.keys()) {
|
|
293
|
+
if (!isOperationAllowed(operationName, config)) continue;
|
|
294
|
+
const inputSchema = OPERATION_INPUT_SCHEMAS[operationName] ?? PERMISSIVE_SCHEMA;
|
|
295
|
+
const annotations: { readOnlyHint?: boolean; destructiveHint?: boolean; idempotentHint?: boolean } = {};
|
|
296
|
+
if (isReadOnly(operationName)) annotations.readOnlyHint = true;
|
|
297
|
+
if (isDestructive(operationName)) annotations.destructiveHint = true;
|
|
298
|
+
if (isIdempotent(operationName)) annotations.idempotentHint = true;
|
|
299
|
+
addTool({
|
|
300
|
+
name: operationName,
|
|
301
|
+
description: buildDescription(operationName, operationName in OPERATION_INPUT_SCHEMAS),
|
|
302
|
+
inputSchema,
|
|
303
|
+
profile: 'operations',
|
|
304
|
+
...(Object.keys(annotations).length > 0 ? { annotations } : {}),
|
|
305
|
+
visibleTo: (user) => canRoleInvokeOperation(user, operationName),
|
|
306
|
+
handler: makeOperationToolHandler(operationName),
|
|
307
|
+
});
|
|
308
|
+
registered++;
|
|
309
|
+
}
|
|
310
|
+
harperLogger.info(`MCP operations profile: registered ${registered} tool(s)`);
|
|
311
|
+
}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive MCP tool input schemas from a Harper Resource's `Table.attributes`.
|
|
3
|
+
*
|
|
4
|
+
* Harper attribute types map to JSON Schema's primitive types; nested
|
|
5
|
+
* `properties[]` and array `elements` map recursively. `attribute_permissions`
|
|
6
|
+
* (per role, per table) narrows the schema by removing attributes the user
|
|
7
|
+
* can't read (for `get_*`/`search_*`) or write (for `create_*`/`update_*`).
|
|
8
|
+
*
|
|
9
|
+
* Runtime enforcement still happens in `Table.allowUpdate` /
|
|
10
|
+
* `Table.allowCreate` — the schema narrowing here is a UX layer (so the LLM
|
|
11
|
+
* doesn't waste tokens on fields it can't write), NOT a security boundary.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export interface HarperAttribute {
|
|
15
|
+
name: string;
|
|
16
|
+
type?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
hidden?: boolean;
|
|
19
|
+
nullable?: boolean;
|
|
20
|
+
isPrimaryKey?: boolean;
|
|
21
|
+
properties?: HarperAttribute[];
|
|
22
|
+
elements?: HarperAttribute;
|
|
23
|
+
computed?: unknown;
|
|
24
|
+
computedFromExpression?: string;
|
|
25
|
+
assignCreatedTime?: boolean;
|
|
26
|
+
assignUpdatedTime?: boolean;
|
|
27
|
+
expiresAt?: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface AttributePermissionEntry {
|
|
31
|
+
attribute_name: string;
|
|
32
|
+
read?: boolean;
|
|
33
|
+
insert?: boolean;
|
|
34
|
+
update?: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
type Mode = 'read' | 'insert' | 'update';
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Maps a Harper attribute type to a JSON Schema `type` value (or list of
|
|
41
|
+
* types when nullable). Falls back to "string" for unknown types — better
|
|
42
|
+
* than blocking the field entirely; the runtime will validate.
|
|
43
|
+
*/
|
|
44
|
+
function harperTypeToJsonSchema(type: string | undefined): { type: string | string[] } | object {
|
|
45
|
+
switch (type) {
|
|
46
|
+
case 'Int':
|
|
47
|
+
case 'Long':
|
|
48
|
+
case 'BigInt':
|
|
49
|
+
return { type: 'integer' };
|
|
50
|
+
case 'Float':
|
|
51
|
+
return { type: 'number' };
|
|
52
|
+
case 'Boolean':
|
|
53
|
+
return { type: 'boolean' };
|
|
54
|
+
case 'String':
|
|
55
|
+
case 'ID':
|
|
56
|
+
return { type: 'string' };
|
|
57
|
+
case 'Date':
|
|
58
|
+
// Harper Date may be ISO string or number; allow both for LLM flexibility.
|
|
59
|
+
return { type: ['string', 'number'], description: 'ISO 8601 timestamp or epoch milliseconds.' };
|
|
60
|
+
case 'Bytes':
|
|
61
|
+
case 'Blob':
|
|
62
|
+
return { type: 'string', contentEncoding: 'base64' };
|
|
63
|
+
case 'Any':
|
|
64
|
+
case undefined:
|
|
65
|
+
return {};
|
|
66
|
+
default:
|
|
67
|
+
return { type: 'string' };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function attributeToProperty(attr: HarperAttribute): object {
|
|
72
|
+
let base: { type?: string | string[]; description?: string; [key: string]: unknown };
|
|
73
|
+
if (attr.type === 'Object' && attr.properties) {
|
|
74
|
+
base = {
|
|
75
|
+
type: 'object',
|
|
76
|
+
properties: Object.fromEntries(attr.properties.map((p) => [p.name, attributeToProperty(p)])),
|
|
77
|
+
};
|
|
78
|
+
} else if (attr.type === 'Array' && attr.elements) {
|
|
79
|
+
base = {
|
|
80
|
+
type: 'array',
|
|
81
|
+
items: attributeToProperty(attr.elements),
|
|
82
|
+
};
|
|
83
|
+
} else {
|
|
84
|
+
base = harperTypeToJsonSchema(attr.type) as typeof base;
|
|
85
|
+
}
|
|
86
|
+
if (attr.nullable && 'type' in base) {
|
|
87
|
+
const t = base.type;
|
|
88
|
+
const types = Array.isArray(t) ? t : [t as string];
|
|
89
|
+
if (!types.includes('null')) {
|
|
90
|
+
base.type = [...types, 'null'];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (attr.description && !base.description) {
|
|
94
|
+
base.description = attr.description;
|
|
95
|
+
}
|
|
96
|
+
return base;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* `true` if the user has the requested mode (read/insert/update) on this
|
|
101
|
+
* attribute. When no per-attribute permissions exist, returns true (the
|
|
102
|
+
* table-level perm gates the call already).
|
|
103
|
+
*/
|
|
104
|
+
function attributeAllowed(
|
|
105
|
+
attributeName: string,
|
|
106
|
+
permissions: AttributePermissionEntry[] | undefined,
|
|
107
|
+
mode: Mode
|
|
108
|
+
): boolean {
|
|
109
|
+
if (!permissions || permissions.length === 0) return true;
|
|
110
|
+
const match = permissions.find((p) => p.attribute_name === attributeName);
|
|
111
|
+
if (!match) return false; // explicit list with no entry → denied
|
|
112
|
+
return match[mode] !== false;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Composed visibility: an attribute is visible when it is NOT @hidden AND the
|
|
117
|
+
* caller is allowed under attribute_permissions for the requested mode. The
|
|
118
|
+
* `@hidden` directive is a metadata-visibility signal — it suppresses the
|
|
119
|
+
* attribute from MCP descriptors and OpenAPI emit. RBAC remains the
|
|
120
|
+
* enforcement mechanism for data access.
|
|
121
|
+
*/
|
|
122
|
+
function attributeVisible(
|
|
123
|
+
attr: HarperAttribute,
|
|
124
|
+
permissions: AttributePermissionEntry[] | undefined,
|
|
125
|
+
mode: Mode
|
|
126
|
+
): boolean {
|
|
127
|
+
if (attr.hidden) return false;
|
|
128
|
+
return attributeAllowed(attr.name, permissions, mode);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Build a JSON Schema object covering some subset of the table's attributes.
|
|
133
|
+
* `mode` controls how attribute_permissions are interpreted; `include`
|
|
134
|
+
* optionally limits to a subset (e.g. primary-key-only for `delete_*`).
|
|
135
|
+
*/
|
|
136
|
+
function buildPropertiesObject(
|
|
137
|
+
attributes: HarperAttribute[],
|
|
138
|
+
permissions: AttributePermissionEntry[] | undefined,
|
|
139
|
+
mode: Mode,
|
|
140
|
+
include?: (a: HarperAttribute) => boolean
|
|
141
|
+
): { properties: Record<string, object>; required: string[] } {
|
|
142
|
+
const properties: Record<string, object> = {};
|
|
143
|
+
const required: string[] = [];
|
|
144
|
+
for (const attr of attributes) {
|
|
145
|
+
if (include && !include(attr)) continue;
|
|
146
|
+
if (!attributeVisible(attr, permissions, mode)) continue;
|
|
147
|
+
// Skip auto-managed columns from write inputs — Harper assigns them.
|
|
148
|
+
if (mode !== 'read' && (attr.assignCreatedTime || attr.assignUpdatedTime || attr.expiresAt)) continue;
|
|
149
|
+
if (mode !== 'read' && (attr.computed !== undefined || attr.computedFromExpression !== undefined)) continue;
|
|
150
|
+
properties[attr.name] = attributeToProperty(attr);
|
|
151
|
+
if (mode === 'insert' && !attr.nullable && !attr.isPrimaryKey) {
|
|
152
|
+
required.push(attr.name);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return { properties, required };
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function findPrimaryKey(attributes: HarperAttribute[]): HarperAttribute | undefined {
|
|
159
|
+
return attributes.find((a) => a.isPrimaryKey);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function deriveGetSchema(
|
|
163
|
+
attributes: HarperAttribute[],
|
|
164
|
+
_permissions: AttributePermissionEntry[] | undefined
|
|
165
|
+
): object {
|
|
166
|
+
const pk = findPrimaryKey(attributes);
|
|
167
|
+
const pkSchema = pk ? attributeToProperty(pk) : { type: 'string' };
|
|
168
|
+
return {
|
|
169
|
+
type: 'object',
|
|
170
|
+
properties: {
|
|
171
|
+
id: { ...pkSchema, description: pk ? `Primary key (${pk.name}).` : 'Primary key.' },
|
|
172
|
+
get_attributes: {
|
|
173
|
+
type: 'array',
|
|
174
|
+
items: { type: 'string' },
|
|
175
|
+
description: 'Attribute names to project; defaults to all readable attributes.',
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
required: ['id'],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function deriveSearchSchema(
|
|
183
|
+
attributes: HarperAttribute[],
|
|
184
|
+
permissions: AttributePermissionEntry[] | undefined
|
|
185
|
+
): object {
|
|
186
|
+
// `conditions` is freeform — Harper supports many comparators; we expose
|
|
187
|
+
// the common subset and rely on server-side validation for the rest.
|
|
188
|
+
const readableAttrs = attributes.filter((a) => attributeVisible(a, permissions, 'read'));
|
|
189
|
+
const attrNames = readableAttrs.map((a) => a.name);
|
|
190
|
+
return {
|
|
191
|
+
type: 'object',
|
|
192
|
+
properties: {
|
|
193
|
+
conditions: {
|
|
194
|
+
type: 'array',
|
|
195
|
+
items: {
|
|
196
|
+
type: 'object',
|
|
197
|
+
properties: {
|
|
198
|
+
attribute: {
|
|
199
|
+
type: 'string',
|
|
200
|
+
...(attrNames.length > 0 ? { enum: attrNames } : {}),
|
|
201
|
+
description: 'Attribute name to filter on.',
|
|
202
|
+
},
|
|
203
|
+
comparator: {
|
|
204
|
+
type: 'string',
|
|
205
|
+
enum: [
|
|
206
|
+
'equals',
|
|
207
|
+
'not_equals',
|
|
208
|
+
'contains',
|
|
209
|
+
'starts_with',
|
|
210
|
+
'ends_with',
|
|
211
|
+
'greater_than',
|
|
212
|
+
'less_than',
|
|
213
|
+
'greater_than_equal',
|
|
214
|
+
'less_than_equal',
|
|
215
|
+
'between',
|
|
216
|
+
],
|
|
217
|
+
description: 'Comparison operator. Defaults to "equals" if omitted.',
|
|
218
|
+
},
|
|
219
|
+
value: { description: 'Comparison value (any JSON type).' },
|
|
220
|
+
},
|
|
221
|
+
required: ['attribute', 'value'],
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
operator: { type: 'string', enum: ['and', 'or'], description: 'How to combine conditions; defaults to "and".' },
|
|
225
|
+
get_attributes: { type: 'array', items: { type: 'string' } },
|
|
226
|
+
limit: { type: 'integer', minimum: 1, description: 'Max records to return on this page.' },
|
|
227
|
+
cursor: { type: 'string', description: 'Opaque pagination cursor returned by a previous call.' },
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export function deriveCreateSchema(
|
|
233
|
+
attributes: HarperAttribute[],
|
|
234
|
+
permissions: AttributePermissionEntry[] | undefined
|
|
235
|
+
): object {
|
|
236
|
+
const { properties, required } = buildPropertiesObject(attributes, permissions, 'insert');
|
|
237
|
+
const schema: { type: string; properties: Record<string, object>; required?: string[] } = {
|
|
238
|
+
type: 'object',
|
|
239
|
+
properties,
|
|
240
|
+
};
|
|
241
|
+
if (required.length > 0) schema.required = required;
|
|
242
|
+
return schema;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export function deriveUpdateSchema(
|
|
246
|
+
attributes: HarperAttribute[],
|
|
247
|
+
permissions: AttributePermissionEntry[] | undefined
|
|
248
|
+
): object {
|
|
249
|
+
const pk = findPrimaryKey(attributes);
|
|
250
|
+
const { properties } = buildPropertiesObject(attributes, permissions, 'update', (a) => !a.isPrimaryKey);
|
|
251
|
+
return {
|
|
252
|
+
type: 'object',
|
|
253
|
+
properties: {
|
|
254
|
+
id: pk
|
|
255
|
+
? { ...attributeToProperty(pk), description: `Primary key (${pk.name}). Required.` }
|
|
256
|
+
: { type: 'string', description: 'Primary key. Required.' },
|
|
257
|
+
...properties,
|
|
258
|
+
},
|
|
259
|
+
required: ['id'],
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export function deriveDeleteSchema(
|
|
264
|
+
attributes: HarperAttribute[],
|
|
265
|
+
_permissions: AttributePermissionEntry[] | undefined
|
|
266
|
+
): object {
|
|
267
|
+
const pk = findPrimaryKey(attributes);
|
|
268
|
+
return {
|
|
269
|
+
type: 'object',
|
|
270
|
+
properties: {
|
|
271
|
+
id: pk
|
|
272
|
+
? { ...attributeToProperty(pk), description: `Primary key (${pk.name}).` }
|
|
273
|
+
: { type: 'string', description: 'Primary key.' },
|
|
274
|
+
},
|
|
275
|
+
required: ['id'],
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Full record shape — every visible attribute as it appears in returned records.
|
|
281
|
+
* Used as the outputSchema for get/create/update/patch. Reflects what the
|
|
282
|
+
* server returns, not what the client sends: server-assigned fields
|
|
283
|
+
* (@createdTime, @updatedTime, @primaryKey) appear as required in output even
|
|
284
|
+
* though they're optional on input.
|
|
285
|
+
*
|
|
286
|
+
* `search_*` deliberately omits outputSchema — envelope shape (records vs
|
|
287
|
+
* data, cursor vs nextCursor) is tracked in the sibling issue.
|
|
288
|
+
*/
|
|
289
|
+
function deriveRecordSchema(
|
|
290
|
+
attributes: HarperAttribute[],
|
|
291
|
+
permissions: AttributePermissionEntry[] | undefined
|
|
292
|
+
): object {
|
|
293
|
+
const properties: Record<string, object> = {};
|
|
294
|
+
const required: string[] = [];
|
|
295
|
+
for (const attr of attributes) {
|
|
296
|
+
if (!attributeVisible(attr, permissions, 'read')) continue;
|
|
297
|
+
properties[attr.name] = attributeToProperty(attr);
|
|
298
|
+
const requiredOnOutput =
|
|
299
|
+
attr.nullable === false || attr.assignCreatedTime || attr.assignUpdatedTime || attr.isPrimaryKey;
|
|
300
|
+
if (requiredOnOutput) required.push(attr.name);
|
|
301
|
+
}
|
|
302
|
+
const schema: {
|
|
303
|
+
type: string;
|
|
304
|
+
properties: Record<string, object>;
|
|
305
|
+
required?: string[];
|
|
306
|
+
additionalProperties: boolean;
|
|
307
|
+
} = {
|
|
308
|
+
type: 'object',
|
|
309
|
+
properties,
|
|
310
|
+
additionalProperties: false,
|
|
311
|
+
};
|
|
312
|
+
if (required.length > 0) schema.required = required;
|
|
313
|
+
return schema;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export function deriveGetOutputSchema(
|
|
317
|
+
attributes: HarperAttribute[],
|
|
318
|
+
permissions: AttributePermissionEntry[] | undefined
|
|
319
|
+
): object {
|
|
320
|
+
return deriveRecordSchema(attributes, permissions);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export function deriveCreateOutputSchema(
|
|
324
|
+
attributes: HarperAttribute[],
|
|
325
|
+
permissions: AttributePermissionEntry[] | undefined
|
|
326
|
+
): object {
|
|
327
|
+
return deriveRecordSchema(attributes, permissions);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
export function deriveUpdateOutputSchema(
|
|
331
|
+
attributes: HarperAttribute[],
|
|
332
|
+
permissions: AttributePermissionEntry[] | undefined
|
|
333
|
+
): object {
|
|
334
|
+
return deriveRecordSchema(attributes, permissions);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export function derivePatchOutputSchema(
|
|
338
|
+
attributes: HarperAttribute[],
|
|
339
|
+
permissions: AttributePermissionEntry[] | undefined
|
|
340
|
+
): object {
|
|
341
|
+
return deriveRecordSchema(attributes, permissions);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Output schema for delete responses. Table.delete returns Promise<boolean>;
|
|
346
|
+
* makeDeleteHandler wraps it as wrapResult(data ?? { ok: true }) — so on
|
|
347
|
+
* success the MCP response carries a text content of "true" with no
|
|
348
|
+
* structuredContent. Advertise the actual contract (boolean) rather than a
|
|
349
|
+
* synthesized object envelope the handler never produces.
|
|
350
|
+
*/
|
|
351
|
+
export function deriveDeleteOutputSchema(_attributes: HarperAttribute[]): object {
|
|
352
|
+
return {
|
|
353
|
+
type: 'boolean',
|
|
354
|
+
description: 'True when the record was deleted; false when no record matched the primary key.',
|
|
355
|
+
};
|
|
356
|
+
}
|