@harperfast/harper 5.2.9 → 5.3.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/agent/mcpTools.ts +1 -1
  2. package/agent/session.ts +25 -14
  3. package/bin/cliOperations.ts +46 -9
  4. package/bin/copyDb.ts +282 -59
  5. package/bin/deploySetup.ts +16 -5
  6. package/bin/harper.ts +1 -1
  7. package/bin/help.ts +4 -1
  8. package/bin/lite.ts +4 -1
  9. package/bin/restart.ts +59 -3
  10. package/bin/run.ts +6 -11
  11. package/bin/upgrade.js +7 -3
  12. package/bin/workloadIdentity.ts +119 -0
  13. package/components/Application.ts +2414 -242
  14. package/components/ApplicationScope.ts +8 -0
  15. package/components/EntryHandler.ts +59 -39
  16. package/components/OptionsWatcher.ts +150 -74
  17. package/components/RuntimeModuleTracker.ts +38 -7
  18. package/components/Scope.ts +37 -15
  19. package/components/awaitRestart.ts +84 -0
  20. package/components/componentLoader.ts +340 -30
  21. package/components/componentPreparationLock.ts +16 -5
  22. package/components/mcp/adapters/harperHttp.ts +4 -0
  23. package/components/mcp/listChanged.ts +4 -0
  24. package/components/mcp/toolRegistry.ts +2 -0
  25. package/components/mcp/tools/operations.ts +9 -0
  26. package/components/mcp/tools/schemas/operationDescriptions.ts +2 -2
  27. package/components/operations.js +270 -78
  28. package/components/operationsValidation.js +49 -1
  29. package/components/status/ComponentStatusRegistry.ts +59 -0
  30. package/config/RootConfigWatcher.ts +80 -34
  31. package/config/configUtils.ts +291 -34
  32. package/config/harperConfigEnvVars.ts +170 -27
  33. package/config-root.schema.json +29 -0
  34. package/dataLayer/blobBackup.ts +160 -50
  35. package/dataLayer/delete.ts +6 -1
  36. package/dataLayer/harperBridge/ResourceBridge.ts +52 -8
  37. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
  38. package/dataLayer/hdbInfoController.ts +34 -1
  39. package/dataLayer/insert.ts +44 -1
  40. package/dataLayer/rocksdbBackup.ts +53 -10
  41. package/dataLayer/schema.ts +11 -1
  42. package/dataLayer/schemaDescribe.ts +8 -1
  43. package/dist/agent/mcpTools.js +1 -1
  44. package/dist/agent/mcpTools.js.map +1 -1
  45. package/dist/agent/session.d.ts +22 -0
  46. package/dist/agent/session.js +26 -15
  47. package/dist/agent/session.js.map +1 -1
  48. package/dist/bin/cliOperations.js +48 -9
  49. package/dist/bin/cliOperations.js.map +1 -1
  50. package/dist/bin/copyDb.d.ts +12 -1
  51. package/dist/bin/copyDb.js +248 -60
  52. package/dist/bin/copyDb.js.map +1 -1
  53. package/dist/bin/deploySetup.d.ts +2 -0
  54. package/dist/bin/deploySetup.js +11 -3
  55. package/dist/bin/deploySetup.js.map +1 -1
  56. package/dist/bin/harper.js +1 -1
  57. package/dist/bin/harper.js.map +1 -1
  58. package/dist/bin/help.js +4 -1
  59. package/dist/bin/help.js.map +1 -1
  60. package/dist/bin/lite.js +4 -1
  61. package/dist/bin/lite.js.map +1 -1
  62. package/dist/bin/restart.js +54 -5
  63. package/dist/bin/restart.js.map +1 -1
  64. package/dist/bin/run.js +4 -10
  65. package/dist/bin/run.js.map +1 -1
  66. package/dist/bin/upgrade.js +4 -3
  67. package/dist/bin/upgrade.js.map +1 -1
  68. package/dist/bin/workloadIdentity.d.ts +18 -0
  69. package/dist/bin/workloadIdentity.js +100 -0
  70. package/dist/bin/workloadIdentity.js.map +1 -0
  71. package/dist/components/Application.d.ts +139 -16
  72. package/dist/components/Application.js +2215 -267
  73. package/dist/components/Application.js.map +1 -1
  74. package/dist/components/ApplicationScope.d.ts +8 -0
  75. package/dist/components/ApplicationScope.js +7 -0
  76. package/dist/components/ApplicationScope.js.map +1 -1
  77. package/dist/components/EntryHandler.js +26 -10
  78. package/dist/components/EntryHandler.js.map +1 -1
  79. package/dist/components/OptionsWatcher.d.ts +1 -0
  80. package/dist/components/OptionsWatcher.js +141 -74
  81. package/dist/components/OptionsWatcher.js.map +1 -1
  82. package/dist/components/RuntimeModuleTracker.js +40 -6
  83. package/dist/components/RuntimeModuleTracker.js.map +1 -1
  84. package/dist/components/Scope.js +38 -13
  85. package/dist/components/Scope.js.map +1 -1
  86. package/dist/components/awaitRestart.d.ts +33 -0
  87. package/dist/components/awaitRestart.js +61 -0
  88. package/dist/components/awaitRestart.js.map +1 -0
  89. package/dist/components/componentLoader.d.ts +38 -1
  90. package/dist/components/componentLoader.js +279 -22
  91. package/dist/components/componentLoader.js.map +1 -1
  92. package/dist/components/componentPreparationLock.d.ts +5 -0
  93. package/dist/components/componentPreparationLock.js +14 -6
  94. package/dist/components/componentPreparationLock.js.map +1 -1
  95. package/dist/components/mcp/adapters/harperHttp.js +4 -0
  96. package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
  97. package/dist/components/mcp/listChanged.js +5 -0
  98. package/dist/components/mcp/listChanged.js.map +1 -1
  99. package/dist/components/mcp/toolRegistry.d.ts +1 -0
  100. package/dist/components/mcp/toolRegistry.js.map +1 -1
  101. package/dist/components/mcp/tools/operations.d.ts +5 -0
  102. package/dist/components/mcp/tools/operations.js +9 -0
  103. package/dist/components/mcp/tools/operations.js.map +1 -1
  104. package/dist/components/mcp/tools/schemas/operationDescriptions.js +2 -2
  105. package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
  106. package/dist/components/operations.js +231 -77
  107. package/dist/components/operations.js.map +1 -1
  108. package/dist/components/operationsValidation.js +49 -1
  109. package/dist/components/operationsValidation.js.map +1 -1
  110. package/dist/components/status/ComponentStatusRegistry.d.ts +0 -4
  111. package/dist/components/status/ComponentStatusRegistry.js +63 -0
  112. package/dist/components/status/ComponentStatusRegistry.js.map +1 -1
  113. package/dist/config/RootConfigWatcher.d.ts +7 -1
  114. package/dist/config/RootConfigWatcher.js +64 -27
  115. package/dist/config/RootConfigWatcher.js.map +1 -1
  116. package/dist/config/configUtils.d.ts +9 -1
  117. package/dist/config/configUtils.js +254 -33
  118. package/dist/config/configUtils.js.map +1 -1
  119. package/dist/config/harperConfigEnvVars.d.ts +16 -0
  120. package/dist/config/harperConfigEnvVars.js +162 -25
  121. package/dist/config/harperConfigEnvVars.js.map +1 -1
  122. package/dist/dataLayer/blobBackup.d.ts +49 -20
  123. package/dist/dataLayer/blobBackup.js +139 -50
  124. package/dist/dataLayer/blobBackup.js.map +1 -1
  125. package/dist/dataLayer/delete.js +1 -1
  126. package/dist/dataLayer/delete.js.map +1 -1
  127. package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +14 -1
  128. package/dist/dataLayer/harperBridge/ResourceBridge.js +51 -10
  129. package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
  130. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.d.ts +3 -1
  131. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
  132. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js.map +1 -1
  133. package/dist/dataLayer/hdbInfoController.d.ts +10 -0
  134. package/dist/dataLayer/hdbInfoController.js +30 -1
  135. package/dist/dataLayer/hdbInfoController.js.map +1 -1
  136. package/dist/dataLayer/insert.d.ts +9 -1
  137. package/dist/dataLayer/insert.js +30 -0
  138. package/dist/dataLayer/insert.js.map +1 -1
  139. package/dist/dataLayer/rocksdbBackup.d.ts +2 -2
  140. package/dist/dataLayer/rocksdbBackup.js +45 -8
  141. package/dist/dataLayer/rocksdbBackup.js.map +1 -1
  142. package/dist/dataLayer/schema.js +8 -0
  143. package/dist/dataLayer/schema.js.map +1 -1
  144. package/dist/dataLayer/schemaDescribe.js +8 -1
  145. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  146. package/dist/index.d.ts +1 -1
  147. package/dist/index.js.map +1 -1
  148. package/dist/json/systemSchema.json +52 -0
  149. package/dist/resources/DatabaseTransaction.d.ts +55 -0
  150. package/dist/resources/DatabaseTransaction.js +459 -45
  151. package/dist/resources/DatabaseTransaction.js.map +1 -1
  152. package/dist/resources/LMDBTransaction.js +22 -4
  153. package/dist/resources/LMDBTransaction.js.map +1 -1
  154. package/dist/resources/PrimaryRocksDatabase.d.ts +1 -0
  155. package/dist/resources/PrimaryRocksDatabase.js +29 -0
  156. package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
  157. package/dist/resources/RecordEncoder.d.ts +20 -0
  158. package/dist/resources/RecordEncoder.js +94 -9
  159. package/dist/resources/RecordEncoder.js.map +1 -1
  160. package/dist/resources/RequestTarget.d.ts +2 -0
  161. package/dist/resources/RequestTarget.js.map +1 -1
  162. package/dist/resources/Resource.js +20 -11
  163. package/dist/resources/Resource.js.map +1 -1
  164. package/dist/resources/ResourceInterface.d.ts +20 -1
  165. package/dist/resources/ResourceInterface.js.map +1 -1
  166. package/dist/resources/RocksIndexStore.d.ts +6 -1
  167. package/dist/resources/RocksIndexStore.js +24 -9
  168. package/dist/resources/RocksIndexStore.js.map +1 -1
  169. package/dist/resources/RocksTransactionLogStore.d.ts +14 -1
  170. package/dist/resources/RocksTransactionLogStore.js +57 -17
  171. package/dist/resources/RocksTransactionLogStore.js.map +1 -1
  172. package/dist/resources/Table.d.ts +112 -8
  173. package/dist/resources/Table.js +1073 -191
  174. package/dist/resources/Table.js.map +1 -1
  175. package/dist/resources/auditStore.d.ts +11 -2
  176. package/dist/resources/auditStore.js +325 -71
  177. package/dist/resources/auditStore.js.map +1 -1
  178. package/dist/resources/blob.d.ts +129 -9
  179. package/dist/resources/blob.js +992 -114
  180. package/dist/resources/blob.js.map +1 -1
  181. package/dist/resources/branchDatabase.d.ts +48 -0
  182. package/dist/resources/branchDatabase.js +892 -0
  183. package/dist/resources/branchDatabase.js.map +1 -0
  184. package/dist/resources/crdt.js +50 -12
  185. package/dist/resources/crdt.js.map +1 -1
  186. package/dist/resources/databases.d.ts +150 -0
  187. package/dist/resources/databases.js +1200 -239
  188. package/dist/resources/databases.js.map +1 -1
  189. package/dist/resources/defineTable.d.ts +10 -2
  190. package/dist/resources/defineTable.js +9 -1
  191. package/dist/resources/defineTable.js.map +1 -1
  192. package/dist/resources/graphql.d.ts +1 -1
  193. package/dist/resources/graphql.js +50 -15
  194. package/dist/resources/graphql.js.map +1 -1
  195. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +1 -0
  196. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +6 -2
  197. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
  198. package/dist/resources/longLivedTransactions.d.ts +71 -0
  199. package/dist/resources/longLivedTransactions.js +358 -0
  200. package/dist/resources/longLivedTransactions.js.map +1 -0
  201. package/dist/resources/models/backendRegistry.d.ts +26 -0
  202. package/dist/resources/models/backendRegistry.js +60 -2
  203. package/dist/resources/models/backendRegistry.js.map +1 -1
  204. package/dist/resources/models/bootstrap.d.ts +33 -1
  205. package/dist/resources/models/bootstrap.js +416 -31
  206. package/dist/resources/models/bootstrap.js.map +1 -1
  207. package/dist/resources/recordLock.d.ts +80 -0
  208. package/dist/resources/recordLock.js +184 -0
  209. package/dist/resources/recordLock.js.map +1 -0
  210. package/dist/resources/replayLogs.d.ts +14 -1
  211. package/dist/resources/replayLogs.js +152 -24
  212. package/dist/resources/replayLogs.js.map +1 -1
  213. package/dist/resources/replayLogsGuards.d.ts +94 -7
  214. package/dist/resources/replayLogsGuards.js +111 -7
  215. package/dist/resources/replayLogsGuards.js.map +1 -1
  216. package/dist/resources/search.js +158 -6
  217. package/dist/resources/search.js.map +1 -1
  218. package/dist/resources/transactionBroadcast.d.ts +1 -1
  219. package/dist/resources/transactionBroadcast.js +2 -2
  220. package/dist/resources/transactionBroadcast.js.map +1 -1
  221. package/dist/security/auth.js +61 -30
  222. package/dist/security/auth.js.map +1 -1
  223. package/dist/security/authn/oidc/claims.d.ts +22 -0
  224. package/dist/security/authn/oidc/claims.js +71 -0
  225. package/dist/security/authn/oidc/claims.js.map +1 -0
  226. package/dist/security/authn/oidc/identityToken.d.ts +27 -0
  227. package/dist/security/authn/oidc/identityToken.js +111 -0
  228. package/dist/security/authn/oidc/identityToken.js.map +1 -0
  229. package/dist/security/authn/oidc/jwks.d.ts +25 -0
  230. package/dist/security/authn/oidc/jwks.js +261 -0
  231. package/dist/security/authn/oidc/jwks.js.map +1 -0
  232. package/dist/security/authn/oidc/providers/generic.d.ts +13 -0
  233. package/dist/security/authn/oidc/providers/generic.js +34 -0
  234. package/dist/security/authn/oidc/providers/generic.js.map +1 -0
  235. package/dist/security/authn/oidc/providers/githubActions.d.ts +11 -0
  236. package/dist/security/authn/oidc/providers/githubActions.js +129 -0
  237. package/dist/security/authn/oidc/providers/githubActions.js.map +1 -0
  238. package/dist/security/authn/oidc/providers/index.d.ts +37 -0
  239. package/dist/security/authn/oidc/providers/index.js +24 -0
  240. package/dist/security/authn/oidc/providers/index.js.map +1 -0
  241. package/dist/security/authn/oidc/tokenExchange.d.ts +12 -0
  242. package/dist/security/authn/oidc/tokenExchange.js +306 -0
  243. package/dist/security/authn/oidc/tokenExchange.js.map +1 -0
  244. package/dist/security/authn/oidc/trustPolicyOperations.d.ts +49 -0
  245. package/dist/security/authn/oidc/trustPolicyOperations.js +358 -0
  246. package/dist/security/authn/oidc/trustPolicyOperations.js.map +1 -0
  247. package/dist/security/authn/oidc/types.d.ts +38 -0
  248. package/dist/security/authn/oidc/types.js +6 -0
  249. package/dist/security/authn/oidc/types.js.map +1 -0
  250. package/dist/security/certificateVerification/index.js +40 -11
  251. package/dist/security/certificateVerification/index.js.map +1 -1
  252. package/dist/security/certificateVerification/trustedIssuers.d.ts +24 -0
  253. package/dist/security/certificateVerification/trustedIssuers.js +79 -0
  254. package/dist/security/certificateVerification/trustedIssuers.js.map +1 -0
  255. package/dist/security/certificateVerification/types.d.ts +1 -0
  256. package/dist/security/credentialProvenance.d.ts +35 -0
  257. package/dist/security/credentialProvenance.js +51 -0
  258. package/dist/security/credentialProvenance.js.map +1 -0
  259. package/dist/security/credentialRejection.d.ts +4 -0
  260. package/dist/security/credentialRejection.js +24 -0
  261. package/dist/security/credentialRejection.js.map +1 -0
  262. package/dist/security/deferredAuthentication.d.ts +36 -0
  263. package/dist/security/deferredAuthentication.js +70 -0
  264. package/dist/security/deferredAuthentication.js.map +1 -0
  265. package/dist/security/impersonation.d.ts +21 -0
  266. package/dist/security/impersonation.js +108 -9
  267. package/dist/security/impersonation.js.map +1 -1
  268. package/dist/security/jsLoader.d.ts +6 -0
  269. package/dist/security/jsLoader.js +75 -15
  270. package/dist/security/jsLoader.js.map +1 -1
  271. package/dist/security/keys.js +301 -71
  272. package/dist/security/keys.js.map +1 -1
  273. package/dist/security/operationScope.d.ts +21 -0
  274. package/dist/security/operationScope.js +36 -0
  275. package/dist/security/operationScope.js.map +1 -0
  276. package/dist/security/permissionsTranslator.js +21 -0
  277. package/dist/security/permissionsTranslator.js.map +1 -1
  278. package/dist/security/tokenAuthentication.d.ts +19 -1
  279. package/dist/security/tokenAuthentication.js +191 -10
  280. package/dist/security/tokenAuthentication.js.map +1 -1
  281. package/dist/security/user.js +4 -3
  282. package/dist/security/user.js.map +1 -1
  283. package/dist/server/DurableSubscriptionsSession.d.ts +2 -2
  284. package/dist/server/DurableSubscriptionsSession.js +67 -10
  285. package/dist/server/DurableSubscriptionsSession.js.map +1 -1
  286. package/dist/server/REST.js +73 -0
  287. package/dist/server/REST.js.map +1 -1
  288. package/dist/server/graphqlQuerying.js +4 -0
  289. package/dist/server/graphqlQuerying.js.map +1 -1
  290. package/dist/server/http.d.ts +11 -0
  291. package/dist/server/http.js +88 -15
  292. package/dist/server/http.js.map +1 -1
  293. package/dist/server/itc/serverHandlers.js +8 -1
  294. package/dist/server/itc/serverHandlers.js.map +1 -1
  295. package/dist/server/jobs/jobProcess.js +6 -2
  296. package/dist/server/jobs/jobProcess.js.map +1 -1
  297. package/dist/server/jobs/jobs.js +4 -1
  298. package/dist/server/jobs/jobs.js.map +1 -1
  299. package/dist/server/liveSubscriptionAuth.d.ts +26 -4
  300. package/dist/server/liveSubscriptionAuth.js +105 -39
  301. package/dist/server/liveSubscriptionAuth.js.map +1 -1
  302. package/dist/server/loadRootComponents.js +49 -10
  303. package/dist/server/loadRootComponents.js.map +1 -1
  304. package/dist/server/mqtt.d.ts +2 -0
  305. package/dist/server/mqtt.js +165 -30
  306. package/dist/server/mqtt.js.map +1 -1
  307. package/dist/server/nodeName.d.ts +2 -0
  308. package/dist/server/nodeName.js +107 -23
  309. package/dist/server/nodeName.js.map +1 -1
  310. package/dist/server/serverHelpers/Headers.d.ts +25 -0
  311. package/dist/server/serverHelpers/Headers.js +139 -1
  312. package/dist/server/serverHelpers/Headers.js.map +1 -1
  313. package/dist/server/serverHelpers/contentTypes.d.ts +9 -0
  314. package/dist/server/serverHelpers/contentTypes.js +32 -25
  315. package/dist/server/serverHelpers/contentTypes.js.map +1 -1
  316. package/dist/server/serverHelpers/deployValidationState.d.ts +3 -0
  317. package/dist/server/serverHelpers/deployValidationState.js +9 -19
  318. package/dist/server/serverHelpers/deployValidationState.js.map +1 -1
  319. package/dist/server/serverHelpers/operationAuthorizationState.d.ts +12 -0
  320. package/dist/server/serverHelpers/operationAuthorizationState.js +24 -2
  321. package/dist/server/serverHelpers/operationAuthorizationState.js.map +1 -1
  322. package/dist/server/serverHelpers/registeredOperations.d.ts +5 -4
  323. package/dist/server/serverHelpers/registeredOperations.js +74 -21
  324. package/dist/server/serverHelpers/registeredOperations.js.map +1 -1
  325. package/dist/server/serverHelpers/requestSanitization.d.ts +11 -0
  326. package/dist/server/serverHelpers/requestSanitization.js +20 -0
  327. package/dist/server/serverHelpers/requestSanitization.js.map +1 -0
  328. package/dist/server/serverHelpers/serverHandlers.js +6 -3
  329. package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
  330. package/dist/server/serverHelpers/serverUtilities.d.ts +18 -0
  331. package/dist/server/serverHelpers/serverUtilities.js +90 -20
  332. package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
  333. package/dist/server/serverHelpers/sharedMessageEncoding.d.ts +67 -0
  334. package/dist/server/serverHelpers/sharedMessageEncoding.js +280 -0
  335. package/dist/server/serverHelpers/sharedMessageEncoding.js.map +1 -0
  336. package/dist/server/serverHelpers/uwsServer.js +19 -1
  337. package/dist/server/serverHelpers/uwsServer.js.map +1 -1
  338. package/dist/server/static.js +24 -28
  339. package/dist/server/static.js.map +1 -1
  340. package/dist/server/storageReclamation.d.ts +12 -0
  341. package/dist/server/storageReclamation.js +26 -0
  342. package/dist/server/storageReclamation.js.map +1 -1
  343. package/dist/server/threads/itc.d.ts +7 -2
  344. package/dist/server/threads/itc.js +5 -1
  345. package/dist/server/threads/itc.js.map +1 -1
  346. package/dist/server/threads/manageThreads.d.ts +26 -3
  347. package/dist/server/threads/manageThreads.js +517 -65
  348. package/dist/server/threads/manageThreads.js.map +1 -1
  349. package/dist/server/threads/socketRouter.js +89 -26
  350. package/dist/server/threads/socketRouter.js.map +1 -1
  351. package/dist/server/threads/threadHeapMemory.d.ts +2 -0
  352. package/dist/server/threads/threadHeapMemory.js +31 -0
  353. package/dist/server/threads/threadHeapMemory.js.map +1 -0
  354. package/dist/server/threads/threadServer.js +46 -15
  355. package/dist/server/threads/threadServer.js.map +1 -1
  356. package/dist/sqlEngine/config.d.ts +1 -3
  357. package/dist/sqlEngine/config.js +19 -16
  358. package/dist/sqlEngine/config.js.map +1 -1
  359. package/dist/sqlTranslator/index.d.ts +1 -1
  360. package/dist/sqlTranslator/index.js +30 -7
  361. package/dist/sqlTranslator/index.js.map +1 -1
  362. package/dist/upgrade/directives/5-3-0.d.ts +7 -0
  363. package/dist/upgrade/directives/5-3-0.js +148 -0
  364. package/dist/upgrade/directives/5-3-0.js.map +1 -0
  365. package/dist/upgrade/directives/directivesController.js +2 -1
  366. package/dist/upgrade/directives/directivesController.js.map +1 -1
  367. package/dist/utility/OperationFunctionCaller.js +2 -1
  368. package/dist/utility/OperationFunctionCaller.js.map +1 -1
  369. package/dist/utility/common_utils.d.ts +16 -0
  370. package/dist/utility/common_utils.js +32 -6
  371. package/dist/utility/common_utils.js.map +1 -1
  372. package/dist/utility/componentNames.d.ts +8 -0
  373. package/dist/utility/componentNames.js +12 -1
  374. package/dist/utility/componentNames.js.map +1 -1
  375. package/dist/utility/environment/environmentManager.js +3 -6
  376. package/dist/utility/environment/environmentManager.js.map +1 -1
  377. package/dist/utility/environment/systemInformation.d.ts +1 -0
  378. package/dist/utility/environment/systemInformation.js +1 -0
  379. package/dist/utility/environment/systemInformation.js.map +1 -1
  380. package/dist/utility/errors/commonErrors.d.ts +2 -0
  381. package/dist/utility/errors/commonErrors.js +2 -0
  382. package/dist/utility/errors/commonErrors.js.map +1 -1
  383. package/dist/utility/errors/hdbError.d.ts +17 -0
  384. package/dist/utility/errors/hdbError.js +30 -1
  385. package/dist/utility/errors/hdbError.js.map +1 -1
  386. package/dist/utility/globalSchema.d.ts +18 -0
  387. package/dist/utility/hdbTerms.d.ts +16 -0
  388. package/dist/utility/hdbTerms.js +18 -2
  389. package/dist/utility/hdbTerms.js.map +1 -1
  390. package/dist/utility/logging/harper_logger.d.ts +2 -0
  391. package/dist/utility/logging/harper_logger.js +91 -14
  392. package/dist/utility/logging/harper_logger.js.map +1 -1
  393. package/dist/utility/logging/logRotator.js +76 -49
  394. package/dist/utility/logging/logRotator.js.map +1 -1
  395. package/dist/utility/nodeIdentity.d.ts +9 -0
  396. package/dist/utility/nodeIdentity.js +58 -0
  397. package/dist/utility/nodeIdentity.js.map +1 -0
  398. package/dist/utility/npmUtilities.js +9 -7
  399. package/dist/utility/npmUtilities.js.map +1 -1
  400. package/dist/utility/operationPermissions.d.ts +3 -1
  401. package/dist/utility/operationPermissions.js +16 -1
  402. package/dist/utility/operationPermissions.js.map +1 -1
  403. package/dist/utility/operation_authorization.d.ts +10 -7
  404. package/dist/utility/operation_authorization.js +212 -41
  405. package/dist/utility/operation_authorization.js.map +1 -1
  406. package/dist/utility/watchPath.d.ts +29 -0
  407. package/dist/utility/watchPath.js +68 -0
  408. package/dist/utility/watchPath.js.map +1 -0
  409. package/dist/utility/watcherFallback.d.ts +86 -0
  410. package/dist/utility/watcherFallback.js +278 -1
  411. package/dist/utility/watcherFallback.js.map +1 -1
  412. package/dist/validation/configValidator.d.ts +12 -0
  413. package/dist/validation/configValidator.js +199 -72
  414. package/dist/validation/configValidator.js.map +1 -1
  415. package/dist/validation/installValidator.js +12 -0
  416. package/dist/validation/installValidator.js.map +1 -1
  417. package/dist/validation/validationWrapper.d.ts +11 -0
  418. package/dist/validation/validationWrapper.js +16 -3
  419. package/dist/validation/validationWrapper.js.map +1 -1
  420. package/index.ts +2 -0
  421. package/json/systemSchema.json +52 -0
  422. package/npm-shrinkwrap.json +196 -194
  423. package/package.json +7 -6
  424. package/resources/DESIGN.md +114 -52
  425. package/resources/DatabaseTransaction.ts +521 -43
  426. package/resources/LMDBTransaction.ts +26 -4
  427. package/resources/PrimaryRocksDatabase.ts +28 -1
  428. package/resources/RecordEncoder.ts +103 -8
  429. package/resources/RequestTarget.ts +2 -0
  430. package/resources/Resource.ts +17 -9
  431. package/resources/ResourceInterface.ts +23 -0
  432. package/resources/RocksIndexStore.ts +30 -9
  433. package/resources/RocksTransactionLogStore.ts +78 -21
  434. package/resources/Table.ts +1110 -159
  435. package/resources/auditStore.ts +331 -73
  436. package/resources/blob.ts +1029 -110
  437. package/resources/branchDatabase.ts +941 -0
  438. package/resources/crdt.ts +76 -12
  439. package/resources/databases.ts +1310 -252
  440. package/resources/defineTable.ts +18 -2
  441. package/resources/graphql.ts +70 -16
  442. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +6 -2
  443. package/resources/longLivedTransactions.ts +360 -0
  444. package/resources/models/backendRegistry.ts +84 -2
  445. package/resources/models/bootstrap.ts +473 -28
  446. package/resources/recordLock.ts +253 -0
  447. package/resources/replayLogs.ts +147 -26
  448. package/resources/replayLogsGuards.ts +171 -8
  449. package/resources/search.ts +154 -7
  450. package/resources/transactionBroadcast.ts +3 -3
  451. package/security/auth.ts +68 -29
  452. package/security/authn/oidc/claims.ts +72 -0
  453. package/security/authn/oidc/identityToken.ts +129 -0
  454. package/security/authn/oidc/jwks.ts +260 -0
  455. package/security/authn/oidc/providers/generic.ts +40 -0
  456. package/security/authn/oidc/providers/githubActions.ts +137 -0
  457. package/security/authn/oidc/providers/index.ts +52 -0
  458. package/security/authn/oidc/tokenExchange.ts +300 -0
  459. package/security/authn/oidc/trustPolicyOperations.ts +343 -0
  460. package/security/authn/oidc/types.ts +41 -0
  461. package/security/certificateVerification/index.ts +54 -13
  462. package/security/certificateVerification/trustedIssuers.ts +76 -0
  463. package/security/certificateVerification/types.ts +1 -0
  464. package/security/credentialProvenance.ts +47 -0
  465. package/security/credentialRejection.ts +22 -0
  466. package/security/deferredAuthentication.ts +71 -0
  467. package/security/impersonation.ts +117 -12
  468. package/security/jsLoader.ts +81 -18
  469. package/security/keys.ts +298 -72
  470. package/security/operationScope.ts +33 -0
  471. package/security/permissionsTranslator.js +23 -0
  472. package/security/tokenAuthentication.ts +233 -12
  473. package/security/user.ts +4 -3
  474. package/server/DESIGN.md +183 -16
  475. package/server/DurableSubscriptionsSession.ts +71 -11
  476. package/server/REST.ts +79 -1
  477. package/server/graphqlQuerying.ts +4 -0
  478. package/server/http.ts +99 -18
  479. package/server/itc/serverHandlers.js +8 -1
  480. package/server/jobs/jobProcess.ts +8 -2
  481. package/server/jobs/jobs.ts +4 -1
  482. package/server/liveSubscriptionAuth.ts +129 -46
  483. package/server/loadRootComponents.js +50 -8
  484. package/server/mqtt.ts +179 -38
  485. package/server/nodeName.ts +103 -21
  486. package/server/serverHelpers/Headers.ts +131 -0
  487. package/server/serverHelpers/contentTypes.ts +29 -21
  488. package/server/serverHelpers/deployValidationState.ts +24 -13
  489. package/server/serverHelpers/operationAuthorizationState.ts +34 -3
  490. package/server/serverHelpers/registeredOperations.ts +79 -22
  491. package/server/serverHelpers/requestSanitization.ts +15 -0
  492. package/server/serverHelpers/serverHandlers.js +6 -3
  493. package/server/serverHelpers/serverUtilities.ts +104 -31
  494. package/server/serverHelpers/sharedMessageEncoding.ts +307 -0
  495. package/server/serverHelpers/uwsServer.ts +17 -2
  496. package/server/static.ts +23 -29
  497. package/server/storageReclamation.ts +23 -0
  498. package/server/threads/itc.js +11 -1
  499. package/server/threads/manageThreads.js +526 -56
  500. package/server/threads/socketRouter.ts +81 -26
  501. package/server/threads/threadHeapMemory.ts +26 -0
  502. package/server/threads/threadServer.js +43 -15
  503. package/sqlTranslator/index.ts +31 -8
  504. package/studio/web/assets/Chat-BnCBegQz.js +2267 -0
  505. package/studio/web/assets/FloatingChat-CoDW1ySS.js +23 -0
  506. package/studio/web/assets/{abnfDiagram-VCTEODGH-C0_BAZyO.js → abnfDiagram-VCTEODGH-B0BebmD2.js} +1 -1
  507. package/studio/web/assets/{alertDialog-DIHt7Z0r.js → alertDialog-CQyAJJhl.js} +1 -1
  508. package/studio/web/assets/{apiToken-c3Rd-w6g.js → apiToken-Bwk5BLXW.js} +1 -1
  509. package/studio/web/assets/applications-DHxGi7JH.js +296 -0
  510. package/studio/web/assets/architecture-7GRP2DOG-LB-MLAAb.js +1 -0
  511. package/studio/web/assets/{architectureDiagram-5GKGNRK7-BWzrASgm.js → architectureDiagram-5GKGNRK7-7SW3GD-K.js} +1 -1
  512. package/studio/web/assets/authStore-C3Nfubqr.js +3 -0
  513. package/studio/web/assets/{blockDiagram-NRAW4CY4-BdJX9Khj.js → blockDiagram-I7D4REHJ-BqguiadH.js} +2 -2
  514. package/studio/web/assets/{button-DhiX-njv.js → button-BIsUKRZq.js} +2 -2
  515. package/studio/web/assets/{c4Diagram-UCG6FXSJ-CI6MzGmQ.js → c4Diagram-7LVT6UL2-LBNf8t_X.js} +1 -1
  516. package/studio/web/assets/channel-yictG-U-.js +1 -0
  517. package/studio/web/assets/{chevron-up-Df2c8uoU.js → chevron-up-DtKGqDn3.js} +1 -1
  518. package/studio/web/assets/{chunk-TEH6E4GO-P87k5mNi.js → chunk-4HAMMTFA-DWtTut21.js} +1 -1
  519. package/studio/web/assets/{chunk-75Z2AOVW-BT8tVmks.js → chunk-75Z2AOVW-QGQD6th2.js} +1 -1
  520. package/studio/web/assets/{chunk-DU6HZSFF-9kAOOmI6.js → chunk-DU6HZSFF-Chq20Ba5.js} +1 -1
  521. package/studio/web/assets/{chunk-F27PBJKO-BW7ao8AY.js → chunk-F27PBJKO-BVA5EPhV.js} +1 -1
  522. package/studio/web/assets/{chunk-GMAD6QVW-BNyXpoQO.js → chunk-GMAD6QVW-BeS7S07A.js} +1 -1
  523. package/studio/web/assets/{chunk-OBVCFTLP-D4wWOqDQ.js → chunk-GVQU2GXP-sbwVIQ8i.js} +1 -1
  524. package/studio/web/assets/{chunk-G27WJ6UU-COyLMcgK.js → chunk-IMKFNOWR-Bnh3tAVd.js} +1 -1
  525. package/studio/web/assets/{chunk-JQ64N6SF-Cyz1IeLf.js → chunk-L3NEJ4N5-COfUyKII.js} +1 -1
  526. package/studio/web/assets/chunk-OSK3NFVY-ByciRftO.js +10 -0
  527. package/studio/web/assets/{chunk-P2QGCYS3-DmIFY4d7.js → chunk-P2QGCYS3-CP1VhG_c.js} +1 -1
  528. package/studio/web/assets/{chunk-POPQ4Y6H-BPrvMyKz.js → chunk-POPQ4Y6H-ClWhhkwW.js} +1 -1
  529. package/studio/web/assets/{chunk-PWAF6VOD-2zB6IW9i.js → chunk-PWAF6VOD-1z1THyS5.js} +1 -1
  530. package/studio/web/assets/{chunk-RHFEMEQ7-2FgyI8YU.js → chunk-SHT3W25Y-LpQkMsah.js} +2 -2
  531. package/studio/web/assets/{chunk-SVP7TREG-FwtbH2QC.js → chunk-SVP7TREG-jtdAHw0S.js} +1 -1
  532. package/studio/web/assets/{chunk-LCL6LL3I-HOzK_ppE.js → chunk-TICWLB2K-VOwzetX-.js} +1 -1
  533. package/studio/web/assets/classDiagram-ZZMXUADV-VaEwSy_g.js +1 -0
  534. package/studio/web/assets/classDiagram-v2-VYDZK3BY-VaEwSy_g.js +1 -0
  535. package/studio/web/assets/{createLucideIcon-BKGPfjm2.js → createLucideIcon-CzW9508A.js} +1 -1
  536. package/studio/web/assets/{cssMode-CEN2mzSA.js → cssMode-s0cWI-_M.js} +1 -1
  537. package/studio/web/assets/{cynefin-OW5HDTMX-BRkpLFQV.js → cynefin-OW5HDTMX-BbdbCvub.js} +1 -1
  538. package/studio/web/assets/{cynefinDiagram-5FMLGOSQ-CHT1DaX6.js → cynefinDiagram-5FMLGOSQ-TP-aIqbt.js} +1 -1
  539. package/studio/web/assets/{dagre-3AP2YEHR-DpUXBh63.js → dagre-GXQ25YYZ-DShnGpGo.js} +1 -1
  540. package/studio/web/assets/{diagram-S7CK7UJ4-BuymVFZT.js → diagram-S7CK7UJ4-aoCVTtcy.js} +1 -1
  541. package/studio/web/assets/{diagram-UQ7AKVKN-CyP148RM.js → diagram-UQ7AKVKN-DglXtQ6x.js} +1 -1
  542. package/studio/web/assets/{diagram-VSXAHHWV-CoCAg3M9.js → diagram-VSXAHHWV-fhEdmkwM.js} +1 -1
  543. package/studio/web/assets/{diagram-VX7I27RA-BpOqCFca.js → diagram-VX7I27RA-DccVJet6.js} +1 -1
  544. package/studio/web/assets/{diagram-Z3DM3KII-Bfpw7Vbj.js → diagram-Z3DM3KII-D-RyJJb7.js} +1 -1
  545. package/studio/web/assets/{dialog-CBf0Mr1d.js → dialog-Cn2uWgD4.js} +1 -1
  546. package/studio/web/assets/{dist-lkA3O3eM.js → dist-DP8UjMB_.js} +1 -1
  547. package/studio/web/assets/{download-BtTOBem-.js → download-B5T5r7ss.js} +1 -1
  548. package/studio/web/assets/{ebnfDiagram-PWID7BFC-DS_6aWqL.js → ebnfDiagram-PWID7BFC-DJGpIpz_.js} +1 -1
  549. package/studio/web/assets/{editor-D8oDeCTL.js → editor-DNcRHK54.js} +1 -1
  550. package/studio/web/assets/{erDiagram-SSCWMZ5O-DJNk6Fgw.js → erDiagram-RLTQ6QDP-CIfNlgkC.js} +1 -1
  551. package/studio/web/assets/eventmodeling-NTZA5JFV-CLxnp2CR.js +1 -0
  552. package/studio/web/assets/flowDiagram-HODETNUW-BIbhmz9f.js +1 -0
  553. package/studio/web/assets/{ganttDiagram-EL5Y4UJY-2pOExxMY.js → ganttDiagram-EL5Y4UJY-BxToTzzD.js} +1 -1
  554. package/studio/web/assets/{getAnalytics-D4LKGeVy.js → getAnalytics-GHK8ORfM.js} +1 -1
  555. package/studio/web/assets/{gitGraph-4MIJSDKK-CH5ZxwzF.js → gitGraph-4MIJSDKK-D2s2w8lE.js} +1 -1
  556. package/studio/web/assets/{gitGraphDiagram-WWUBYQGX-DVIsIhbO.js → gitGraphDiagram-WWUBYQGX-Dwntd4-x.js} +1 -1
  557. package/studio/web/assets/{html-u3vOg7LJ.js → html-Bdssedlg.js} +1 -1
  558. package/studio/web/assets/{htmlMode-DyO31v-P.js → htmlMode-CoDlJ3fw.js} +1 -1
  559. package/studio/web/assets/{index-Cxj2_wsl.css → index-7RMEgVG1.css} +1 -1
  560. package/studio/web/assets/index-D6sxmFLR.js +824 -0
  561. package/studio/web/assets/index.lazy-tmU5BS8s.js +2 -0
  562. package/studio/web/assets/{info-A6RAGUB7-CPQfTnaG.js → info-A6RAGUB7-DYjkvb0C.js} +1 -1
  563. package/studio/web/assets/{infoDiagram-RXCK75RN-DlwLYlwm.js → infoDiagram-27XIBGKW-Bnp1FJE5.js} +1 -1
  564. package/studio/web/assets/{ishikawaDiagram-5VMMS53U-BRXRp29U.js → ishikawaDiagram-5VMMS53U-D9Xh2r6X.js} +1 -1
  565. package/studio/web/assets/{javascript-CUvxOyTC.js → javascript-B8meVSTH.js} +1 -1
  566. package/studio/web/assets/{journeyDiagram-EYS64GPL-B0ou8k0n.js → journeyDiagram-3NMN7TZE-CokIi6ll.js} +2 -2
  567. package/studio/web/assets/{jsonMode-f_IwbF3D.js → jsonMode-DpIPd35T.js} +1 -1
  568. package/studio/web/assets/{kanban-definition-3QL26DDD-uYg7iYzp.js → kanban-definition-UXKFOSKX-CukSFJfX.js} +1 -1
  569. package/studio/web/assets/{languageServices-DXtZ6rEF.js → languageServices-C_5FMJzQ.js} +1 -1
  570. package/studio/web/assets/{lspLanguageFeatures-B4pCF1zO.js → lspLanguageFeatures-BIzNBzPK.js} +1 -1
  571. package/studio/web/assets/{mermaid-parser.core-Ck-fC8b7.js → mermaid-parser.core-BlEsOWNO.js} +3 -3
  572. package/studio/web/assets/{mermaid.core-CP8aNNYm.js → mermaid.core-BlkGaMIH.js} +5 -5
  573. package/studio/web/assets/{mindmap-definition-FBJOCRG2-CgTZ-rit.js → mindmap-definition-YA3MSWOX-IprMc_0j.js} +1 -1
  574. package/studio/web/assets/{notifications-D3tIQ4sg.js → notifications-CQf18QKb.js} +1 -1
  575. package/studio/web/assets/notifications-CvZivSbh.js +1 -0
  576. package/studio/web/assets/{packet-AYTQ26CC-DEyoPtPb.js → packet-AYTQ26CC-Bi3V04Zi.js} +1 -1
  577. package/studio/web/assets/{pegDiagram-XKGWAZYB-DrD-7sD9.js → pegDiagram-XKGWAZYB-BNuPDLZY.js} +1 -1
  578. package/studio/web/assets/{pie-WAS4IAKB-wjj-EI1d.js → pie-WAS4IAKB-_6DoDbng.js} +1 -1
  579. package/studio/web/assets/{pieDiagram-E7YTZNPT-GntqDCzv.js → pieDiagram-E7YTZNPT-DqNb6Ht2.js} +1 -1
  580. package/studio/web/assets/{profile-DZWU7MgT.js → profile-DdOwtntb.js} +1 -1
  581. package/studio/web/assets/{quadrantDiagram-AXDQQJYC-0UeqXQGd.js → quadrantDiagram-AXDQQJYC-BGH9E2YR.js} +1 -1
  582. package/studio/web/assets/{radar-RG4KPBEZ-DFSA5h7k.js → radar-RG4KPBEZ-DDdVczcL.js} +1 -1
  583. package/studio/web/assets/{railroad-74A4TZTK-CaOUG9wR.js → railroad-74A4TZTK-BJUP4Jds.js} +1 -1
  584. package/studio/web/assets/railroad-abnf-HS5TGJTU-Bm3L1L0h.js +1 -0
  585. package/studio/web/assets/railroad-ebnf-LZEXJU2U-CKzLGlkw.js +1 -0
  586. package/studio/web/assets/railroad-peg-WCYAUIDC-S8xLjslx.js +1 -0
  587. package/studio/web/assets/{railroadDiagram-O6MQD6OU-yHUELZaV.js → railroadDiagram-O6MQD6OU-DGTPh2KZ.js} +1 -1
  588. package/studio/web/assets/{regions-CkyurXzE.js → regions-n69fwagr.js} +1 -1
  589. package/studio/web/assets/{register-BUyhWjBO.js → register-PfWTCXWB.js} +3 -3
  590. package/studio/web/assets/{requirementDiagram-EFPCY7ZU-DNEGFjuW.js → requirementDiagram-BXWQKSXE-BJnO6uLz.js} +1 -1
  591. package/studio/web/assets/{sankeyDiagram-P5KCCOFB-DpyAmSVR.js → sankeyDiagram-P5KCCOFB-0vSOdymH.js} +1 -1
  592. package/studio/web/assets/{sequenceDiagram-WJ2MYXX4-TyaT7xNk.js → sequenceDiagram-WJ2MYXX4-hETizDWE.js} +1 -1
  593. package/studio/web/assets/{setComponentFile-CeyKSZAa.js → setComponentFile-Bg6O7X0S.js} +1 -1
  594. package/studio/web/assets/{setup-D2kn7cAA.js → setup-CUx_aUDl.js} +2 -2
  595. package/studio/web/assets/{stateDiagram-HBIQ2CUA-CeEdTArZ.js → stateDiagram-D77RDMKH-CdYQ_KtC.js} +1 -1
  596. package/studio/web/assets/stateDiagram-v2-MP3YSRHH-CdKuzQMT.js +1 -0
  597. package/studio/web/assets/status-D7BVKqX9.js +61 -0
  598. package/studio/web/assets/{swimlanes-XN3QIQJK-B54FmF46.js → swimlanes-42K2YHIH-B8cHIpU4.js} +1 -1
  599. package/studio/web/assets/swimlanesDiagram-VR7AAH4N-DmOSJwaH.js +8 -0
  600. package/studio/web/assets/{tabs-B_G5zscN.js → tabs-BrHu7gJi.js} +1 -1
  601. package/studio/web/assets/{timeline-definition-24CTP7MA-D-a9ujbo.js → timeline-definition-24CTP7MA-BJWYSXqF.js} +1 -1
  602. package/studio/web/assets/{toggleHighContrast-C0UW6rI2.js → toggleHighContrast-DBSyXzMr.js} +1 -1
  603. package/studio/web/assets/{treeView-Q6P3EWNA-CrW_6JnS.js → treeView-Q6P3EWNA-qxe_v6CQ.js} +1 -1
  604. package/studio/web/assets/{treemap-WGGIJYW6-BxyYLdP_.js → treemap-WGGIJYW6-dDo97XXF.js} +1 -1
  605. package/studio/web/assets/{tsMode-DBC0zmDx.js → tsMode-BByKCjBS.js} +1 -1
  606. package/studio/web/assets/{typescript-DApRQir3.js → typescript-DDLnLpw9.js} +1 -1
  607. package/studio/web/assets/{useEntityRestURL-DB6JStU1.js → useEntityRestURL-31CHGaHk.js} +1 -1
  608. package/studio/web/assets/{useLocalStorage-Dtj1QS8_.js → useLocalStorage-BqMR3D8_.js} +1 -1
  609. package/studio/web/assets/vendor-core-c2JRRJpV.js +58 -0
  610. package/studio/web/assets/vendor-datadog-CLUcJXOo.js +6 -0
  611. package/studio/web/assets/{vendor-react-Dyj4O3HE.js → vendor-react-CJV_K1u4.js} +1 -1
  612. package/studio/web/assets/vendor-tanstack-DxzraizX.js +1 -0
  613. package/studio/web/assets/{vendor-ui-vhu-UHhF.js → vendor-ui-BUjK0h8a.js} +2 -2
  614. package/studio/web/assets/{vennDiagram-4TSXK5OY-Cy7s7Mpy.js → vennDiagram-4TSXK5OY-A3i-lCdl.js} +1 -1
  615. package/studio/web/assets/{wardley-WFR3VGLG-BeBL35g2.js → wardley-WFR3VGLG-B0ik-_6g.js} +1 -1
  616. package/studio/web/assets/{wardleyDiagram-VM6X3IG4-BylmIGSg.js → wardleyDiagram-VM6X3IG4-CjrkKWUR.js} +1 -1
  617. package/studio/web/assets/{workers-C0bFIedw.js → workers-pR3jRY9D.js} +1 -1
  618. package/studio/web/assets/x-DIzaLEdK.js +1 -0
  619. package/studio/web/assets/{xml-HWd01lU-.js → xml-2iRnMhQO.js} +1 -1
  620. package/studio/web/assets/{xychartDiagram-S5SC5T6Z-CoKALMXr.js → xychartDiagram-S5SC5T6Z-Biok4GYV.js} +1 -1
  621. package/studio/web/assets/{yaml-CIH0Nt-h.js → yaml-Bf92gJpd.js} +1 -1
  622. package/studio/web/index.html +14 -14
  623. package/upgrade/directives/5-3-0.ts +132 -0
  624. package/upgrade/directives/directivesController.ts +2 -1
  625. package/utility/OperationFunctionCaller.ts +2 -1
  626. package/utility/common_utils.ts +30 -5
  627. package/utility/componentNames.ts +12 -0
  628. package/utility/environment/environmentManager.ts +3 -7
  629. package/utility/environment/systemInformation.ts +7 -0
  630. package/utility/errors/commonErrors.ts +4 -0
  631. package/utility/errors/hdbError.ts +29 -0
  632. package/utility/hdbTerms.ts +17 -0
  633. package/utility/logging/harper_logger.ts +87 -14
  634. package/utility/logging/logRotator.ts +72 -45
  635. package/utility/nodeIdentity.ts +45 -0
  636. package/utility/npmUtilities.ts +10 -8
  637. package/utility/operationPermissions.ts +18 -1
  638. package/utility/operation_authorization.ts +231 -42
  639. package/utility/watchPath.ts +63 -0
  640. package/utility/watcherFallback.ts +270 -0
  641. package/validation/configValidator.ts +209 -72
  642. package/validation/installValidator.ts +15 -0
  643. package/validation/validationWrapper.ts +18 -4
  644. package/studio/web/assets/Chat-JpO8EtUu.js +0 -2067
  645. package/studio/web/assets/FloatingChat-Bcj3xSZu.js +0 -23
  646. package/studio/web/assets/applications-ByqLRKyZ.js +0 -296
  647. package/studio/web/assets/architecture-7GRP2DOG-DNdx5tEU.js +0 -1
  648. package/studio/web/assets/authStore-qKmCZcaf.js +0 -3
  649. package/studio/web/assets/channel-DtCV8PTL.js +0 -1
  650. package/studio/web/assets/chunk-R7TYR2AO-Irip67yr.js +0 -10
  651. package/studio/web/assets/classDiagram-DTDB5LWJ-DbO_dCNE.js +0 -1
  652. package/studio/web/assets/classDiagram-v2-JRS7N3AN-DbO_dCNE.js +0 -1
  653. package/studio/web/assets/eventmodeling-NTZA5JFV-5jbe4A5P.js +0 -1
  654. package/studio/web/assets/flowDiagram-A5DVABFB-Dp9Ezlow.js +0 -1
  655. package/studio/web/assets/index-aSt5tY-L.js +0 -824
  656. package/studio/web/assets/index.lazy-B9jiPwT8.js +0 -2
  657. package/studio/web/assets/notifications-CUoYgU98.js +0 -1
  658. package/studio/web/assets/railroad-abnf-HS5TGJTU-Bc0Qi0WH.js +0 -1
  659. package/studio/web/assets/railroad-ebnf-LZEXJU2U-G8rVVZ2C.js +0 -1
  660. package/studio/web/assets/railroad-peg-WCYAUIDC-CrehKBhC.js +0 -1
  661. package/studio/web/assets/stateDiagram-v2-4QOOHH4V-D4tuw9Su.js +0 -1
  662. package/studio/web/assets/status-D7Xn5ePA.js +0 -61
  663. package/studio/web/assets/swimlanesDiagram-VK2B7HYN-XOhmNEvq.js +0 -8
  664. package/studio/web/assets/vendor-core-RCcadM3e.js +0 -73
  665. package/studio/web/assets/vendor-datadog-BRv-mOv1.js +0 -6
  666. package/studio/web/assets/vendor-tanstack-BiFWSB3W.js +0 -1
  667. package/studio/web/assets/x-B9o9hsep.js +0 -1
  668. /package/studio/web/assets/{sizeCapture-X5ZJPWSS-B0uUizjq.js → sizeCapture-INFHLROL-B0uUizjq.js} +0 -0
@@ -1,11 +1,13 @@
1
1
  import {
2
2
  DatabaseTransaction,
3
+ shouldSpareCommitPhase,
3
4
  transactionOpenTooLongError,
4
5
  type CommitOptions,
5
6
  type TransactionWrite,
6
7
  type CommitResolution,
7
8
  } from './DatabaseTransaction';
8
9
  import { cleanupUnusedBlobs, collectRetainedFileIds } from './blob.ts';
10
+ import { ServerError } from '../utility/errors/hdbError.ts';
9
11
  import { getNextMonotonicTime } from '../utility/lmdb/commonUtility.ts';
10
12
  import * as harperLogger from '../utility/logging/harper_logger.ts';
11
13
  import type { Context } from './ResourceInterface.ts';
@@ -38,7 +40,7 @@ export class LMDBTransaction extends DatabaseTransaction {
38
40
  getReadTxn(): any {
39
41
  // used optimistically
40
42
  this.readTxnRefCount = (this.readTxnRefCount || 0) + 1;
41
- this.timeout = txnExpiration; // reset the timeout
43
+ this.timeout = Math.max(txnExpiration, this.timeoutBudget ?? 0); // reset the timeout
42
44
  if (this.stale) this.stale = false;
43
45
  if (this.readTxn) {
44
46
  if ((this.readTxn as any).openTimer) (this.readTxn as any).openTimer = 0;
@@ -153,6 +155,9 @@ export class LMDBTransaction extends DatabaseTransaction {
153
155
  // source writes will finish (with right to refuse/abort) before proceeeding to less
154
156
  // canonical sources.
155
157
  if (hasBefore) {
158
+ // see `committing` in DatabaseTransaction (issue #2062)
159
+ this.setCommitPhase(true);
160
+ const stagedWrites = this.writes.length;
156
161
  return (async () => {
157
162
  try {
158
163
  for (let phase = 0; phase < 2; phase++) {
@@ -172,9 +177,15 @@ export class LMDBTransaction extends DatabaseTransaction {
172
177
  if (completion) await (completion.push ? Promise.all(completion) : completion);
173
178
  }
174
179
  } catch (error) {
180
+ this.setCommitPhase(false);
175
181
  this.abort();
176
182
  throw error;
177
183
  }
184
+ this.setCommitPhase(false);
185
+ // aborted underneath us while parked above — see DatabaseTransaction's twin guard
186
+ if (this.timedOut) throw transactionOpenTooLongError();
187
+ if (stagedWrites > 0 && this.writes.length === 0 && this.open === TRANSACTION_STATE.CLOSED)
188
+ throw new ServerError('Transaction was aborted while its commit was waiting on pre-commit work', 500);
178
189
  return this.commit(options);
179
190
  })();
180
191
  }
@@ -372,10 +383,21 @@ let timer;
372
383
 
373
384
  function startMonitoringTxns() {
374
385
  timer = setInterval(function () {
386
+ const checkedCommitPhaseChains = new Set<DatabaseTransaction>();
375
387
  for (const txn of trackedTxns) {
388
+ const commitChainHead = txn.commitChainHead ?? txn;
376
389
  if (txn.timeout <= 0) {
377
390
  const url = (txn.getContext() as any)?.url;
378
- if (txn.hasPendingWrites() && !txn.sourceApply && !txn.isReplay) {
391
+ if (shouldSpareCommitPhase(txn, checkedCommitPhaseChains)) {
392
+ // see DatabaseTransaction's monitor (issue #2062)
393
+ harperLogger.warn?.(
394
+ `Transaction has been in its commit phase past the open-transaction limit, waiting on pre-commit work (e.g. a large blob write); letting it complete, from table: ${
395
+ (txn.db as any)?.name + (url ? ' path: ' + url : '')
396
+ }`,
397
+ ...(txn.startedFrom ? [`was started from ${txn.startedFrom.resourceName}.${txn.startedFrom.method}`] : [])
398
+ );
399
+ txn.timeout = Math.max(txnExpiration, txn.timeoutBudget ?? 0);
400
+ } else if (txn.hasPendingWrites() && !txn.sourceApply && !txn.isReplay) {
379
401
  // Abort and surface an error rather than force-committing a partial write set: silently
380
402
  // committing on the application's behalf breaks atomicity and can leave orphaned
381
403
  // secondary-index entries that only a full index rebuild repairs (issue #1407). The app
@@ -390,7 +412,7 @@ function startMonitoringTxns() {
390
412
  }`
391
413
  );
392
414
  try {
393
- txn.abortDueToTimeout();
415
+ commitChainHead.abortDueToTimeout();
394
416
  } catch (error) {
395
417
  harperLogger.debug?.(`Error aborting timed out transaction: ${error.message}`);
396
418
  }
@@ -408,7 +430,7 @@ function startMonitoringTxns() {
408
430
  } catch (error) {
409
431
  harperLogger.debug?.(`Error committing timed out transaction: ${error.message}`);
410
432
  }
411
- txn.timeout = txnExpiration;
433
+ txn.timeout = Math.max(txnExpiration, txn.timeoutBudget ?? 0);
412
434
  }
413
435
  } else {
414
436
  txn.timeout -= txnExpiration;
@@ -1,4 +1,4 @@
1
- import { RocksDatabase, type RocksDatabaseOptions, constants, type Store } from '@harperfast/rocksdb-js';
1
+ import { RocksDatabase, type RocksDatabaseOptions, constants, type Store, Transaction } from '@harperfast/rocksdb-js';
2
2
 
3
3
  const FRESH_VERSION_FLAG = constants.FRESH_VERSION_FLAG;
4
4
  import { WeakLRUCache } from 'weak-lru-cache';
@@ -41,6 +41,33 @@ export class PrimaryRocksDatabase extends RocksDatabase {
41
41
  }
42
42
  }
43
43
 
44
+ // Match LMDB's remove(key, version) contract without splitting the version check from the delete.
45
+ async removeIfVersion(id: any, version: number): Promise<boolean> {
46
+ let retried = false;
47
+ while (true) {
48
+ let transaction: Transaction | undefined;
49
+ try {
50
+ transaction = new Transaction(this.store);
51
+ const entry = this.#processEntry(super.getSync(id, { transaction }), id);
52
+ if (!entry || entry.version !== version) {
53
+ transaction.abort();
54
+ return false;
55
+ }
56
+ this.#cache?.delete(id);
57
+ super.removeSync(id, { transaction });
58
+ await transaction.commit();
59
+ return true;
60
+ } catch (error: any) {
61
+ try {
62
+ transaction?.abort();
63
+ } catch {}
64
+ // rocksdb-js reports a writer that committed between our read and our commit as ERR_BUSY
65
+ if (retried || error?.code !== 'ERR_BUSY') throw error;
66
+ retried = true;
67
+ }
68
+ }
69
+ }
70
+
44
71
  /**
45
72
  * Initialises encoder/decoder state. Must be called once after open() with the root
46
73
  * RocksDatabase. Equivalent to the RocksDB branch of handleLocalTimeForGets, but as
@@ -42,6 +42,33 @@ const StructonEncoder = createStructon(Encoder) as typeof Encoder;
42
42
  // monitoring; the store name is passed as the metric path.
43
43
  const MISSING_STRUCTURE_METRIC = 'decode-missing-structure';
44
44
 
45
+ // Reaching this bound is not an error: novel shapes fall back to plain msgpackr encoding, which
46
+ // round-trips correctly but gives up random-access field reads.
47
+ export const DEFAULT_MAX_TYPED_STRUCTURES = 256;
48
+
49
+ export interface StructureCounts {
50
+ typed: number;
51
+ classic: number;
52
+ typedLimit: number;
53
+ typedEnabled: boolean;
54
+ }
55
+
56
+ // Mirrors structon's onLoadedStructures over the four durable payload shapes it accepts. The
57
+ // bare-array and cbor-x forms carry named structures only; structon keeps the encoder's own typed
58
+ // dictionary for them, and they are written by the capped fallback path (msgpackr's base save
59
+ // overwriting the combined payload, before structon's best-effort re-save). That window is by
60
+ // definition a saturated store, so reporting zero there would show an empty dictionary at the one
61
+ // moment the count matters most.
62
+ function countDurableStructures(sharedData: any, localTyped: number): { typed: number; classic: number } {
63
+ if (!sharedData) return { typed: 0, classic: 0 };
64
+ if (sharedData instanceof Map)
65
+ return { typed: sharedData.get('typed')?.length ?? 0, classic: sharedData.get('named')?.length ?? 0 };
66
+ if (Array.isArray(sharedData)) return { typed: localTyped, classic: sharedData.length };
67
+ if (!sharedData.named && !sharedData.typed && Array.isArray(sharedData.structures))
68
+ return { typed: localTyped, classic: sharedData.structures.length };
69
+ return { typed: sharedData.typed?.length ?? 0, classic: sharedData.named?.length ?? 0 };
70
+ }
71
+
45
72
  // Terminal error messages msgpackr/structon throw when a record references a shared structure that
46
73
  // is not in this node's structures buffer. Both the typed (random-access) path (structon's
47
74
  // readStruct) and the classic path (msgpackr's createSecondByteReader) reload the structures from
@@ -77,6 +104,8 @@ export type Entry = {
77
104
  export const TIMESTAMP_PLACEHOLDER = new Uint8Array([1, 1, 1, 1, 4, 0x40, 0, 0]);
78
105
  // the first byte here indicates that we use the last timestamp
79
106
  export const LAST_TIMESTAMP_PLACEHOLDER = new Uint8Array([1, 1, 1, 1, 1, 0, 0, 0]);
107
+ // Never write this into an audit entry value: the substitution resolves to 2.0 when no previous time
108
+ // was recorded, and the audit format reads a leading byte other than 0x42 as "no field here". See harper#2247.
80
109
  export const PREVIOUS_TIMESTAMP_PLACEHOLDER = new Uint8Array([1, 1, 1, 1, 3, 0x40, 0, 0]);
81
110
  export const NEW_TIMESTAMP_PLACEHOLDER = new Uint8Array([1, 1, 1, 1, 0, 0x40, 0, 0]);
82
111
  export const LOCAL_TIMESTAMP = Symbol('local-timestamp');
@@ -95,6 +124,7 @@ export const HAS_NODE_ID = 64;
95
124
  export const PENDING_LOCAL_TIME = 1;
96
125
  export const HAS_STRUCTURE_UPDATE = 0x100;
97
126
  export const HAS_ADDITIONAL_AUDIT_REFS = 0x80;
127
+ export const VERSION_NOT_UNIQUE_FLAG = 0x10000;
98
128
 
99
129
  const TRACKED_WRITE_TYPES = new Set(['put', 'patch', 'delete', 'message', 'publish']);
100
130
  // For now we use this as the private property mechanism for mapping records to entries.
@@ -197,6 +227,10 @@ export class RecordEncoder extends StructonEncoder {
197
227
  declare saveStructures: any;
198
228
  declare getStructures: any;
199
229
  declare _writeStruct: any;
230
+ declare typedStructs: any[];
231
+ declare structures: any[];
232
+ declare maxOwnStructures: number;
233
+ randomAccessStructure = false;
200
234
  structureUpdate?: any;
201
235
  // Set by TableResource.updatedAttributes. Undefined for a store with no resolved attributes, which
202
236
  // is what keeps the projection off that store's writes entirely.
@@ -217,7 +251,7 @@ export class RecordEncoder extends StructonEncoder {
217
251
  // Bound the per-encoder typed-structure dictionary. It is append-only and pinned on the
218
252
  // long-lived primary store, so a wide/sparse schema (whose records vary by per-field value
219
253
  // width) can grow it unbounded and exhaust memory. Caller-overridable; default caps it.
220
- options.maxOwnStructures ??= 256;
254
+ options.maxOwnStructures ??= DEFAULT_MAX_TYPED_STRUCTURES;
221
255
  /**
222
256
  * The base class for records that provides the read-only methods for accessing
223
257
  * metadata and will be assigned computed property getters. On its own, these instances
@@ -233,6 +267,7 @@ export class RecordEncoder extends StructonEncoder {
233
267
  // (e.g. __dbis__, useVersions=false) must not — see the encode hook + harper#1307. Default to
234
268
  // true when unspecified so an option that doesn't propagate can't silently strip prefixes.
235
269
  this.useVersions = options.useVersions !== false;
270
+ this.randomAccessStructure = options.randomAccessStructure === true;
236
271
  // structon (the StructonEncoder base) always installs the struct write hook. For DBIs
237
272
  // that don't opt into struct mode (non-primary, e.g. __dbis__), force it to bail (return
238
273
  // 0) so objects are written in plain msgpackr records mode — decodable by readers without
@@ -417,12 +452,14 @@ export class RecordEncoder extends StructonEncoder {
417
452
  // HAS_STRUCTURE_UPDATE in the audit log for a structure that was never persisted.
418
453
  if (committed === true) {
419
454
  this.structureUpdate = structures;
455
+ this.checkStructureCapacity();
420
456
  return true;
421
457
  }
422
458
  return false;
423
459
  } else {
424
460
  const result = superSaveStructures.call(this, structures, isCompatible);
425
461
  this.structureUpdate = structures;
462
+ if (result !== false) this.checkStructureCapacity();
426
463
  return result;
427
464
  }
428
465
  };
@@ -432,10 +469,51 @@ export class RecordEncoder extends StructonEncoder {
432
469
  const buffer = this.rootStore.getBinarySync(sharedStructuresKey);
433
470
  return buffer ? this.decode(buffer) : undefined;
434
471
  } else {
435
- return superGetStructures.call(this);
472
+ // msgpackr only defines getStructures when the option was supplied; a store with no
473
+ // shared-structures mechanism has no durable dictionary to report.
474
+ return superGetStructures?.call(this);
436
475
  }
437
476
  };
438
477
  }
478
+ /**
479
+ * Sizes of this store's record-structure dictionaries. Read from the durable payload, not this
480
+ * encoder's arrays: each worker owns an encoder and loads lazily, so a worker that never encoded
481
+ * for this store holds empty arrays for a store whose dictionary is full.
482
+ */
483
+ getStructureCounts(): StructureCounts {
484
+ const { typed, classic } = countDurableStructures(this.getStructures(), this.typedStructs?.length ?? 0);
485
+ return {
486
+ typed,
487
+ classic,
488
+ typedLimit: this.maxOwnStructures ?? DEFAULT_MAX_TYPED_STRUCTURES,
489
+ typedEnabled: this.randomAccessStructure,
490
+ };
491
+ }
492
+ /**
493
+ * Warn once per encoder when its typed dictionary is at the bound. Fires from the post-save path,
494
+ * so it needs some structure save to happen -- any save, including a classic one -- and it needs
495
+ * this encoder to have loaded the dictionary. Several workers can therefore each warn for one
496
+ * table, and a worker that never saves after loading a full dictionary stays silent. The counts
497
+ * above are the reliable signal; this is the heads-up. It must not escape into the save's return
498
+ * value -- the structures are committed.
499
+ */
500
+ #reportedStructureSaturation = false;
501
+ checkStructureCapacity() {
502
+ if (this.#reportedStructureSaturation) return;
503
+ const typedLimit = this.maxOwnStructures ?? DEFAULT_MAX_TYPED_STRUCTURES;
504
+ if ((this.typedStructs?.length ?? 0) < typedLimit) return;
505
+ this.#reportedStructureSaturation = true;
506
+ try {
507
+ harperLogger.warn(
508
+ `Typed-structure dictionary for store ${this.name ?? this.rootStore?.name ?? '(unnamed)'} reached its limit of ` +
509
+ `${typedLimit} structures; new record shapes will be stored without random-access field ` +
510
+ 'encoding. Dictionary size follows the variety of shapes written -- field set, key order, ' +
511
+ 'and per-field value width -- not column count (see HarperFast/harper#2220).'
512
+ );
513
+ } catch {
514
+ // the structures are already committed; a failing sink must not fail the write
515
+ }
516
+ }
439
517
  decode(buffer, options) {
440
518
  lastMetadata = null;
441
519
  const start = options?.start || 0;
@@ -807,6 +885,9 @@ export function recordUpdater(store, tableId, auditStore) {
807
885
  : NO_TIMESTAMP;
808
886
  const expiresAt = options?.expiresAt;
809
887
  if (expiresAt >= 0) assignMetadata |= HAS_EXPIRATION;
888
+ if (isRocksDB && record !== undefined && existingEntry?.version != null && newVersion <= existingEntry.version) {
889
+ assignMetadata = Math.max(assignMetadata, 0) | VERSION_NOT_UNIQUE_FLAG;
890
+ }
810
891
  metadataInNextEncoding = assignMetadata;
811
892
  expiresAtNextEncoding = expiresAt;
812
893
  const putOptions: {
@@ -829,9 +910,9 @@ export function recordUpdater(store, tableId, auditStore) {
829
910
  metadataInNextEncoding |= HAS_RESIDENCY_ID;
830
911
  extendedType |= HAS_CURRENT_RESIDENCY_ID;
831
912
  } else residencyIdAtNextEncoding = 0;
832
- const nodeId = options?.nodeId ?? (audit ? getThisNodeId(auditStore) : undefined);
833
- if (nodeId >= 0) {
834
- nodeIdAtNextEncoding = nodeId;
913
+ const recordNodeId = options?.recordNodeId ?? options?.nodeId ?? (audit ? getThisNodeId(auditStore) : undefined);
914
+ if (recordNodeId >= 0) {
915
+ nodeIdAtNextEncoding = recordNodeId;
835
916
  metadataInNextEncoding |= HAS_NODE_ID;
836
917
  } else nodeIdAtNextEncoding = -1;
837
918
  const additionalAuditRefs = options?.additionalAuditRefs;
@@ -904,8 +985,22 @@ export function recordUpdater(store, tableId, auditStore) {
904
985
  const nodeId = options?.nodeId ?? getThisNodeId(auditStore) ?? 0;
905
986
  const viaNodeId = options?.viaNodeId ?? nodeId;
906
987
  if (resolveRecord && existingEntry?.localTime) {
907
- const replacingId = existingEntry?.localTime;
908
- const replacingEntry = auditStore.get(replacingId, tableId, id);
988
+ let replacingId = existingEntry.localTime;
989
+ let replacingEntry;
990
+ if (isRocksDB && existingEntry.additionalAuditRefs) {
991
+ for (const ref of existingEntry.additionalAuditRefs) {
992
+ const candidate = auditStore.get(ref.version, tableId, id, ref.nodeId);
993
+ if (
994
+ candidate?.version === existingEntry.version &&
995
+ (candidate.nodeId ?? 0) === (existingEntry.nodeId ?? 0)
996
+ ) {
997
+ replacingId = ref.version;
998
+ replacingEntry = candidate;
999
+ break;
1000
+ }
1001
+ }
1002
+ }
1003
+ replacingEntry ??= auditStore.get(replacingId, tableId, id, existingEntry.nodeId);
909
1004
  if (replacingEntry) {
910
1005
  const previousVersion = replacingEntry.previousVersion;
911
1006
  result = auditStore[isRocksDB ? 'putSync' : 'put'](
@@ -934,7 +1029,7 @@ export function recordUpdater(store, tableId, auditStore) {
934
1029
  result = auditStore[isRocksDB ? 'putSync' : 'put'](
935
1030
  record === undefined ? NEW_TIMESTAMP_PLACEHOLDER : LAST_TIMESTAMP_PLACEHOLDER,
936
1031
  {
937
- version: newVersion,
1032
+ version: options?.recordVersion ?? newVersion,
938
1033
  tableId,
939
1034
  recordId: id,
940
1035
  previousVersion: isRocksDB ? existingEntry?.version : existingEntry?.localTime,
@@ -36,6 +36,8 @@ export class RequestTarget extends URLSearchParams {
36
36
  declare select?: Select;
37
37
  /** Return an explanation of the query order */
38
38
  declare explain?: boolean;
39
+ /** Request a total count of matching records for pagination (REST `Prefer: count=exact|estimated`). */
40
+ declare count?: 'exact' | 'estimated';
39
41
  /** Force the query to be executed in the order of conditions */
40
42
  declare enforceExecutionOrder?: boolean;
41
43
  declare lazy?: boolean;
@@ -963,15 +963,23 @@ function registerLiveSubscriptionForContext(subscription: any, resource: any, ad
963
963
  // JWT exp of the bearer credential (set by the auth layer); undefined for password/mTLS/session.
964
964
  authExpiresAt: user.authExpiresAt,
965
965
  recheck: async () => {
966
- // Re-fetch current user state — the user/role cache is rebuilt on mutations — so a dropped or
967
- // role-stripped user no longer authorizes.
968
- const { findAndValidateUser } = require('../security/user');
969
- const fresh: any = await findAndValidateUser(username, undefined, false);
970
- if (!fresh?.role) return false;
971
- // Advance the subscription's context to the fresh user so downstream checks — context.user
972
- // and getCurrentUser() (which reads the resource's context) — evaluate against current state,
973
- // not the stale user captured at subscribe time.
974
- if (context) (context as any).user = fresh;
966
+ let fresh: any;
967
+ if (user._scopedToken) {
968
+ // A scoped token's identity IS its embedded role — never re-resolve its attribution
969
+ // username against hdb_user (it may not exist, or may name an unrelated principal
970
+ // created later). Expiry (authExpiresAt above) is its only revocation.
971
+ fresh = user;
972
+ } else {
973
+ // Re-fetch current user state — the user/role cache is rebuilt on mutations — so a dropped or
974
+ // role-stripped user no longer authorizes.
975
+ const { findAndValidateUser } = require('../security/user');
976
+ fresh = await findAndValidateUser(username, undefined, false);
977
+ if (!fresh?.role) return false;
978
+ // Advance the subscription's context to the fresh user so downstream checks — context.user
979
+ // and getCurrentUser() (which reads the resource's context) — evaluate against current state,
980
+ // not the stale user captured at subscribe time.
981
+ if (context) (context as any).user = fresh;
982
+ }
975
983
  // Re-run the same operation-level allowRead that granted the subscription.
976
984
  const reTarget: any = cloneRequestTarget(admittedTarget);
977
985
  reTarget.checkPermission = fresh.role?.permission;
@@ -4,6 +4,7 @@ import { DatabaseTransaction } from './DatabaseTransaction.ts';
4
4
  import { IterableEventQueue } from './IterableEventQueue.ts';
5
5
  import type { Entry, RecordObject } from './RecordEncoder.ts';
6
6
  import { RequestTarget } from './RequestTarget.ts';
7
+ import type { RecordLockOptions } from './recordLock.ts';
7
8
 
8
9
  export interface ResourceInterface<Record extends object = any>
9
10
  extends Partial<RecordObject>, Pick<UpdatableRecord<Record>, 'addTo' | 'subtractFrom'> {
@@ -45,6 +46,11 @@ export interface ResourceInterface<Record extends object = any>
45
46
 
46
47
  invalidate(target: RequestTargetOrId): void | Promise<void>;
47
48
 
49
+ /** Acquire an exclusive lock on a record and return it ready for updates (see `RecordLockOptions`) */
50
+ lock?(target?: RequestTargetOrId | RecordLockOptions, options?: RecordLockOptions): Promise<WritableRecord<Record>>;
51
+ /** Release the lock this instance holds; resolves true when this call cleared it */
52
+ unlock?(): Promise<boolean>;
53
+
48
54
  publish?(target: RequestTargetOrId, record: Record, options?: any): void;
49
55
  subscribe?(request: SubscriptionRequest): AsyncIterable<Record> | Promise<AsyncIterable<Record>>;
50
56
 
@@ -258,6 +264,23 @@ interface TypedUpdatableRecord<Record extends object, Property extends keyof Rec
258
264
  subtractFrom(property: Property, value: Record[Property]): void;
259
265
  }
260
266
 
267
+ export type { RecordLockOptions } from './recordLock.ts';
268
+
269
+ /**
270
+ * What `lock()` resolves with: the locked record, loaded after the lock committed and tracking
271
+ * changes for `save()`. Inside an explicit `transaction()` scope a scoped lock is released when
272
+ * that transaction commits or aborts. Outside any explicit scope (ImmediateTransaction context),
273
+ * a scoped lock persists until `unlock()` is called or the lease expires. A held lock
274
+ * (`{ hold: true }`) is always released by `unlock()` or its lease, regardless of scope.
275
+ */
276
+ export type WritableRecord<Record extends object = any> = UpdatableRecord<Record> & {
277
+ save(): void | Promise<void>;
278
+ update(updates?: Partial<Record>): unknown;
279
+ delete(target?: RequestTargetOrId): boolean | Promise<boolean>;
280
+ lock(target?: RequestTargetOrId | RecordLockOptions, options?: RecordLockOptions): Promise<WritableRecord<Record>>;
281
+ unlock(): Promise<boolean>;
282
+ };
283
+
261
284
  export interface Subscription<Event extends object = any> extends IterableEventQueue<Event> {
262
285
  new (listener: Listener<Event>);
263
286
 
@@ -1,4 +1,6 @@
1
1
  import {
2
+ type CountEstimate,
3
+ type CountEstimateOptions,
2
4
  DBI,
3
5
  type StoreIteratorOptions,
4
6
  type StorePutOptions,
@@ -14,6 +16,25 @@ declare module '@harperfast/rocksdb-js' {
14
16
  }
15
17
  }
16
18
 
19
+ /**
20
+ * Widen value-space bounds to `[value, MAXIMUM_KEY]` composite bounds. The base implementation's
21
+ * encoded-byte successor of the bare indexed value would exclude the wrong entries on composite
22
+ * `[indexedValue, primaryKey]` keys.
23
+ */
24
+ function translateIndexBounds<
25
+ T extends { start?: any; end?: any; exclusiveStart?: boolean; inclusiveEnd?: boolean; reverse?: boolean },
26
+ >(options: T): T {
27
+ let { start, end } = options;
28
+ const { exclusiveStart, inclusiveEnd, reverse } = options;
29
+ if ((reverse ? !exclusiveStart : exclusiveStart) && start !== undefined) {
30
+ start = [start, MAXIMUM_KEY];
31
+ }
32
+ if ((reverse ? !inclusiveEnd : inclusiveEnd) && end !== undefined) {
33
+ end = [end, MAXIMUM_KEY];
34
+ }
35
+ return { ...options, start, end };
36
+ }
37
+
17
38
  /**
18
39
  * A specialized RocksDB-based index store that maintains indexed references to primary keys.
19
40
  * This store uses composite keys consisting of indexed values and primary keys, enabling
@@ -27,19 +48,19 @@ export class RocksIndexStore extends RocksDatabase {
27
48
  * @param options
28
49
  */
29
50
  getRange(options: StoreIteratorOptions): Iterable<any> {
30
- let { start, end, exclusiveStart, inclusiveEnd, reverse } = options;
31
- if ((reverse ? !exclusiveStart : exclusiveStart) && start !== undefined) {
32
- start = [start, MAXIMUM_KEY];
33
- }
34
- if ((reverse ? !inclusiveEnd : inclusiveEnd) && end !== undefined) {
35
- end = [end, MAXIMUM_KEY];
36
- }
37
- const translatedOptions = { ...options, start, end };
38
- return super.getRange(translatedOptions).map(({ key }) => {
51
+ return super.getRange(translateIndexBounds(options)).map(({ key }) => {
39
52
  return { key: key[0], value: key.length > 2 ? key.slice(1) : key[1] };
40
53
  });
41
54
  }
42
55
 
56
+ /**
57
+ * Estimate the entry count of a range of indexed values. Shares `getRange`'s bound translation
58
+ * so a planner estimate always covers exactly the range execution would iterate.
59
+ */
60
+ estimateCount(options?: CountEstimateOptions): CountEstimate {
61
+ return super.estimateCount(translateIndexBounds(options ?? {}));
62
+ }
63
+
43
64
  /**
44
65
  * Translate a put with indexed value and primary key to an underlying put
45
66
  * @param indexedValue - ignored, only used by LMDB