@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
@@ -159,3 +159,134 @@ export function toWriteHeadHeaders(headers: any): any {
159
159
  }
160
160
  return result;
161
161
  }
162
+
163
+ // RFC 9111 cache-scope directives; boundaries on both sides so a token like `public-foo` doesn't match.
164
+ export const SHARED_CACHE_OPTIN = /(^|[,\s])(public|s-maxage)($|[\s,;=])/i;
165
+ export const PRIVATE_SCOPE = /(^|[,\s])(private|no-store)($|[\s,;=])/i;
166
+
167
+ function headerValueString(value: unknown): string {
168
+ if (value == null) return '';
169
+ return Array.isArray(value) ? value.join(', ') : String(value);
170
+ }
171
+
172
+ /**
173
+ * Folds the middleware chain's response headers into the headers a fallback server produced for the
174
+ * same request.
175
+ *
176
+ * Bun and uWS construct a new response from legacy Fastify when the chain declines a request, so the
177
+ * chain's credential-dependent cache policy must be merged explicitly. Fastify wins headers it set,
178
+ * `Vary` is unioned, and private cache scope is re-applied unless the final response explicitly opts
179
+ * into RFC 9111 shared caching with `public` or `s-maxage`.
180
+ */
181
+ export function mergeChainHeadersIntoFallback<
182
+ T extends {
183
+ get(name: string): any;
184
+ set(name: string, value: any): any;
185
+ has(name: string): boolean;
186
+ append?(name: string, value: any): any;
187
+ },
188
+ >(chainHeaders: any, finalHeaders: T): T {
189
+ if (!chainHeaders?.[Symbol.iterator]) return finalHeaders;
190
+ const chainVary = headerValueString(chainHeaders.get('Vary'));
191
+ const chainCacheControl = headerValueString(chainHeaders.get('Cache-Control'));
192
+ for (const [name, value] of chainHeaders) {
193
+ const lowerName = String(name).toLowerCase();
194
+ if (lowerName === 'vary' || lowerName === 'cache-control') continue;
195
+ if (finalHeaders.has(name)) {
196
+ if (lowerName === 'set-cookie') {
197
+ const existing = (finalHeaders as any).getSetCookie?.() ?? finalHeaders.get(name);
198
+ const existingValues = new Set((Array.isArray(existing) ? existing : [existing]).map(String));
199
+ const values = Array.isArray(value) ? value : [value];
200
+ for (const single of values) {
201
+ if (!existingValues.has(String(single))) appendHeader(finalHeaders, name, single, false);
202
+ }
203
+ }
204
+ continue;
205
+ }
206
+ if (Array.isArray(value)) {
207
+ for (const single of value) appendHeader(finalHeaders, name, single, lowerName !== 'set-cookie');
208
+ } else finalHeaders.set(name, value);
209
+ }
210
+ for (const token of chainVary.split(',')) {
211
+ const trimmed = token.trim();
212
+ if (trimmed) addVaryHeader(finalHeaders as any, trimmed);
213
+ }
214
+ if (chainCacheControl) {
215
+ const finalCacheControl = headerValueString(finalHeaders.get('Cache-Control'));
216
+ if (!finalCacheControl) finalHeaders.set('Cache-Control', chainCacheControl);
217
+ else if (
218
+ PRIVATE_SCOPE.test(chainCacheControl) &&
219
+ !PRIVATE_SCOPE.test(finalCacheControl) &&
220
+ !SHARED_CACHE_OPTIN.test(finalCacheControl)
221
+ )
222
+ finalHeaders.set('Cache-Control', finalCacheControl + ', private');
223
+ }
224
+ return finalHeaders;
225
+ }
226
+
227
+ function nodeResponseHeaders(nodeResponse: any) {
228
+ return {
229
+ get: (name: string) => nodeResponse.getHeader(name),
230
+ set: (name: string, value: any) => nodeResponse.setHeader(name, value),
231
+ has: (name: string) => nodeResponse.hasHeader(name),
232
+ append: (name: string, value: any, commaDelimited?: boolean) => {
233
+ const existing = nodeResponse.getHeader(name);
234
+ if (existing == null) return nodeResponse.setHeader(name, value);
235
+ if (commaDelimited)
236
+ return nodeResponse.setHeader(name, (Array.isArray(existing) ? existing.join(', ') : existing) + ', ' + value);
237
+ return nodeResponse.setHeader(name, Array.isArray(existing) ? [...existing, value] : [existing, value]);
238
+ },
239
+ };
240
+ }
241
+
242
+ function applyWriteHeadHeaders(nodeResponse: any, headers: any): void {
243
+ const suppliedHeaders = new Map<string, { name: string; value: any }>();
244
+ const addHeader = (name: string, value: any) => {
245
+ const key = String(name).toLowerCase();
246
+ const supplied = suppliedHeaders.get(key);
247
+ if (!supplied) {
248
+ suppliedHeaders.set(key, { name, value });
249
+ return;
250
+ }
251
+ const values = Array.isArray(supplied.value) ? supplied.value : [supplied.value];
252
+ supplied.value = Array.isArray(value) ? values.concat(value) : values.concat([value]);
253
+ };
254
+ if (Array.isArray(headers)) {
255
+ if (Array.isArray(headers[0])) {
256
+ for (const [name, value] of headers) addHeader(name, value);
257
+ } else {
258
+ for (let i = 0; i + 1 < headers.length; i += 2) addHeader(headers[i], headers[i + 1]);
259
+ }
260
+ } else {
261
+ for (const name of Object.keys(headers)) {
262
+ const value = headers[name];
263
+ if (value != null) addHeader(name, value);
264
+ }
265
+ }
266
+ for (const { name, value } of suppliedHeaders.values()) nodeResponse.setHeader(name, value);
267
+ }
268
+
269
+ /**
270
+ * Node's counterpart to the Bun and uWS fallback bridges: the chain's headers go onto the
271
+ * `ServerResponse` before legacy Fastify runs, so a Fastify route that sets `Cache-Control` or `Vary`
272
+ * replaces them outright and can make a credential-dependent response shared-cacheable (#1565).
273
+ * Reconciliation therefore runs at `writeHead` — the last point the header set is still mutable, and
274
+ * the one Node also routes implicit headers through — using the same policy as the other two bridges.
275
+ */
276
+ export function bridgeChainHeadersToNodeResponse(chainHeaders: any, nodeResponse: any): void {
277
+ if (!chainHeaders?.[Symbol.iterator]) return;
278
+ for (const [name, value] of chainHeaders) nodeResponse.setHeader(name, value);
279
+ const originalWriteHead = nodeResponse.writeHead;
280
+ nodeResponse.writeHead = function (statusCode: number, statusMessage?: any, headers?: any) {
281
+ if (this.headersSent) return originalWriteHead.apply(this, arguments as any);
282
+ if (statusMessage != null && typeof statusMessage !== 'string') {
283
+ headers = statusMessage;
284
+ statusMessage = undefined;
285
+ }
286
+ if (headers) applyWriteHeadHeaders(this, headers);
287
+ mergeChainHeadersIntoFallback(chainHeaders, nodeResponseHeaders(this));
288
+ return statusMessage === undefined
289
+ ? originalWriteHead.call(this, statusCode)
290
+ : originalWriteHead.call(this, statusCode, statusMessage);
291
+ };
292
+ }
@@ -125,6 +125,11 @@ const ndjsonHandler = {
125
125
  mediaTypes.set('application/x-ndjson', ndjsonHandler);
126
126
  mediaTypes.set('application/ndjson', ndjsonHandler);
127
127
 
128
+ function serializeSSEData(data: any) {
129
+ if (typeof data === 'object') return 'data: ' + JSONStringify(data) + '\n';
130
+ return 'data: ' + String(data).replace(/\r\n|\r|\n/g, '\ndata: ') + '\n';
131
+ }
132
+
128
133
  mediaTypes.set('text/event-stream', {
129
134
  // Server-Sent Events (SSE)
130
135
  serializeStream: function (iterable) {
@@ -141,20 +146,20 @@ mediaTypes.set('text/event-stream', {
141
146
  id: message.timestamp,
142
147
  };
143
148
  }
144
- if (message.data || message.event) {
149
+ // A non-null top-level `data` or truthy `event` is an SSE envelope, even with sibling fields.
150
+ // `id`/`retry` alone do not open it: `id` is too common a literal-payload field name (e.g. a
151
+ // database record) to safely treat as an SSE-envelope signal.
152
+ if (message.data != null || message.event) {
145
153
  let serialized = '';
146
154
  if (message.event) serialized += 'event: ' + message.event + '\n';
147
- if (message.data) {
148
- let data = message.data;
149
- if (typeof data === 'object') data = JSONStringify(data);
150
- serialized += 'data: ' + data + '\n';
155
+ if (message.data != null) {
156
+ serialized += serializeSSEData(message.data);
151
157
  }
152
- if (message.id) serialized += 'id: ' + message.id + '\n';
153
- if (message.retry) serialized += 'retry: ' + message.retry + '\n';
158
+ if (message.id != null) serialized += 'id: ' + message.id + '\n';
159
+ if (message.retry != null) serialized += 'retry: ' + message.retry + '\n';
154
160
  return serialized + '\n';
155
161
  } else {
156
- if (typeof message === 'object') return `data: ${JSONStringify(message)}\n\n`;
157
- return `data: ${message}\n\n`;
162
+ return serializeSSEData(message) + '\n';
158
163
  }
159
164
  },
160
165
  compressible: false,
@@ -436,6 +441,20 @@ export function serialize(responseData, request, responseObject) {
436
441
  }
437
442
 
438
443
  let asyncSerializations: Promise<void>[];
444
+ /**
445
+ * Get the message serializer for a request's negotiated content type, memoized on the request.
446
+ * The returned function is the registered per-content-type serializer, so its identity keys the
447
+ * content type. Caching serialized output across requests under that key is only valid because the
448
+ * built-in serializers are pure functions of their argument — a component registering a serializer
449
+ * into `server.contentTypes` whose output depends on anything else would not be shareable.
450
+ * @param request
451
+ */
452
+ export function getMessageSerializer(request?: Request): (message: any) => Buffer | string {
453
+ if (!request) return JSONStringify;
454
+ let serialize = (request as any).serialize;
455
+ if (!serialize) serialize = (request as any).serialize = findBestSerializer(request).serializer.serialize;
456
+ return serialize;
457
+ }
439
458
  /**
440
459
  * Serialize a message, may be use multiple times (like with WebSockets)
441
460
  * @param message
@@ -450,18 +469,7 @@ export function serializeMessage(
450
469
  if (message?.contentType != null && message.data != null) return message.data;
451
470
  asyncSerializations = inAsyncContinuation ? undefined : [];
452
471
  try {
453
- let serialized: Buffer | string;
454
- if (request) {
455
- let serialize = (request as any).serialize;
456
- if (serialize) serialized = serialize(message);
457
- else {
458
- const serializer = findBestSerializer(request);
459
- serialize = (request as any).serialize = serializer.serializer.serialize;
460
- serialized = serialize(message);
461
- }
462
- } else {
463
- serialized = JSONStringify(message);
464
- }
472
+ const serialized: Buffer | string = getMessageSerializer(request)(message);
465
473
  if (asyncSerializations?.length > 0)
466
474
  // if there were any serialization attempts that must wait for async work to be done, we wait now and then retry the serialization
467
475
  return (asyncSerializations.length === 1 ? asyncSerializations[0] : Promise.all(asyncSerializations)).then(() =>
@@ -1,25 +1,36 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+
3
+ import type { ComponentStatus } from '../../components/status/ComponentStatus.ts';
4
+
1
5
  // Deploy pre-flight validation loads throwaway candidate component code purely to surface load-time
2
6
  // errors — its top-level `server.registerOperation` / `server.setMcpQuotaHandler` calls mutate
3
7
  // process-wide state (the operation map, its cross-thread announcement, the quota handler) that is
4
8
  // NOT owned by a Scope, so a failed/rolled-back deploy would otherwise leak the candidate's
5
- // registrations onto the live worker. Those registration methods no-op while this guard is active.
9
+ // registrations onto the live worker. Those registration methods no-op while this guard is active,
10
+ // and the candidate's component-status writes are diverted into the throwaway sink below.
6
11
  //
7
- // Depth-counted so overlapping validations both keep the guard raised until the last one finishes.
8
- // Caveat: while a validation is in flight, a legitimate registration from an interleaving real load
9
- // is also skipped (it re-registers on its next load); that window is narrow, and the alternative —
10
- // leaking a candidate's registration live — is worse.
11
- let validationDepth = 0;
12
+ // Context-scoped rather than a process-wide depth counter, because the live component KEEPS SERVING on
13
+ // this worker throughout the window and writes to both of those same places: it registers on its own
14
+ // reload, and `statusForComponent()` is a public API its runtime code may call at any time. A counter
15
+ // cannot tell the two writers apart, so it suppressed the live component's registration and reverted its
16
+ // status report. An async context can: only work descending from the validation load itself is diverted.
17
+ interface DeployValidationContext {
18
+ // Where the candidate's own status writes land instead of the live registry. Discarded with the context.
19
+ statusSink: Map<string, ComponentStatus>;
20
+ }
21
+
22
+ const deployValidation = new AsyncLocalStorage<DeployValidationContext>();
12
23
 
13
24
  export function isDeployValidating(): boolean {
14
- return validationDepth > 0;
25
+ return deployValidation.getStore() !== undefined;
26
+ }
27
+
28
+ /** The throwaway map a candidate's status writes belong in, or `undefined` outside a validation load. */
29
+ export function deployValidationStatusSink(): Map<string, ComponentStatus> | undefined {
30
+ return deployValidation.getStore()?.statusSink;
15
31
  }
16
32
 
17
33
  /** Run `fn` (the throwaway validation load) with the guard raised, lowering it even if `fn` throws. */
18
34
  export async function runWithDeployValidationGuard<T>(fn: () => Promise<T>): Promise<T> {
19
- validationDepth++;
20
- try {
21
- return await fn();
22
- } finally {
23
- validationDepth--;
24
- }
35
+ return deployValidation.run({ statusSink: new Map() }, fn);
25
36
  }
@@ -1,11 +1,42 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
2
 
3
- const operationAuthorizationState = new AsyncLocalStorage<boolean>();
3
+ interface OperationAuthorizationState {
4
+ bypassAuth: boolean;
5
+ apiOperation?: string;
6
+ }
7
+
8
+ const operationAuthorizationState = new AsyncLocalStorage<OperationAuthorizationState>();
9
+
10
+ // Shared, for the common case of no carrier to preserve.
11
+ const BYPASSED: OperationAuthorizationState = Object.freeze({ bypassAuth: true });
12
+ const ENFORCED: OperationAuthorizationState = Object.freeze({ bypassAuth: false });
4
13
 
5
14
  export function runWithOperationAuthorizationBypass<T>(bypassAuth: boolean, callback: () => T): T {
6
- return operationAuthorizationState.run(bypassAuth === true, callback);
15
+ // An existing carrier survives: the enforced branch is not a bypass, and a job handler dispatching
16
+ // a nested authorized operation must not lose its own operation identity.
17
+ const apiOperation = operationAuthorizationState.getStore()?.apiOperation;
18
+ if (apiOperation === undefined) {
19
+ return operationAuthorizationState.run(bypassAuth === true ? BYPASSED : ENFORCED, callback);
20
+ }
21
+ return operationAuthorizationState.run(Object.freeze({ bypassAuth: bypassAuth === true, apiOperation }), callback);
22
+ }
23
+
24
+ /**
25
+ * `apiOperation` MUST come from the same value that selected the code now running, so it cannot name
26
+ * an operation other than the one executing. That is the entire basis for trusting it: a request
27
+ * property would be forgeable, and on the direct-SQL path this check is the only gate.
28
+ */
29
+ export function runWithDispatchedOperation<T>(apiOperation: string, callback: () => T): T {
30
+ return operationAuthorizationState.run(
31
+ Object.freeze({ bypassAuth: operationAuthorizationState.getStore()?.bypassAuth === true, apiOperation }),
32
+ callback
33
+ );
34
+ }
35
+
36
+ export function getOperationAuthorizationState(): OperationAuthorizationState | undefined {
37
+ return operationAuthorizationState.getStore();
7
38
  }
8
39
 
9
40
  export function isOperationAuthorizationBypassed(): boolean {
10
- return operationAuthorizationState.getStore() === true;
41
+ return operationAuthorizationState.getStore()?.bypassAuth === true;
11
42
  }
@@ -11,7 +11,7 @@
11
11
  * so a request is sent to exactly ONE registering worker (never broadcast-first-wins).
12
12
  *
13
13
  * - Worker: `registerOperation()` announces the name (OPERATION_REGISTERED) to all threads;
14
- * only the main thread records it, as name -> Set<threadId>.
14
+ * only the main thread records it, as name -> Set<threadId>, plus `grantable`.
15
15
  * - Main: on an OPERATION_FUNCTION_MAP miss, `getRemoteOperationFunction()` supplies a forwarding
16
16
  * function that sends the request body (OPERATION_EXECUTE_REQUEST) to one live registering
17
17
  * worker and awaits the correlated OPERATION_EXECUTE_RESPONSE.
@@ -26,7 +26,11 @@ import * as env from '../../utility/environment/environmentManager.ts';
26
26
  import harperLogger from '../../utility/logging/harper_logger.ts';
27
27
  import { ServerError } from '../../utility/errors/hdbError.ts';
28
28
  import { sendItcEvent } from '../threads/itc.js';
29
- import { onMessageByType, onThreadExit } from '../threads/manageThreads.js';
29
+ import { hasThreadExited, onMessageByType, onThreadExit } from '../threads/manageThreads.js';
30
+ import {
31
+ registerWorkerGrantableOperation,
32
+ unregisterWorkerGrantableOperation,
33
+ } from '../../utility/operationPermissions.ts';
30
34
  import { runWithOperationAuthorizationBypass } from './operationAuthorizationState.ts';
31
35
 
32
36
  const operationLog = harperLogger.loggerWithTag('operation');
@@ -59,6 +63,9 @@ export function setLocalOperationDispatch(dispatch: typeof localDispatch) {
59
63
 
60
64
  /** name -> threadIds of workers that registered it (main thread only) */
61
65
  const registeredByWorker = new Map<string, Set<number>>();
66
+ // Per originator, not per name: a rolling deploy whose new generation drops `requiresSuperUser`
67
+ // must keep routing the name while retracting grantability, which a name-level flag cannot express.
68
+ const grantableByWorker = new Map<string, Set<number>>();
62
69
  const pendingExecutions = new Map<
63
70
  number,
64
71
  { targetThreadId: number; resolve: (result: any) => void; reject: (error: Error) => void }
@@ -71,27 +78,82 @@ let mainListenersAttached = false;
71
78
  * a lost announcement just means the op stays unreachable (the pre-#1736 status quo), and the
72
79
  * broadcast has its own ack timeout.
73
80
  */
74
- export function announceRegisteredOperation(name: string) {
81
+ export function announceRegisteredOperation(name: string, grantable = false) {
75
82
  if (isMainThread) return;
76
83
  sendItcEvent({
77
84
  type: terms.ITC_EVENT_TYPES.OPERATION_REGISTERED,
78
- message: { name },
85
+ message: { name, grantable },
79
86
  }).catch((error) => operationLog.error(`Failed to announce registered operation '${name}'`, error));
80
87
  }
81
88
 
82
89
  /**
83
90
  * ITC handler (all threads receive the broadcast; only main records it).
84
91
  */
85
- export function operationRegisteredHandler(event: { message: { name: string; originator: number } }) {
92
+ export function operationRegisteredHandler(event: {
93
+ message?: { name?: string; grantable?: boolean; originator?: number };
94
+ }) {
86
95
  if (!isMainThread) return;
87
- const { name, originator } = event.message;
96
+ const { name, grantable, originator } = event?.message ?? {};
88
97
  if (typeof name !== 'string' || typeof originator !== 'number') return;
98
+ // An announcement can lose the race with its own thread's exit, and exit notification fires once
99
+ // per thread, so without this the entry would never be cleaned up. Reads manageThreads' tombstone
100
+ // rather than keeping a second one: job threads are one-shot workers, so a duplicate here would
101
+ // grow per completed job, not per worker restart.
102
+ if (hasThreadExited(originator)) {
103
+ operationLog.debug(`Ignoring operation '${name}' announced by exited worker thread ${originator}`);
104
+ return;
105
+ }
89
106
  let workerIds = registeredByWorker.get(name);
90
107
  if (!workerIds) registeredByWorker.set(name, (workerIds = new Set()));
91
108
  workerIds.add(originator);
109
+ // Mirroring only widens what an allowlist may name; enforcement stays on the worker's
110
+ // chooseOperation. A re-announcement that drops the permission retracts this thread's claim.
111
+ setWorkerGrantable(name, originator, grantable === true);
92
112
  operationLog.debug(`Registered operation '${name}' announced by worker thread ${originator}`);
93
113
  }
94
114
 
115
+ /**
116
+ * A worker that dies mid-execution can never respond, so fail its in-flight forwards rather than
117
+ * waiting out the timeout, and forget its registrations (a replacement re-registers on load).
118
+ */
119
+ function handleThreadExit(deadThreadId: number) {
120
+ for (const [name, workerIds] of registeredByWorker) {
121
+ if (!workerIds.delete(deadThreadId)) continue;
122
+ // A surviving worker that never declared a permission must not keep the name admissible.
123
+ if (workerIds.size === 0) dropRegistration(name);
124
+ else setWorkerGrantable(name, deadThreadId, false);
125
+ }
126
+ for (const [requestId, pending] of pendingExecutions) {
127
+ if (pending.targetThreadId === deadThreadId) {
128
+ pendingExecutions.delete(requestId);
129
+ pending.reject(new ServerError('The worker thread executing this operation exited', 503));
130
+ }
131
+ }
132
+ }
133
+
134
+ function setWorkerGrantable(name: string, threadId: number, grantable: boolean) {
135
+ let grantableIds = grantableByWorker.get(name);
136
+ if (grantable) {
137
+ if (!grantableIds) grantableByWorker.set(name, (grantableIds = new Set()));
138
+ grantableIds.add(threadId);
139
+ registerWorkerGrantableOperation(name);
140
+ } else if (grantableIds?.delete(threadId) && grantableIds.size === 0) {
141
+ grantableByWorker.delete(name);
142
+ unregisterWorkerGrantableOperation(name);
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Forget an operation no live worker offers any more. Both prune paths — thread exit, and a failed
148
+ * send discovering a dead port — route through here so a name can never keep a route without an
149
+ * owner. Grantability is dropped per owner instead, in `setWorkerGrantable`.
150
+ */
151
+ function dropRegistration(name: string) {
152
+ registeredByWorker.delete(name);
153
+ grantableByWorker.delete(name);
154
+ unregisterWorkerGrantableOperation(name);
155
+ }
156
+
95
157
  let rotation = 0;
96
158
  /**
97
159
  * Main-thread dispatch fallback: if a worker registered `name`, return a forwarding operation
@@ -122,23 +184,15 @@ function attachMainListeners() {
122
184
  if (error) pending.reject(new ServerError(error.message, error.statusCode || 500));
123
185
  else pending.resolve(result);
124
186
  });
125
- // A worker that dies mid-execution can never respond; fail its in-flight forwards rather
126
- // than waiting out the timeout, and forget its registrations (a replacement worker
127
- // re-registers on component load).
128
- onThreadExit((deadThreadId: number) => {
129
- for (const [name, workerIds] of registeredByWorker) {
130
- workerIds.delete(deadThreadId);
131
- if (workerIds.size === 0) registeredByWorker.delete(name);
132
- }
133
- for (const [requestId, pending] of pendingExecutions) {
134
- if (pending.targetThreadId === deadThreadId) {
135
- pendingExecutions.delete(requestId);
136
- pending.reject(new ServerError('The worker thread executing this operation exited', 503));
137
- }
138
- }
139
- });
187
+ onThreadExit(handleThreadExit);
140
188
  }
141
189
 
190
+ // Armed at load rather than on first use: serverUtilities imports this module during its own load,
191
+ // before any worker exists. Thread-exit notification fires once per thread and is dropped outright
192
+ // if no listener is attached yet, so a worker dying before its first announcement is processed
193
+ // would otherwise leave a registration nothing could ever clean up.
194
+ if (isMainThread) attachMainListeners();
195
+
142
196
  async function executeRemoteOperation(name: string, body: any, bypassAuth: boolean): Promise<any> {
143
197
  attachMainListeners();
144
198
  const workerIds = registeredByWorker.get(name);
@@ -168,7 +222,10 @@ async function executeRemoteOperation(name: string, body: any, bypassAuth: boole
168
222
  );
169
223
  }
170
224
  if (!sent) {
225
+ // The port is gone, so this thread's claims go with it — grantability included, which
226
+ // handleThreadExit would otherwise not retract while other workers still route the name.
171
227
  workerIds.delete(targetThreadId);
228
+ setWorkerGrantable(name, targetThreadId, false);
172
229
  continue;
173
230
  }
174
231
  return new Promise((promiseResolve, promiseReject) => {
@@ -190,7 +247,7 @@ async function executeRemoteOperation(name: string, body: any, bypassAuth: boole
190
247
  });
191
248
  });
192
249
  }
193
- if (registeredByWorker.get(name)?.size === 0) registeredByWorker.delete(name);
250
+ if (registeredByWorker.get(name)?.size === 0) dropRegistration(name);
194
251
  throw new ServerError(
195
252
  `Operation '${name}' is registered by a component but no worker thread is available to run it`,
196
253
  503
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `evaluateSQL` honors a supplied `parsed_sql_object` verbatim and skips parsing, so one carrying
3
+ * `permissions_checked: true` executes an AST that no authorization check ever saw. Neither position
4
+ * is ever legitimately client-supplied: dispatch parses the statement itself, and the job worker
5
+ * re-parses from the `sql` string dispatch authorized.
6
+ *
7
+ * Both positions, because the two entry points differ: `chooseOperation` overwrites the top-level
8
+ * object with its own parse, but only inside its SQL branch, so a non-SQL job (`export_local` with a
9
+ * `search_by_value` search) can still carry a client-supplied one through to the persisted row.
10
+ */
11
+ export function stripSuppliedParsedSqlObject(request: any): void {
12
+ if (!request) return;
13
+ delete request.parsed_sql_object;
14
+ delete request.search_operation?.parsed_sql_object;
15
+ }
@@ -41,6 +41,9 @@ const NO_AUTH_OPERATIONS = [
41
41
  terms.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,
42
42
  terms.OPERATIONS_ENUM.LOGIN,
43
43
  terms.OPERATIONS_ENUM.LOGOUT,
44
+ // The OIDC exchange *is* the authentication (#2171): the caller proves identity with a token
45
+ // from a trusted issuer, not with Harper credentials it does not have.
46
+ terms.OPERATIONS_ENUM.EXCHANGE_OIDC_TOKEN,
44
47
  ];
45
48
 
46
49
  const UNSAFE_REQUEST_BODY_PROPERTIES = ['__proto__', 'constructor', 'prototype'];
@@ -111,10 +114,10 @@ function authHandler(req, resp, done) {
111
114
  const isAuthOperation = !NO_AUTH_OPERATIONS.includes(req.body.operation);
112
115
  if (
113
116
  isAuthOperation ||
114
- // If create token is called without username/password in the body it needs to be authorized
117
+ // Create token needs to be authorized when called without username/password in the body, or
118
+ // with an inline role object (scoped-token minting is gated on the authenticated requester)
115
119
  (req.body.operation === terms.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS &&
116
- !req.body.username &&
117
- !req.body.password)
120
+ ((!req.body.username && !req.body.password) || (req.body.role && typeof req.body.role === 'object')))
118
121
  ) {
119
122
  pAuthorize(req, resp)
120
123
  .then(async (userData) => {