@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
@@ -47,6 +47,8 @@ import { handleHDBError, hdbErrors } from '../utility/errors/hdbError.ts';
47
47
  import * as regDeprecated from '../resources/registrationDeprecated.ts';
48
48
  import * as deploymentOperations from '../components/deploymentOperations.ts';
49
49
  import * as secretOperations from '../components/secretOperations.ts';
50
+ import * as trustPolicyOperations from '../security/authn/oidc/trustPolicyOperations.ts';
51
+ import * as tokenExchange from '../security/authn/oidc/tokenExchange.ts';
50
52
 
51
53
  const requiredPermissions = new Map();
52
54
  const DELETE_PERM = 'delete';
@@ -88,6 +90,8 @@ const BULK_OPS = {
88
90
  CSV_FILE_LOAD: 'csvFileLoad',
89
91
  IMPORT_FROM_S3: 'importFromS3',
90
92
  };
93
+ /** The same set, precomputed: `isBulkLoadOperation` runs on every operations authorization. */
94
+ const BULK_OP_NAMES = new Set(Object.values(BULK_OPS));
91
95
 
92
96
  const STRUCTURE_USER_OPS = [
93
97
  schema.createTable.name,
@@ -147,6 +151,13 @@ requiredPermissions.set(
147
151
  write.upsert.name,
148
152
  new (permission as any)(false, [INSERT_PERM, UPDATE_PERM], terms.OPERATIONS_ENUM.UPSERT)
149
153
  );
154
+ // Same grants as `upsert`, and the same as REST `PUT` enforces: creating needs insert, replacing an
155
+ // existing record needs update. A full replace can DROP attributes, which is why the
156
+ // attribute-scoped denial below applies to it.
157
+ requiredPermissions.set(
158
+ write.put.name,
159
+ new (permission as any)(false, [INSERT_PERM, UPDATE_PERM], terms.OPERATIONS_ENUM.PUT)
160
+ );
150
161
  requiredPermissions.set(
151
162
  search.searchByConditions.name,
152
163
  new (permission as any)(false, [READ_PERM], terms.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS)
@@ -359,6 +370,28 @@ requiredPermissions.set(
359
370
  new (permission as any)(true, [], terms.OPERATIONS_ENUM.GET_SECRETS_PUBLIC_KEY)
360
371
  );
361
372
 
373
+ // OIDC trust policies (#2171). A policy lets an external CI run authenticate as a Harper user, so
374
+ // these are SU-only; the handlers ALSO enforce super_user directly so they cannot be delegated
375
+ // through a role's `operations` allowlist (gate-2 bypass below).
376
+ requiredPermissions.set(
377
+ trustPolicyOperations.addOidcTrust.name,
378
+ new (permission as any)(true, [], terms.OPERATIONS_ENUM.ADD_OIDC_TRUST)
379
+ );
380
+ requiredPermissions.set(
381
+ trustPolicyOperations.listOidcTrust.name,
382
+ new (permission as any)(true, [], terms.OPERATIONS_ENUM.LIST_OIDC_TRUST)
383
+ );
384
+ requiredPermissions.set(
385
+ trustPolicyOperations.dropOidcTrust.name,
386
+ new (permission as any)(true, [], terms.OPERATIONS_ENUM.DROP_OIDC_TRUST)
387
+ );
388
+ // The exchange is unauthenticated by design — it authenticates its own caller against a trust
389
+ // policy, the way create_authentication_tokens does against a password.
390
+ requiredPermissions.set(
391
+ tokenExchange.exchangeOidcToken.name,
392
+ new (permission as any)(false, [], terms.OPERATIONS_ENUM.EXCHANGE_OIDC_TOKEN)
393
+ );
394
+
362
395
  //Below are functions that are currently open to all roles
363
396
  requiredPermissions.set(regDeprecated.getRegistrationInfo.name, new (permission as any)(false, []));
364
397
  requiredPermissions.set(user.userInfo.name, new (permission as any)(false, [], terms.OPERATIONS_ENUM.USER_INFO));
@@ -406,6 +439,7 @@ requiredPermissions.set(terms.VALID_SQL_OPS_ENUM.UPDATE, new (permission as any)
406
439
  module.exports = {
407
440
  verifyPerms,
408
441
  verifyPermsAST,
442
+ verifyOperationsAllowlist,
409
443
  verifyBulkLoadAttributePerms,
410
444
  registerOperationPermission,
411
445
  unregisterOperationPermission,
@@ -418,7 +452,77 @@ module.exports = {
418
452
  * @param operation - The operation specified in the call.
419
453
  * @returns {null | PermissionResponseObject} - null if permissions match, errors returned in the PermissionResponseObject
420
454
  */
421
- export function verifyPermsAST(ast, userObject, operation) {
455
+ /**
456
+ * Token-scoped narrowing: a minted operation token may carry a subset of what its user's role allows,
457
+ * so one credential can be handed out with less authority than the user has (an OIDC trust policy
458
+ * uses this to scope a single workflow). Returns a denial, or undefined when the scope permits — or
459
+ * when there is no scope, which is every token minted before this existed.
460
+ *
461
+ * Shared by verifyPerms AND verifyPermsAST, and called first in both. Four ways this gets bypassed
462
+ * if it moves or is incomplete:
463
+ *
464
+ * 1. `sql` dispatches to verifyPermsAST, in a branch mutually exclusive with the verifyPerms call
465
+ * (server/serverHelpers/serverUtilities.ts). A gate in only one of them means a token scoped to
466
+ * `get_status` can still run arbitrary SQL against whatever its role can reach.
467
+ * 2. Both functions `return null` early for a super_user — the identity that most needs constraining.
468
+ * 3. verifyPerms' `operations` gate 2 also returns null, treating an explicit listing of an SU-only
469
+ * operation as a deliberate grant.
470
+ * 4. Operations that never reach verifyPerms at all: create_authentication_tokens (NO_AUTH),
471
+ * refresh_operation_token, and impersonation each PRODUCE a new credential or principal, so the
472
+ * scope has to be carried forward there too or a scoped token mints an unscoped one. That carry-
473
+ * forward lives in tokenAuthentication.ts and impersonation.ts, not here.
474
+ *
475
+ * It can only subtract. The scope is deliberately NOT merged into `permission.operations`, because
476
+ * that field is not purely narrowing (see gate 2) — merging into it could widen instead.
477
+ *
478
+ * `apiOperation` MUST be the snake_case API operation the caller actually invoked (`deploy_component`,
479
+ * `sql`, `export_local`, ...) — i.e. `requestJson.operation`, the same namespace the policy's scope is
480
+ * written in. It is emphatically NOT the handler function name: many handlers have no `api_name`
481
+ * mapping (deploy_component → `deployComponent`) and some are shared across operations
482
+ * (`search_by_id`/`search_by_hash`), so resolving the scope name from the handler both denies the
483
+ * feature's own headline op and conflates aliases. Callers pass the real operation.
484
+ */
485
+ function tokenScopeDenial(userObject: any, apiOperation: string) {
486
+ // `!= null`, not `!== undefined`: an unscoped policy stores `operations: null`, and expanding a
487
+ // null would throw rather than fall through to the role.
488
+ const tokenOperations = userObject?.tokenOperations;
489
+ if (tokenOperations == null) return undefined;
490
+
491
+ // `instanceof Set`, not just presence: this memo rides on hdb_user, and a job persists that user
492
+ // into hdb_job.request, where msgpackr round-trips a Set back as a plain Array. Trusting the
493
+ // memo's presence would then call .has() on an Array and throw a TypeError out of the auth gate
494
+ // — still fail-closed, but as a 500 rather than a denial, and only inside a job worker.
495
+ let scopedOps = userObject._expandedTokenOperations;
496
+ if (!(scopedOps instanceof Set)) {
497
+ scopedOps = userObject._expandedTokenOperations = expandOperationsPerms(tokenOperations);
498
+ }
499
+ if (scopedOps.has(apiOperation)) return undefined;
500
+
501
+ harperLogger.info(`Operation '${apiOperation}' is outside the scope of the presented token`);
502
+ return new PermissionResponseObject().handleUnauthorizedItem(HDB_ERROR_MSGS.OP_NOT_IN_OPERATIONS(apiOperation));
503
+ }
504
+
505
+ /**
506
+ * A scope naming `sql` grants the SQL interface, not unrestricted DML through it.
507
+ *
508
+ * `read_only` expands to include `sql` — the group defers DML enforcement to table CRUD permissions
509
+ * (see its note in operationPermissions.ts) — but verifyPermsAST returns null outright for a
510
+ * super_user before any table check runs. Without this, a token scoped to `read_only` could DELETE,
511
+ * which is the one thing that name promises it cannot do.
512
+ *
513
+ * So a write statement additionally requires its matching data operation in scope. That is exactly
514
+ * what separates `read_only` (no insert/update/delete) from `standard_user` (all three), with no
515
+ * need to track which group admitted `sql`. A bare `['sql']` therefore admits SELECT only; name the
516
+ * write operations alongside it to allow more. Anything that is not a recognized SELECT falls
517
+ * through to the same check and is denied unless named, so an unfamiliar statement type fails closed.
518
+ */
519
+ function sqlWriteScopeDenial(userObject: any, sqlVariant: string) {
520
+ if (userObject?.tokenOperations == null) return undefined;
521
+ if (sqlVariant === terms.VALID_SQL_OPS_ENUM.SELECT) return undefined;
522
+ return tokenScopeDenial(userObject, sqlVariant);
523
+ }
524
+
525
+ export function verifyPermsAST(ast, userObject, operation, apiOperation = terms.OPERATIONS_ENUM.SQL) {
422
526
  //TODO - update these validation checks to use validate.js
423
527
  if (commonUtils.isEmptyOrZeroLength(ast)) {
424
528
  harperLogger.info('verify_perms_ast has an empty user parameter');
@@ -432,6 +536,15 @@ export function verifyPermsAST(ast, userObject, operation) {
432
536
  harperLogger.info('verify_perms_ast has a null operation parameter');
433
537
  throw handleHDBError(new Error());
434
538
  }
539
+
540
+ // `operation` here is the SQL statement variant (select/insert/...), not the API operation. The
541
+ // scope is checked against `apiOperation` — the top-level operation the caller invoked, which is
542
+ // `sql` for a direct SQL call but `export_local`/`export_to_s3` for a job whose inner
543
+ // search_operation is SQL. Checking a hardcoded `sql` would let a token scoped only to `sql` start
544
+ // an export that its scope excludes. Ahead of the super_user bypass, as on the NoSQL path.
545
+ const scopeDenial = tokenScopeDenial(userObject, apiOperation) ?? sqlWriteScopeDenial(userObject, operation);
546
+ if (scopeDenial) return scopeDenial;
547
+
435
548
  try {
436
549
  const bucketModule = require('../sqlTranslator/sql_statement_bucket');
437
550
  const bucket = bucketModule.default || bucketModule;
@@ -520,6 +633,28 @@ export function verifyPermsAST(ast, userObject, operation) {
520
633
  }
521
634
  }
522
635
 
636
+ /**
637
+ * Gate 1 of the role `operations` allowlist, callable from every authorization path. The SQL path
638
+ * (chooseOperation → checkASTPermissions) never reaches verifyPerms, so it must call this
639
+ * directly — otherwise an allowlisted role could reach unlisted operations through `sql`.
640
+ * Returns null when allowed (or no allowlist present), a PermissionResponseObject denial otherwise.
641
+ */
642
+ export function verifyOperationsAllowlist(requestJson: any, operationFunctionName: string) {
643
+ const rolePermission = requestJson.hdb_user?.role?.permission;
644
+ const allowedOperationsList = rolePermission?.operations;
645
+ if (allowedOperationsList == null) return null;
646
+ // _expandedOperations is pre-built at cache-load time (O(1) lookup).
647
+ // Fall back to on-demand expansion for inline-asserted roles (e.g. impersonation via hdb_user in body).
648
+ const allowedOps = rolePermission._expandedOperations ?? expandOperationsPerms(allowedOperationsList);
649
+ // operationFunctionName is the internal camelCase function name; allowedOps contains snake_case
650
+ // API names. Resolve via the api_name stored on the permission entry (set at registration time).
651
+ const opApiName = requiredPermissions.get(operationFunctionName)?.api_name ?? operationFunctionName;
652
+ if (!allowedOps.has(opApiName)) {
653
+ return new PermissionResponseObject().handleUnauthorizedItem(HDB_ERROR_MSGS.OP_NOT_IN_OPERATIONS(opApiName));
654
+ }
655
+ return null;
656
+ }
657
+
523
658
  /**
524
659
  * Verifies permissions and restrictions for the NoSQL operation based on the user's assigned role.
525
660
  *
@@ -527,7 +662,7 @@ export function verifyPermsAST(ast, userObject, operation) {
527
662
  * @param operation - The name of the operation specified in the request.
528
663
  * @returns { null | PermissionResponseObject } - null if permissions match, errors are consolidated into PermissionResponseObj.
529
664
  */
530
- export function verifyPerms(requestJson: any, operation: any, _options?: any) {
665
+ export function verifyPerms(requestJson: any, operation: any, options?: { apiOperation?: string }) {
531
666
  if (
532
667
  requestJson === null ||
533
668
  operation === null ||
@@ -546,18 +681,51 @@ export function verifyPerms(requestJson: any, operation: any, _options?: any) {
546
681
  op = operation;
547
682
  }
548
683
  //we need to use the action value, if present, to ensure the correct permission is checked below
549
- let action = requestJson.action;
550
-
551
- let operationSchema = requestJson.schema ?? requestJson.database;
684
+ // `action` narrows the required permissions to just that one — `hasPermissions` does it for table
685
+ // permissions and `checkAttributePerms` for attribute permissions — because a bulk load carries
686
+ // `action: insert|update|upsert` and only needs the permission for what it will actually do.
687
+ //
688
+ // Honoured ONLY for a real bulk-load operation. `action` is an unknown-but-accepted key on the
689
+ // shared write validator, so taking it from any request let a caller pick which half of an
690
+ // operation's permissions to be checked against: `{operation:'put', action:'insert'}` from a role
691
+ // with `insert: true, update: false` replaced an existing record, and `action:'update'` created a
692
+ // missing one with no insert permission. `upsert` had the same shape before `put` existed.
693
+ //
694
+ // Both narrowing sites read this one variable, so gating it here covers both. The bulk path is
695
+ // unaffected: `verifyBulkLoadAttributePerms` receives the real action from
696
+ // `bulkLoad.validateChunk`, not from here.
697
+ let action = isBulkLoadOperation(op) ? requestJson.action : undefined;
698
+
699
+ // Resolved through the same helper the handlers use (`transformReq` delegates to it), because
700
+ // authorization runs BEFORE `transformReq` and any disagreement about the target means the
701
+ // permissions checked are not the permissions for the write that happens. This used to be a
702
+ // local `schema ?? database`, which diverged from the handlers in two separately exploitable
703
+ // ways: it kept a falsy-but-present `database: 0` instead of defaulting, and it preferred
704
+ // `schema` where the handlers prefer `database` — so a request could be authorized against one
705
+ // database and written to another. With no target resolved at all, `schemaTableMap` stayed empty
706
+ // and `hasPermissions` iterated nothing, authorizing by vacuous truth.
707
+ let operationSchema = commonUtils.resolveTargetDatabase(requestJson);
552
708
  let table = requestJson.table;
553
709
 
554
710
  let schemaTableMap = new Map();
555
- if (operationSchema && table) {
711
+ // `table != undefined`, not truthy: `hdbTable` is `Joi.alternatives(Joi.string(), Joi.number())`
712
+ // (validation/common_validators.ts), so a table named `0` validates and a truthy test drops it
713
+ // from the map — leaving `hasPermissions` nothing to iterate, which authorizes by vacuous truth.
714
+ // The same falsy-vs-nullish distinction the database resolution above turns on.
715
+ if (operationSchema != undefined && table != undefined) {
556
716
  schemaTableMap.set(operationSchema, [table]);
557
717
  }
558
718
 
559
719
  const permsResponse = new PermissionResponseObject();
560
720
 
721
+ // The top-level API operation the caller invoked — the namespace the policy scope is written in.
722
+ // For a job (export_local/export_to_s3), the dispatcher passes the nested search_operation as
723
+ // requestJson, so requestJson.operation is the *inner* op (e.g. search_by_conditions); the caller
724
+ // threads the real top-level op through `options.apiOperation` so a read-scoped token cannot ride
725
+ // an export. Never `op` (the handler name), which would deny deploy_component and conflate aliases.
726
+ const scopeDenial = tokenScopeDenial(requestJson.hdb_user, options?.apiOperation ?? requestJson.operation);
727
+ if (scopeDenial) return scopeDenial;
728
+
561
729
  if (
562
730
  commonUtils.isEmptyOrZeroLength(requestJson.hdb_user?.role) ||
563
731
  commonUtils.isEmptyOrZeroLength(requestJson.hdb_user?.role?.permission)
@@ -568,6 +736,15 @@ export function verifyPerms(requestJson: any, operation: any, _options?: any) {
568
736
  return permsResponse.handleUnauthorizedItem(HDB_ERROR_MSGS.USER_HAS_NO_PERMS(requestJson.hdb_user?.username));
569
737
  }
570
738
 
739
+ // Gate 1 of the optional `operations` allowlist: when present, only ops explicitly listed (or
740
+ // expanded from a group) are reachable. This must run before EVERY privilege early-return below
741
+ // (super_user, structure_user, system-table allowances) — otherwise a role combining one of
742
+ // those flags with a restrictive allowlist could reach ops outside its list. Gate 2 (the
743
+ // SU-only-op bypass for explicitly listed ops) stays below, after the ambient privilege checks.
744
+ const allowlistDenial = verifyOperationsAllowlist(requestJson, op);
745
+ if (allowlistDenial) return allowlistDenial;
746
+ const allowedOperationsList = requestJson.hdb_user?.role?.permission?.operations;
747
+
571
748
  const isSuperUser = !!requestJson.hdb_user?.role?.permission?.super_user;
572
749
  const structureUser = requestJson.hdb_user?.role?.permission?.structure_user;
573
750
  // set to true if this operation affects a system table. Only su can read from system tables, but can't update/delete.
@@ -618,36 +795,18 @@ export function verifyPerms(requestJson: any, operation: any, _options?: any) {
618
795
  );
619
796
  }
620
797
 
621
- // operations is an optional allowlist on the role. When present, it acts as a two-gate check:
622
- // Gate 1 — operation allowlist: only ops explicitly listed (or expanded from a group) are reachable.
623
- // Any unlisted op is denied here, before table CRUD checks even run.
624
- // Gate 2 — SU bypass: if the op passed gate 1 and is normally restricted to super_user, the explicit
625
- // listing is treated as a deliberate admin grant and allowed immediately (return null).
626
- // Non-SU ops that pass gate 1 fall through to the normal table CRUD checks below.
627
- const permission = requestJson.hdb_user?.role?.permission;
628
- const operations = permission?.operations;
629
- if (operations !== undefined) {
630
- // _expandedOperations is pre-built at cache-load time (O(1) lookup).
631
- // Fall back to on-demand expansion for inline-asserted roles (e.g. impersonation via hdb_user in body).
632
- const allowedOps = permission._expandedOperations ?? expandOperationsPerms(operations);
633
- // op is the internal camelCase function name; allowedOps contains snake_case API names.
634
- // Resolve via the api_name stored on the permission entry (set at registration time).
635
- const opApiName = requiredPermissions.get(op)?.api_name ?? op;
636
- // Gate 1: op not in allowlist — deny regardless of table CRUD permissions.
637
- if (!allowedOps.has(opApiName)) {
638
- return permsResponse.handleUnauthorizedItem(HDB_ERROR_MSGS.OP_NOT_IN_OPERATIONS(opApiName));
639
- }
640
- // Gate 2: op is SU-only but was explicitly granted via operations — allow without super_user.
641
- // Without this, the SU check further below would still deny it even though it passed gate 1.
642
- // TODO: ops registered with both requires_su AND non-empty CRUD perms have their table-level
643
- // CRUD check bypassed here. Should fall through for those instead of returning null
644
- // unconditionally. The managed-backup ops share this shape but self-enforce super_user in their
645
- // handlers/validators (dataLayer/rocksdbBackup.ts requireSuperUser), so they are not delegable
646
- // regardless; get_backup remains the one that relies solely on this gate. Low risk today but
647
- // worth tightening.
648
- if (requiredPermissions.get(op)?.requires_su) {
649
- return null;
650
- }
798
+ // Gate 2 of the `operations` allowlist (gate 1 ran above, before the privilege early-returns):
799
+ // the op passed the allowlist, so if it is normally restricted to super_user, the explicit
800
+ // listing is treated as a deliberate admin grant and allowed immediately (return null).
801
+ // Non-SU ops that passed gate 1 fall through to the normal table CRUD checks below.
802
+ // TODO: ops registered with both requires_su AND non-empty CRUD perms have their table-level
803
+ // CRUD check bypassed here. Should fall through for those instead of returning null
804
+ // unconditionally. The managed-backup ops share this shape but self-enforce super_user in their
805
+ // handlers/validators (dataLayer/rocksdbBackup.ts requireSuperUser), so they are not delegable
806
+ // regardless; get_backup remains the one that relies solely on this gate. Low risk today but
807
+ // worth tightening.
808
+ if (allowedOperationsList !== undefined && requiredPermissions.get(op)?.requires_su) {
809
+ return null;
651
810
  }
652
811
 
653
812
  const fullRolePerms = permsTranslator.getRolePermissions(requestJson.hdb_user?.role);
@@ -676,6 +835,16 @@ export function verifyPerms(requestJson: any, operation: any, _options?: any) {
676
835
  }
677
836
  }
678
837
 
838
+ // Fail closed on an unresolved target. `hasPermissions` iterates `schemaTableMap`, so an empty map
839
+ // authorizes by vacuous truth — the shape of this whole bug class, and of the SQL path's
840
+ // GHSA-5c29-q62v-jrwf, whose fix carries the same backstop. `resolveTargetDatabase` always
841
+ // returns a database, so a named table always populates the map and this is unreachable today; it
842
+ // is here so that a future change to target resolution fails safe instead of silently authorizing
843
+ // everything. That also means no test can cover it, which is the point rather than an omission.
844
+ if (table != undefined && schemaTableMap.size === 0) {
845
+ return permsResponse.handleUnauthorizedItem(HDB_ERROR_MSGS.UNKNOWN_OP_AUTH_ERROR(op, operationSchema, table));
846
+ }
847
+
679
848
  let failedPermissions = hasPermissions(requestJson.hdb_user, op, schemaTableMap, permsResponse, action);
680
849
  //check if failedTablePerms are back and return them B/C it will be an op-level permission issue
681
850
  if (failedPermissions) {
@@ -706,8 +875,17 @@ export function verifyPerms(requestJson: any, operation: any, _options?: any) {
706
875
  }
707
876
  }
708
877
 
709
- const recordAttrs = getRecordAttributes(requestJson);
878
+ const recordAttrs = getRecordAttributes(requestJson, op);
710
879
  const attrPermissions = getAttributePermissions(requestJson.hdb_user?.role?.permission, operationSchema, table);
880
+ // A `put` replaces the whole record, so it REMOVES every attribute the request omits — and
881
+ // `checkAttributePerms` below only sees the attributes a request SUPPLIES, so it cannot police
882
+ // those removals. An attribute-scoped role could otherwise erase an attribute it has no `update`
883
+ // permission for by leaving it out. REST closes the same gap in `Table.allowUpdate` by restoring
884
+ // such attributes from the stored record, which needs the stored record; this runs before anything
885
+ // is read, so it denies instead. Roles that scope no attribute are unaffected.
886
+ if (attrPermissions.size > 0 && op === write.put.name) {
887
+ return permsResponse.handleUnauthorizedItem(HDB_ERROR_MSGS.PUT_WITH_ATTRIBUTE_PERMS(operationSchema, table));
888
+ }
711
889
  checkAttributePerms(recordAttrs, attrPermissions, op, table, operationSchema, permsResponse, action);
712
890
 
713
891
  //This result value will be null if no perms issues were found in checkAttributePerms
@@ -913,12 +1091,20 @@ export function checkAttributePerms(
913
1091
  * @param json - json containing the request
914
1092
  * @returns {Set} - all attributes affected by the request statement.
915
1093
  */
916
- function getRecordAttributes(json) {
1094
+ /** Whether the operation checks attribute permissions per chunk rather than from this request. */
1095
+ function isBulkLoadOperation(operationName): boolean {
1096
+ return BULK_OP_NAMES.has(operationName);
1097
+ }
1098
+
1099
+ function getRecordAttributes(json, operationName?) {
917
1100
  let affectedAttributes = new Set();
918
1101
  try {
919
- //Bulk load operations need to have attr-level permissions checked during the validateChunk step of the operation
920
- // in the bulkLoad.js methods
921
- if (json.action) {
1102
+ // Bulk load operations have their attribute permissions checked per chunk instead, in
1103
+ // `bulkLoad.validateChunk` — the records aren't in this request. That opt-out is keyed on the
1104
+ // OPERATION, never on the caller-supplied `action` field: `action` is an unknown-but-accepted
1105
+ // key on the insert/update/upsert validator, so inferring the opt-out from its presence let any
1106
+ // direct request skip every attribute check by adding `action: "update"` to the body.
1107
+ if (isBulkLoadOperation(operationName)) {
922
1108
  return affectedAttributes;
923
1109
  }
924
1110
  if (json.operation === terms.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS) {
@@ -980,7 +1166,10 @@ export function getAttributePermissions(rolePerms, operationSchema, table) {
980
1166
  }
981
1167
  //Some commands do not require a table to be specified. If there is no table, there is likely not
982
1168
  // anything attribute permissions needs to check.
983
- if (!operationSchema || !table) {
1169
+ // Nullish rather than falsy for the same reason as the map guard in verifyPerms: a table named `0`
1170
+ // validates (`hdbTable` accepts a number), and skipping it here means its attribute permissions
1171
+ // go unchecked.
1172
+ if (operationSchema == undefined || table == undefined) {
984
1173
  return roleAttributePermissions;
985
1174
  }
986
1175
  try {
@@ -0,0 +1,63 @@
1
+ import { realpathSync } from 'node:fs';
2
+ import { basename, dirname, join } from 'node:path';
3
+ import { loggerWithTag } from './logging/harper_logger.ts';
4
+
5
+ const watchPathLogger = loggerWithTag('watcher');
6
+ let canonicalizationWarned = false;
7
+
8
+ /**
9
+ * Canonicalize an absolute path before it is handed to a native file watch (`fs.watch`, directly or
10
+ * through chokidar).
11
+ *
12
+ * libuv's Windows fs-event callback rebuilds each event's absolute path, expands it with
13
+ * `GetLongPathNameW`, and then asserts the expansion still starts with the directory it stored when
14
+ * the watch was armed. An 8.3 short directory (`C:\Users\RUNNER~1\...`) never survives that
15
+ * comparison, and the assertion aborts the process rather than failing the watch, so a short path
16
+ * reaching a native watch takes down the whole server (harper#2234).
17
+ *
18
+ * Every Windows path is resolved rather than only the ones that look short: `GetLongPathNameW`'s
19
+ * documentation is explicit that a short name need not contain a tilde, and NTFS allows an
20
+ * explicitly assigned one, so any spelling test would leave the abort reachable. `realpathSync` is
21
+ * not a substitute for the `.native` variant — it resolves symlinks but leaves 8.3 names intact.
22
+ *
23
+ * Returns `undefined` when the long form cannot be established, because a path we cannot prove is
24
+ * expanded is exactly the one that must never reach a native watch.
25
+ */
26
+ export function canonicalizeWatchPath(watchPath: string, platform: string = process.platform): string | undefined {
27
+ if (platform !== 'win32') return watchPath;
28
+ try {
29
+ return realpathSync.native(watchPath);
30
+ } catch (error) {
31
+ if (!error || typeof error !== 'object' || !('code' in error) || error.code !== 'ENOENT') return undefined;
32
+ // libuv stores only the parent directory of a file target and compares only that prefix, so a
33
+ // leaf that does not exist yet — a config file whose watcher is armed during the install window
34
+ // — still yields a watch path that cannot trip the assertion.
35
+ try {
36
+ return join(realpathSync.native(dirname(watchPath)), basename(watchPath));
37
+ } catch {
38
+ return undefined;
39
+ }
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Watch target for a chokidar/`fs.watch` call: the canonical path, or the original path with
45
+ * `mustPoll`, which callers turn into their polling options. Polling stats the file instead of
46
+ * arming a native watch, so it cannot reach the abort.
47
+ */
48
+ export function resolveWatchTarget(watchPath: string): { path: string; mustPoll: boolean } {
49
+ const canonical = canonicalizeWatchPath(watchPath);
50
+ if (canonical !== undefined) return { path: canonical, mustPoll: false };
51
+ if (!canonicalizationWarned) {
52
+ canonicalizationWarned = true;
53
+ watchPathLogger.warn?.(
54
+ `Could not resolve the long-path form of ${watchPath}. Falling back to polling-based watching for ` +
55
+ 'affected watchers, because handing a Windows 8.3 short path to a native watch aborts the process.'
56
+ );
57
+ }
58
+ return { path: watchPath, mustPoll: true };
59
+ }
60
+
61
+ export function _resetForTests(): void {
62
+ canonicalizationWarned = false;
63
+ }