@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,17 @@
1
1
  import * as hdbTerms from '../utility/hdbTerms.ts';
2
2
  import * as hdbUtils from '../utility/common_utils.ts';
3
3
  import logger from '../utility/logging/harper_logger.ts';
4
- import { configValidator, getDomainSocketPathLengthWarning } from '../validation/configValidator.ts';
4
+ import {
5
+ configValidator,
6
+ getDomainSocketPathLengthWarning,
7
+ isLegacySqlApplicationEntry,
8
+ } from '../validation/configValidator.ts';
9
+ import { isReservedComponentName } from '../utility/componentNames.ts';
5
10
  import fs from 'fs-extra';
6
11
  import YAML from 'yaml';
7
12
  import path from 'path';
8
- import { threadId } from 'node:worker_threads';
13
+ import { constants as osConstants } from 'node:os';
14
+ import { isMainThread, threadId } from 'node:worker_threads';
9
15
  import { randomBytes } from 'node:crypto';
10
16
  import isNumber from 'is-number';
11
17
  import propertiesReaderModule from 'properties-reader';
@@ -23,8 +29,9 @@ import { server } from '../server/Server.ts';
23
29
  import { getBackupDirPath } from './configHelpers.ts';
24
30
  import { PACKAGE_ROOT } from '../utility/packageUtils.js';
25
31
  import * as env from '../utility/environment/environmentManager.ts';
26
- import { applyRuntimeEnvConfig, hasPersistedEnvConfigState } from './harperConfigEnvVars.ts';
32
+ import { prepareRuntimeEnvConfig, hasPersistedEnvConfigState, discardConfigState } from './harperConfigEnvVars.ts';
27
33
  import { warnComponentEnvConfigVars, resolveConfiguredPath } from './componentEnvPrepass.ts';
34
+ import { isStartableThreadHeapMemory } from '../server/threads/threadHeapMemory.ts';
28
35
 
29
36
  const { DATABASES_PARAM_CONFIG, CONFIG_PARAMS, CONFIG_PARAM_MAP } = hdbTerms;
30
37
  const UNINIT_GET_CONFIG_ERR = 'Unable to get config value because config is uninitialized';
@@ -90,20 +97,47 @@ export function getConfigPath(param: string) {
90
97
  // in the same millisecond can't collide on the temp name and then race the rename.
91
98
  //
92
99
  // Windows has no POSIX-style "replace an open file" semantics: rename() fails with
93
- // EPERM/EACCES if another thread/process has the destination momentarily open for read.
94
- // Every worker thread runs its own RootConfigWatcher (chokidar), so a write on one thread
95
- // routinely races a hot-reload read on another; Windows Defender / AV real-time scanning can
96
- // hold a similar transient handle. Retry with exponential backoff to ride out the race -
97
- // callers are synchronous, so the wait is a synchronous sleep rather than an async one.
98
- // The budget must outlast a single AV real-time scan pass (seconds, not hundreds of ms):
99
- // the previous ~910ms budget was exhausted twice in a row by the same test on a CI runner
100
- // (harper#2036), so the worst case is now ~3.6s.
100
+ // EPERM/EACCES while another descriptor is open on the destination. The sleep below blocks the
101
+ // calling thread, so this can only ride out a holder that releases without needing that
102
+ // thread's event loop. A holder on the calling thread would live exactly as long as the budget,
103
+ // which is why config readers must not keep a descriptor on this file open across an event-loop
104
+ // turn (RootConfigWatcher.handleChange, OptionsWatcher#handleChange).
101
105
  const RENAME_RETRY_MAX_ATTEMPTS = 12;
102
106
  const RENAME_RETRY_INITIAL_DELAY_MS = 10;
103
107
  const RENAME_RETRY_MAX_DELAY_MS = 500;
104
108
  // Never notified; exists only so Atomics.wait can time out (a synchronous, CPU-idle sleep).
105
109
  const renameRetrySleepBuffer = new Int32Array(new SharedArrayBuffer(4));
106
110
 
111
+ // Linux has no libuv mapping for EDQUOT, so a quota-exhausted write surfaces as
112
+ // `Unknown system error -122` with an unusable `code`; the numeric errno is the portable signal
113
+ // (EDQUOT is 122 on Linux, 69 on macOS).
114
+ const STORAGE_EXHAUSTED_CODES = new Set(['ENOSPC', 'EDQUOT']);
115
+ // EDQUOT is absent from os.constants.errno on platforms without quotas, so filter before negating:
116
+ // -undefined is NaN, which would sit in the set matching nothing and reading as a bug.
117
+ const STORAGE_EXHAUSTED_ERRNOS = new Set(
118
+ [osConstants.errno.ENOSPC, osConstants.errno.EDQUOT].filter((errno) => errno !== undefined).map((errno) => -errno)
119
+ );
120
+
121
+ export function isStorageExhausted(error): boolean {
122
+ return STORAGE_EXHAUSTED_CODES.has(error?.code) || STORAGE_EXHAUSTED_ERRNOS.has(error?.errno);
123
+ }
124
+
125
+ // Boot-path persistence of derived config is best-effort: on an exhausted volume a fatal write here
126
+ // is an un-breakable restart loop, because freeing space needs a started process (#847).
127
+ export function persistConfigDuringBoot(artifactPath: string, write: () => void): boolean {
128
+ try {
129
+ write();
130
+ return true;
131
+ } catch (error) {
132
+ if (!isStorageExhausted(error)) throw error;
133
+ logger.error(
134
+ `Storage exhausted (${error.code ?? error.errno}) writing ${artifactPath}; continuing startup with the in-memory configuration. The file on disk is unchanged - free space on the Harper volume to restore config persistence.`
135
+ );
136
+ return false;
137
+ }
138
+ }
139
+
140
+ // Returns true when the file was written, false when an unchanged write was skipped.
107
141
  export function atomicWriteFile(
108
142
  filePath,
109
143
  content,
@@ -111,16 +145,47 @@ export function atomicWriteFile(
111
145
  maxRetries = RENAME_RETRY_MAX_ATTEMPTS,
112
146
  initialDelayMs = RENAME_RETRY_INITIAL_DELAY_MS,
113
147
  maxDelayMs = RENAME_RETRY_MAX_DELAY_MS,
148
+ skipIfUnchanged = false,
114
149
  } = {}
115
150
  ) {
151
+ // Opt-in: skipping means no mtime bump, so no watcher event. Only callers that re-derive the
152
+ // same file every boot want that.
153
+ if (skipIfUnchanged && matchesFileContent(filePath, content)) return false;
116
154
  const tempPath = `${filePath}.${process.pid}.${threadId}.${randomBytes(4).toString('hex')}.tmp`;
117
- fs.writeFileSync(tempPath, content);
155
+ try {
156
+ fs.writeFileSync(tempPath, content);
157
+ } catch (err) {
158
+ // The open succeeds before the write runs out of room, leaving the temp file behind.
159
+ removeTempFile(tempPath);
160
+ throw err;
161
+ }
162
+ try {
163
+ renameWithRetry(tempPath, filePath, { maxRetries, initialDelayMs, maxDelayMs });
164
+ } catch (err) {
165
+ removeTempFile(tempPath);
166
+ throw err;
167
+ }
168
+ return true;
169
+ }
170
+
171
+ export function renameWithRetry(
172
+ fromPath,
173
+ toPath,
174
+ {
175
+ maxRetries = RENAME_RETRY_MAX_ATTEMPTS,
176
+ initialDelayMs = RENAME_RETRY_INITIAL_DELAY_MS,
177
+ maxDelayMs = RENAME_RETRY_MAX_DELAY_MS,
178
+ } = {}
179
+ ) {
118
180
  let retries = maxRetries;
119
181
  let delayMs = initialDelayMs;
182
+ let attempts = 0;
183
+ const startedAt = Date.now();
120
184
  while (true) {
121
185
  try {
122
- fs.renameSync(tempPath, filePath);
123
- break;
186
+ attempts++;
187
+ fs.renameSync(fromPath, toPath);
188
+ return;
124
189
  } catch (err) {
125
190
  if (retries > 0 && (err.code === 'EPERM' || err.code === 'EACCES')) {
126
191
  retries--;
@@ -131,17 +196,35 @@ export function atomicWriteFile(
131
196
  delayMs = Math.min(delayMs * 2, maxDelayMs);
132
197
  continue;
133
198
  }
134
- // if it fails we should clean up the tmp file
135
- try {
136
- fs.unlinkSync(tempPath);
137
- } catch {
138
- // ignore cleanup errors
199
+ // Attempts and elapsed distinguish a holder that never released from one that lost
200
+ // a race, and neither survives on the rethrown error.
201
+ if (err.code === 'EPERM' || err.code === 'EACCES') {
202
+ logger.warn(
203
+ `Could not replace ${toPath}: ${err.code} after ${attempts} attempts over ${Date.now() - startedAt}ms`
204
+ );
139
205
  }
140
206
  throw err;
141
207
  }
142
208
  }
143
209
  }
144
210
 
211
+ function removeTempFile(tempPath) {
212
+ try {
213
+ fs.unlinkSync(tempPath);
214
+ } catch {
215
+ // ignore cleanup errors
216
+ }
217
+ }
218
+
219
+ function matchesFileContent(filePath, content): boolean {
220
+ if (typeof content !== 'string') return false;
221
+ try {
222
+ return fs.readFileSync(filePath, 'utf8') === content;
223
+ } catch {
224
+ return false;
225
+ }
226
+ }
227
+
145
228
  /**
146
229
  * Builds the Harper config file using user inputs and default values from defaultConfig.yaml
147
230
  * @param args - any args that the user provided.
@@ -154,7 +237,7 @@ export function createConfigFile(args, skipFsValidation = false) {
154
237
  // Loop through the user inputted args. Match them to a parameter in the default config file and update value.
155
238
  let schemasArgs;
156
239
  for (const arg in args) {
157
- let configParam = CONFIG_PARAM_MAP[arg.toLowerCase()];
240
+ let configParam = lookupConfigParam(arg);
158
241
 
159
242
  // Schemas config args are handled differently, so if they exist set them to var that will be used by setSchemasConfig
160
243
  if (configParam === CONFIG_PARAMS.DATABASES) {
@@ -169,7 +252,7 @@ export function createConfigFile(args, skipFsValidation = false) {
169
252
  continue;
170
253
  }
171
254
 
172
- if (!configParam && (arg.endsWith('_package') || arg.endsWith('_port'))) {
255
+ if (!configParam && isSuffixEscapedParam(arg)) {
173
256
  configParam = arg;
174
257
  }
175
258
 
@@ -273,7 +356,7 @@ export function getDefaultConfig(param: string) {
273
356
  flatDefaultConfigObj = flattenConfig(configDoc.toJSON());
274
357
  }
275
358
 
276
- const paramMap = CONFIG_PARAM_MAP[param.toLowerCase()];
359
+ const paramMap = lookupConfigParam(param);
277
360
  if (paramMap === undefined) return undefined;
278
361
 
279
362
  return flatDefaultConfigObj[paramMap.toLowerCase()];
@@ -297,7 +380,7 @@ export function getConfigValue(param: string | null | undefined) {
297
380
  return undefined;
298
381
  }
299
382
 
300
- const paramMap = CONFIG_PARAM_MAP[param.toLowerCase()];
383
+ const paramMap = lookupConfigParam(param);
301
384
  if (paramMap === undefined) return undefined;
302
385
 
303
386
  return flatConfigObj[paramMap.toLowerCase()];
@@ -352,7 +435,10 @@ export function ensureConfigKeysPresent(keys: string[]): string[] {
352
435
  }
353
436
  if (added.length === 0) return [];
354
437
 
355
- atomicWriteFile(configFilePath, String(configDoc));
438
+ // Worker threads re-read the config from disk and never run this backfill, so a key that only
439
+ // exists in this thread's memory activates nowhere that serves requests: report nothing when the
440
+ // write was refused rather than logging an activation the request path did not get.
441
+ if (!persistConfigDuringBoot(configFilePath, () => atomicWriteFile(configFilePath, String(configDoc)))) return [];
356
442
 
357
443
  // Mirror the additions into the already-memoized config so a built-in gated on the new key
358
444
  // activates on the CURRENT boot: componentLoader reads the root config from getConfigObj(),
@@ -572,7 +658,7 @@ function checkForUpdatedConfig(configDoc, configFilePath) {
572
658
  HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR
573
659
  );
574
660
  }
575
- atomicWriteFile(configFilePath, String(configDoc));
661
+ persistConfigDuringBoot(configFilePath, () => atomicWriteFile(configFilePath, String(configDoc)));
576
662
  }
577
663
  }
578
664
 
@@ -676,6 +762,10 @@ function validateConfig(configDoc, skipFsValidation = false) {
676
762
  configDoc.setIn(['operationsApi', 'network', 'domainSocket'], domainSocket);
677
763
  const domainSocketWarning = getDomainSocketPathLengthWarning(validation.value.rootPath, domainSocket);
678
764
  if (domainSocketWarning) logger.warn(domainSocketWarning);
765
+ if (isLegacySqlApplicationEntry(configJson.sql))
766
+ logger.warn(
767
+ "The root config entry 'sql' is an application, but 'sql' now configures Harper's SQL engine. Redeploy that application under a different name and remove the 'sql' entry; until then the SQL engine settings cannot be configured."
768
+ );
679
769
  }
680
770
 
681
771
  /**
@@ -690,7 +780,7 @@ export function updateConfigObject(param: string, value: any) {
690
780
  flatConfigObj = {};
691
781
  }
692
782
 
693
- const configObjKey = CONFIG_PARAM_MAP[param.toLowerCase()];
783
+ const configObjKey = lookupConfigParam(param);
694
784
  if (configObjKey === undefined) {
695
785
  logger.trace(`Unable to update config object because config param '${param}' does not exist`);
696
786
  return;
@@ -734,6 +824,71 @@ export function updateConfigObject(param: string, value: any) {
734
824
  }
735
825
  }
736
826
 
827
+ /**
828
+ * Canonical config param for an arg name, or `undefined` when the name is not a config param.
829
+ * `Object.hasOwn` because a bare lookup resolves inherited names: `constructor` yields an
830
+ * `Object.prototype` member that then fails `.split('_')` or `.toLowerCase()`.
831
+ */
832
+ function lookupConfigParam(arg: string): string | undefined {
833
+ if (typeof arg !== 'string') return undefined;
834
+ const name = arg.toLowerCase();
835
+ return Object.hasOwn(CONFIG_PARAM_MAP, name) ? CONFIG_PARAM_MAP[name] : undefined;
836
+ }
837
+
838
+ const COMPONENT_PARAM_SUFFIXES = ['_package', '_port'];
839
+
840
+ function suffixEscapedComponentName(arg: string): string | undefined {
841
+ if (typeof arg !== 'string') return undefined;
842
+ const suffix = COMPONENT_PARAM_SUFFIXES.find((candidate) => arg.endsWith(candidate));
843
+ if (suffix === undefined) return undefined;
844
+ const component = arg.slice(0, -suffix.length);
845
+ return component === '' ? undefined : component;
846
+ }
847
+
848
+ /**
849
+ * Component entries (`my-component_package`, `my-component_port`) are operator-named, so they
850
+ * cannot be enumerated in CONFIG_PARAM_MAP and bypass it. This escape is the one way to write a
851
+ * root component entry without going through deploy_component, so a reserved name is excluded.
852
+ */
853
+ function isSuffixEscapedParam(arg: string): boolean {
854
+ const component = suffixEscapedComponentName(arg);
855
+ return component !== undefined && !isReservedComponentName(component);
856
+ }
857
+
858
+ function findReservedComponentParams(args: object): string[] {
859
+ const reserved = [];
860
+ for (const arg in args) {
861
+ if (!Object.hasOwn(args, arg)) continue;
862
+ const component = suffixEscapedComponentName(arg);
863
+ if (component !== undefined && isReservedComponentName(component)) reserved.push(arg);
864
+ }
865
+ return reserved;
866
+ }
867
+
868
+ const MAX_REPORTED_UNRECOGNIZED = 10;
869
+
870
+ /**
871
+ * Render unrecognized names for an error that also reaches the operations log: control characters
872
+ * are stripped so a name containing a newline cannot forge a log line, and the list is capped so a
873
+ * body carrying thousands of unknown keys cannot produce an unbounded message.
874
+ */
875
+ function describeUnrecognized(names: string[]): string {
876
+ const shown = names
877
+ .slice(0, MAX_REPORTED_UNRECOGNIZED)
878
+ // eslint-disable-next-line no-control-regex
879
+ .map((name) => name.replace(/[\u0000-\u001f\u007f]/g, '?'));
880
+ const remaining = names.length - shown.length;
881
+ return remaining > 0 ? `${shown.join(', ')} (and ${remaining} more)` : shown.join(', ');
882
+ }
883
+
884
+ function findUnrecognizedParams(args: object): string[] {
885
+ let unrecognized;
886
+ for (const arg in args) {
887
+ if (lookupConfigParam(arg) === undefined && !isSuffixEscapedParam(arg)) (unrecognized ??= []).push(arg);
888
+ }
889
+ return unrecognized ?? [];
890
+ }
891
+
737
892
  /**
738
893
  * Updates and validates a config value in config file. Can also create a backup of config before updating.
739
894
  * @param param - the config value to update
@@ -794,7 +949,7 @@ export function updateConfigValue(
794
949
  if (skipParamMap) {
795
950
  configParam = param;
796
951
  } else {
797
- configParam = CONFIG_PARAM_MAP[param.toLowerCase()];
952
+ configParam = lookupConfigParam(param);
798
953
  if (configParam === undefined) {
799
954
  throw handleHDBError(
800
955
  new Error(),
@@ -813,7 +968,7 @@ export function updateConfigValue(
813
968
  } else {
814
969
  // Loop through the user inputted args. Match them to a parameter in the default config file and update value.
815
970
  for (const arg in parsedArgs) {
816
- let configParam = CONFIG_PARAM_MAP[arg.toLowerCase()];
971
+ let configParam = lookupConfigParam(arg);
817
972
 
818
973
  // If setting http.securePort to the same value as http.port, set http.port to null to avoid clashing ports
819
974
  if (
@@ -845,7 +1000,7 @@ export function updateConfigValue(
845
1000
  }
846
1001
  }
847
1002
 
848
- if (!configParam && (arg.endsWith('_package') || arg.endsWith('_port'))) {
1003
+ if (!configParam && isSuffixEscapedParam(arg)) {
849
1004
  configParam = arg;
850
1005
  }
851
1006
 
@@ -1039,14 +1194,54 @@ export function getConfiguration() {
1039
1194
  return configDoc.toJSON();
1040
1195
  }
1041
1196
 
1197
+ // `set_configuration` is the one config writer that also fans out (`replicated: true`), so a value
1198
+ // accepted here lands on every peer at once and the next rolling restart takes the whole cluster
1199
+ // down together (harper-pro#558). Boot-time writers are deliberately not gated the same way: config
1200
+ // that already exists has to stay bootable, so it is recovered at the point of use instead
1201
+ // (server/threads/threadHeapMemory.ts).
1202
+ function assertThreadHeapMemoryStartable(configFields) {
1203
+ for (const field in configFields) {
1204
+ const configParam = CONFIG_PARAM_MAP[field.toLowerCase()];
1205
+ let configured;
1206
+ if (configParam === CONFIG_PARAMS.THREADS_MAXHEAPMEMORY) configured = configFields[field];
1207
+ else if (configParam === CONFIG_PARAMS.THREADS) configured = readSectionHeapMemory(configFields[field]);
1208
+ else continue;
1209
+ const value = castConfigValue(CONFIG_PARAMS.THREADS_MAXHEAPMEMORY, configured);
1210
+ if (typeof value !== 'number' || isStartableThreadHeapMemory(value)) continue;
1211
+ throw handleHDBError(
1212
+ new Error(),
1213
+ HDB_ERROR_MSGS.CONFIG_VALIDATION(
1214
+ `'threads.maxHeapMemory' must be greater than or equal to ${hdbTerms.MIN_THREAD_HEAP_MEMORY_MB}`
1215
+ ),
1216
+ HTTP_STATUS_CODES.BAD_REQUEST,
1217
+ undefined,
1218
+ undefined,
1219
+ true
1220
+ );
1221
+ }
1222
+ }
1223
+
1224
+ // A whole `threads` section reaches the same config key, and `threads` canonicalizes to itself
1225
+ // rather than to `threads_count`. It arrives either as an object or as the JSON string
1226
+ // castConfigValue parses, and flattenConfig lowercases every key on the way back out, so the nested
1227
+ // name has to be matched the same way the top-level one is.
1228
+ function readSectionHeapMemory(section) {
1229
+ const parsed = castConfigValue(CONFIG_PARAMS.THREADS, section);
1230
+ if (!hdbUtils.isObject(parsed)) return undefined;
1231
+ for (const key in parsed) if (key.toLowerCase() === 'maxheapmemory') return parsed[key];
1232
+ }
1233
+
1042
1234
  /**
1043
1235
  * Set Configuration - this function sets new configuration
1044
1236
  * @param setConfigJson
1045
1237
 
1046
1238
  */
1047
1239
  export async function setConfiguration(setConfigJson) {
1240
+ // `hdb_auth_header` is the 4.x spelling of `hdbAuthHeader`, and `impersonate` is a generic
1241
+ // operation-body field (server/operationsServer.ts): control fields, never config params.
1048
1242
  // eslint-disable-next-line no-unused-vars
1049
- const { operation, hdb_user, hdbAuthHeader, replicated, ...configFields } = setConfigJson;
1243
+ const { operation, hdb_user, hdbAuthHeader, hdb_auth_header, impersonate, replicated, ...configFields } =
1244
+ setConfigJson;
1050
1245
  // Operation-control field, not a config param: enforce boolean (matching other
1051
1246
  // `replicated` surfaces, e.g. analyticsValidator) before any local write so a
1052
1247
  // malformed value like the string "false" — which is truthy — can't apply config
@@ -1061,6 +1256,32 @@ export async function setConfiguration(setConfigJson) {
1061
1256
  true
1062
1257
  );
1063
1258
  }
1259
+ const reservedComponentParams = findReservedComponentParams(configFields);
1260
+ if (reservedComponentParams.length > 0) {
1261
+ throw handleHDBError(
1262
+ new Error(),
1263
+ `Unable to update config, cannot configure a component whose name is reserved for Harper's own configuration section: ${describeUnrecognized(reservedComponentParams)}`,
1264
+ HTTP_STATUS_CODES.BAD_REQUEST,
1265
+ undefined,
1266
+ undefined,
1267
+ true
1268
+ );
1269
+ }
1270
+ // Before any local write: the writer skips names it cannot resolve, so a request mixing
1271
+ // recognized and unrecognized names would otherwise apply the recognized half and still report
1272
+ // success.
1273
+ const unrecognized = findUnrecognizedParams(configFields);
1274
+ if (unrecognized.length > 0) {
1275
+ throw handleHDBError(
1276
+ new Error(),
1277
+ `Unable to update config, unrecognized config parameter${unrecognized.length > 1 ? 's' : ''}: ${describeUnrecognized(unrecognized)}`,
1278
+ HTTP_STATUS_CODES.BAD_REQUEST,
1279
+ undefined,
1280
+ undefined,
1281
+ true
1282
+ );
1283
+ }
1284
+ assertThreadHeapMemoryStartable(configFields);
1064
1285
  try {
1065
1286
  updateConfigValue(undefined, undefined, configFields, true);
1066
1287
  if (replicated) {
@@ -1151,9 +1372,16 @@ function applyRuntimeEnvVarConfig(configDoc, configFilePath, options = {}) {
1151
1372
  // Convert to JSON for processing
1152
1373
  const configObj = configDoc.toJSON();
1153
1374
 
1375
+ let saveEnvConfigState;
1376
+ let confirmEnvConfigState;
1377
+ let commitEnvConfigState;
1154
1378
  try {
1155
1379
  // Apply env vars with source tracking and drift detection
1156
- applyRuntimeEnvConfig(configObj, rootPath, options);
1380
+ ({
1381
+ saveState: saveEnvConfigState,
1382
+ confirmConfigWritten: confirmEnvConfigState,
1383
+ commitState: commitEnvConfigState,
1384
+ } = prepareRuntimeEnvConfig(configObj, rootPath, options));
1157
1385
 
1158
1386
  // If securePort was set to the same value as port, auto-null port to avoid clashing
1159
1387
  if (configObj.http?.port && configObj.http?.port === configObj.http?.securePort) {
@@ -1185,11 +1413,18 @@ function applyRuntimeEnvVarConfig(configDoc, configFilePath, options = {}) {
1185
1413
  throw error;
1186
1414
  }
1187
1415
 
1188
- // We're done here if no config file to write to
1416
+ // Install has no config file yet and no process to keep alive, so its snapshot write stays
1417
+ // mandatory - an install that never recorded originals should fail, not proceed.
1189
1418
  if (!configFilePath) {
1419
+ commitEnvConfigState();
1190
1420
  return;
1191
1421
  }
1192
1422
 
1423
+ // Every worker thread runs initConfig and derives the same merged config, so letting them all
1424
+ // persist it means N threads racing over one pair of files for a result they already agree on.
1425
+ // The main thread owns the on-disk copy; a worker runs on the in-memory one.
1426
+ if (!isMainThread) return;
1427
+
1193
1428
  // Persist changes to file
1194
1429
  try {
1195
1430
  if (configDoc.errors?.length > 0) {
@@ -1199,8 +1434,30 @@ function applyRuntimeEnvVarConfig(configDoc, configFilePath, options = {}) {
1199
1434
  HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR
1200
1435
  );
1201
1436
  }
1202
- atomicWriteFile(configFilePath, String(configDoc));
1203
- logger.debug('Config file updated with runtime env var values');
1437
+ // Stage, write the file, promote by rename: the confirmed state is the only record of the
1438
+ // file's pre-env values, so no write an exhausted volume can refuse may stand between it and
1439
+ // disk. See DESIGN.md, boot-path config persistence.
1440
+ let stateStaged = false;
1441
+ if (persistConfigDuringBoot(`${rootPath} env config state`, () => (stateStaged = saveEnvConfigState()))) {
1442
+ let configPersisted = false;
1443
+ let configRewritten = false;
1444
+ try {
1445
+ configPersisted = persistConfigDuringBoot(configFilePath, () => {
1446
+ configRewritten = atomicWriteFile(configFilePath, String(configDoc), { skipIfUnchanged: true });
1447
+ });
1448
+ } finally {
1449
+ if (!configPersisted && stateStaged) discardConfigState(rootPath as string);
1450
+ }
1451
+ if (configPersisted) {
1452
+ if (stateStaged) confirmEnvConfigState();
1453
+ // Distinguished, because this is the line that answers "did something rewrite my config?"
1454
+ logger.debug(
1455
+ configRewritten
1456
+ ? 'Config file updated with runtime env var values'
1457
+ : 'Config file already matched the runtime env var values'
1458
+ );
1459
+ }
1460
+ }
1204
1461
  } catch (error) {
1205
1462
  logger.error(`Failed to write config file after applying runtime env vars: ${error.message}`);
1206
1463
  throw error;