@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.
Files changed (942) hide show
  1. package/analytics/profile.ts +4 -0
  2. package/core/AGENTS.md +94 -6
  3. package/core/DESIGN.md +36 -0
  4. package/core/README.md +11 -10
  5. package/core/agent/agent.ts +203 -0
  6. package/core/agent/loop.ts +205 -0
  7. package/core/agent/operations.ts +148 -0
  8. package/core/agent/session.ts +187 -0
  9. package/core/agent/tools/fsTools.ts +276 -0
  10. package/core/agent/tools/httpFetchTool.ts +112 -0
  11. package/core/agent/tools/scheduleTool.ts +68 -0
  12. package/core/agent/toolset.ts +43 -0
  13. package/core/agent/types.ts +85 -0
  14. package/core/benchmarks/hnsw-search.js +157 -0
  15. package/core/benchmarks/ycsb/README.md +144 -0
  16. package/core/benchmarks/ycsb/analyze-profile.mts +120 -0
  17. package/core/benchmarks/ycsb/app/config.yaml +3 -0
  18. package/core/benchmarks/ycsb/app/schema.graphql +17 -0
  19. package/core/benchmarks/ycsb/harness.mts +328 -0
  20. package/core/benchmarks/ycsb/restClient.mts +120 -0
  21. package/core/benchmarks/ycsb/run-single-node.mts +97 -0
  22. package/core/benchmarks/ycsb/to-benchmark-json.mts +58 -0
  23. package/core/benchmarks/ycsb/workload.mts +499 -0
  24. package/core/benchmarks/ycsb/workload.test.mts +174 -0
  25. package/core/bin/{BinObjects.js → BinObjects.ts} +4 -5
  26. package/core/bin/cliCredentials.ts +133 -0
  27. package/core/bin/cliOperations.ts +339 -0
  28. package/core/bin/copyDb.ts +10 -10
  29. package/core/bin/deployRenderer.ts +196 -0
  30. package/core/bin/{harper.js → harper.ts} +48 -24
  31. package/core/bin/{install.js → install.ts} +3 -3
  32. package/core/bin/lite.ts +2 -0
  33. package/core/bin/login.ts +134 -0
  34. package/core/bin/logout.ts +11 -0
  35. package/core/bin/mcp/client.ts +407 -0
  36. package/core/bin/mcp/doctor.ts +189 -0
  37. package/core/bin/mcp/index.ts +80 -0
  38. package/core/bin/mcp/options.ts +122 -0
  39. package/core/bin/mcp/printConfig.ts +89 -0
  40. package/core/bin/multipartBuilder.ts +74 -0
  41. package/core/bin/{restart.js → restart.ts} +31 -32
  42. package/core/bin/{run.js → run.ts} +57 -46
  43. package/core/bin/sseConsumer.ts +126 -0
  44. package/core/bin/{status.js → status.ts} +10 -10
  45. package/core/bin/stop.ts +21 -0
  46. package/core/bin/upgrade.js +17 -24
  47. package/core/components/Application.ts +144 -18
  48. package/core/components/ApplicationScope.ts +2 -2
  49. package/core/components/ComponentV1.ts +2 -2
  50. package/core/components/EntryHandler.ts +159 -9
  51. package/core/components/OptionsWatcher.ts +75 -11
  52. package/core/components/Scope.ts +132 -18
  53. package/core/components/anthropic/index.ts +547 -0
  54. package/core/components/bedrock/index.ts +823 -0
  55. package/core/components/componentLoader.ts +64 -32
  56. package/core/components/deployLifecycle.ts +161 -0
  57. package/core/components/deploymentOperations.ts +173 -0
  58. package/core/components/deploymentRecorder.ts +427 -0
  59. package/core/components/deriveURLPath.ts +4 -4
  60. package/core/components/mcp/adapters/fastify.ts +87 -0
  61. package/core/components/mcp/adapters/harperHttp.ts +103 -0
  62. package/core/components/mcp/audit.ts +75 -0
  63. package/core/components/mcp/index.ts +134 -0
  64. package/core/components/mcp/jsonrpc.ts +134 -0
  65. package/core/components/mcp/lifecycle.ts +105 -0
  66. package/core/components/mcp/listChanged.ts +270 -0
  67. package/core/components/mcp/rateLimit.ts +217 -0
  68. package/core/components/mcp/resources.ts +607 -0
  69. package/core/components/mcp/session.ts +151 -0
  70. package/core/components/mcp/sessionRegistry.ts +140 -0
  71. package/core/components/mcp/toolRegistry.ts +294 -0
  72. package/core/components/mcp/tools/application.ts +761 -0
  73. package/core/components/mcp/tools/operations.ts +311 -0
  74. package/core/components/mcp/tools/schemas/derive.ts +356 -0
  75. package/core/components/mcp/tools/schemas/operationDescriptions.ts +241 -0
  76. package/core/components/mcp/tools/schemas/operations.ts +301 -0
  77. package/core/components/mcp/transport.ts +517 -0
  78. package/core/components/ollama/index.ts +316 -0
  79. package/core/components/openai/index.ts +563 -0
  80. package/core/components/operations.js +217 -60
  81. package/core/components/operationsValidation.js +12 -4
  82. package/core/components/packageComponent.ts +97 -29
  83. package/core/components/requestRestart.ts +17 -2
  84. package/core/components/status/crossThread.ts +14 -5
  85. package/core/components/status/errors.ts +1 -1
  86. package/core/config/RootConfigWatcher.ts +56 -2
  87. package/core/config/configUtils.js +29 -8
  88. package/core/config/harperConfigEnvVars.ts +1 -1
  89. package/core/dataLayer/{CreateAttributeObject.js → CreateAttributeObject.ts} +4 -3
  90. package/core/dataLayer/{CreateTableObject.js → CreateTableObject.ts} +2 -1
  91. package/core/dataLayer/{DataLayerObjects.js → DataLayerObjects.ts} +17 -9
  92. package/core/dataLayer/{DeleteBeforeObject.js → DeleteBeforeObject.ts} +2 -1
  93. package/core/dataLayer/{DeleteObject.js → DeleteObject.ts} +3 -2
  94. package/core/dataLayer/{DropAttributeObject.js → DropAttributeObject.ts} +2 -1
  95. package/core/dataLayer/{GetBackupObject.js → GetBackupObject.ts} +3 -2
  96. package/core/dataLayer/{InsertObject.js → InsertObject.ts} +3 -2
  97. package/core/dataLayer/{ReadAuditLogObject.js → ReadAuditLogObject.ts} +3 -2
  98. package/core/dataLayer/{SQLSearch.js → SQLSearch.ts} +97 -43
  99. package/core/dataLayer/{SearchByConditionsObject.js → SearchByConditionsObject.ts} +5 -6
  100. package/core/dataLayer/{SearchByHashObject.js → SearchByHashObject.ts} +2 -1
  101. package/core/dataLayer/{SearchObject.js → SearchObject.ts} +2 -1
  102. package/core/dataLayer/{SqlSearchObject.js → SqlSearchObject.ts} +2 -1
  103. package/core/dataLayer/{UpdateObject.js → UpdateObject.ts} +3 -2
  104. package/core/dataLayer/{UpsertObject.js → UpsertObject.ts} +3 -2
  105. package/core/dataLayer/{bulkLoad.js → bulkLoad.ts} +40 -49
  106. package/core/dataLayer/{delete.js → delete.ts} +21 -26
  107. package/core/dataLayer/{export.js → export.ts} +22 -26
  108. package/core/dataLayer/{getBackup.js → getBackup.ts} +7 -9
  109. package/core/dataLayer/harperBridge/BridgeMethods.ts +102 -0
  110. package/core/dataLayer/harperBridge/ResourceBridge.ts +27 -26
  111. package/core/dataLayer/harperBridge/TableSizeObject.ts +1 -0
  112. package/core/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +4 -4
  113. package/core/dataLayer/harperBridge/{harperBridge.js → harperBridge.ts} +3 -3
  114. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +8 -6
  115. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +4 -4
  116. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +1 -1
  117. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +6 -4
  118. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +5 -4
  119. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +4 -4
  120. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +6 -5
  121. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +5 -4
  122. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +5 -5
  123. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +1 -1
  124. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +3 -3
  125. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +1 -1
  126. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +3 -2
  127. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +5 -5
  128. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +10 -8
  129. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +1 -1
  130. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +4 -3
  131. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +3 -3
  132. package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +6 -5
  133. package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +2 -1
  134. package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +3 -2
  135. package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +2 -2
  136. package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +5 -4
  137. package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +6 -3
  138. package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.ts +1 -1
  139. package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +4 -4
  140. package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +5 -5
  141. package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +4 -4
  142. package/core/dataLayer/{hdbInfoController.js → hdbInfoController.ts} +20 -26
  143. package/core/dataLayer/{insert.js → insert.ts} +24 -24
  144. package/core/dataLayer/{readAuditLog.js → readAuditLog.ts} +8 -10
  145. package/core/dataLayer/{schema.js → schema.ts} +32 -44
  146. package/core/dataLayer/{schemaDescribe.js → schemaDescribe.ts} +23 -26
  147. package/core/dataLayer/{search.js → search.ts} +9 -15
  148. package/core/dataLayer/{transaction.js → transaction.ts} +2 -5
  149. package/core/dataLayer/{update.js → update.ts} +19 -22
  150. package/core/index.ts +5 -0
  151. package/core/json/systemSchema.json +65 -0
  152. package/core/launchServiceScripts/utility/checkNodeVersion.js +2 -0
  153. package/core/package-lock.json +9087 -4345
  154. package/core/resources/DESIGN.md +98 -0
  155. package/core/resources/DatabaseTransaction.ts +58 -30
  156. package/core/resources/ErrorResource.ts +2 -1
  157. package/core/resources/LMDBTransaction.ts +38 -29
  158. package/core/resources/RecordEncoder.ts +41 -39
  159. package/core/resources/RequestTarget.ts +2 -0
  160. package/core/resources/Resource.ts +96 -56
  161. package/core/resources/ResourceInterface.ts +44 -21
  162. package/core/resources/Resources.ts +8 -8
  163. package/core/resources/RocksIndexStore.ts +3 -0
  164. package/core/resources/RocksTransactionLogStore.ts +13 -4
  165. package/core/resources/Table.ts +440 -223
  166. package/core/resources/analytics/metadata.ts +1 -0
  167. package/core/resources/analytics/read.ts +99 -10
  168. package/core/resources/analytics/write.ts +240 -17
  169. package/core/resources/auditStore.ts +30 -19
  170. package/core/resources/blob.ts +53 -53
  171. package/core/resources/dataLoader.ts +4 -4
  172. package/core/resources/databases.ts +208 -74
  173. package/core/resources/graphql.ts +267 -165
  174. package/core/resources/indexes/HierarchicalNavigableSmallWorld.ts +310 -65
  175. package/core/resources/indexes/vector.ts +17 -0
  176. package/core/resources/jsonSchemaTypes.ts +102 -0
  177. package/core/resources/loadEnv.ts +21 -17
  178. package/core/resources/login.ts +5 -3
  179. package/core/resources/models/Models.ts +304 -0
  180. package/core/resources/models/TestBackend.ts +83 -0
  181. package/core/resources/models/agentLoop.ts +895 -0
  182. package/core/resources/models/analyticsTable.ts +199 -0
  183. package/core/resources/models/backendHelpers.ts +116 -0
  184. package/core/resources/models/backendRegistry.ts +66 -0
  185. package/core/resources/models/bootstrap.ts +135 -0
  186. package/core/resources/models/embedHook.ts +138 -0
  187. package/core/resources/models/types.ts +296 -0
  188. package/core/resources/openApi.ts +65 -31
  189. package/core/resources/replayLogs.ts +20 -9
  190. package/core/resources/replayLogsGuards.ts +45 -0
  191. package/core/resources/roles.ts +62 -67
  192. package/core/resources/search.ts +355 -135
  193. package/core/resources/tracked.ts +18 -9
  194. package/core/resources/transaction.ts +8 -8
  195. package/core/resources/transactionBroadcast.ts +3 -3
  196. package/core/security/auth.ts +35 -26
  197. package/core/security/certificateVerification/crlVerification.ts +11 -4
  198. package/core/security/{cryptoHash.js → cryptoHash.ts} +3 -8
  199. package/core/security/data_objects/{PermissionAttributeResponseObject.js → PermissionAttributeResponseObject.ts} +4 -4
  200. package/core/security/data_objects/{PermissionResponseObject.js → PermissionResponseObject.ts} +12 -11
  201. package/core/security/data_objects/{PermissionTableResponseObject.js → PermissionTableResponseObject.ts} +6 -4
  202. package/core/security/{fastifyAuth.js → fastifyAuth.ts} +93 -20
  203. package/core/security/impersonation.ts +3 -3
  204. package/core/security/jsLoader.ts +22 -8
  205. package/core/security/{keys.js → keys.ts} +113 -121
  206. package/core/security/permissionsTranslator.js +2 -2
  207. package/core/security/{role.js → role.ts} +26 -33
  208. package/core/security/tokenAuthentication.ts +34 -7
  209. package/core/security/user.ts +26 -22
  210. package/core/server/DESIGN.md +139 -0
  211. package/core/server/DurableSubscriptionsSession.ts +67 -50
  212. package/core/server/REST.ts +120 -107
  213. package/core/server/Server.ts +31 -12
  214. package/core/server/fastifyRoutes/helpers/getCORSOptions.js +1 -1
  215. package/core/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +1 -1
  216. package/core/server/fastifyRoutes/helpers/getServerOptions.js +1 -1
  217. package/core/server/fastifyRoutes.ts +37 -33
  218. package/core/server/graphqlQuerying.ts +6 -5
  219. package/core/server/http.ts +517 -26
  220. package/core/server/itc/serverHandlers.js +75 -14
  221. package/core/server/jobs/{JobObject.js → JobObject.ts} +13 -6
  222. package/core/server/jobs/{jobProcess.js → jobProcess.ts} +20 -16
  223. package/core/server/jobs/{jobRunner.js → jobRunner.ts} +20 -21
  224. package/core/server/jobs/{jobs.js → jobs.ts} +41 -44
  225. package/core/server/loadRootComponents.js +1 -1
  226. package/core/server/middlewareChain.ts +270 -0
  227. package/core/server/mqtt.ts +35 -26
  228. package/core/server/nodeName.ts +3 -1
  229. package/core/server/operationsServer.ts +85 -10
  230. package/core/server/serverHelpers/Headers.ts +10 -8
  231. package/core/server/serverHelpers/JSONStream.ts +15 -5
  232. package/core/server/serverHelpers/Request.ts +370 -13
  233. package/core/server/serverHelpers/contentTypes.ts +42 -11
  234. package/core/server/serverHelpers/multipartParser.ts +152 -0
  235. package/core/server/serverHelpers/progressEmitter.ts +110 -0
  236. package/core/server/serverHelpers/serverHandlers.js +43 -7
  237. package/core/server/serverHelpers/serverUtilities.ts +40 -30
  238. package/core/server/static.ts +9 -6
  239. package/core/server/status/index.ts +2 -2
  240. package/core/server/storageReclamation.ts +39 -2
  241. package/core/server/threads/itc.js +7 -4
  242. package/core/server/threads/manageThreads.js +100 -26
  243. package/core/server/threads/socketRouter.ts +12 -275
  244. package/core/server/threads/threadServer.js +345 -105
  245. package/core/server/threads/workerProcessGuard.ts +93 -0
  246. package/core/server/throttle.ts +18 -0
  247. package/core/sqlTranslator/{SelectValidator.js → SelectValidator.ts} +41 -49
  248. package/core/sqlTranslator/{alasqlFunctionImporter.js → alasqlFunctionImporter.ts} +5 -5
  249. package/core/sqlTranslator/{deleteTranslator.js → deleteTranslator.ts} +13 -18
  250. package/core/sqlTranslator/{index.js → index.ts} +30 -33
  251. package/core/sqlTranslator/{sql_statement_bucket.js → sql_statement_bucket.ts} +49 -20
  252. package/core/static/README.md +10 -9
  253. package/core/static/defaultConfig.yaml +0 -1
  254. package/core/system/000004.log +0 -0
  255. package/core/system/CURRENT +1 -0
  256. package/core/system/IDENTITY +1 -0
  257. package/core/system/LOCK +0 -0
  258. package/core/system/LOG +1351 -0
  259. package/core/system/MANIFEST-000005 +0 -0
  260. package/core/system/OPTIONS-000013 +607 -0
  261. package/core/system/OPTIONS-000015 +734 -0
  262. package/core/upgrade/{UpgradeObjects.js → UpgradeObjects.ts} +3 -6
  263. package/core/upgrade/directives/5-1-0.ts +89 -0
  264. package/core/upgrade/directives/{directivesController.js → directivesController.ts} +16 -16
  265. package/core/upgrade/{directivesManager.js → directivesManager.ts} +7 -11
  266. package/core/upgrade/{upgradePrompt.js → upgradePrompt.ts} +6 -54
  267. package/core/upgrade/{upgradeUtilities.js → upgradeUtilities.ts} +3 -7
  268. package/core/utility/{OperationFunctionCaller.js → OperationFunctionCaller.ts} +7 -7
  269. package/core/utility/{assignCmdEnvVariables.js → assignCmdEnvVariables.ts} +6 -8
  270. package/core/utility/{common_utils.js → common_utils.ts} +113 -139
  271. package/core/utility/environment/{environmentManager.js → environmentManager.ts} +34 -33
  272. package/core/utility/environment/systemInformation.ts +18 -4
  273. package/core/utility/errors/{commonErrors.js → commonErrors.ts} +9 -9
  274. package/core/utility/errors/{hdbError.js → hdbError.ts} +39 -45
  275. package/core/utility/expandEnvVar.ts +110 -0
  276. package/core/utility/functions/geo.js +2 -2
  277. package/core/utility/functions/sql/alaSQLExtension.js +1 -1
  278. package/core/utility/globalSchema.ts +30 -0
  279. package/core/utility/hdbTerms.ts +54 -1
  280. package/core/utility/install/checkJWTTokensExist.js +1 -1
  281. package/core/utility/install/{installer.js → installer.ts} +86 -62
  282. package/core/utility/installation.ts +2 -2
  283. package/core/utility/lmdb/{DBIDefinition.js → DBIDefinition.ts} +4 -1
  284. package/core/utility/lmdb/{DeleteRecordsResponseObject.js → DeleteRecordsResponseObject.ts} +2 -1
  285. package/core/utility/lmdb/{InsertRecordsResponseObject.js → InsertRecordsResponseObject.ts} +2 -1
  286. package/core/utility/lmdb/OpenDBIObject.ts +57 -0
  287. package/core/utility/lmdb/{OpenEnvironmentObject.js → OpenEnvironmentObject.ts} +19 -6
  288. package/core/utility/lmdb/{UpdateRecordsResponseObject.js → UpdateRecordsResponseObject.ts} +2 -1
  289. package/core/utility/lmdb/{UpsertRecordsResponseObject.js → UpsertRecordsResponseObject.ts} +2 -1
  290. package/core/utility/lmdb/{cleanLMDBMap.js → cleanLMDBMap.ts} +5 -5
  291. package/core/utility/lmdb/{commonUtility.js → commonUtility.ts} +13 -21
  292. package/core/utility/lmdb/{deleteUtility.js → deleteUtility.ts} +8 -12
  293. package/core/utility/lmdb/{environmentUtility.js → environmentUtility.ts} +43 -52
  294. package/core/utility/lmdb/{searchCursorFunctions.js → searchCursorFunctions.ts} +12 -26
  295. package/core/utility/lmdb/{searchUtility.js → searchUtility.ts} +75 -64
  296. package/core/utility/lmdb/{terms.js → terms.ts} +10 -23
  297. package/core/utility/lmdb/{writeUtility.js → writeUtility.ts} +37 -22
  298. package/core/utility/logging/{harper_logger.js → harper_logger.ts} +137 -90
  299. package/core/utility/logging/{logRotator.js → logRotator.ts} +15 -18
  300. package/core/utility/logging/logger.ts +1 -1
  301. package/core/utility/logging/{readLog.js → readLog.ts} +19 -19
  302. package/core/utility/logging/{transactionLog.js → transactionLog.ts} +10 -14
  303. package/core/utility/{mount_hdb.js → mount_hdb.ts} +15 -16
  304. package/core/utility/{npmUtilities.js → npmUtilities.ts} +14 -17
  305. package/core/utility/{operation_authorization.js → operation_authorization.ts} +173 -124
  306. package/core/utility/packageUtils.js +7 -16
  307. package/core/utility/password.ts +1 -1
  308. package/core/utility/processManagement/processManagement.js +2 -2
  309. package/core/utility/processManagement/servicesConfig.js +1 -1
  310. package/core/utility/{signalling.js → signalling.ts} +6 -11
  311. package/core/utility/watcherFallback.ts +74 -0
  312. package/core/validation/analyticsValidator.ts +44 -0
  313. package/core/validation/{bulkDeleteValidator.js → bulkDeleteValidator.ts} +5 -5
  314. package/core/validation/{check_permissions.js → check_permissions.ts} +3 -3
  315. package/core/validation/{common_validators.js → common_validators.ts} +12 -24
  316. package/core/validation/{configValidator.js → configValidator.ts} +114 -18
  317. package/core/validation/{deleteValidator.js → deleteValidator.ts} +5 -5
  318. package/core/validation/{fileLoadValidator.js → fileLoadValidator.ts} +12 -19
  319. package/core/validation/{insertValidator.js → insertValidator.ts} +5 -5
  320. package/core/validation/{installValidator.js → installValidator.ts} +8 -8
  321. package/core/validation/{readLogValidator.js → readLogValidator.ts} +10 -10
  322. package/core/validation/{role_validation.js → role_validation.ts} +26 -32
  323. package/core/validation/{schemaMetadataValidator.js → schemaMetadataValidator.ts} +5 -11
  324. package/core/validation/{searchValidator.js → searchValidator.ts} +12 -11
  325. package/core/validation/statusValidator.ts +1 -1
  326. package/core/validation/{transactionLogValidator.js → transactionLogValidator.ts} +4 -9
  327. package/core/validation/{user_validation.js → user_validation.ts} +4 -10
  328. package/core/validation/{validationWrapper.js → validationWrapper.ts} +3 -9
  329. package/dist/analytics/profile.js +4 -0
  330. package/dist/analytics/profile.js.map +1 -1
  331. package/dist/cloneNode/cloneNode.js +224 -12
  332. package/dist/cloneNode/cloneNode.js.map +1 -1
  333. package/dist/core/agent/agent.js +175 -0
  334. package/dist/core/agent/agent.js.map +1 -0
  335. package/dist/core/agent/loop.js +176 -0
  336. package/dist/core/agent/loop.js.map +1 -0
  337. package/dist/core/agent/operations.js +137 -0
  338. package/dist/core/agent/operations.js.map +1 -0
  339. package/dist/core/agent/session.js +182 -0
  340. package/dist/core/agent/session.js.map +1 -0
  341. package/dist/core/agent/tools/fsTools.js +286 -0
  342. package/dist/core/agent/tools/fsTools.js.map +1 -0
  343. package/dist/core/agent/tools/httpFetchTool.js +116 -0
  344. package/dist/core/agent/tools/httpFetchTool.js.map +1 -0
  345. package/dist/core/agent/tools/scheduleTool.js +54 -0
  346. package/dist/core/agent/tools/scheduleTool.js.map +1 -0
  347. package/dist/core/agent/toolset.js +33 -0
  348. package/dist/core/agent/toolset.js.map +1 -0
  349. package/dist/core/agent/types.js +10 -0
  350. package/dist/core/agent/types.js.map +1 -0
  351. package/dist/core/bin/BinObjects.js +6 -3
  352. package/dist/core/bin/BinObjects.js.map +1 -1
  353. package/dist/core/bin/cliCredentials.js +130 -0
  354. package/dist/core/bin/cliCredentials.js.map +1 -0
  355. package/dist/core/bin/cliOperations.js +254 -40
  356. package/dist/core/bin/cliOperations.js.map +1 -1
  357. package/dist/core/bin/copyDb.js +16 -16
  358. package/dist/core/bin/copyDb.js.map +1 -1
  359. package/dist/core/bin/deployRenderer.js +185 -0
  360. package/dist/core/bin/deployRenderer.js.map +1 -0
  361. package/dist/core/bin/harper.js +92 -31
  362. package/dist/core/bin/harper.js.map +1 -1
  363. package/dist/core/bin/install.js +41 -4
  364. package/dist/core/bin/install.js.map +1 -1
  365. package/dist/core/bin/lite.js +3 -4
  366. package/dist/core/bin/lite.js.map +1 -1
  367. package/dist/core/bin/login.js +123 -0
  368. package/dist/core/bin/login.js.map +1 -0
  369. package/dist/core/bin/logout.js +16 -0
  370. package/dist/core/bin/logout.js.map +1 -0
  371. package/dist/core/bin/mcp/client.js +395 -0
  372. package/dist/core/bin/mcp/client.js.map +1 -0
  373. package/dist/core/bin/mcp/doctor.js +193 -0
  374. package/dist/core/bin/mcp/doctor.js.map +1 -0
  375. package/dist/core/bin/mcp/index.js +81 -0
  376. package/dist/core/bin/mcp/index.js.map +1 -0
  377. package/dist/core/bin/mcp/options.js +113 -0
  378. package/dist/core/bin/mcp/options.js.map +1 -0
  379. package/dist/core/bin/mcp/printConfig.js +85 -0
  380. package/dist/core/bin/mcp/printConfig.js.map +1 -0
  381. package/dist/core/bin/multipartBuilder.js +55 -0
  382. package/dist/core/bin/multipartBuilder.js.map +1 -0
  383. package/dist/core/bin/restart.js +85 -48
  384. package/dist/core/bin/restart.js.map +1 -1
  385. package/dist/core/bin/run.js +123 -77
  386. package/dist/core/bin/run.js.map +1 -1
  387. package/dist/core/bin/sseConsumer.js +127 -0
  388. package/dist/core/bin/sseConsumer.js.map +1 -0
  389. package/dist/core/bin/status.js +48 -11
  390. package/dist/core/bin/status.js.map +1 -1
  391. package/dist/core/bin/stop.js +44 -7
  392. package/dist/core/bin/stop.js.map +1 -1
  393. package/dist/core/bin/upgrade.js +14 -22
  394. package/dist/core/bin/upgrade.js.map +1 -1
  395. package/dist/core/components/Application.js +134 -28
  396. package/dist/core/components/Application.js.map +1 -1
  397. package/dist/core/components/ApplicationScope.js +2 -2
  398. package/dist/core/components/ComponentV1.js +5 -5
  399. package/dist/core/components/ComponentV1.js.map +1 -1
  400. package/dist/core/components/EntryHandler.js +153 -13
  401. package/dist/core/components/EntryHandler.js.map +1 -1
  402. package/dist/core/components/OptionsWatcher.js +72 -10
  403. package/dist/core/components/OptionsWatcher.js.map +1 -1
  404. package/dist/core/components/Scope.js +112 -12
  405. package/dist/core/components/Scope.js.map +1 -1
  406. package/dist/core/components/anthropic/index.js +428 -0
  407. package/dist/core/components/anthropic/index.js.map +1 -0
  408. package/dist/core/components/bedrock/index.js +734 -0
  409. package/dist/core/components/bedrock/index.js.map +1 -0
  410. package/dist/core/components/componentLoader.js +65 -38
  411. package/dist/core/components/componentLoader.js.map +1 -1
  412. package/dist/core/components/deployLifecycle.js +156 -0
  413. package/dist/core/components/deployLifecycle.js.map +1 -0
  414. package/dist/core/components/deploymentOperations.js +185 -0
  415. package/dist/core/components/deploymentOperations.js.map +1 -0
  416. package/dist/core/components/deploymentRecorder.js +425 -0
  417. package/dist/core/components/deploymentRecorder.js.map +1 -0
  418. package/dist/core/components/deriveURLPath.js +2 -2
  419. package/dist/core/components/deriveURLPath.js.map +1 -1
  420. package/dist/core/components/mcp/adapters/fastify.js +66 -0
  421. package/dist/core/components/mcp/adapters/fastify.js.map +1 -0
  422. package/dist/core/components/mcp/adapters/harperHttp.js +78 -0
  423. package/dist/core/components/mcp/adapters/harperHttp.js.map +1 -0
  424. package/dist/core/components/mcp/audit.js +73 -0
  425. package/dist/core/components/mcp/audit.js.map +1 -0
  426. package/dist/core/components/mcp/index.js +109 -0
  427. package/dist/core/components/mcp/index.js.map +1 -0
  428. package/dist/core/components/mcp/jsonrpc.js +93 -0
  429. package/dist/core/components/mcp/jsonrpc.js.map +1 -0
  430. package/dist/core/components/mcp/lifecycle.js +79 -0
  431. package/dist/core/components/mcp/lifecycle.js.map +1 -0
  432. package/dist/core/components/mcp/listChanged.js +257 -0
  433. package/dist/core/components/mcp/listChanged.js.map +1 -0
  434. package/dist/core/components/mcp/rateLimit.js +226 -0
  435. package/dist/core/components/mcp/rateLimit.js.map +1 -0
  436. package/dist/core/components/mcp/resources.js +526 -0
  437. package/dist/core/components/mcp/resources.js.map +1 -0
  438. package/dist/core/components/mcp/session.js +170 -0
  439. package/dist/core/components/mcp/session.js.map +1 -0
  440. package/dist/core/components/mcp/sessionRegistry.js +124 -0
  441. package/dist/core/components/mcp/sessionRegistry.js.map +1 -0
  442. package/dist/core/components/mcp/toolRegistry.js +177 -0
  443. package/dist/core/components/mcp/toolRegistry.js.map +1 -0
  444. package/dist/core/components/mcp/tools/application.js +660 -0
  445. package/dist/core/components/mcp/tools/application.js.map +1 -0
  446. package/dist/core/components/mcp/tools/operations.js +331 -0
  447. package/dist/core/components/mcp/tools/operations.js.map +1 -0
  448. package/dist/core/components/mcp/tools/schemas/derive.js +291 -0
  449. package/dist/core/components/mcp/tools/schemas/derive.js.map +1 -0
  450. package/dist/core/components/mcp/tools/schemas/operationDescriptions.js +179 -0
  451. package/dist/core/components/mcp/tools/schemas/operationDescriptions.js.map +1 -0
  452. package/dist/core/components/mcp/tools/schemas/operations.js +299 -0
  453. package/dist/core/components/mcp/tools/schemas/operations.js.map +1 -0
  454. package/dist/core/components/mcp/transport.js +467 -0
  455. package/dist/core/components/mcp/transport.js.map +1 -0
  456. package/dist/core/components/ollama/index.js +239 -0
  457. package/dist/core/components/ollama/index.js.map +1 -0
  458. package/dist/core/components/openai/index.js +475 -0
  459. package/dist/core/components/openai/index.js.map +1 -0
  460. package/dist/core/components/operations.js +205 -52
  461. package/dist/core/components/operations.js.map +1 -1
  462. package/dist/core/components/operationsValidation.js +13 -4
  463. package/dist/core/components/operationsValidation.js.map +1 -1
  464. package/dist/core/components/packageComponent.js +87 -26
  465. package/dist/core/components/packageComponent.js.map +1 -1
  466. package/dist/core/components/requestRestart.js +12 -1
  467. package/dist/core/components/requestRestart.js.map +1 -1
  468. package/dist/core/components/status/crossThread.js +12 -5
  469. package/dist/core/components/status/crossThread.js.map +1 -1
  470. package/dist/core/components/status/errors.js +7 -7
  471. package/dist/core/config/RootConfigWatcher.js +52 -1
  472. package/dist/core/config/RootConfigWatcher.js.map +1 -1
  473. package/dist/core/config/configUtils.js +31 -8
  474. package/dist/core/config/configUtils.js.map +1 -1
  475. package/dist/core/config/harperConfigEnvVars.js +1 -1
  476. package/dist/core/config/harperConfigEnvVars.js.map +1 -1
  477. package/dist/core/dataLayer/CreateAttributeObject.js +4 -3
  478. package/dist/core/dataLayer/CreateAttributeObject.js.map +1 -1
  479. package/dist/core/dataLayer/CreateTableObject.js +2 -1
  480. package/dist/core/dataLayer/CreateTableObject.js.map +1 -1
  481. package/dist/core/dataLayer/DataLayerObjects.js +19 -5
  482. package/dist/core/dataLayer/DataLayerObjects.js.map +1 -1
  483. package/dist/core/dataLayer/DeleteBeforeObject.js +2 -1
  484. package/dist/core/dataLayer/DeleteBeforeObject.js.map +1 -1
  485. package/dist/core/dataLayer/DeleteObject.js +4 -3
  486. package/dist/core/dataLayer/DeleteObject.js.map +1 -1
  487. package/dist/core/dataLayer/DropAttributeObject.js +2 -1
  488. package/dist/core/dataLayer/DropAttributeObject.js.map +1 -1
  489. package/dist/core/dataLayer/GetBackupObject.js +4 -3
  490. package/dist/core/dataLayer/GetBackupObject.js.map +1 -1
  491. package/dist/core/dataLayer/InsertObject.js +4 -3
  492. package/dist/core/dataLayer/InsertObject.js.map +1 -1
  493. package/dist/core/dataLayer/ReadAuditLogObject.js +4 -3
  494. package/dist/core/dataLayer/ReadAuditLogObject.js.map +1 -1
  495. package/dist/core/dataLayer/SQLSearch.js +140 -78
  496. package/dist/core/dataLayer/SQLSearch.js.map +1 -1
  497. package/dist/core/dataLayer/SearchByConditionsObject.js +5 -7
  498. package/dist/core/dataLayer/SearchByConditionsObject.js.map +1 -1
  499. package/dist/core/dataLayer/SearchByHashObject.js +2 -1
  500. package/dist/core/dataLayer/SearchByHashObject.js.map +1 -1
  501. package/dist/core/dataLayer/SearchObject.js +2 -1
  502. package/dist/core/dataLayer/SearchObject.js.map +1 -1
  503. package/dist/core/dataLayer/SqlSearchObject.js +2 -1
  504. package/dist/core/dataLayer/SqlSearchObject.js.map +1 -1
  505. package/dist/core/dataLayer/UpdateObject.js +4 -3
  506. package/dist/core/dataLayer/UpdateObject.js.map +1 -1
  507. package/dist/core/dataLayer/UpsertObject.js +4 -3
  508. package/dist/core/dataLayer/UpsertObject.js.map +1 -1
  509. package/dist/core/dataLayer/bulkLoad.js +122 -88
  510. package/dist/core/dataLayer/bulkLoad.js.map +1 -1
  511. package/dist/core/dataLayer/delete.js +74 -39
  512. package/dist/core/dataLayer/delete.js.map +1 -1
  513. package/dist/core/dataLayer/export.js +90 -55
  514. package/dist/core/dataLayer/export.js.map +1 -1
  515. package/dist/core/dataLayer/getBackup.js +43 -11
  516. package/dist/core/dataLayer/getBackup.js.map +1 -1
  517. package/dist/core/dataLayer/harperBridge/BridgeMethods.js +41 -20
  518. package/dist/core/dataLayer/harperBridge/BridgeMethods.js.map +1 -1
  519. package/dist/core/dataLayer/harperBridge/ResourceBridge.js +26 -25
  520. package/dist/core/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
  521. package/dist/core/dataLayer/harperBridge/TableSizeObject.js.map +1 -1
  522. package/dist/core/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +4 -4
  523. package/dist/core/dataLayer/harperBridge/harperBridge.js +38 -4
  524. package/dist/core/dataLayer/harperBridge/harperBridge.js.map +1 -1
  525. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +7 -6
  526. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js.map +1 -1
  527. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +4 -4
  528. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js.map +1 -1
  529. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +1 -1
  530. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js.map +1 -1
  531. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +5 -4
  532. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js.map +1 -1
  533. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +4 -4
  534. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js.map +1 -1
  535. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +4 -4
  536. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +5 -5
  537. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js.map +1 -1
  538. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +4 -4
  539. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js.map +1 -1
  540. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +5 -5
  541. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js.map +1 -1
  542. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +1 -1
  543. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +3 -3
  544. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +1 -1
  545. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +2 -2
  546. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js.map +1 -1
  547. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +5 -5
  548. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +8 -8
  549. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js.map +1 -1
  550. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +1 -1
  551. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +3 -3
  552. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js.map +1 -1
  553. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +3 -3
  554. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +5 -5
  555. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js.map +1 -1
  556. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +1 -1
  557. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js.map +1 -1
  558. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +2 -2
  559. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js.map +1 -1
  560. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +2 -2
  561. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +4 -4
  562. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js.map +1 -1
  563. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +5 -3
  564. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js.map +1 -1
  565. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +2 -2
  566. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +4 -4
  567. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js.map +1 -1
  568. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +5 -5
  569. package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +4 -4
  570. package/dist/core/dataLayer/hdbInfoController.js +66 -31
  571. package/dist/core/dataLayer/hdbInfoController.js.map +1 -1
  572. package/dist/core/dataLayer/insert.js +63 -28
  573. package/dist/core/dataLayer/insert.js.map +1 -1
  574. package/dist/core/dataLayer/readAuditLog.js +45 -13
  575. package/dist/core/dataLayer/readAuditLog.js.map +1 -1
  576. package/dist/core/dataLayer/schema.js +124 -89
  577. package/dist/core/dataLayer/schema.js.map +1 -1
  578. package/dist/core/dataLayer/schemaDescribe.js +78 -41
  579. package/dist/core/dataLayer/schemaDescribe.js.map +1 -1
  580. package/dist/core/dataLayer/search.js +12 -13
  581. package/dist/core/dataLayer/search.js.map +1 -1
  582. package/dist/core/dataLayer/transaction.js +3 -4
  583. package/dist/core/dataLayer/transaction.js.map +1 -1
  584. package/dist/core/dataLayer/update.js +53 -18
  585. package/dist/core/dataLayer/update.js.map +1 -1
  586. package/dist/core/globals.js +1 -0
  587. package/dist/core/globals.js.map +1 -1
  588. package/dist/core/index.js +4 -1
  589. package/dist/core/index.js.map +1 -1
  590. package/dist/core/json/systemSchema.json +65 -0
  591. package/dist/core/launchServiceScripts/utility/checkNodeVersion.js +3 -0
  592. package/dist/core/launchServiceScripts/utility/checkNodeVersion.js.map +1 -1
  593. package/dist/core/resources/DatabaseTransaction.js +39 -15
  594. package/dist/core/resources/DatabaseTransaction.js.map +1 -1
  595. package/dist/core/resources/ErrorResource.js +3 -1
  596. package/dist/core/resources/ErrorResource.js.map +1 -1
  597. package/dist/core/resources/LMDBTransaction.js +18 -7
  598. package/dist/core/resources/LMDBTransaction.js.map +1 -1
  599. package/dist/core/resources/RecordEncoder.js +38 -38
  600. package/dist/core/resources/RecordEncoder.js.map +1 -1
  601. package/dist/core/resources/RequestTarget.js.map +1 -1
  602. package/dist/core/resources/Resource.js +43 -10
  603. package/dist/core/resources/Resource.js.map +1 -1
  604. package/dist/core/resources/ResourceInterface.js +20 -0
  605. package/dist/core/resources/ResourceInterface.js.map +1 -1
  606. package/dist/core/resources/Resources.js +7 -6
  607. package/dist/core/resources/Resources.js.map +1 -1
  608. package/dist/core/resources/RocksIndexStore.js +3 -0
  609. package/dist/core/resources/RocksIndexStore.js.map +1 -1
  610. package/dist/core/resources/RocksTransactionLogStore.js +10 -3
  611. package/dist/core/resources/RocksTransactionLogStore.js.map +1 -1
  612. package/dist/core/resources/Table.js +306 -116
  613. package/dist/core/resources/Table.js.map +1 -1
  614. package/dist/core/resources/analytics/metadata.js +1 -0
  615. package/dist/core/resources/analytics/metadata.js.map +1 -1
  616. package/dist/core/resources/analytics/read.js +69 -8
  617. package/dist/core/resources/analytics/read.js.map +1 -1
  618. package/dist/core/resources/analytics/write.js +232 -20
  619. package/dist/core/resources/analytics/write.js.map +1 -1
  620. package/dist/core/resources/auditStore.js +16 -8
  621. package/dist/core/resources/auditStore.js.map +1 -1
  622. package/dist/core/resources/blob.js +8 -8
  623. package/dist/core/resources/blob.js.map +1 -1
  624. package/dist/core/resources/dataLoader.js +13 -13
  625. package/dist/core/resources/databases.js +175 -59
  626. package/dist/core/resources/databases.js.map +1 -1
  627. package/dist/core/resources/graphql.js +267 -173
  628. package/dist/core/resources/graphql.js.map +1 -1
  629. package/dist/core/resources/indexes/HierarchicalNavigableSmallWorld.js +327 -59
  630. package/dist/core/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
  631. package/dist/core/resources/indexes/vector.js +14 -0
  632. package/dist/core/resources/indexes/vector.js.map +1 -1
  633. package/dist/core/resources/jsonSchemaTypes.js +78 -0
  634. package/dist/core/resources/jsonSchemaTypes.js.map +1 -0
  635. package/dist/core/resources/loadEnv.js +21 -18
  636. package/dist/core/resources/loadEnv.js.map +1 -1
  637. package/dist/core/resources/login.js +5 -4
  638. package/dist/core/resources/login.js.map +1 -1
  639. package/dist/core/resources/models/Models.js +265 -0
  640. package/dist/core/resources/models/Models.js.map +1 -0
  641. package/dist/core/resources/models/TestBackend.js +71 -0
  642. package/dist/core/resources/models/TestBackend.js.map +1 -0
  643. package/dist/core/resources/models/agentLoop.js +746 -0
  644. package/dist/core/resources/models/agentLoop.js.map +1 -0
  645. package/dist/core/resources/models/analyticsTable.js +166 -0
  646. package/dist/core/resources/models/analyticsTable.js.map +1 -0
  647. package/dist/core/resources/models/backendHelpers.js +109 -0
  648. package/dist/core/resources/models/backendHelpers.js.map +1 -0
  649. package/dist/core/resources/models/backendRegistry.js +54 -0
  650. package/dist/core/resources/models/backendRegistry.js.map +1 -0
  651. package/dist/core/resources/models/bootstrap.js +112 -0
  652. package/dist/core/resources/models/bootstrap.js.map +1 -0
  653. package/dist/core/resources/models/embedHook.js +127 -0
  654. package/dist/core/resources/models/embedHook.js.map +1 -0
  655. package/dist/core/resources/models/types.js +11 -0
  656. package/dist/core/resources/models/types.js.map +1 -0
  657. package/dist/core/resources/openApi.js +74 -34
  658. package/dist/core/resources/openApi.js.map +1 -1
  659. package/dist/core/resources/replayLogs.js +7 -1
  660. package/dist/core/resources/replayLogs.js.map +1 -1
  661. package/dist/core/resources/replayLogsGuards.js +47 -0
  662. package/dist/core/resources/replayLogsGuards.js.map +1 -1
  663. package/dist/core/resources/roles.js +67 -71
  664. package/dist/core/resources/roles.js.map +1 -1
  665. package/dist/core/resources/search.js +349 -140
  666. package/dist/core/resources/search.js.map +1 -1
  667. package/dist/core/resources/tracked.js +23 -15
  668. package/dist/core/resources/tracked.js.map +1 -1
  669. package/dist/core/resources/transaction.js +1 -1
  670. package/dist/core/resources/transaction.js.map +1 -1
  671. package/dist/core/resources/transactionBroadcast.js.map +1 -1
  672. package/dist/core/security/auth.js +34 -25
  673. package/dist/core/security/auth.js.map +1 -1
  674. package/dist/core/security/certificateVerification/crlVerification.js +7 -1
  675. package/dist/core/security/certificateVerification/crlVerification.js.map +1 -1
  676. package/dist/core/security/cryptoHash.js +37 -5
  677. package/dist/core/security/cryptoHash.js.map +1 -1
  678. package/dist/core/security/data_objects/PermissionAttributeResponseObject.js +4 -1
  679. package/dist/core/security/data_objects/PermissionAttributeResponseObject.js.map +1 -1
  680. package/dist/core/security/data_objects/PermissionResponseObject.js +15 -8
  681. package/dist/core/security/data_objects/PermissionResponseObject.js.map +1 -1
  682. package/dist/core/security/data_objects/PermissionTableResponseObject.js +6 -1
  683. package/dist/core/security/data_objects/PermissionTableResponseObject.js.map +1 -1
  684. package/dist/core/security/fastifyAuth.js +131 -22
  685. package/dist/core/security/fastifyAuth.js.map +1 -1
  686. package/dist/core/security/impersonation.js +15 -15
  687. package/dist/core/security/jsLoader.js +18 -5
  688. package/dist/core/security/jsLoader.js.map +1 -1
  689. package/dist/core/security/keys.js +160 -114
  690. package/dist/core/security/keys.js.map +1 -1
  691. package/dist/core/security/permissionsTranslator.js +2 -2
  692. package/dist/core/security/role.js +70 -35
  693. package/dist/core/security/role.js.map +1 -1
  694. package/dist/core/security/tokenAuthentication.js +57 -27
  695. package/dist/core/security/tokenAuthentication.js.map +1 -1
  696. package/dist/core/security/user.js +74 -38
  697. package/dist/core/security/user.js.map +1 -1
  698. package/dist/core/server/DurableSubscriptionsSession.js +71 -55
  699. package/dist/core/server/DurableSubscriptionsSession.js.map +1 -1
  700. package/dist/core/server/REST.js +17 -16
  701. package/dist/core/server/REST.js.map +1 -1
  702. package/dist/core/server/Server.js +1 -1
  703. package/dist/core/server/Server.js.map +1 -1
  704. package/dist/core/server/fastifyRoutes/helpers/getCORSOptions.js +1 -1
  705. package/dist/core/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +1 -1
  706. package/dist/core/server/fastifyRoutes/helpers/getServerOptions.js +1 -1
  707. package/dist/core/server/fastifyRoutes.js +34 -30
  708. package/dist/core/server/fastifyRoutes.js.map +1 -1
  709. package/dist/core/server/graphqlQuerying.js +8 -7
  710. package/dist/core/server/graphqlQuerying.js.map +1 -1
  711. package/dist/core/server/http.js +523 -47
  712. package/dist/core/server/http.js.map +1 -1
  713. package/dist/core/server/itc/serverHandlers.js +66 -15
  714. package/dist/core/server/itc/serverHandlers.js.map +1 -1
  715. package/dist/core/server/jobs/JobObject.js +53 -7
  716. package/dist/core/server/jobs/JobObject.js.map +1 -1
  717. package/dist/core/server/jobs/jobProcess.js +64 -24
  718. package/dist/core/server/jobs/jobProcess.js.map +1 -1
  719. package/dist/core/server/jobs/jobRunner.js +68 -30
  720. package/dist/core/server/jobs/jobRunner.js.map +1 -1
  721. package/dist/core/server/jobs/jobs.js +93 -61
  722. package/dist/core/server/jobs/jobs.js.map +1 -1
  723. package/dist/core/server/loadRootComponents.js +1 -1
  724. package/dist/core/server/middlewareChain.js +252 -0
  725. package/dist/core/server/middlewareChain.js.map +1 -0
  726. package/dist/core/server/mqtt.js +22 -17
  727. package/dist/core/server/mqtt.js.map +1 -1
  728. package/dist/core/server/nodeName.js +46 -13
  729. package/dist/core/server/nodeName.js.map +1 -1
  730. package/dist/core/server/operationsServer.js +106 -33
  731. package/dist/core/server/operationsServer.js.map +1 -1
  732. package/dist/core/server/serverHelpers/Headers.js +2 -0
  733. package/dist/core/server/serverHelpers/Headers.js.map +1 -1
  734. package/dist/core/server/serverHelpers/JSONStream.js +12 -3
  735. package/dist/core/server/serverHelpers/JSONStream.js.map +1 -1
  736. package/dist/core/server/serverHelpers/Request.js +370 -9
  737. package/dist/core/server/serverHelpers/Request.js.map +1 -1
  738. package/dist/core/server/serverHelpers/contentTypes.js +36 -7
  739. package/dist/core/server/serverHelpers/contentTypes.js.map +1 -1
  740. package/dist/core/server/serverHelpers/multipartParser.js +142 -0
  741. package/dist/core/server/serverHelpers/multipartParser.js.map +1 -0
  742. package/dist/core/server/serverHelpers/progressEmitter.js +103 -0
  743. package/dist/core/server/serverHelpers/progressEmitter.js.map +1 -0
  744. package/dist/core/server/serverHelpers/serverHandlers.js +38 -7
  745. package/dist/core/server/serverHelpers/serverHandlers.js.map +1 -1
  746. package/dist/core/server/serverHelpers/serverUtilities.js +97 -93
  747. package/dist/core/server/serverHelpers/serverUtilities.js.map +1 -1
  748. package/dist/core/server/static.js +8 -5
  749. package/dist/core/server/static.js.map +1 -1
  750. package/dist/core/server/status/index.js +3 -3
  751. package/dist/core/server/storageReclamation.js +68 -9
  752. package/dist/core/server/storageReclamation.js.map +1 -1
  753. package/dist/core/server/threads/itc.js +7 -4
  754. package/dist/core/server/threads/itc.js.map +1 -1
  755. package/dist/core/server/threads/manageThreads.js +110 -26
  756. package/dist/core/server/threads/manageThreads.js.map +1 -1
  757. package/dist/core/server/threads/socketRouter.js +8 -271
  758. package/dist/core/server/threads/socketRouter.js.map +1 -1
  759. package/dist/core/server/threads/threadServer.js +360 -118
  760. package/dist/core/server/threads/threadServer.js.map +1 -1
  761. package/dist/core/server/threads/workerProcessGuard.js +114 -0
  762. package/dist/core/server/threads/workerProcessGuard.js.map +1 -0
  763. package/dist/core/server/throttle.js +17 -0
  764. package/dist/core/server/throttle.js.map +1 -1
  765. package/dist/core/sqlTranslator/SelectValidator.js +86 -47
  766. package/dist/core/sqlTranslator/SelectValidator.js.map +1 -1
  767. package/dist/core/sqlTranslator/alasqlFunctionImporter.js +40 -3
  768. package/dist/core/sqlTranslator/alasqlFunctionImporter.js.map +1 -1
  769. package/dist/core/sqlTranslator/deleteTranslator.js +48 -14
  770. package/dist/core/sqlTranslator/deleteTranslator.js.map +1 -1
  771. package/dist/core/sqlTranslator/index.js +69 -30
  772. package/dist/core/sqlTranslator/index.js.map +1 -1
  773. package/dist/core/sqlTranslator/sql_statement_bucket.js +55 -13
  774. package/dist/core/sqlTranslator/sql_statement_bucket.js.map +1 -1
  775. package/dist/core/upgrade/UpgradeObjects.js +37 -4
  776. package/dist/core/upgrade/UpgradeObjects.js.map +1 -1
  777. package/dist/core/upgrade/directives/5-1-0.js +114 -0
  778. package/dist/core/upgrade/directives/5-1-0.js.map +1 -0
  779. package/dist/core/upgrade/directives/directivesController.js +52 -11
  780. package/dist/core/upgrade/directives/directivesController.js.map +1 -1
  781. package/dist/core/upgrade/directivesManager.js +53 -18
  782. package/dist/core/upgrade/directivesManager.js.map +1 -1
  783. package/dist/core/upgrade/upgradePrompt.js +55 -60
  784. package/dist/core/upgrade/upgradePrompt.js.map +1 -1
  785. package/dist/core/upgrade/upgradeUtilities.js +37 -5
  786. package/dist/core/upgrade/upgradeUtilities.js.map +1 -1
  787. package/dist/core/utility/OperationFunctionCaller.js +45 -10
  788. package/dist/core/utility/OperationFunctionCaller.js.map +1 -1
  789. package/dist/core/utility/assignCmdEnvVariables.js +8 -4
  790. package/dist/core/utility/assignCmdEnvVariables.js.map +1 -1
  791. package/dist/core/utility/common_utils.js +140 -79
  792. package/dist/core/utility/common_utils.js.map +1 -1
  793. package/dist/core/utility/environment/environmentManager.js +75 -29
  794. package/dist/core/utility/environment/environmentManager.js.map +1 -1
  795. package/dist/core/utility/environment/systemInformation.js +27 -16
  796. package/dist/core/utility/environment/systemInformation.js.map +1 -1
  797. package/dist/core/utility/errors/commonErrors.js +49 -18
  798. package/dist/core/utility/errors/commonErrors.js.map +1 -1
  799. package/dist/core/utility/errors/hdbError.js +65 -26
  800. package/dist/core/utility/errors/hdbError.js.map +1 -1
  801. package/dist/core/utility/expandEnvVar.js +113 -0
  802. package/dist/core/utility/expandEnvVar.js.map +1 -0
  803. package/dist/core/utility/functions/geo.js +2 -2
  804. package/dist/core/utility/functions/sql/alaSQLExtension.js +1 -1
  805. package/dist/core/utility/globalSchema.js +14 -11
  806. package/dist/core/utility/globalSchema.js.map +1 -1
  807. package/dist/core/utility/hdbTerms.js +54 -1
  808. package/dist/core/utility/hdbTerms.js.map +1 -1
  809. package/dist/core/utility/install/checkJWTTokensExist.js +1 -1
  810. package/dist/core/utility/install/installer.js +136 -73
  811. package/dist/core/utility/install/installer.js.map +1 -1
  812. package/dist/core/utility/installation.js +3 -3
  813. package/dist/core/utility/lmdb/DBIDefinition.js +5 -1
  814. package/dist/core/utility/lmdb/DBIDefinition.js.map +1 -1
  815. package/dist/core/utility/lmdb/DeleteRecordsResponseObject.js +2 -1
  816. package/dist/core/utility/lmdb/DeleteRecordsResponseObject.js.map +1 -1
  817. package/dist/core/utility/lmdb/InsertRecordsResponseObject.js +2 -1
  818. package/dist/core/utility/lmdb/InsertRecordsResponseObject.js.map +1 -1
  819. package/dist/core/utility/lmdb/OpenDBIObject.js +68 -6
  820. package/dist/core/utility/lmdb/OpenDBIObject.js.map +1 -1
  821. package/dist/core/utility/lmdb/OpenEnvironmentObject.js +52 -4
  822. package/dist/core/utility/lmdb/OpenEnvironmentObject.js.map +1 -1
  823. package/dist/core/utility/lmdb/UpdateRecordsResponseObject.js +2 -1
  824. package/dist/core/utility/lmdb/UpdateRecordsResponseObject.js.map +1 -1
  825. package/dist/core/utility/lmdb/UpsertRecordsResponseObject.js +2 -1
  826. package/dist/core/utility/lmdb/UpsertRecordsResponseObject.js.map +1 -1
  827. package/dist/core/utility/lmdb/cleanLMDBMap.js +44 -7
  828. package/dist/core/utility/lmdb/cleanLMDBMap.js.map +1 -1
  829. package/dist/core/utility/lmdb/commonUtility.js +46 -17
  830. package/dist/core/utility/lmdb/commonUtility.js.map +1 -1
  831. package/dist/core/utility/lmdb/deleteUtility.js +51 -16
  832. package/dist/core/utility/lmdb/deleteUtility.js.map +1 -1
  833. package/dist/core/utility/lmdb/environmentUtility.js +91 -51
  834. package/dist/core/utility/lmdb/environmentUtility.js.map +1 -1
  835. package/dist/core/utility/lmdb/searchCursorFunctions.js +46 -14
  836. package/dist/core/utility/lmdb/searchCursorFunctions.js.map +1 -1
  837. package/dist/core/utility/lmdb/searchUtility.js +91 -55
  838. package/dist/core/utility/lmdb/searchUtility.js.map +1 -1
  839. package/dist/core/utility/lmdb/terms.js +12 -22
  840. package/dist/core/utility/lmdb/terms.js.map +1 -1
  841. package/dist/core/utility/lmdb/writeUtility.js +61 -28
  842. package/dist/core/utility/lmdb/writeUtility.js.map +1 -1
  843. package/dist/core/utility/logging/harper_logger.js +177 -82
  844. package/dist/core/utility/logging/harper_logger.js.map +1 -1
  845. package/dist/core/utility/logging/logRotator.js +67 -32
  846. package/dist/core/utility/logging/logRotator.js.map +1 -1
  847. package/dist/core/utility/logging/logger.js +4 -4
  848. package/dist/core/utility/logging/readLog.js +54 -17
  849. package/dist/core/utility/logging/readLog.js.map +1 -1
  850. package/dist/core/utility/logging/transactionLog.js +51 -16
  851. package/dist/core/utility/logging/transactionLog.js.map +1 -1
  852. package/dist/core/utility/mount_hdb.js +54 -17
  853. package/dist/core/utility/mount_hdb.js.map +1 -1
  854. package/dist/core/utility/npmUtilities.js +54 -19
  855. package/dist/core/utility/npmUtilities.js.map +1 -1
  856. package/dist/core/utility/operation_authorization.js +135 -86
  857. package/dist/core/utility/operation_authorization.js.map +1 -1
  858. package/dist/core/utility/packageUtils.js +7 -17
  859. package/dist/core/utility/packageUtils.js.map +1 -1
  860. package/dist/core/utility/password.js +2 -2
  861. package/dist/core/utility/processManagement/processManagement.js +2 -2
  862. package/dist/core/utility/processManagement/servicesConfig.js +1 -1
  863. package/dist/core/utility/signalling.js +51 -16
  864. package/dist/core/utility/signalling.js.map +1 -1
  865. package/dist/core/utility/watcherFallback.js +73 -0
  866. package/dist/core/utility/watcherFallback.js.map +1 -0
  867. package/dist/core/validation/analyticsValidator.js +80 -0
  868. package/dist/core/validation/analyticsValidator.js.map +1 -0
  869. package/dist/core/validation/bulkDeleteValidator.js +49 -11
  870. package/dist/core/validation/bulkDeleteValidator.js.map +1 -1
  871. package/dist/core/validation/check_permissions.js +38 -3
  872. package/dist/core/validation/check_permissions.js.map +1 -1
  873. package/dist/core/validation/common_validators.js +62 -31
  874. package/dist/core/validation/common_validators.js.map +1 -1
  875. package/dist/core/validation/configValidator.js +189 -54
  876. package/dist/core/validation/configValidator.js.map +1 -1
  877. package/dist/core/validation/deleteValidator.js +49 -11
  878. package/dist/core/validation/deleteValidator.js.map +1 -1
  879. package/dist/core/validation/fileLoadValidator.js +67 -32
  880. package/dist/core/validation/fileLoadValidator.js.map +1 -1
  881. package/dist/core/validation/insertValidator.js +48 -10
  882. package/dist/core/validation/insertValidator.js.map +1 -1
  883. package/dist/core/validation/installValidator.js +47 -10
  884. package/dist/core/validation/installValidator.js.map +1 -1
  885. package/dist/core/validation/readLogValidator.js +60 -22
  886. package/dist/core/validation/readLogValidator.js.map +1 -1
  887. package/dist/core/validation/role_validation.js +55 -19
  888. package/dist/core/validation/role_validation.js.map +1 -1
  889. package/dist/core/validation/schemaMetadataValidator.js +11 -12
  890. package/dist/core/validation/schemaMetadataValidator.js.map +1 -1
  891. package/dist/core/validation/searchValidator.js +82 -43
  892. package/dist/core/validation/searchValidator.js.map +1 -1
  893. package/dist/core/validation/transactionLogValidator.js +52 -17
  894. package/dist/core/validation/transactionLogValidator.js.map +1 -1
  895. package/dist/core/validation/user_validation.js +38 -6
  896. package/dist/core/validation/user_validation.js.map +1 -1
  897. package/dist/core/validation/validationWrapper.js +4 -5
  898. package/dist/core/validation/validationWrapper.js.map +1 -1
  899. package/dist/licensing/usageLicensing.js +30 -21
  900. package/dist/licensing/usageLicensing.js.map +1 -1
  901. package/dist/replication/knownNodes.js +171 -41
  902. package/dist/replication/knownNodes.js.map +1 -1
  903. package/dist/replication/replicationConnection.js +441 -85
  904. package/dist/replication/replicationConnection.js.map +1 -1
  905. package/dist/replication/replicator.js +56 -28
  906. package/dist/replication/replicator.js.map +1 -1
  907. package/dist/replication/setNode.js +24 -4
  908. package/dist/replication/setNode.js.map +1 -1
  909. package/dist/replication/subscriptionManager.js +195 -16
  910. package/dist/replication/subscriptionManager.js.map +1 -1
  911. package/dist/security/certificate.js +41 -6
  912. package/dist/security/certificate.js.map +1 -1
  913. package/dist/security/sshKeyOperations.js +35 -2
  914. package/dist/security/sshKeyOperations.js.map +1 -1
  915. package/licensing/usageLicensing.ts +32 -37
  916. package/npm-shrinkwrap.json +9032 -4334
  917. package/package.json +17 -12
  918. package/replication/DESIGN.md +139 -0
  919. package/replication/knownNodes.ts +165 -44
  920. package/replication/replicationConnection.ts +475 -92
  921. package/replication/replicator.ts +54 -27
  922. package/replication/setNode.ts +29 -10
  923. package/replication/subscriptionManager.ts +227 -21
  924. package/security/certificate.ts +8 -4
  925. package/security/sshKeyOperations.ts +1 -1
  926. package/static/defaultConfig.yaml +1 -0
  927. package/studio/web/assets/{index-CybLScHg.js → index-Dqr9oVhe.js} +5 -5
  928. package/studio/web/assets/index-Dqr9oVhe.js.map +1 -0
  929. package/studio/web/assets/{index.lazy-DKx5-iXF.js → index.lazy-CpKcKb7M.js} +2 -2
  930. package/studio/web/assets/{index.lazy-DKx5-iXF.js.map → index.lazy-CpKcKb7M.js.map} +1 -1
  931. package/studio/web/assets/{profile-BOjes0Wl.js → profile-C1cujdsg.js} +2 -2
  932. package/studio/web/assets/{profile-BOjes0Wl.js.map → profile-C1cujdsg.js.map} +1 -1
  933. package/studio/web/assets/{status-EWKUIrjT.js → status-CTiIIQlY.js} +2 -2
  934. package/studio/web/assets/{status-EWKUIrjT.js.map → status-CTiIIQlY.js.map} +1 -1
  935. package/studio/web/index.html +1 -1
  936. package/core/bin/cliOperations.js +0 -159
  937. package/core/bin/lite.js +0 -5
  938. package/core/bin/stop.js +0 -21
  939. package/core/dataLayer/harperBridge/BridgeMethods.js +0 -85
  940. package/core/utility/globalSchema.js +0 -35
  941. package/core/utility/lmdb/OpenDBIObject.js +0 -31
  942. package/studio/web/assets/index-CybLScHg.js.map +0 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@harperfast/harper-pro",
3
- "version": "5.0.30",
4
- "description": "Harper is a distributed database, caching service, streaming broker, and application development platform focused on performance and ease of use.",
3
+ "version": "5.1.0-beta.2",
4
+ "description": "Harper is a distributed database, caching service, streaming broker, and application development platform focused on performance and ease of use. Harper Pro includes replication, certificate management, profiling.",
5
5
  "keywords": [
6
6
  "database",
7
7
  "nosql",
@@ -11,8 +11,7 @@
11
11
  "mqtt",
12
12
  "real-time",
13
13
  "enterprise",
14
- "Fastify",
15
- "NATS",
14
+ "vector database",
16
15
  "HarperDB",
17
16
  "Harper",
18
17
  "clustering",
@@ -107,7 +106,9 @@
107
106
  "lint": "oxlint --deny-warnings .",
108
107
  "lint:fix": "npm run lint -- --fix",
109
108
  "lint:required": "oxlint --quiet .",
110
- "test:integration": "node integrationTests/run.mjs",
109
+ "test:unit": "mocha --require unitTests/unitTestSetup.cjs 'unitTests/**/*.test.mjs'",
110
+ "test:integration": "HARPER_INTEGRATION_TEST_INSTALL_SCRIPT=dist/bin/harper.js harper-integration-test-run",
111
+ "test:integration:all": "npm run test:integration -- integrationTests/**/*.test.*s",
111
112
  "cluster:ip:local": "pushd utility/dev && docker compose -f docker-compose.ip.yml --project-directory ../.. build && docker compose -f docker-compose.ip.yml --project-directory ../.. up; popd",
112
113
  "cluster:ip:latest": "pushd utility/dev && docker compose -f docker-compose.ip.yml --project-directory ../.. pull && docker compose -f docker-compose.ip.yml --project-directory ../.. up; popd",
113
114
  "cluster:delete": "pushd utility/dev && docker compose -f docker-compose.ip.yml --project-directory ../.. down --remove-orphans; popd",
@@ -120,14 +121,14 @@
120
121
  "dependencies": {
121
122
  "@aws-sdk/client-s3": "^3.1012.0",
122
123
  "@aws-sdk/lib-storage": "3.1045.0",
123
- "@datadog/pprof": "^5.11.1",
124
+ "@datadog/pprof": "^5.14.4",
124
125
  "@endo/static-module-record": "^1.1.2",
125
126
  "@fastify/autoload": "^6.3.1",
126
127
  "@fastify/compress": "^8.3.1",
127
128
  "@fastify/cors": "^11.2.0",
128
129
  "@fastify/static": "^9.1.3",
129
130
  "@harperfast/extended-iterable": "^1.0.1",
130
- "@harperfast/rocksdb-js": "^1.4.2",
131
+ "@harperfast/rocksdb-js": "^2.0.0",
131
132
  "@turf/area": "6.5.0",
132
133
  "@turf/boolean-contains": "6.5.0",
133
134
  "@turf/boolean-disjoint": "6.5.0",
@@ -137,10 +138,11 @@
137
138
  "@turf/distance": "6.5.0",
138
139
  "@turf/helpers": "6.5.0",
139
140
  "@turf/length": "6.5.0",
140
- "alasql": "4.6.6",
141
+ "alasql": "4.17.2",
141
142
  "amaro": "^1.1.8",
142
143
  "argon2": "0.44.0",
143
- "asn1js": "3.0.7",
144
+ "asn1js": "3.0.10",
145
+ "busboy": "^1.6.0",
144
146
  "cbor-x": "1.6.4",
145
147
  "chalk": "4.1.2",
146
148
  "chokidar": "^4.0.3",
@@ -169,11 +171,10 @@
169
171
  "minimist": "1.2.8",
170
172
  "moment": "2.30.1",
171
173
  "mqtt-packet": "~9.0.1",
172
- "msgpackr": "1.12.1",
174
+ "msgpackr": "^2.0.4",
173
175
  "needle": "3.5.0",
174
176
  "node-forge": "^1.3.1",
175
177
  "node-stream-zip": "1.15.0",
176
- "node-unix-socket": "0.2.7",
177
178
  "normalize-path": "^3.0.0",
178
179
  "ora": "8.2.0",
179
180
  "ordered-binary": "1.6.1",
@@ -191,6 +192,7 @@
191
192
  "ses": "^1.15.0",
192
193
  "stream-chain": "2.2.5",
193
194
  "stream-json": "1.9.1",
195
+ "structon": "^1.0.6",
194
196
  "systeminformation": "^5.31.4",
195
197
  "tar-fs": "^3.1.2",
196
198
  "ulidx": "0.5.0",
@@ -201,6 +203,9 @@
201
203
  },
202
204
  "devDependencies": {
203
205
  "@harperdb/code-guidelines": "^0.0.6",
206
+ "@harperfast/integration-testing": "^0.3.1",
207
+ "@modelcontextprotocol/sdk": "^1.29.0",
208
+ "@types/busboy": "^1.5.4",
204
209
  "@types/fs-extra": "^11.0.4",
205
210
  "@types/gunzip-maybe": "^1.4.3",
206
211
  "@types/jsonwebtoken": "^9.0.10",
@@ -219,7 +224,7 @@
219
224
  "intercept-stdout": "0.1.2",
220
225
  "mkcert": "^3.2.0",
221
226
  "mocha": "^11.7.5",
222
- "mqtt": "~4.3.8",
227
+ "mqtt": "^5.15.1",
223
228
  "oxlint": "^1.31.0",
224
229
  "prettier": "~3.8.0",
225
230
  "rewire": "^9.0.1",
@@ -0,0 +1,139 @@
1
+ # replication/ — Navigation Guide
2
+
3
+ Real-time, peer-to-peer replication of table data across cluster nodes via persistent WebSocket connections. Implements eventual consistency: when a local transaction commits, the audit records are forwarded asynchronously to peers.
4
+
5
+ **Read this when:** you're touching cluster sync, debugging missed writes, JWT/cluster auth, latency-based node selection, or blob transfer between nodes.
6
+
7
+ **Integration boundary with core:** replication hooks into core's table resource layer — a `Replicator` class is installed as a `source` of the table (`table.sourcedFrom(class Replicator extends Resource {...})`). When a local cache miss occurs, the Replicator picks the lowest-latency peer and fetches. Core's audit store (`core/resources/auditStore.ts`) and node-id mapping (`core/resources/nodeIdMapping.ts`) are the two data structures replication reads.
8
+
9
+ > **Navigation convention.** Code is referenced by **symbol name** (class, function, exported const). Use your editor's go-to-symbol or `grep -n '<name>' replication/<file>` to jump. Line numbers drift; symbols don't.
10
+
11
+ ---
12
+
13
+ ## Files (6 total, ~4200 lines)
14
+
15
+ | File | Purpose |
16
+ | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
17
+ | `replicationConnection.ts` | The protocol engine. Defines `NodeReplicationConnection`, encodes/decodes the binary frame format, drives audit-record forwarding, manages blobs, and writes shared latency/back-pressure counters. **The big file.** |
18
+ | `replicator.ts` | Setup module: `start()`, per-database/per-table `Replicator` resource class, retrieval-connection pool, operation forwarding, mTLS config. |
19
+ | `subscriptionManager.ts` | Main-thread orchestration. Delegates subscription work to worker threads; routes around disconnects. |
20
+ | `setNode.ts` | Cluster member operations — add/remove nodes, CSR signing, TLS certificate negotiation. |
21
+ | `knownNodes.ts` | Node registry (`hdb_nodes` system table) + shared-memory `Float64Array` status buffers (latency, confirmation, back-pressure). |
22
+ | `clusterStatus.ts` | Read-only status reporting for `cluster_status` operation. |
23
+
24
+ ---
25
+
26
+ ## Key abstractions
27
+
28
+ ### `NodeReplicationConnection` (`replicationConnection.ts`)
29
+
30
+ A persistent connection to one remote node. Owns the WebSocket lifecycle, reconnection (initial delay `INITIAL_RETRY_TIME`), latency tracking, and per-subscription state. **Inspect this when debugging connection drops or auth failures** (see issue #135 lineage on JWT/cluster auth).
31
+
32
+ ### `replicateOverWS(ws, options, authorization)` (`replicationConnection.ts`)
33
+
34
+ The protocol decoder. Reads incoming binary commands — each is a top-level named const in the same file:
35
+
36
+ | Command constant | Value | Meaning |
37
+ | ------------------------------------------ | --------- | ----------------------------------------- |
38
+ | `SUBSCRIPTION_REQUEST` | 129 | Client wants to subscribe to a table |
39
+ | `RESIDENCY_LIST` | 130 | Negotiate which records each node holds |
40
+ | `TABLE_FIXED_STRUCTURE` | 132 | Schema sync |
41
+ | `GET_RECORD` / `GET_RECORD_RESPONSE` | 133 / 134 | Cache-miss fetch |
42
+ | `OPERATION_REQUEST` / `OPERATION_RESPONSE` | 136 / 137 | Forwarded operations |
43
+ | `NODE_NAME` / `NODE_NAME_TO_ID_MAP` | 140 / 141 | Identity exchange |
44
+ | `DISCONNECT` | 142 | Graceful close (not used on auth failure) |
45
+ | `SEQUENCE_ID_UPDATE` | 143 | Audit sequence cursor |
46
+ | `COMMITTED_UPDATE` | 144 | Confirm-on-commit |
47
+ | `DB_SCHEMA` | 145 | Database schema replication |
48
+ | `BLOB_CHUNK` | 146 | Blob bytes |
49
+ | `SUBSCRIPTION_UPDATE` | 147 | Audit record forwarded to subscribers |
50
+
51
+ The `authorization` parameter is a **promise that may resolve asynchronously**; on rejection the socket closes without a DISCONNECT frame (relevant to JWT failure flows).
52
+
53
+ ### `Replicator extends Resource` (`replicator.ts`)
54
+
55
+ A `Resource` class installed as a `source` of a table. Declared inside `setReplicator()` and passed to `table.sourcedFrom(...)`. Its `static async load(entry)` method picks the lowest-latency available node for cache-miss fetches.
56
+
57
+ ### Shared status buffers (`getReplicationSharedStatus` in `knownNodes.ts`)
58
+
59
+ Per (database, remote_node) pair: an mmap-backed `Float64Array` shared across threads, used to avoid IPC for hot-path status updates. Position constants live in `replicationConnection.ts`:
60
+
61
+ | Position | Constant |
62
+ | -------- | ------------------------------ |
63
+ | 0 | `CONFIRMATION_STATUS_POSITION` |
64
+ | 1 | `RECEIVED_VERSION_POSITION` |
65
+ | 2 | `RECEIVED_TIME_POSITION` |
66
+ | 3 | `SENDING_TIME_POSITION` |
67
+ | 4 | `LATENCY_POSITION` |
68
+ | 5 | `RECEIVING_STATUS_POSITION` |
69
+ | 6 | `BACK_PRESSURE_RATIO_POSITION` |
70
+
71
+ These are written concurrently by `replicationConnection.ts` without explicit synchronization. Don't introduce read-modify-write patterns on this buffer.
72
+
73
+ ### `hdb_nodes` system table (`getHDBNodeTable` in `knownNodes.ts`)
74
+
75
+ Schema (defined in that function): `name` (PK), `subscriptions[]`, `system_info`, `url`, `routes`, `ca`, `ca_info`, `replicates`, `revoked_certificates`, plus `__createdtime__` / `__updatedtime__`. Subscription updates flow through `subscribeToNodeUpdates`, which fans out to `monitorNodeCAs` → refresh `replicationCertificateAuthorities` (exported from `replicator.ts`).
76
+
77
+ ---
78
+
79
+ ## Subsystems
80
+
81
+ **Connection management** — `NodeReplicationConnection.connect()` (`replicationConnection.ts`), `subscriptionManager.startOnMainThread()`. Dial/retry, thread-pool delegation, recovery on disconnect.
82
+
83
+ **Binary protocol** — `replicateOverWS` (`replicationConnection.ts`); command constants are the `*_REQUEST` / `*_UPDATE` / `*_RESPONSE` consts at module top; msgpack body; back-pressure ratio recomputed on `BACK_PRESSURE_INTERVAL` (30 s).
84
+
85
+ **Data propagation** — Audit-record iteration → forwarding; blob streaming with concurrency cap `MAX_OUTSTANDING_BLOBS_BEING_SENT` (declared inside `replicateOverWS`); commit confirmation batched on `COMMITTED_UPDATE_DELAY` (2 ms).
86
+
87
+ **Latency awareness** — Ping every `PING_INTERVAL` (default 30 s, `replication.pingInterval`); a connection with no socket activity for `PING_TIMEOUT` (default 2× interval, `replication.pingTimeout`) is terminated; latency captured on pong; `Replicator.load()` routes cache-miss fetches to the lowest-latency node.
88
+
89
+ **Node discovery & TLS** — `hdb_nodes` subscriptions, `setNode.ts` for member ops, `buildReplicationMtlsConfig()` (`replicator.ts`), `monitorNodeCAs()` (`replicator.ts`).
90
+
91
+ ---
92
+
93
+ ## Non-obvious behaviors
94
+
95
+ 1. **Auth failures don't send DISCONNECT.** When the `authorization` promise rejects in `replicateOverWS`, the connection closes with "Unauthorized" but no DISCONNECT frame is sent — the client is expected to retry. This is the lineage of JWT/cluster auth bugs (issue #135).
96
+
97
+ 2. **Origin loop prevention via delayed sequence updates.** A node receiving its own message (checked against `remoteToLocalNodeId`) skips local processing but still forwards. To avoid feedback loops, the sequence-update emit is delayed by `SKIPPED_MESSAGE_SEQUENCE_UPDATE_DELAY` (300 ms; in `replicationConnection.ts`).
98
+
99
+ 3. **Blob back-pressure & timeout.** Blobs time out after `blobTimeout` (default 120s); concurrent sends are capped at `MAX_OUTSTANDING_BLOBS_BEING_SENT = 5`; back-pressure ratio (computed every `BACK_PRESSURE_INTERVAL`) tells senders to pause. If you're seeing large-data replication hangs, look here first.
100
+
101
+ 4. **Shared-buffer concurrency.** The Float64Array status buffers are touched from multiple threads with no lock. Treat them as eventually consistent; use the callback param of `subscribeToNodeUpdates` if you need notification.
102
+
103
+ 5. **Per-route table exclusion (`excludeTables`).** Route entries in `sendsTo`/`receivesFrom` can specify `excludeTables: ['hdb_nodes']` to prevent specific tables from crossing the wire. Three layers enforce this: (a) subscriber omits them from SUBSCRIPTION_REQUEST (in `sendSubscriptionRequestUpdate`); (b) sender skips their audit records before streaming (in `sendAuditRecord`); (c) receiver drops any that arrive (in the incoming message loop). Route config `routeReplicates` is threaded from `subscriptionManager.ts` onto `nodeSubscriptions` objects so static-route exclusions are available inside HTTP worker threads where `replicateOverWS` runs. Primary use case: v4→v5 migration bridges that share `system` database users/roles but must keep per-cluster `hdb_nodes` topology tables isolated.
104
+
105
+ 6. **Keep-alive is measured from byte activity, not a single ping interval.** `shouldTerminateIdlePing` terminates a connection only after no socket bytes have moved in either direction for the full `PING_TIMEOUT`. A bulk transfer — notably the initial clone copy of a large table — makes slow but real progress (the sender's buffer drains in bursts as the peer consumes), so bytes keep moving within the window and it is not killed mid-copy (the old "no bytes since last ping → terminate" heuristic restarted the copy from zero — issue #241). A genuinely dead peer moves no bytes and still trips the timeout — including the case where the sender filled its socket buffer and the `drain` event never fires. The sole exemption is `pauseReasons > 0` (the receiver intentionally stopped reading to drain its own queue): that stall is local and self-clearing, so the caller keeps liveness fresh while paused. Relatedly, the receive decode loop in `replicateOverWS` yields the event loop on a time budget (`RECEIVE_YIELD_INTERVAL`) — not only when the consumer queue exceeds `RECEIVE_EVENT_HIGH_WATER_MARK` — so a single large message can't decode in one synchronous turn and starve ping responses (core's `MAX_EVENT_DELAY_TIME` monitor).
106
+
107
+ 6. **The initial bulk clone copy is resumable (PK cursor).** When a follower requests a full copy (`startTime: 0`), the leader sends `COPY_START{copyStartTime}`, walks each table's primary store in key order, flushes a checkpoint transaction every `COPY_CHECKPOINT_RECORDS` (timed at `copyStartTime` so the persisted `seqId` stays pinned there, never a record's `localTime`), and sends `COPY_COMPLETE` at the end. The follower persists a cursor `{copyStartTime, currentTable, afterKey}` under `dbisDB` key `Symbol.for('copyCursor')` — but only in the `end_txn` `onCommit`, **after** the batch commits, so the cursor can never get ahead of committed data (a resume re-copies a few records idempotently but never skips). On reconnect, `sendSubscriptionRequestUpdate` reads the cursor and sends it as `copyResume` on the subscription request (overriding the persisted `seqId`, which alone would skip the un-copied tables); the leader skips tables before `currentTable` (stable iteration order ⇒ already committed) and resumes `currentTable` after `afterKey`. `COPY_COMPLETE` clears the cursor so subsequent connections resume normally from `seqId`. Before this, an interrupted copy restarted from zero and never converged for a large table (issue #241).
108
+
109
+ ---
110
+
111
+ ## Tests
112
+
113
+ **Integration tests** live in `../integrationTests/cluster/`:
114
+
115
+ | File | Purpose |
116
+ | -------------------------------------- | -------------------------------------------------------- |
117
+ | `clusterShared.mjs` | Shared fixture/helper (cluster boot, node setup) |
118
+ | `fullyConnectedReplication.test.mjs` | Full-mesh topology |
119
+ | `replicationTopology.test.mjs` | Dynamic membership changes |
120
+ | `replicationLoad.test.mjs` | Concurrent-write load |
121
+ | `excludeTablesReplication.test.mjs` | Per-route `excludeTables` bridge migration (issue #239) |
122
+
123
+ Most replication behavior is exercised via integration tests that spin up multi-node clusters. A few function-level invariants that don't need a cluster live in `../unitTests/replication/` (e.g. `listenerLifecycle.test.mjs`, `pingKeepalive.test.mjs`).
124
+
125
+ ---
126
+
127
+ ## "Where is X" cheat sheet
128
+
129
+ | Question | Where |
130
+ | ----------------------------------------- | ---------------------------------------------------------------------------------------------- |
131
+ | Where does a remote message get decoded? | `replicationConnection.ts → replicateOverWS` |
132
+ | Where do cache-miss fetches pick a peer? | `replicator.ts → Replicator.load` (declared inside `setReplicator`) |
133
+ | Where is the connection retry loop? | `replicationConnection.ts → NodeReplicationConnection` (uses `INITIAL_RETRY_TIME`) |
134
+ | Where is mTLS configured? | `replicator.ts → buildReplicationMtlsConfig` |
135
+ | Where is a new cluster member added? | `setNode.ts` (the whole file is one operation) |
136
+ | Where are protocol message types defined? | `replicationConnection.ts` — top-level consts (`SUBSCRIPTION_REQUEST` … `SUBSCRIPTION_UPDATE`) |
137
+ | Where is `hdb_nodes` schema? | `knownNodes.ts → getHDBNodeTable` |
138
+ | What does `cluster_status` return? | `clusterStatus.ts` (82 lines, whole file) |
139
+ | Where is per-route table exclusion logic? | `knownNodes.ts → getExcludedTablesForRouteEntries`; threaded via `subscriptionManager.ts → routeReplicates` |
@@ -8,7 +8,7 @@ import { getThisNodeName } from '../core/server/nodeName.ts';
8
8
  import { replicationConfirmation } from '../core/resources/DatabaseTransaction.ts';
9
9
  import { isMainThread } from 'worker_threads';
10
10
  import { ClientError } from '../core/utility/errors/hdbError.js';
11
- import env from '../core/utility/environment/environmentManager.js';
11
+ import * as env from '../core/utility/environment/environmentManager.js';
12
12
  import { CONFIG_PARAMS } from '../core/utility/hdbTerms.ts';
13
13
  import { logger } from '../core/utility/logging/logger.ts';
14
14
 
@@ -74,39 +74,98 @@ export function getReplicationSharedStatus(
74
74
  )
75
75
  );
76
76
  }
77
- export function subscribeToNodeUpdates(listener: (node: any, id: string) => void) {
78
- getHDBNodeTable()
79
- .subscribe({})
80
- .then(async (events) => {
77
+ // If the async iterator for hdb_nodes throws or completes, the watcher used to die silently
78
+ // and the node lost the ability to (re)establish outbound replication subscriptions for the
79
+ // lifetime of the process. Run the watcher inside a restart loop so a single transient error
80
+ // (e.g. WebSocket close, schema mismatch, downstream throw) does not permanently disable
81
+ // node-update tracking. Per-event errors are caught individually so they cannot tear down
82
+ // the loop.
83
+ const NODE_WATCHER_RESTART_DELAY_MS = 1000;
84
+ // Cap the exponential backoff so a persistent failure (subscribe throws every time)
85
+ // doesn't run a tight 1s log+retry loop forever — back off up to 30s instead.
86
+ const NODE_WATCHER_MAX_DELAY_MS = 30_000;
87
+ type WatcherOptions = {
88
+ subscribe?: () => Promise<AsyncIterable<any>> | AsyncIterable<any>;
89
+ processEvent?: (event: any, listener: (node: any, id: string) => void) => Promise<void> | void;
90
+ restartDelayMs?: number;
91
+ maxDelayMs?: number;
92
+ maxRestarts?: number;
93
+ };
94
+ export async function runNodeUpdateWatcher(listener: (node: any, id: string) => void, options: WatcherOptions = {}) {
95
+ const subscribe = options.subscribe ?? (() => getHDBNodeTable().subscribe({}));
96
+ const processEvent = options.processEvent ?? processNodeUpdateEvent;
97
+ const restartDelayMs = options.restartDelayMs ?? NODE_WATCHER_RESTART_DELAY_MS;
98
+ const maxDelayMs = options.maxDelayMs ?? NODE_WATCHER_MAX_DELAY_MS;
99
+ const maxRestarts = options.maxRestarts ?? Infinity;
100
+ let restarts = 0;
101
+ let consecutiveFailures = 0;
102
+ while (restarts < maxRestarts) {
103
+ let iteratedSuccessfully = false;
104
+ try {
105
+ const events = await subscribe();
106
+ iteratedSuccessfully = true; // we got past subscribe — any later throw is a fresh failure
81
107
  for await (const event of events) {
82
- // remove any nodes that have been updated or deleted
83
- const node_name = event?.value?.name || event?.id;
84
- logger.debug?.('adding node', node_name, 'on node', getThisNodeName(), ' on process', process.pid);
85
- server.nodes = server.nodes.filter((node) => node && node.name !== node_name);
86
- if (event.type === 'put' && node_name !== getThisNodeName()) {
87
- // add any new nodes
88
- if (event.value) server.nodes.push(event.value);
89
- else {
90
- console.error('Invalid node update event', event);
91
- }
92
- }
93
- const shards = new Map();
94
- for await (const node of getHDBNodeTable().search({})) {
95
- if (!node) continue;
96
- if (node.shard != undefined) {
97
- let nodesForShard = shards.get(node.shard);
98
- if (!nodesForShard) {
99
- shards.set(node.shard, (nodesForShard = []));
100
- }
101
- nodesForShard.push(node);
102
- }
103
- }
104
- server.shards = shards;
105
- if (event.type === 'put' || event.type === 'delete') {
106
- listener(event.value, event.id);
108
+ try {
109
+ await processEvent(event, listener);
110
+ } catch (error) {
111
+ // Don't let a single bad event tear down the watcher — log and continue.
112
+ // Optional chaining: this `logger` is the level-conditional one, where
113
+ // `.error` is undefined when the configured level filters it out, and an
114
+ // uncaught TypeError here would defeat the whole recovery loop.
115
+ logger.error?.('Error processing hdb_nodes update event', error);
107
116
  }
108
117
  }
109
- });
118
+ logger.warn?.('hdb_nodes subscription ended unexpectedly; restarting watcher');
119
+ } catch (error) {
120
+ logger.error?.('hdb_nodes watcher failed; restarting', error);
121
+ }
122
+ // Successful subscribe → reset backoff so a fresh failure restarts quickly.
123
+ consecutiveFailures = iteratedSuccessfully ? 0 : consecutiveFailures + 1;
124
+ restarts++;
125
+ if (restarts >= maxRestarts) return;
126
+ const delay = Math.min(restartDelayMs * Math.pow(2, Math.min(consecutiveFailures, 5)), maxDelayMs);
127
+ await new Promise((resolve) => setTimeout(resolve, delay));
128
+ }
129
+ }
130
+ async function processNodeUpdateEvent(event: any, listener: (node: any, id: string) => void) {
131
+ // remove any nodes that have been updated or deleted
132
+ const node_name = event?.value?.name || event?.id;
133
+ logger.debug?.('adding node', node_name, 'on node', getThisNodeName(), ' on process', process.pid);
134
+ server.nodes = server.nodes.filter((node) => node && node.name !== node_name);
135
+ if (event.type === 'put' && node_name !== getThisNodeName()) {
136
+ // add any new nodes
137
+ if (event.value) server.nodes.push(event.value);
138
+ else {
139
+ console.error('Invalid node update event', event);
140
+ }
141
+ } else if (event.type === 'patch' && node_name !== getThisNodeName() && event.value?.isLeader !== undefined) {
142
+ // add_node { isLeader: true } reaches us as a patch event; read the merged
143
+ // record from LMDB so server.nodes reflects the full record (including isLeader).
144
+ const fullRecord = getHDBNodeTable().primaryStore.get(node_name);
145
+ if (fullRecord) server.nodes.push(fullRecord);
146
+ }
147
+ const shards = new Map();
148
+ for await (const node of getHDBNodeTable().search({})) {
149
+ if (!node) continue;
150
+ if (node.shard != undefined) {
151
+ let nodesForShard = shards.get(node.shard);
152
+ if (!nodesForShard) {
153
+ shards.set(node.shard, (nodesForShard = []));
154
+ }
155
+ nodesForShard.push(node);
156
+ }
157
+ }
158
+ server.shards = shards;
159
+ if (event.type === 'put' || event.type === 'delete') {
160
+ listener(event.value, event.id);
161
+ } else if (event.type === 'patch' && event.value?.isLeader !== undefined) {
162
+ // isLeader patches need to drive subscription bootstrap; pass the merged record.
163
+ const fullRecord = getHDBNodeTable().primaryStore.get(event.id);
164
+ if (fullRecord) listener(fullRecord, event.id);
165
+ }
166
+ }
167
+ export function subscribeToNodeUpdates(listener: (node: any, id: string) => void) {
168
+ runNodeUpdateWatcher(listener);
110
169
  server.nodes = [];
111
170
  server.shards = new Map();
112
171
 
@@ -133,6 +192,11 @@ export function shouldReplicateFromNode(node: Node, databaseName: string) {
133
192
  const databaseReplications: string | Array<string | { name: string; sharded?: boolean }> = env.get(
134
193
  CONFIG_PARAMS.REPLICATION_DATABASES
135
194
  );
195
+ // When this peer is our leader, the database may not exist locally yet — that's the
196
+ // whole point of the full-table copy bootstrap. Skip the local-presence precondition
197
+ // so the subscription can be scheduled and the leader can push records (and schema)
198
+ // to create the database on this node.
199
+ const hasLocalDatabase = !!databases[databaseName] || !!node.isLeader;
136
200
  return (
137
201
  ((typeof node.replicates === 'object'
138
202
  ? node.replicates?.sends ||
@@ -143,7 +207,7 @@ export function shouldReplicateFromNode(node: Node, databaseName: string) {
143
207
  : sendsTo === getThisNodeName()
144
208
  )
145
209
  : node.replicates) &&
146
- databases[databaseName] &&
210
+ hasLocalDatabase &&
147
211
  (!databaseReplications ||
148
212
  databaseReplications === '*' ||
149
213
  (Array.isArray(databaseReplications) &&
@@ -240,16 +304,21 @@ function startSubscriptionToReplications() {
240
304
  if (auditStore) break;
241
305
  }
242
306
  if (auditStore) {
243
- const replicatedTime = getReplicationSharedStatus(auditStore, databaseName, nodeNameAtUpdate, () => {
244
- const updatedTime = replicatedTime[0];
245
- const lastTime = replicatedTime.lastTime;
246
- for (const { txnTime, onConfirm } of commitsAwaitingReplication.get(databaseName) || []) {
247
- if (txnTime > lastTime && txnTime <= updatedTime) {
248
- onConfirm();
307
+ const replicatedTime: Float64Array & { lastTime?: number } = getReplicationSharedStatus(
308
+ auditStore,
309
+ databaseName,
310
+ nodeNameAtUpdate,
311
+ () => {
312
+ const updatedTime = replicatedTime[0];
313
+ const lastTime = replicatedTime.lastTime;
314
+ for (const { txnTime, onConfirm } of commitsAwaitingReplication.get(databaseName) || []) {
315
+ if (txnTime > lastTime && txnTime <= updatedTime) {
316
+ onConfirm();
317
+ }
249
318
  }
319
+ replicatedTime.lastTime = updatedTime;
250
320
  }
251
- replicatedTime.lastTime = updatedTime;
252
- });
321
+ );
253
322
  replicatedTime.lastTime = 0;
254
323
  confirmationsForNode.set(databaseName, replicatedTime);
255
324
  }
@@ -257,6 +326,12 @@ function startSubscriptionToReplications() {
257
326
  confirmationWatchersByNode.set(nodeNameAtUpdate, handle);
258
327
  });
259
328
  }
329
+ export type RouteEntry = {
330
+ target?: string;
331
+ source?: string;
332
+ database?: string;
333
+ excludeTables?: string[];
334
+ };
260
335
  export type Route = {
261
336
  url?: string;
262
337
  subscriptions?: { database: string; schema: string; subscribe: boolean }[];
@@ -264,6 +339,18 @@ export type Route = {
264
339
  host?: string;
265
340
  port?: any;
266
341
  routes?: any[];
342
+ sendsTo?: (RouteEntry | string)[];
343
+ receivesFrom?: (RouteEntry | string)[];
344
+ // yielded by iterateRoutes (may differ from raw config shape)
345
+ name?: string;
346
+ replicates?:
347
+ | boolean
348
+ | {
349
+ sends?: boolean;
350
+ sendsTo?: (RouteEntry | string)[];
351
+ receives?: boolean;
352
+ receivesFrom?: (RouteEntry | string)[];
353
+ };
267
354
  };
268
355
  export type Node = {
269
356
  name: string;
@@ -272,17 +359,42 @@ export type Node = {
272
359
  | boolean
273
360
  | {
274
361
  sends?: boolean;
275
- sendsTo?: ({ target: string; database: string } | string)[];
362
+ sendsTo?: (RouteEntry | string)[];
276
363
  receives?: boolean;
277
- receivesFrom?: ({ source: string; database: string } | string)[];
364
+ receivesFrom?: (RouteEntry | string)[];
278
365
  };
279
366
  url?: string;
280
367
  port?: number;
281
368
  startTime?: number;
282
369
  revoked_certificates?: string[];
283
370
  shard?: number;
371
+ isLeader?: boolean;
284
372
  };
285
373
 
374
+ /**
375
+ * Returns the set of tables to exclude for a given peer+database from a sendsTo or receivesFrom
376
+ * route-entry array. Returns null when there are no exclusions (hot path: avoids a Set allocation).
377
+ */
378
+ export function getExcludedTablesForRouteEntries(
379
+ entries: (RouteEntry | string)[] | undefined,
380
+ peerName: string,
381
+ databaseName: string
382
+ ): Set<string> | null {
383
+ if (!entries) return null;
384
+ let excluded: Set<string> | null = null;
385
+ for (const entry of entries) {
386
+ if (typeof entry === 'string') continue;
387
+ const entryPeer = entry.target ?? entry.source;
388
+ if ((!entryPeer || entryPeer === peerName) && (!entry.database || entry.database === databaseName)) {
389
+ if (entry.excludeTables?.length) {
390
+ if (!excluded) excluded = new Set(entry.excludeTables);
391
+ else for (const t of entry.excludeTables) excluded.add(t);
392
+ }
393
+ }
394
+ }
395
+ return excluded;
396
+ }
397
+
286
398
  export function* iterateRoutes(options: { routes: (Route | any)[] }) {
287
399
  for (const route of options.routes || []) {
288
400
  let url = route.url;
@@ -299,8 +411,17 @@ export function* iterateRoutes(options: { routes: (Route | any)[] }) {
299
411
  continue;
300
412
  }
301
413
 
414
+ // Support sendsTo/receivesFrom either nested under replicates: or as top-level route keys
415
+ let replicates = route.replicates;
416
+ if (replicates === undefined) {
417
+ if (route.sendsTo || route.receivesFrom) {
418
+ replicates = { sendsTo: route.sendsTo, receivesFrom: route.receivesFrom };
419
+ } else {
420
+ replicates = !route.subscriptions; // if there is not a list of subscriptions, then this node is authorized to fully replicate
421
+ }
422
+ }
302
423
  yield {
303
- replicates: route.replicates ?? !route.subscriptions, // if there is not a list of subscriptions, then this node is authorized to fully replicate
424
+ replicates,
304
425
  name: host,
305
426
  url,
306
427
  port: route.port,
@@ -314,7 +435,7 @@ export function* iterateRoutes(options: { routes: (Route | any)[] }) {
314
435
 
315
436
  export function getNodeURL(node: Node): string {
316
437
  if (node.url) return node.url;
317
- const host = node.name;
438
+ let host = node.name;
318
439
  const securePort = env.get(CONFIG_PARAMS.REPLICATION_SECUREPORT);
319
440
  let port: any;
320
441
  // if the host includes a port, use that port