harper 5.1.20 → 5.2.0-alpha.5

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 (395) hide show
  1. package/agent/operations.ts +13 -16
  2. package/components/Application.ts +188 -7
  3. package/components/ApplicationScope.ts +3 -0
  4. package/components/Scope.ts +12 -0
  5. package/components/anthropic/index.ts +9 -2
  6. package/components/bedrock/index.ts +25 -2
  7. package/components/componentLoader.ts +56 -7
  8. package/components/componentSecrets.ts +451 -0
  9. package/components/deploymentRecorder.ts +7 -1
  10. package/components/mcp/adapters/fastify.ts +3 -0
  11. package/components/mcp/adapters/harperHttp.ts +3 -0
  12. package/components/mcp/audit.ts +21 -6
  13. package/components/mcp/customResourceRegistry.ts +17 -38
  14. package/components/mcp/listChanged.ts +37 -20
  15. package/components/mcp/quota.ts +145 -0
  16. package/components/mcp/rateLimit.ts +152 -14
  17. package/components/mcp/resources.ts +2 -4
  18. package/components/mcp/toolRegistry.ts +73 -4
  19. package/components/mcp/tools/application.ts +77 -8
  20. package/components/mcp/tools/operations.ts +106 -36
  21. package/components/mcp/tools/schemas/operationDescriptions.ts +4 -4
  22. package/components/mcp/tools/schemas/operations.ts +5 -0
  23. package/components/mcp/transport.ts +55 -4
  24. package/components/ollama/index.ts +6 -2
  25. package/components/openai/index.ts +9 -2
  26. package/components/operations.js +204 -10
  27. package/components/operationsValidation.js +173 -0
  28. package/components/secretOperations.ts +498 -0
  29. package/config/configUtils.ts +25 -1
  30. package/config-app.schema.json +81 -0
  31. package/config-root.schema.json +8 -1
  32. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +4 -3
  33. package/dataLayer/readAuditLog.ts +14 -0
  34. package/dataLayer/schemaDescribe.ts +1 -0
  35. package/dist/agent/operations.d.ts +7 -4
  36. package/dist/agent/operations.js +13 -15
  37. package/dist/agent/operations.js.map +1 -1
  38. package/dist/components/Application.d.ts +25 -2
  39. package/dist/components/Application.js +166 -7
  40. package/dist/components/Application.js.map +1 -1
  41. package/dist/components/ApplicationScope.d.ts +2 -0
  42. package/dist/components/ApplicationScope.js +3 -0
  43. package/dist/components/ApplicationScope.js.map +1 -1
  44. package/dist/components/Scope.d.ts +8 -0
  45. package/dist/components/Scope.js +11 -0
  46. package/dist/components/Scope.js.map +1 -1
  47. package/dist/components/anthropic/index.d.ts +4 -1
  48. package/dist/components/anthropic/index.js +4 -2
  49. package/dist/components/anthropic/index.js.map +1 -1
  50. package/dist/components/bedrock/index.d.ts +4 -1
  51. package/dist/components/bedrock/index.js +22 -2
  52. package/dist/components/bedrock/index.js.map +1 -1
  53. package/dist/components/componentLoader.d.ts +2 -0
  54. package/dist/components/componentLoader.js +52 -10
  55. package/dist/components/componentLoader.js.map +1 -1
  56. package/dist/components/componentSecrets.d.ts +63 -0
  57. package/dist/components/componentSecrets.js +405 -0
  58. package/dist/components/componentSecrets.js.map +1 -0
  59. package/dist/components/deploymentRecorder.d.ts +3 -0
  60. package/dist/components/deploymentRecorder.js +4 -3
  61. package/dist/components/deploymentRecorder.js.map +1 -1
  62. package/dist/components/mcp/adapters/fastify.d.ts +2 -0
  63. package/dist/components/mcp/adapters/fastify.js +1 -0
  64. package/dist/components/mcp/adapters/fastify.js.map +1 -1
  65. package/dist/components/mcp/adapters/harperHttp.d.ts +2 -0
  66. package/dist/components/mcp/adapters/harperHttp.js +1 -0
  67. package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
  68. package/dist/components/mcp/audit.d.ts +2 -2
  69. package/dist/components/mcp/audit.js +20 -5
  70. package/dist/components/mcp/audit.js.map +1 -1
  71. package/dist/components/mcp/customResourceRegistry.d.ts +5 -12
  72. package/dist/components/mcp/customResourceRegistry.js +15 -30
  73. package/dist/components/mcp/customResourceRegistry.js.map +1 -1
  74. package/dist/components/mcp/listChanged.d.ts +7 -2
  75. package/dist/components/mcp/listChanged.js +28 -0
  76. package/dist/components/mcp/listChanged.js.map +1 -1
  77. package/dist/components/mcp/quota.d.ts +31 -0
  78. package/dist/components/mcp/quota.js +155 -0
  79. package/dist/components/mcp/quota.js.map +1 -0
  80. package/dist/components/mcp/rateLimit.d.ts +19 -3
  81. package/dist/components/mcp/rateLimit.js +129 -13
  82. package/dist/components/mcp/rateLimit.js.map +1 -1
  83. package/dist/components/mcp/resources.js.map +1 -1
  84. package/dist/components/mcp/toolRegistry.d.ts +39 -1
  85. package/dist/components/mcp/toolRegistry.js +60 -5
  86. package/dist/components/mcp/toolRegistry.js.map +1 -1
  87. package/dist/components/mcp/tools/application.d.ts +8 -1
  88. package/dist/components/mcp/tools/application.js +65 -5
  89. package/dist/components/mcp/tools/application.js.map +1 -1
  90. package/dist/components/mcp/tools/operations.d.ts +15 -3
  91. package/dist/components/mcp/tools/operations.js +99 -38
  92. package/dist/components/mcp/tools/operations.js.map +1 -1
  93. package/dist/components/mcp/tools/schemas/operationDescriptions.js +4 -4
  94. package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
  95. package/dist/components/mcp/tools/schemas/operations.js +4 -0
  96. package/dist/components/mcp/tools/schemas/operations.js.map +1 -1
  97. package/dist/components/mcp/transport.d.ts +6 -0
  98. package/dist/components/mcp/transport.js +47 -3
  99. package/dist/components/mcp/transport.js.map +1 -1
  100. package/dist/components/ollama/index.d.ts +4 -1
  101. package/dist/components/ollama/index.js +4 -2
  102. package/dist/components/ollama/index.js.map +1 -1
  103. package/dist/components/openai/index.d.ts +4 -1
  104. package/dist/components/openai/index.js +4 -2
  105. package/dist/components/openai/index.js.map +1 -1
  106. package/dist/components/operations.d.ts +39 -0
  107. package/dist/components/operations.js +194 -2
  108. package/dist/components/operations.js.map +1 -1
  109. package/dist/components/operationsValidation.d.ts +38 -0
  110. package/dist/components/operationsValidation.js +155 -0
  111. package/dist/components/operationsValidation.js.map +1 -1
  112. package/dist/components/secretOperations.d.ts +113 -0
  113. package/dist/components/secretOperations.js +475 -0
  114. package/dist/components/secretOperations.js.map +1 -0
  115. package/dist/config/configUtils.d.ts +4 -1
  116. package/dist/config/configUtils.js +18 -1
  117. package/dist/config/configUtils.js.map +1 -1
  118. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +4 -3
  119. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js.map +1 -1
  120. package/dist/dataLayer/readAuditLog.js +11 -0
  121. package/dist/dataLayer/readAuditLog.js.map +1 -1
  122. package/dist/dataLayer/schemaDescribe.js +2 -0
  123. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  124. package/dist/globals.d.ts +1 -1
  125. package/dist/globals.js +1 -0
  126. package/dist/globals.js.map +1 -1
  127. package/dist/index.d.ts +3 -0
  128. package/dist/index.js +1 -0
  129. package/dist/index.js.map +1 -1
  130. package/dist/json/systemSchema.json +38 -0
  131. package/dist/resources/DatabaseTransaction.d.ts +31 -3
  132. package/dist/resources/DatabaseTransaction.js +190 -29
  133. package/dist/resources/DatabaseTransaction.js.map +1 -1
  134. package/dist/resources/LMDBTransaction.d.ts +1 -1
  135. package/dist/resources/LMDBTransaction.js +43 -5
  136. package/dist/resources/LMDBTransaction.js.map +1 -1
  137. package/dist/resources/PrimaryRocksDatabase.d.ts +51 -0
  138. package/dist/resources/PrimaryRocksDatabase.js +194 -0
  139. package/dist/resources/PrimaryRocksDatabase.js.map +1 -0
  140. package/dist/resources/RecordEncoder.d.ts +1 -0
  141. package/dist/resources/RecordEncoder.js +81 -75
  142. package/dist/resources/RecordEncoder.js.map +1 -1
  143. package/dist/resources/RequestTarget.d.ts +19 -0
  144. package/dist/resources/RequestTarget.js.map +1 -1
  145. package/dist/resources/Resource.d.ts +0 -1
  146. package/dist/resources/Resource.js +103 -16
  147. package/dist/resources/Resource.js.map +1 -1
  148. package/dist/resources/ResourceInterface.d.ts +6 -2
  149. package/dist/resources/ResourceInterface.js.map +1 -1
  150. package/dist/resources/Resources.js.map +1 -1
  151. package/dist/resources/Table.d.ts +6 -4
  152. package/dist/resources/Table.js +247 -24
  153. package/dist/resources/Table.js.map +1 -1
  154. package/dist/resources/analytics/read.js +25 -28
  155. package/dist/resources/analytics/read.js.map +1 -1
  156. package/dist/resources/blob.js +165 -22
  157. package/dist/resources/blob.js.map +1 -1
  158. package/dist/resources/crdt.d.ts +2 -0
  159. package/dist/resources/crdt.js +45 -36
  160. package/dist/resources/crdt.js.map +1 -1
  161. package/dist/resources/databases.d.ts +1 -0
  162. package/dist/resources/databases.js +134 -7
  163. package/dist/resources/databases.js.map +1 -1
  164. package/dist/resources/graphql.js +8 -0
  165. package/dist/resources/graphql.js.map +1 -1
  166. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +35 -5
  167. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +239 -14
  168. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
  169. package/dist/resources/jsResource.js +6 -0
  170. package/dist/resources/jsResource.js.map +1 -1
  171. package/dist/resources/loadEnv.js +30 -3
  172. package/dist/resources/loadEnv.js.map +1 -1
  173. package/dist/resources/login.js +2 -2
  174. package/dist/resources/login.js.map +1 -1
  175. package/dist/resources/models/Models.js +14 -3
  176. package/dist/resources/models/Models.js.map +1 -1
  177. package/dist/resources/models/embedHook.js +10 -2
  178. package/dist/resources/models/embedHook.js.map +1 -1
  179. package/dist/resources/models/openaiStream.d.ts +56 -0
  180. package/dist/resources/models/openaiStream.js +94 -0
  181. package/dist/resources/models/openaiStream.js.map +1 -0
  182. package/dist/resources/replayLogs.js +4 -3
  183. package/dist/resources/replayLogs.js.map +1 -1
  184. package/dist/resources/search.d.ts +1 -1
  185. package/dist/resources/search.js +104 -11
  186. package/dist/resources/search.js.map +1 -1
  187. package/dist/resources/secretDecryptor.d.ts +54 -0
  188. package/dist/resources/secretDecryptor.js +131 -0
  189. package/dist/resources/secretDecryptor.js.map +1 -0
  190. package/dist/resources/tracked.js +15 -5
  191. package/dist/resources/tracked.js.map +1 -1
  192. package/dist/security/auth.js +71 -8
  193. package/dist/security/auth.js.map +1 -1
  194. package/dist/security/jsLoader.js +11 -0
  195. package/dist/security/jsLoader.js.map +1 -1
  196. package/dist/security/tokenAuthentication.d.ts +9 -1
  197. package/dist/security/tokenAuthentication.js +31 -1
  198. package/dist/security/tokenAuthentication.js.map +1 -1
  199. package/dist/server/DurableSubscriptionsSession.d.ts +1 -1
  200. package/dist/server/DurableSubscriptionsSession.js +8 -4
  201. package/dist/server/DurableSubscriptionsSession.js.map +1 -1
  202. package/dist/server/REST.js +28 -9
  203. package/dist/server/REST.js.map +1 -1
  204. package/dist/server/fastifyRoutes.js +11 -1
  205. package/dist/server/fastifyRoutes.js.map +1 -1
  206. package/dist/server/graphqlQuerying.js +4 -3
  207. package/dist/server/graphqlQuerying.js.map +1 -1
  208. package/dist/server/http.d.ts +40 -2
  209. package/dist/server/http.js +560 -77
  210. package/dist/server/http.js.map +1 -1
  211. package/dist/server/itc/serverHandlers.js +64 -0
  212. package/dist/server/itc/serverHandlers.js.map +1 -1
  213. package/dist/server/liveSubscriptionAuth.d.ts +12 -0
  214. package/dist/server/liveSubscriptionAuth.js +140 -0
  215. package/dist/server/liveSubscriptionAuth.js.map +1 -0
  216. package/dist/server/loadRootComponents.js +2 -1
  217. package/dist/server/loadRootComponents.js.map +1 -1
  218. package/dist/server/middlewareChain.d.ts +44 -1
  219. package/dist/server/middlewareChain.js +86 -10
  220. package/dist/server/middlewareChain.js.map +1 -1
  221. package/dist/server/mqtt.js +2 -1
  222. package/dist/server/mqtt.js.map +1 -1
  223. package/dist/server/operationsServer.js +1 -1
  224. package/dist/server/operationsServer.js.map +1 -1
  225. package/dist/server/serverHelpers/Headers.d.ts +9 -0
  226. package/dist/server/serverHelpers/Headers.js +22 -0
  227. package/dist/server/serverHelpers/Headers.js.map +1 -1
  228. package/dist/server/serverHelpers/JSONStream.js +3 -3
  229. package/dist/server/serverHelpers/JSONStream.js.map +1 -1
  230. package/dist/server/serverHelpers/Request.d.ts +52 -1
  231. package/dist/server/serverHelpers/Request.js +122 -1
  232. package/dist/server/serverHelpers/Request.js.map +1 -1
  233. package/dist/server/serverHelpers/contentTypes.js +3 -8
  234. package/dist/server/serverHelpers/contentTypes.js.map +1 -1
  235. package/dist/server/serverHelpers/progressEmitter.d.ts +19 -0
  236. package/dist/server/serverHelpers/progressEmitter.js +52 -4
  237. package/dist/server/serverHelpers/progressEmitter.js.map +1 -1
  238. package/dist/server/serverHelpers/registeredOperations.d.ts +40 -0
  239. package/dist/server/serverHelpers/registeredOperations.js +286 -0
  240. package/dist/server/serverHelpers/registeredOperations.js.map +1 -0
  241. package/dist/server/serverHelpers/serverHandlers.js +11 -5
  242. package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
  243. package/dist/server/serverHelpers/serverUtilities.d.ts +1 -0
  244. package/dist/server/serverHelpers/serverUtilities.js +67 -5
  245. package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
  246. package/dist/server/serverHelpers/uwsServer.d.ts +80 -0
  247. package/dist/server/serverHelpers/uwsServer.js +433 -0
  248. package/dist/server/serverHelpers/uwsServer.js.map +1 -0
  249. package/dist/server/static.d.ts +0 -15
  250. package/dist/server/static.js +161 -2
  251. package/dist/server/static.js.map +1 -1
  252. package/dist/server/status/index.d.ts +4 -1
  253. package/dist/server/status/index.js +64 -4
  254. package/dist/server/status/index.js.map +1 -1
  255. package/dist/server/threads/manageThreads.d.ts +10 -0
  256. package/dist/server/threads/manageThreads.js +107 -4
  257. package/dist/server/threads/manageThreads.js.map +1 -1
  258. package/dist/server/threads/socketRouter.js +5 -1
  259. package/dist/server/threads/socketRouter.js.map +1 -1
  260. package/dist/server/threads/threadServer.js +92 -14
  261. package/dist/server/threads/threadServer.js.map +1 -1
  262. package/dist/upgrade/directives/5-2-0.d.ts +7 -0
  263. package/dist/upgrade/directives/5-2-0.js +108 -0
  264. package/dist/upgrade/directives/5-2-0.js.map +1 -0
  265. package/dist/upgrade/directives/directivesController.js +2 -1
  266. package/dist/upgrade/directives/directivesController.js.map +1 -1
  267. package/dist/utility/common_utils.js +5 -0
  268. package/dist/utility/common_utils.js.map +1 -1
  269. package/dist/utility/envFile.d.ts +41 -0
  270. package/dist/utility/envFile.js +221 -0
  271. package/dist/utility/envFile.js.map +1 -0
  272. package/dist/utility/globalSchema.d.ts +9 -0
  273. package/dist/utility/hdbTerms.d.ts +25 -0
  274. package/dist/utility/hdbTerms.js +31 -0
  275. package/dist/utility/hdbTerms.js.map +1 -1
  276. package/dist/utility/logging/harper_logger.d.ts +21 -0
  277. package/dist/utility/logging/harper_logger.js +160 -8
  278. package/dist/utility/logging/harper_logger.js.map +1 -1
  279. package/dist/utility/logging/logRotator.js +29 -17
  280. package/dist/utility/logging/logRotator.js.map +1 -1
  281. package/dist/utility/logging/readLog.d.ts +1 -1
  282. package/dist/utility/logging/readLog.js +305 -2
  283. package/dist/utility/logging/readLog.js.map +1 -1
  284. package/dist/utility/operationPermissions.d.ts +18 -0
  285. package/dist/utility/operationPermissions.js +35 -1
  286. package/dist/utility/operationPermissions.js.map +1 -1
  287. package/dist/utility/operation_authorization.d.ts +17 -0
  288. package/dist/utility/operation_authorization.js +38 -0
  289. package/dist/utility/operation_authorization.js.map +1 -1
  290. package/dist/utility/secretEnvelope.d.ts +30 -0
  291. package/dist/utility/secretEnvelope.js +94 -0
  292. package/dist/utility/secretEnvelope.js.map +1 -0
  293. package/dist/utility/signalling.d.ts +7 -0
  294. package/dist/utility/signalling.js +16 -0
  295. package/dist/utility/signalling.js.map +1 -1
  296. package/dist/validation/configValidator.js +70 -24
  297. package/dist/validation/configValidator.js.map +1 -1
  298. package/index.ts +4 -0
  299. package/json/systemSchema.json +38 -0
  300. package/npm-shrinkwrap.json +15066 -9347
  301. package/package.json +13 -8
  302. package/resources/DESIGN.md +15 -12
  303. package/resources/DatabaseTransaction.ts +206 -37
  304. package/resources/LMDBTransaction.ts +43 -9
  305. package/resources/PrimaryRocksDatabase.ts +201 -0
  306. package/resources/RecordEncoder.ts +81 -69
  307. package/resources/RequestTarget.ts +21 -0
  308. package/resources/Resource.ts +109 -25
  309. package/resources/ResourceInterface.ts +6 -2
  310. package/resources/Resources.ts +1 -3
  311. package/resources/Table.ts +238 -29
  312. package/resources/analytics/read.ts +25 -30
  313. package/resources/blob.ts +159 -23
  314. package/resources/crdt.ts +37 -31
  315. package/resources/databases.ts +143 -6
  316. package/resources/graphql.ts +8 -0
  317. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +251 -17
  318. package/resources/jsResource.ts +6 -0
  319. package/resources/loadEnv.ts +34 -3
  320. package/resources/login.ts +2 -2
  321. package/resources/models/Models.ts +19 -3
  322. package/resources/models/embedHook.ts +13 -2
  323. package/resources/models/openaiStream.ts +133 -0
  324. package/resources/replayLogs.ts +4 -3
  325. package/resources/search.ts +113 -11
  326. package/resources/secretDecryptor.ts +159 -0
  327. package/resources/tracked.ts +24 -17
  328. package/security/auth.ts +70 -10
  329. package/security/jsLoader.ts +12 -0
  330. package/security/tokenAuthentication.ts +42 -1
  331. package/server/DESIGN.md +10 -0
  332. package/server/DurableSubscriptionsSession.ts +8 -4
  333. package/server/REST.ts +26 -9
  334. package/server/fastifyRoutes.ts +10 -1
  335. package/server/graphqlQuerying.ts +4 -3
  336. package/server/http.ts +563 -77
  337. package/server/itc/serverHandlers.js +70 -0
  338. package/server/liveSubscriptionAuth.ts +152 -0
  339. package/server/loadRootComponents.js +2 -1
  340. package/server/middlewareChain.ts +107 -17
  341. package/server/mqtt.ts +2 -1
  342. package/server/operationsServer.ts +2 -2
  343. package/server/serverHelpers/Headers.ts +24 -0
  344. package/server/serverHelpers/JSONStream.ts +3 -3
  345. package/server/serverHelpers/Request.ts +127 -0
  346. package/server/serverHelpers/contentTypes.ts +3 -8
  347. package/server/serverHelpers/progressEmitter.ts +55 -5
  348. package/server/serverHelpers/registeredOperations.ts +259 -0
  349. package/server/serverHelpers/serverHandlers.js +11 -5
  350. package/server/serverHelpers/serverUtilities.ts +88 -5
  351. package/server/serverHelpers/uwsServer.ts +488 -0
  352. package/server/static.ts +180 -2
  353. package/server/status/index.ts +72 -4
  354. package/server/threads/manageThreads.js +102 -4
  355. package/server/threads/socketRouter.ts +5 -1
  356. package/server/threads/threadServer.js +93 -10
  357. package/studio/web/assets/{Chat-SdD1EZca.js → Chat-Cv_2paZE.js} +2 -2
  358. package/studio/web/assets/{Chat-SdD1EZca.js.map → Chat-Cv_2paZE.js.map} +1 -1
  359. package/studio/web/assets/{FloatingChat-GMq6tHK9.js → FloatingChat-CPyPIcVR.js} +4 -4
  360. package/studio/web/assets/{FloatingChat-GMq6tHK9.js.map → FloatingChat-CPyPIcVR.js.map} +1 -1
  361. package/studio/web/assets/{applications-B5hhv7uA.js → applications-C0jT2vdZ.js} +2 -2
  362. package/studio/web/assets/{applications-B5hhv7uA.js.map → applications-C0jT2vdZ.js.map} +1 -1
  363. package/studio/web/assets/{index-VFcpNWgq.js → index-D_GKOkhn.js} +6 -6
  364. package/studio/web/assets/index-D_GKOkhn.js.map +1 -0
  365. package/studio/web/assets/{index.lazy-DgcJojIA.js → index.lazy-CAmCIA65.js} +4 -4
  366. package/studio/web/assets/{index.lazy-DgcJojIA.js.map → index.lazy-CAmCIA65.js.map} +1 -1
  367. package/studio/web/assets/{profile-BqN-8vzm.js → profile-CaF-4aZe.js} +2 -2
  368. package/studio/web/assets/{profile-BqN-8vzm.js.map → profile-CaF-4aZe.js.map} +1 -1
  369. package/studio/web/assets/{setComponentFile-CHFvFq9u.js → setComponentFile-DLW1DHCt.js} +2 -2
  370. package/studio/web/assets/{setComponentFile-CHFvFq9u.js.map → setComponentFile-DLW1DHCt.js.map} +1 -1
  371. package/studio/web/assets/{setup-CQ3vWJSr.js → setup-TGCErIhq.js} +2 -2
  372. package/studio/web/assets/{setup-CQ3vWJSr.js.map → setup-TGCErIhq.js.map} +1 -1
  373. package/studio/web/assets/{status-BsW5fjuh.js → status-DG0Maoao.js} +2 -2
  374. package/studio/web/assets/{status-BsW5fjuh.js.map → status-DG0Maoao.js.map} +1 -1
  375. package/studio/web/assets/{swagger-ui-react-DITdeB9-.js → swagger-ui-react-8T4SgQ1m.js} +2 -2
  376. package/studio/web/assets/{swagger-ui-react-DITdeB9-.js.map → swagger-ui-react-8T4SgQ1m.js.map} +1 -1
  377. package/studio/web/assets/{tsMode-Dyph-OUs.js → tsMode-DJ6Sl24Q.js} +2 -2
  378. package/studio/web/assets/{tsMode-Dyph-OUs.js.map → tsMode-DJ6Sl24Q.js.map} +1 -1
  379. package/studio/web/assets/{useEntityRestURL-D0QTUqex.js → useEntityRestURL-JO2mfWTQ.js} +2 -2
  380. package/studio/web/assets/{useEntityRestURL-D0QTUqex.js.map → useEntityRestURL-JO2mfWTQ.js.map} +1 -1
  381. package/studio/web/index.html +1 -1
  382. package/upgrade/directives/5-2-0.ts +82 -0
  383. package/upgrade/directives/directivesController.ts +2 -1
  384. package/utility/common_utils.ts +5 -0
  385. package/utility/envFile.ts +218 -0
  386. package/utility/hdbTerms.ts +31 -0
  387. package/utility/logging/harper_logger.ts +156 -8
  388. package/utility/logging/logRotator.ts +24 -14
  389. package/utility/logging/readLog.ts +323 -2
  390. package/utility/operationPermissions.ts +35 -1
  391. package/utility/operation_authorization.ts +74 -1
  392. package/utility/secretEnvelope.ts +113 -0
  393. package/utility/signalling.ts +15 -0
  394. package/validation/configValidator.ts +78 -25
  395. package/studio/web/assets/index-VFcpNWgq.js.map +0 -1
@@ -7,6 +7,8 @@ exports.handleApplication = handleApplication;
7
7
  const node_fs_1 = require("node:fs");
8
8
  const node_path_1 = require("node:path");
9
9
  const resolveBaseURLPath_ts_1 = require("../components/resolveBaseURLPath.js");
10
+ const common_utils_ts_1 = require("../utility/common_utils.js");
11
+ const micromatch_1 = require("micromatch");
10
12
  const send_1 = __importDefault(require("send"));
11
13
  /**
12
14
  * The static plugin handles serving static files from the respective application directory.
@@ -16,13 +18,126 @@ const send_1 = __importDefault(require("send"));
16
18
  * - `index`: If enabled, it will serve `index.html` files from directories.
17
19
  * - `extensions`: An array of file extensions to try when serving files. If a file is not found, it will try appending each extension in order. For example, if set to `['html'], and the request is `/page`, it will try `/page.html` if `/page` is not found.
18
20
  * - `fallthrough`: If true, it will fall through to the next handler if the file is not found. If false, it will return a 404 error.
21
+ * - `maxAge`: Freshness lifetime for served files — a number of seconds or a duration string
22
+ * (`'5m'`, `'1d'`). Emitted as `Cache-Control: public, max-age=<seconds>`. Defaults to 0
23
+ * (revalidate every request via the ETag/Last-Modified that are always emitted).
24
+ * - `immutable`: If true, adds the `immutable` directive to `Cache-Control` — for content-hashed
25
+ * assets that never change under the same URL. Requires `maxAge` to be meaningful.
26
+ * - `cacheControl`: Full `Cache-Control` override string (takes precedence over `maxAge`/`immutable`),
27
+ * or `false` to suppress the header entirely. Static files are served before authentication, so
28
+ * they are public by construction — do not put per-user content behind this handler.
29
+ * - `cacheOverrides`: A map of glob pattern → partial cache options (`maxAge` / `immutable` /
30
+ * `cacheControl`), letting specific files opt out of the top-level defaults. The typical case is
31
+ * long-lived `immutable` defaults for content-hashed assets while `index.html` gets a short window
32
+ * or `stale-while-revalidate`. Patterns are matched (via `micromatch`, same engine as `files`)
33
+ * against the mount-relative URL path **and** the served file's basename — so `index.html` also
34
+ * targets the directory-index (`/`) serve. Entries are tested in config order and the first match
35
+ * wins; each is a partial (keys present replace the default, absent keys inherit), with the same
36
+ * `cacheControl`-beats-`maxAge`/`immutable` precedence as the top level. Example:
37
+ * ```yaml
38
+ * static:
39
+ * files: 'web/**'
40
+ * maxAge: 1y
41
+ * immutable: true
42
+ * cacheOverrides:
43
+ * 'index.html': { cacheControl: 'public, max-age=0, stale-while-revalidate=60' }
44
+ * '*.html': { maxAge: 5m, immutable: false }
45
+ * ```
19
46
  * - `notFound`: Can be specified as a string to serve a custom 404 page, or an object with `file` and `statusCode` properties to serve a custom file with a specific status code. This is useful for hosting SPAs that use client-side routing. Make sure to set `fallthrough` to `false`!
47
+ * - `before` / `after`: Position this handler in the HTTP middleware chain relative to another named
48
+ * handler. By default the handler runs `before: 'authentication'` — and therefore before the REST
49
+ * handler — so plain file requests skip credential parsing. That default means a `fallthrough: false`
50
+ * catch-all answers GETs for exported REST resources too; an SPA with history-mode routing should set
51
+ * `after: 'rest'` so the API is matched first and only unmatched URLs receive the `notFound` fallback.
52
+ * `before: false` clears the default without adding a new constraint (registration order applies).
53
+ * Handler names are the component config keys as registered (e.g. `rest`, not the legacy `REST` alias);
54
+ * a name that matches no registered handler is ignored, with a warning logged by the middleware chain.
55
+ * Ordering is applied when the component loads; changing `before`/`after` triggers a component restart.
20
56
  *
21
57
  * This plugin dynamically updates its behavior based on the current configuration file. Users can make updates and immediately see the changes reflect in the next request.
22
58
  *
23
59
  * Updates to the `files` option will clear the in-memory maps and allow them to regenerate based on the new configuration (since the default EntryHandler will regenerate anyways).
24
60
  * Updates to `urlPath` request a restart: the HTTP route mount is registered once at load and cannot be re-registered on a live server (#1583).
25
61
  */
62
+ /**
63
+ * Resolve the effective cache-header inputs for a given served file: the live top-level
64
+ * `maxAge`/`immutable`/`cacheControl` options, with the first matching `cacheOverrides` entry layered
65
+ * on top (a partial — keys present replace the default, absent keys inherit). Patterns are matched
66
+ * (via `micromatch`, same engine as `files`) against the mount-relative URL path and the file's
67
+ * basename, so `index.html` also targets the directory-index (`/`) serve.
68
+ */
69
+ function resolveCacheOptions(scope, urlKey, basename) {
70
+ let maxAge = scope.options.get(['maxAge']);
71
+ let immutable = scope.options.get(['immutable']);
72
+ let cacheControl = scope.options.get(['cacheControl']);
73
+ const overrides = scope.options.get(['cacheOverrides']);
74
+ if (overrides !== undefined) {
75
+ if (typeof overrides !== 'object' || overrides === null || Array.isArray(overrides)) {
76
+ throw new Error(`Invalid cacheOverrides option: ${overrides}. Must be a map of glob pattern to cache options.`);
77
+ }
78
+ for (const pattern of Object.keys(overrides)) {
79
+ if ((0, micromatch_1.isMatch)(urlKey, pattern) || (0, micromatch_1.isMatch)(basename, pattern)) {
80
+ const override = overrides[pattern];
81
+ if (typeof override !== 'object' || override === null || Array.isArray(override)) {
82
+ throw new Error(`Invalid cacheOverrides['${pattern}'] value: ${override}. Must be an object with maxAge/immutable/cacheControl.`);
83
+ }
84
+ // partial merge: only keys present in the override replace the top-level default
85
+ if ('maxAge' in override)
86
+ maxAge = override.maxAge;
87
+ if ('immutable' in override)
88
+ immutable = override.immutable;
89
+ if ('cacheControl' in override)
90
+ cacheControl = override.cacheControl;
91
+ break; // first match wins
92
+ }
93
+ }
94
+ }
95
+ immutable = immutable ?? false;
96
+ if (maxAge !== undefined && typeof maxAge !== 'number' && typeof maxAge !== 'string') {
97
+ throw new Error(`Invalid maxAge option: ${maxAge}. Must be a number of seconds or a duration string like '5m'.`);
98
+ }
99
+ const maxAgeMs = maxAge === undefined ? 0 : (0, common_utils_ts_1.convertToMS)(maxAge);
100
+ if (Number.isNaN(maxAgeMs)) {
101
+ throw new Error(`Invalid maxAge option: ${maxAge}. Must be a number of seconds or a duration string like '5m'.`);
102
+ }
103
+ if (typeof immutable !== 'boolean') {
104
+ throw new Error(`Invalid immutable option: ${immutable}. Must be a boolean.`);
105
+ }
106
+ if (cacheControl !== undefined && typeof cacheControl !== 'string' && cacheControl !== false) {
107
+ throw new Error(`Invalid cacheControl option: ${cacheControl}. Must be a string or false.`);
108
+ }
109
+ const customCacheControl = typeof cacheControl === 'string' ? cacheControl : undefined;
110
+ return { cacheControlDisabled: cacheControl === false, maxAgeMs, immutable, customCacheControl };
111
+ }
112
+ /**
113
+ * Serve a file through `send`, applying the plugin's cache-header options (read live from the
114
+ * component config, like `fallthrough`, and layered with any matching `cacheOverrides` entry).
115
+ * `cacheControl` as a string overrides `maxAge`/`immutable` via send's `headers` event;
116
+ * `cacheControl: false` suppresses the header entirely. Applied only to the main file serve — the
117
+ * `notFound` fallback keeps send's default `max-age=0`, which is the right policy for SPA index
118
+ * fallbacks.
119
+ */
120
+ function serveFile(req, path, scope) {
121
+ // The staticFiles map keys are the mount-relative URL path (leading slash stripped for matching);
122
+ // for a directory-index serve req.pathname is the directory, so also match the served basename.
123
+ const urlKey = typeof req.pathname === 'string' ? req.pathname.replace(/^\//, '') : '';
124
+ const basename = path.slice(Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\')) + 1);
125
+ const { cacheControlDisabled, maxAgeMs, immutable, customCacheControl } = resolveCacheOptions(scope, urlKey, basename);
126
+ const stream = (0, send_1.default)(req, path, {
127
+ // suppress send's own header when we set a full override below (or when disabled)
128
+ cacheControl: cacheControlDisabled || customCacheControl !== undefined ? false : true,
129
+ maxAge: maxAgeMs,
130
+ immutable,
131
+ });
132
+ // an empty-string override intentionally behaves like `false` (send's header is suppressed
133
+ // above and no override is written)
134
+ if (customCacheControl) {
135
+ stream.on('headers', (response) => {
136
+ response.setHeader('Cache-Control', customCacheControl);
137
+ });
138
+ }
139
+ return stream;
140
+ }
26
141
  function handleApplication(scope) {
27
142
  // in-memory map of static files
28
143
  // keys are the URL paths relative to the mount base, values are the absolute paths to the files
@@ -32,6 +147,28 @@ function handleApplication(scope) {
32
147
  // cannot be re-registered at runtime. Capture the matching base once so map keys always agree
33
148
  // with the registered route (#1583).
34
149
  const baseURLPath = (0, resolveBaseURLPath_ts_1.resolveBaseURLPath)(scope.pluginName, scope.options.getAll()?.urlPath);
150
+ // A bare `before:` / `after:` key in YAML parses as null — treat it as unset, like before this
151
+ // option was validated.
152
+ const before = scope.options.get(['before']) ?? undefined;
153
+ const after = scope.options.get(['after']) ?? undefined;
154
+ validateOrderingOption('before', before, true);
155
+ validateOrderingOption('after', after, false);
156
+ // Default to the pre-authentication hoist only when no ordering was configured at all.
157
+ const noOrderingConfigured = before === undefined && after === undefined;
158
+ // With the default ordering this handler answers unmatched GETs ahead of the REST handler, so a
159
+ // `fallthrough: false` catch-all makes any exported REST resources unreachable over GET.
160
+ // Reads the live option values (not the registration-time ones above): a config save can change
161
+ // the ordering options together with `fallthrough`, and this re-runs from the change listener.
162
+ const warnIfBlockingRest = () => {
163
+ const liveBefore = scope.options.get(['before']) ?? undefined;
164
+ const liveAfter = scope.options.get(['after']) ?? undefined;
165
+ if (liveAfter === undefined &&
166
+ (liveBefore === undefined || liveBefore === 'authentication') &&
167
+ scope.options.get(['fallthrough']) === false) {
168
+ scope.logger.warn(`The static handler runs before authentication and REST by default, so \`fallthrough: false\` answers every unmatched GET itself — including GETs for any exported REST resources. If this application serves an API, add \`after: 'rest'\` to the static options so API requests are matched first, or remove \`fallthrough: false\`.`);
169
+ }
170
+ };
171
+ warnIfBlockingRest();
35
172
  scope.options.on('change', (key) => {
36
173
  if (key[0] === 'files') {
37
174
  // If the files option changes, clear the maps and let the entry handler regenerate them
@@ -45,6 +182,16 @@ function handleApplication(scope) {
45
182
  scope.requestRestart();
46
183
  return;
47
184
  }
185
+ if (key[0] === 'fallthrough') {
186
+ warnIfBlockingRest();
187
+ return;
188
+ }
189
+ // `before`/`after` are consumed once at registration; the middleware chain can only pick
190
+ // up a new ordering by reloading the component. (Scope's own auto-restart on option
191
+ // changes is bypassed once a plugin registers its own 'change' listener, as we do above.)
192
+ if (key[0] === 'before' || key[0] === 'after') {
193
+ scope.requestRestart();
194
+ }
48
195
  });
49
196
  // Handle entry events for the default entry handler based on the `files` and `urlPath` options
50
197
  scope.handleEntry((entry) => {
@@ -160,7 +307,7 @@ function handleApplication(scope) {
160
307
  // The benefit to using `send` is that it handles a lot of edge cases and headers for us.
161
308
  return {
162
309
  handlesHeaders: true,
163
- body: (0, send_1.default)(req, (0, node_fs_1.realpathSync)(staticFile)),
310
+ body: serveFile(req, (0, node_fs_1.realpathSync)(staticFile), scope),
164
311
  };
165
312
  }
166
313
  // If fallthrough is true pass along the request to the next handler
@@ -186,7 +333,19 @@ function handleApplication(scope) {
186
333
  handlesHeaders: true,
187
334
  body: (0, send_1.default)(req, (0, node_fs_1.realpathSync)(notFoundPath)),
188
335
  };
189
- }, { before: scope.options.get(['before']) ?? 'authentication' });
336
+ }, {
337
+ // `after` (e.g. `after: 'rest'`) must suppress the default pre-authentication hoist —
338
+ // combining the two constraints would be a cycle, which falls back to registration order.
339
+ before: typeof before === 'string' ? before : noOrderingConfigured ? 'authentication' : undefined,
340
+ after: after,
341
+ });
342
+ }
343
+ function validateOrderingOption(name, value, allowFalse) {
344
+ if (value === undefined || (typeof value === 'string' && value.length > 0))
345
+ return;
346
+ if (allowFalse && value === false)
347
+ return;
348
+ throw new Error(`Invalid \`${name}\` option: ${value}. Must be the name of another handler${allowFalse ? ', or false to clear the default ordering' : ''}.`);
190
349
  }
191
350
  function validateNotFoundOption(notFound) {
192
351
  if (notFound === undefined || typeof notFound === 'string')
@@ -1 +1 @@
1
- {"version":3,"file":"static.js","sourceRoot":"","sources":["../../server/static.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"static.js","sourceRoot":"","sources":["../../server/static.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export type { StatusId, StatusRecord, StatusValueMap } from './definitions.ts';
5
5
  export { STATUS_IDS, DEFAULT_STATUS_ID } from './definitions.ts';
6
6
  type StatusRequestBody = {
7
7
  id: StatusId;
8
+ middleware?: boolean;
8
9
  };
9
10
  type StatusWriteRequestBody<T extends StatusId = StatusId> = {
10
11
  id?: T;
@@ -21,6 +22,8 @@ interface AllStatusSummary {
21
22
  systemStatus: Promise<AsyncIterable<StatusRecord>>;
22
23
  componentStatus: AggregatedComponentStatusWithName[];
23
24
  restartRequired: boolean;
25
+ middlewareChains?: MiddlewareChainsSummary | null;
24
26
  }
25
- declare function getStatus({ id }: Partial<StatusRequestBody>): Promise<StatusRecord | AllStatusSummary>;
27
+ type MiddlewareChainsSummary = ReturnType<typeof import('../http.ts').describeMiddlewareChains>;
28
+ declare function getStatus({ id, middleware }: Partial<StatusRequestBody>): Promise<StatusRecord | AllStatusSummary>;
26
29
  declare function setStatus<T extends StatusId = StatusId>({ status, id, }: StatusWriteRequestBody<T>): Promise<StatusRecord<T>>;
@@ -11,6 +11,9 @@ const statusValidator_ts_1 = require("../../validation/statusValidator.js");
11
11
  const definitions_ts_1 = require("./definitions.js");
12
12
  const index_ts_1 = require("../../components/status/index.js");
13
13
  const requestRestart_ts_1 = require("../../components/requestRestart.js");
14
+ const itc_js_1 = require("../threads/itc.js");
15
+ const manageThreads_js_1 = require("../threads/manageThreads.js");
16
+ const hdbTerms_ts_1 = require("../../utility/hdbTerms.js");
14
17
  var definitions_ts_2 = require("./definitions.js");
15
18
  Object.defineProperty(exports, "STATUS_IDS", { enumerable: true, get: function () { return definitions_ts_2.STATUS_IDS; } });
16
19
  Object.defineProperty(exports, "DEFAULT_STATUS_ID", { enumerable: true, get: function () { return definitions_ts_2.DEFAULT_STATUS_ID; } });
@@ -53,7 +56,61 @@ function clearStatus({ id }) {
53
56
  statusLogger.debug?.('clearStatus', id);
54
57
  return getStatusTable().delete(id);
55
58
  }
56
- async function getAllStatus() {
59
+ let nextChainsRequestId = 1;
60
+ let chainsResponseListenerAttached = false;
61
+ const pendingChainsRequests = new Map();
62
+ function attachChainsResponseListener() {
63
+ if (chainsResponseListenerAttached)
64
+ return;
65
+ (0, manageThreads_js_1.onMessageByType)(hdbTerms_ts_1.ITC_EVENT_TYPES.MIDDLEWARE_CHAINS_RESPONSE, ({ message }) => {
66
+ const resolve = pendingChainsRequests.get(message.requestId);
67
+ if (resolve) {
68
+ pendingChainsRequests.delete(message.requestId);
69
+ resolve(message.chains);
70
+ }
71
+ });
72
+ chainsResponseListenerAttached = true;
73
+ }
74
+ // App HTTP middleware is only registered on worker threads, so when get_status runs on the main
75
+ // thread we ask an HTTP worker for its resolved chains (all workers register identically). Returns
76
+ // null if no worker answers within the timeout — mirrors queryWorkerForOpenApi in operationsServer.
77
+ function queryWorkerForMiddlewareChains() {
78
+ attachChainsResponseListener();
79
+ const requestId = nextChainsRequestId++;
80
+ return new Promise((resolve) => {
81
+ const timeoutHandle = setTimeout(() => {
82
+ pendingChainsRequests.delete(requestId);
83
+ resolve(null);
84
+ }, 5000);
85
+ pendingChainsRequests.set(requestId, (chains) => {
86
+ clearTimeout(timeoutHandle);
87
+ resolve(chains);
88
+ });
89
+ (0, itc_js_1.sendItcEvent)({ type: hdbTerms_ts_1.ITC_EVENT_TYPES.MIDDLEWARE_CHAINS_REQUEST, message: { requestId } }).catch(() => {
90
+ clearTimeout(timeoutHandle);
91
+ pendingChainsRequests.delete(requestId);
92
+ resolve(null);
93
+ });
94
+ });
95
+ }
96
+ // Introspect the resolved HTTP/upgrade/WebSocket middleware order (#1573). In a multi-worker
97
+ // deployment the app middleware is registered on the HTTP worker threads while the main thread
98
+ // carries only the operations-API middleware, so when an HTTP worker exists we fetch the chains from
99
+ // one over ITC. With no HTTP worker this thread is the app server itself (single-thread mode, or a
100
+ // worker serving the request) and reports locally. Job workers don't serve HTTP, so they're ignored.
101
+ async function getMiddlewareChains() {
102
+ try {
103
+ if (manageThreads_js_1.workers.some((worker) => worker.name === hdbTerms_ts_1.THREAD_TYPES.HTTP))
104
+ return await queryWorkerForMiddlewareChains();
105
+ const { describeMiddlewareChains } = await import("../http.js");
106
+ return describeMiddlewareChains();
107
+ }
108
+ catch (error) {
109
+ statusLogger.debug?.('getMiddlewareChains failed', error);
110
+ return null;
111
+ }
112
+ }
113
+ async function getAllStatus(includeMiddleware = false) {
57
114
  statusLogger.debug?.('getAllStatus');
58
115
  const statusRecords = getStatusTable().search([]);
59
116
  // Get aggregated component statuses from all threads
@@ -64,16 +121,19 @@ async function getAllStatus() {
64
121
  }));
65
122
  // Get restart flag status
66
123
  const restartRequired = (0, requestRestart_ts_1.restartNeeded)();
67
- return {
124
+ const summary = {
68
125
  systemStatus: statusRecords,
69
126
  componentStatus: componentStatusArray,
70
127
  restartRequired,
71
128
  };
129
+ if (includeMiddleware)
130
+ summary.middlewareChains = await getMiddlewareChains();
131
+ return summary;
72
132
  }
73
- function getStatus({ id }) {
133
+ function getStatus({ id, middleware }) {
74
134
  if (!id) {
75
135
  statusLogger.debug?.('getStatus', 'all');
76
- return getAllStatus();
136
+ return getAllStatus(middleware === true);
77
137
  }
78
138
  statusLogger.debug?.('getStatus', id);
79
139
  return getStatusTable().get(id);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/status/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/status/index.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,16 @@ export function setMainIsWorker(isWorker: any): void;
25
25
  export function setTerminateTimeout(newTimeout: any): void;
26
26
  export function extendShutdownDeadline(deadlineMs: any): void;
27
27
  export function restoreShutdownDeadline(): void;
28
+ /**
29
+ * Register a provider that contributes an extra `workerData` property to every worker spawned
30
+ * from this thread. `provider(options)` receives the startWorker options (`options.name` is the
31
+ * thread type, e.g. 'http' or 'job') and returns the value to place at `workerData[name]`, or
32
+ * undefined to skip that worker. Values must be structured-cloneable; a provider that throws or
33
+ * returns a non-cloneable value is logged and skipped so it can never break a spawn.
34
+ * Returns a function that unregisters the provider.
35
+ */
36
+ export function registerWorkerDataProvider(name: any, provider: any): () => void;
37
+ export function onThreadExit(listener: any): void;
28
38
  export let getThreadInfo: any;
29
39
  export function watchDir(dir: any, beforeRestartCallback: any): Promise<void>;
30
40
  import { Worker } from "node:worker_threads";
@@ -123,6 +123,8 @@ module.exports = {
123
123
  setTerminateTimeout,
124
124
  extendShutdownDeadline,
125
125
  restoreShutdownDeadline,
126
+ registerWorkerDataProvider,
127
+ onThreadExit,
126
128
  restartNumber: workerData?.restartNumber || 1,
127
129
  };
128
130
  connectedPorts.onMessageByType = onMessageByType;
@@ -167,6 +169,63 @@ function setMainIsWorker(isWorker) {
167
169
  module.exports.threadsHaveStarted();
168
170
  }
169
171
  let workerCount = 1; // should be assigned when workers are created
172
+ // Every workerData key core itself produces or consumes — providers may not collide with these.
173
+ // Covers the keys startWorker spreads below plus keys read elsewhere: `noServerStart` is set by
174
+ // the embedding entry point (index.ts) and read by threadServer.js to skip startServers(); a
175
+ // provider shadowing it would wedge HTTP worker startup.
176
+ const RESERVED_WORKER_DATA_KEYS = [
177
+ 'addPorts',
178
+ 'addThreadIds',
179
+ 'workerIndex',
180
+ 'workerCount',
181
+ 'name',
182
+ 'restartNumber',
183
+ 'ticketKeys',
184
+ 'noServerStart',
185
+ '__proto__', // never a legitimate payload name; spread would define it as an own property
186
+ ];
187
+ const workerDataProviders = new Map();
188
+ /**
189
+ * Register a provider that contributes an extra `workerData` property to every worker spawned
190
+ * from this thread. `provider(options)` receives the startWorker options (`options.name` is the
191
+ * thread type, e.g. 'http' or 'job') and returns the value to place at `workerData[name]`, or
192
+ * undefined to skip that worker. Values must be structured-cloneable; a provider that throws or
193
+ * returns a non-cloneable value is logged and skipped so it can never break a spawn.
194
+ * Returns a function that unregisters the provider.
195
+ */
196
+ function registerWorkerDataProvider(name, provider) {
197
+ if (RESERVED_WORKER_DATA_KEYS.includes(name) || workerDataProviders.has(name)) {
198
+ throw new Error(`workerData provider name '${name}' is already in use`);
199
+ }
200
+ if (typeof provider !== 'function')
201
+ throw new Error('workerData provider must be a function');
202
+ workerDataProviders.set(name, provider);
203
+ return () => {
204
+ if (workerDataProviders.get(name) === provider)
205
+ workerDataProviders.delete(name);
206
+ };
207
+ }
208
+ function collectProvidedWorkerData(options) {
209
+ if (workerDataProviders.size === 0)
210
+ return undefined;
211
+ let provided;
212
+ for (const [name, provider] of workerDataProviders) {
213
+ try {
214
+ const value = provider(options);
215
+ if (value === undefined)
216
+ continue;
217
+ // Use the clone, not the original: this both pre-flights cloneability (so a bad value
218
+ // can't break the Worker spawn) and detaches the payload from accessor-backed objects
219
+ // or later mutation that could still throw inside new Worker(). Null prototype so a
220
+ // provider name can never collide with Object.prototype members.
221
+ (provided ??= Object.create(null))[name] = structuredClone(value);
222
+ }
223
+ catch (error) {
224
+ harperLogger.error(`workerData provider '${name}' failed and will be skipped for this worker:`, error);
225
+ }
226
+ }
227
+ return provided;
228
+ }
170
229
  let ticketKeys;
171
230
  function getTicketKeys() {
172
231
  if (ticketKeys)
@@ -204,6 +263,11 @@ listenersByType.set(hdbTerms.ITC_EVENT_TYPES.USER, null);
204
263
  listenersByType.set(hdbTerms.ITC_EVENT_TYPES.COMPONENT_STATUS_REQUEST, null);
205
264
  listenersByType.set(hdbTerms.ITC_EVENT_TYPES.RESOURCE_OPENAPI_REQUEST, null);
206
265
  listenersByType.set(hdbTerms.ITC_EVENT_TYPES.RESOURCE_OPENAPI_RESPONSE, null);
266
+ listenersByType.set(hdbTerms.ITC_EVENT_TYPES.MIDDLEWARE_CHAINS_REQUEST, null);
267
+ listenersByType.set(hdbTerms.ITC_EVENT_TYPES.MIDDLEWARE_CHAINS_RESPONSE, null);
268
+ listenersByType.set(hdbTerms.ITC_EVENT_TYPES.OPERATION_REGISTERED, null);
269
+ listenersByType.set(hdbTerms.ITC_EVENT_TYPES.OPERATION_EXECUTE_REQUEST, null);
270
+ listenersByType.set(hdbTerms.ITC_EVENT_TYPES.OPERATION_EXECUTE_RESPONSE, null);
207
271
  function startWorker(path, options = {}) {
208
272
  // Take a percentage of total memory to determine the max memory for each thread. The percentage is based
209
273
  // on the thread count. Generally, it is unrealistic to efficiently use the majority of total memory for a single
@@ -270,6 +334,7 @@ function startWorker(path, options = {}) {
270
334
  argv: process.argv.slice(2),
271
335
  // pass these in synchronously to the worker so it has them on startup:
272
336
  workerData: {
337
+ ...collectProvidedWorkerData(options),
273
338
  addPorts: portsToSend,
274
339
  addThreadIds: channelsToConnect.map((channel) => channel.existingPort.threadId),
275
340
  workerIndex: options.workerIndex,
@@ -363,10 +428,16 @@ startReplacementThreads = true) {
363
428
  // make a copy of the workers before iterating them, as the workers array mutates a lot during this
364
429
  let waitingToFinish = []; // promises for workers we have shut down and are waiting to exit
365
430
  // We can only start the replacement *before* the old worker releases its port when the OS lets
366
- // both listen on the same port at once (SO_REUSEPORT). Without that — Windows (no SO_REUSEPORT)
367
- // and Bun the replacement can't bind until the old worker exits, so there we keep the original
368
- // ordering: shut the old worker down first, then start the replacement (an unavoidable brief gap).
369
- const canPreStartReplacement = process.platform !== 'win32' && !isBun;
431
+ // both listen on the same port at once (SO_REUSEPORT). Without that — Windows (no SO_REUSEPORT),
432
+ // macOS (unreliable SO_REUSEPORT, so workers bind exclusively), and Bun the replacement can't
433
+ // bind a port the old worker still holds: its EADDRINUSE would be swallowed and the port left
434
+ // unbound once the old worker exits (this silently killed worker-owned listeners like MQTT on
435
+ // macOS after every component-reload restart). So there we keep the original ordering: shut the
436
+ // old worker down first (server.close() releases its ports immediately), then start the
437
+ // replacement — an unavoidable brief gap, but only for worker-owned listeners, since the main
438
+ // thread keeps serving the HTTP ports throughout. This ordering is also what lets
439
+ // listenOnPorts() treat a dedicated listener's EADDRINUSE as an external conflict.
440
+ const canPreStartReplacement = process.platform !== 'win32' && process.platform !== 'darwin' && !isBun;
370
441
  for (let worker of workers.slice(0)) {
371
442
  if ((name && worker.name !== name) || worker.wasShutdown)
372
443
  continue; // filter by type, if specified
@@ -747,11 +818,38 @@ else {
747
818
  getThreadInfo = getChildWorkerInfo;
748
819
  }
749
820
  module.exports.getThreadInfo = getThreadInfo;
821
+ // Listeners notified when a connected thread's port closes (worker exit/restart), so
822
+ // modules holding per-thread state (e.g. registeredOperations' registry and in-flight
823
+ // forwards) can clean up.
824
+ const threadExitListeners = [];
825
+ function onThreadExit(listener) {
826
+ threadExitListeners.push(listener);
827
+ }
828
+ // Thread ids already reported to threadExitListeners, so a dead worker is only reported once
829
+ // regardless of which of the two removal paths below observes it first. Node worker_threads
830
+ // ids are monotonically increasing and never reused within a process, so this never needs
831
+ // pruning (unbounded growth is one entry per worker restart over the process lifetime).
832
+ const notifiedDeadThreadIds = new Set();
833
+ function notifyThreadExit(deadThreadId) {
834
+ if (deadThreadId == null || notifiedDeadThreadIds.has(deadThreadId))
835
+ return;
836
+ notifiedDeadThreadIds.add(deadThreadId);
837
+ for (const listener of threadExitListeners) {
838
+ try {
839
+ listener(deadThreadId);
840
+ }
841
+ catch (error) {
842
+ harperLogger.error(error);
843
+ }
844
+ }
845
+ }
750
846
  function removePort(port, deadThreadId) {
751
847
  const idx = connectedPorts.indexOf(port);
752
848
  if (idx === -1)
753
849
  return;
754
850
  connectedPorts.splice(idx, 1);
851
+ if (deadThreadId != null)
852
+ notifyThreadExit(deadThreadId);
755
853
  // Notify remaining peers to remove this dead sibling port. In Bun, sibling
756
854
  // MessagePorts don't emit 'close' when a peer worker exits, so we broadcast
757
855
  // a REMOVE_PORT message from here (which fires reliably on Worker 'exit')
@@ -790,6 +888,11 @@ function addPort(port, keepRef, isJobWorker) {
790
888
  const idx = connectedPorts.findIndex((p) => p.threadId === message.threadId);
791
889
  if (idx !== -1)
792
890
  connectedPorts.splice(idx, 1);
891
+ // A sibling's port-to-the-dead-worker can close (and broadcast this) before this
892
+ // thread's OWN port to that worker fires its 'close'/'exit' — at which point
893
+ // removePort() would no-op (already spliced) and threadExitListeners would never
894
+ // fire. Notify here too; notifyThreadExit dedupes so it isn't reported twice.
895
+ notifyThreadExit(message.threadId);
793
896
  }
794
897
  else {
795
898
  notifyMessageListeners(message, port);