@harperfast/harper 5.2.13 → 5.3.0-beta.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 (655) hide show
  1. package/agent/mcpTools.ts +1 -1
  2. package/agent/session.ts +25 -14
  3. package/bin/cliOperations.ts +58 -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 +120 -4
  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 +3436 -242
  14. package/components/ApplicationScope.ts +8 -0
  15. package/components/EntryHandler.ts +59 -39
  16. package/components/OptionsWatcher.ts +440 -98
  17. package/components/RuntimeModuleTracker.ts +38 -7
  18. package/components/Scope.ts +56 -15
  19. package/components/awaitRestart.ts +84 -0
  20. package/components/componentLoader.ts +381 -32
  21. package/components/componentPreparationLock.ts +16 -5
  22. package/components/deploymentOperations.ts +4 -1
  23. package/components/deploymentRecorder.ts +9 -2
  24. package/components/mcp/adapters/harperHttp.ts +4 -0
  25. package/components/mcp/listChanged.ts +4 -0
  26. package/components/mcp/toolRegistry.ts +2 -0
  27. package/components/mcp/tools/operations.ts +9 -0
  28. package/components/mcp/tools/schemas/operationDescriptions.ts +2 -2
  29. package/components/operations.js +537 -113
  30. package/components/operationsValidation.js +98 -3
  31. package/components/packageComponent.ts +25 -1
  32. package/components/requestRestart.ts +11 -0
  33. package/components/status/ComponentStatusRegistry.ts +59 -0
  34. package/config/RootConfigWatcher.ts +240 -40
  35. package/config/configReadRetry.ts +62 -0
  36. package/config/configUtils.ts +357 -48
  37. package/config/harperConfigEnvVars.ts +170 -27
  38. package/config/parseConfigFile.ts +34 -0
  39. package/config/readConfigFileSync.ts +44 -0
  40. package/config/watcherArming.ts +59 -0
  41. package/config-root.schema.json +33 -0
  42. package/dataLayer/blobBackup.ts +160 -50
  43. package/dataLayer/delete.ts +6 -1
  44. package/dataLayer/harperBridge/ResourceBridge.ts +80 -10
  45. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
  46. package/dataLayer/hdbInfoController.ts +34 -1
  47. package/dataLayer/insert.ts +44 -1
  48. package/dataLayer/rocksdbBackup.ts +53 -10
  49. package/dataLayer/schema.ts +11 -1
  50. package/dataLayer/schemaDescribe.ts +8 -1
  51. package/dist/agent/mcpTools.js +1 -1
  52. package/dist/agent/mcpTools.js.map +1 -1
  53. package/dist/agent/session.d.ts +22 -0
  54. package/dist/agent/session.js +26 -15
  55. package/dist/agent/session.js.map +1 -1
  56. package/dist/bin/cliOperations.js +61 -9
  57. package/dist/bin/cliOperations.js.map +1 -1
  58. package/dist/bin/copyDb.d.ts +12 -1
  59. package/dist/bin/copyDb.js +248 -60
  60. package/dist/bin/copyDb.js.map +1 -1
  61. package/dist/bin/deploySetup.d.ts +2 -0
  62. package/dist/bin/deploySetup.js +11 -3
  63. package/dist/bin/deploySetup.js.map +1 -1
  64. package/dist/bin/harper.js +1 -1
  65. package/dist/bin/harper.js.map +1 -1
  66. package/dist/bin/help.js +4 -1
  67. package/dist/bin/help.js.map +1 -1
  68. package/dist/bin/lite.js +4 -1
  69. package/dist/bin/lite.js.map +1 -1
  70. package/dist/bin/restart.js +91 -6
  71. package/dist/bin/restart.js.map +1 -1
  72. package/dist/bin/run.js +4 -10
  73. package/dist/bin/run.js.map +1 -1
  74. package/dist/bin/upgrade.js +4 -3
  75. package/dist/bin/upgrade.js.map +1 -1
  76. package/dist/bin/workloadIdentity.d.ts +18 -0
  77. package/dist/bin/workloadIdentity.js +100 -0
  78. package/dist/bin/workloadIdentity.js.map +1 -0
  79. package/dist/components/Application.d.ts +235 -17
  80. package/dist/components/Application.js +3038 -238
  81. package/dist/components/Application.js.map +1 -1
  82. package/dist/components/ApplicationScope.d.ts +8 -0
  83. package/dist/components/ApplicationScope.js +7 -0
  84. package/dist/components/ApplicationScope.js.map +1 -1
  85. package/dist/components/EntryHandler.js +26 -10
  86. package/dist/components/EntryHandler.js.map +1 -1
  87. package/dist/components/OptionsWatcher.d.ts +4 -0
  88. package/dist/components/OptionsWatcher.js +440 -99
  89. package/dist/components/OptionsWatcher.js.map +1 -1
  90. package/dist/components/RuntimeModuleTracker.js +40 -6
  91. package/dist/components/RuntimeModuleTracker.js.map +1 -1
  92. package/dist/components/Scope.js +52 -13
  93. package/dist/components/Scope.js.map +1 -1
  94. package/dist/components/awaitRestart.d.ts +33 -0
  95. package/dist/components/awaitRestart.js +61 -0
  96. package/dist/components/awaitRestart.js.map +1 -0
  97. package/dist/components/componentLoader.d.ts +38 -1
  98. package/dist/components/componentLoader.js +313 -24
  99. package/dist/components/componentLoader.js.map +1 -1
  100. package/dist/components/componentPreparationLock.d.ts +5 -0
  101. package/dist/components/componentPreparationLock.js +14 -6
  102. package/dist/components/componentPreparationLock.js.map +1 -1
  103. package/dist/components/deploymentOperations.js +4 -1
  104. package/dist/components/deploymentOperations.js.map +1 -1
  105. package/dist/components/deploymentRecorder.d.ts +4 -2
  106. package/dist/components/deploymentRecorder.js +1 -0
  107. package/dist/components/deploymentRecorder.js.map +1 -1
  108. package/dist/components/mcp/adapters/harperHttp.js +4 -0
  109. package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
  110. package/dist/components/mcp/listChanged.js +5 -0
  111. package/dist/components/mcp/listChanged.js.map +1 -1
  112. package/dist/components/mcp/toolRegistry.d.ts +1 -0
  113. package/dist/components/mcp/toolRegistry.js.map +1 -1
  114. package/dist/components/mcp/tools/operations.d.ts +5 -0
  115. package/dist/components/mcp/tools/operations.js +9 -0
  116. package/dist/components/mcp/tools/operations.js.map +1 -1
  117. package/dist/components/mcp/tools/schemas/operationDescriptions.js +2 -2
  118. package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
  119. package/dist/components/operations.d.ts +28 -0
  120. package/dist/components/operations.js +476 -113
  121. package/dist/components/operations.js.map +1 -1
  122. package/dist/components/operationsValidation.js +97 -3
  123. package/dist/components/operationsValidation.js.map +1 -1
  124. package/dist/components/packageComponent.js +24 -0
  125. package/dist/components/packageComponent.js.map +1 -1
  126. package/dist/components/requestRestart.d.ts +1 -0
  127. package/dist/components/requestRestart.js +7 -0
  128. package/dist/components/requestRestart.js.map +1 -1
  129. package/dist/components/status/ComponentStatusRegistry.d.ts +0 -4
  130. package/dist/components/status/ComponentStatusRegistry.js +63 -0
  131. package/dist/components/status/ComponentStatusRegistry.js.map +1 -1
  132. package/dist/config/RootConfigWatcher.d.ts +9 -1
  133. package/dist/config/RootConfigWatcher.js +228 -37
  134. package/dist/config/RootConfigWatcher.js.map +1 -1
  135. package/dist/config/configReadRetry.d.ts +8 -0
  136. package/dist/config/configReadRetry.js +62 -0
  137. package/dist/config/configReadRetry.js.map +1 -0
  138. package/dist/config/configUtils.d.ts +11 -2
  139. package/dist/config/configUtils.js +304 -47
  140. package/dist/config/configUtils.js.map +1 -1
  141. package/dist/config/harperConfigEnvVars.d.ts +16 -0
  142. package/dist/config/harperConfigEnvVars.js +162 -25
  143. package/dist/config/harperConfigEnvVars.js.map +1 -1
  144. package/dist/config/parseConfigFile.d.ts +4 -0
  145. package/dist/config/parseConfigFile.js +35 -0
  146. package/dist/config/parseConfigFile.js.map +1 -0
  147. package/dist/config/readConfigFileSync.d.ts +1 -0
  148. package/dist/config/readConfigFileSync.js +47 -0
  149. package/dist/config/readConfigFileSync.js.map +1 -0
  150. package/dist/config/watcherArming.d.ts +15 -0
  151. package/dist/config/watcherArming.js +59 -0
  152. package/dist/config/watcherArming.js.map +1 -0
  153. package/dist/dataLayer/blobBackup.d.ts +49 -20
  154. package/dist/dataLayer/blobBackup.js +139 -50
  155. package/dist/dataLayer/blobBackup.js.map +1 -1
  156. package/dist/dataLayer/delete.js +1 -1
  157. package/dist/dataLayer/delete.js.map +1 -1
  158. package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +14 -1
  159. package/dist/dataLayer/harperBridge/ResourceBridge.js +72 -12
  160. package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
  161. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.d.ts +3 -1
  162. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
  163. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js.map +1 -1
  164. package/dist/dataLayer/hdbInfoController.d.ts +10 -0
  165. package/dist/dataLayer/hdbInfoController.js +30 -1
  166. package/dist/dataLayer/hdbInfoController.js.map +1 -1
  167. package/dist/dataLayer/insert.d.ts +9 -1
  168. package/dist/dataLayer/insert.js +30 -0
  169. package/dist/dataLayer/insert.js.map +1 -1
  170. package/dist/dataLayer/rocksdbBackup.d.ts +2 -2
  171. package/dist/dataLayer/rocksdbBackup.js +45 -8
  172. package/dist/dataLayer/rocksdbBackup.js.map +1 -1
  173. package/dist/dataLayer/schema.js +8 -0
  174. package/dist/dataLayer/schema.js.map +1 -1
  175. package/dist/dataLayer/schemaDescribe.js +8 -1
  176. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  177. package/dist/index.d.ts +2 -1
  178. package/dist/index.js +4 -1
  179. package/dist/index.js.map +1 -1
  180. package/dist/json/systemSchema.json +55 -0
  181. package/dist/resources/DatabaseTransaction.d.ts +77 -0
  182. package/dist/resources/DatabaseTransaction.js +586 -54
  183. package/dist/resources/DatabaseTransaction.js.map +1 -1
  184. package/dist/resources/LMDBTransaction.d.ts +2 -1
  185. package/dist/resources/LMDBTransaction.js +43 -6
  186. package/dist/resources/LMDBTransaction.js.map +1 -1
  187. package/dist/resources/PrimaryRocksDatabase.d.ts +1 -0
  188. package/dist/resources/PrimaryRocksDatabase.js +49 -5
  189. package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
  190. package/dist/resources/RecordEncoder.d.ts +20 -0
  191. package/dist/resources/RecordEncoder.js +110 -9
  192. package/dist/resources/RecordEncoder.js.map +1 -1
  193. package/dist/resources/RequestTarget.d.ts +2 -0
  194. package/dist/resources/RequestTarget.js.map +1 -1
  195. package/dist/resources/Resource.js +117 -24
  196. package/dist/resources/Resource.js.map +1 -1
  197. package/dist/resources/ResourceInterface.d.ts +28 -1
  198. package/dist/resources/ResourceInterface.js.map +1 -1
  199. package/dist/resources/RocksIndexStore.d.ts +6 -1
  200. package/dist/resources/RocksIndexStore.js +24 -9
  201. package/dist/resources/RocksIndexStore.js.map +1 -1
  202. package/dist/resources/RocksTransactionLogStore.d.ts +24 -1
  203. package/dist/resources/RocksTransactionLogStore.js +160 -49
  204. package/dist/resources/RocksTransactionLogStore.js.map +1 -1
  205. package/dist/resources/Table.d.ts +165 -10
  206. package/dist/resources/Table.js +1805 -303
  207. package/dist/resources/Table.js.map +1 -1
  208. package/dist/resources/analytics/write.js +10 -3
  209. package/dist/resources/analytics/write.js.map +1 -1
  210. package/dist/resources/auditStore.d.ts +181 -2
  211. package/dist/resources/auditStore.js +640 -29
  212. package/dist/resources/auditStore.js.map +1 -1
  213. package/dist/resources/blob.d.ts +129 -9
  214. package/dist/resources/blob.js +992 -114
  215. package/dist/resources/blob.js.map +1 -1
  216. package/dist/resources/branchDatabase.d.ts +48 -0
  217. package/dist/resources/branchDatabase.js +892 -0
  218. package/dist/resources/branchDatabase.js.map +1 -0
  219. package/dist/resources/crdt.js +50 -12
  220. package/dist/resources/crdt.js.map +1 -1
  221. package/dist/resources/dataLoader.js +3 -4
  222. package/dist/resources/dataLoader.js.map +1 -1
  223. package/dist/resources/databases.d.ts +157 -14
  224. package/dist/resources/databases.js +1462 -325
  225. package/dist/resources/databases.js.map +1 -1
  226. package/dist/resources/defineTable.d.ts +10 -2
  227. package/dist/resources/defineTable.js +9 -1
  228. package/dist/resources/defineTable.js.map +1 -1
  229. package/dist/resources/derivedIndexRegistry.d.ts +5 -0
  230. package/dist/resources/derivedIndexRegistry.js +68 -0
  231. package/dist/resources/derivedIndexRegistry.js.map +1 -0
  232. package/dist/resources/derivedIndexRuntime.d.ts +215 -0
  233. package/dist/resources/derivedIndexRuntime.js +2027 -0
  234. package/dist/resources/derivedIndexRuntime.js.map +1 -0
  235. package/dist/resources/graphql.d.ts +1 -1
  236. package/dist/resources/graphql.js +52 -16
  237. package/dist/resources/graphql.js.map +1 -1
  238. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +103 -9
  239. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +854 -41
  240. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
  241. package/dist/resources/indexes/hnswDerivedIndex.d.ts +67 -0
  242. package/dist/resources/indexes/hnswDerivedIndex.js +464 -0
  243. package/dist/resources/indexes/hnswDerivedIndex.js.map +1 -0
  244. package/dist/resources/indexes/hnswPlaneBinding.d.ts +65 -0
  245. package/dist/resources/indexes/hnswPlaneBinding.js +91 -0
  246. package/dist/resources/indexes/hnswPlaneBinding.js.map +1 -0
  247. package/dist/resources/longLivedTransactions.d.ts +71 -0
  248. package/dist/resources/longLivedTransactions.js +358 -0
  249. package/dist/resources/longLivedTransactions.js.map +1 -0
  250. package/dist/resources/models/backendRegistry.d.ts +26 -0
  251. package/dist/resources/models/backendRegistry.js +60 -2
  252. package/dist/resources/models/backendRegistry.js.map +1 -1
  253. package/dist/resources/models/bootstrap.d.ts +33 -1
  254. package/dist/resources/models/bootstrap.js +416 -31
  255. package/dist/resources/models/bootstrap.js.map +1 -1
  256. package/dist/resources/nodeIdMapping.d.ts +5 -0
  257. package/dist/resources/nodeIdMapping.js +49 -0
  258. package/dist/resources/nodeIdMapping.js.map +1 -1
  259. package/dist/resources/recordLock.d.ts +123 -0
  260. package/dist/resources/recordLock.js +315 -0
  261. package/dist/resources/recordLock.js.map +1 -0
  262. package/dist/resources/recordLockCoordinator.d.ts +557 -0
  263. package/dist/resources/recordLockCoordinator.js +2565 -0
  264. package/dist/resources/recordLockCoordinator.js.map +1 -0
  265. package/dist/resources/replayLogs.d.ts +14 -1
  266. package/dist/resources/replayLogs.js +157 -24
  267. package/dist/resources/replayLogs.js.map +1 -1
  268. package/dist/resources/replayLogsGuards.d.ts +94 -7
  269. package/dist/resources/replayLogsGuards.js +111 -7
  270. package/dist/resources/replayLogsGuards.js.map +1 -1
  271. package/dist/resources/replicatedApplyFailure.d.ts +16 -0
  272. package/dist/resources/replicatedApplyFailure.js +63 -0
  273. package/dist/resources/replicatedApplyFailure.js.map +1 -0
  274. package/dist/resources/scheduler/scheduler.js +3 -3
  275. package/dist/resources/scheduler/scheduler.js.map +1 -1
  276. package/dist/resources/search.d.ts +10 -4
  277. package/dist/resources/search.js +283 -37
  278. package/dist/resources/search.js.map +1 -1
  279. package/dist/resources/tracked.d.ts +5 -1
  280. package/dist/resources/tracked.js +74 -23
  281. package/dist/resources/tracked.js.map +1 -1
  282. package/dist/resources/transactionBroadcast.d.ts +1 -1
  283. package/dist/resources/transactionBroadcast.js +2 -2
  284. package/dist/resources/transactionBroadcast.js.map +1 -1
  285. package/dist/security/auth.js +61 -30
  286. package/dist/security/auth.js.map +1 -1
  287. package/dist/security/authn/oidc/claims.d.ts +22 -0
  288. package/dist/security/authn/oidc/claims.js +71 -0
  289. package/dist/security/authn/oidc/claims.js.map +1 -0
  290. package/dist/security/authn/oidc/identityToken.d.ts +27 -0
  291. package/dist/security/authn/oidc/identityToken.js +111 -0
  292. package/dist/security/authn/oidc/identityToken.js.map +1 -0
  293. package/dist/security/authn/oidc/jwks.d.ts +25 -0
  294. package/dist/security/authn/oidc/jwks.js +261 -0
  295. package/dist/security/authn/oidc/jwks.js.map +1 -0
  296. package/dist/security/authn/oidc/providers/generic.d.ts +13 -0
  297. package/dist/security/authn/oidc/providers/generic.js +34 -0
  298. package/dist/security/authn/oidc/providers/generic.js.map +1 -0
  299. package/dist/security/authn/oidc/providers/githubActions.d.ts +11 -0
  300. package/dist/security/authn/oidc/providers/githubActions.js +129 -0
  301. package/dist/security/authn/oidc/providers/githubActions.js.map +1 -0
  302. package/dist/security/authn/oidc/providers/index.d.ts +37 -0
  303. package/dist/security/authn/oidc/providers/index.js +24 -0
  304. package/dist/security/authn/oidc/providers/index.js.map +1 -0
  305. package/dist/security/authn/oidc/tokenExchange.d.ts +12 -0
  306. package/dist/security/authn/oidc/tokenExchange.js +306 -0
  307. package/dist/security/authn/oidc/tokenExchange.js.map +1 -0
  308. package/dist/security/authn/oidc/trustPolicyOperations.d.ts +49 -0
  309. package/dist/security/authn/oidc/trustPolicyOperations.js +358 -0
  310. package/dist/security/authn/oidc/trustPolicyOperations.js.map +1 -0
  311. package/dist/security/authn/oidc/types.d.ts +38 -0
  312. package/dist/security/authn/oidc/types.js +6 -0
  313. package/dist/security/authn/oidc/types.js.map +1 -0
  314. package/dist/security/certificateVerification/index.js +40 -11
  315. package/dist/security/certificateVerification/index.js.map +1 -1
  316. package/dist/security/certificateVerification/trustedIssuers.d.ts +24 -0
  317. package/dist/security/certificateVerification/trustedIssuers.js +79 -0
  318. package/dist/security/certificateVerification/trustedIssuers.js.map +1 -0
  319. package/dist/security/certificateVerification/types.d.ts +1 -0
  320. package/dist/security/credentialProvenance.d.ts +35 -0
  321. package/dist/security/credentialProvenance.js +51 -0
  322. package/dist/security/credentialProvenance.js.map +1 -0
  323. package/dist/security/credentialRejection.d.ts +4 -0
  324. package/dist/security/credentialRejection.js +24 -0
  325. package/dist/security/credentialRejection.js.map +1 -0
  326. package/dist/security/deferredAuthentication.d.ts +36 -0
  327. package/dist/security/deferredAuthentication.js +70 -0
  328. package/dist/security/deferredAuthentication.js.map +1 -0
  329. package/dist/security/impersonation.d.ts +21 -0
  330. package/dist/security/impersonation.js +108 -9
  331. package/dist/security/impersonation.js.map +1 -1
  332. package/dist/security/jsLoader.d.ts +6 -0
  333. package/dist/security/jsLoader.js +77 -15
  334. package/dist/security/jsLoader.js.map +1 -1
  335. package/dist/security/keys.js +301 -71
  336. package/dist/security/keys.js.map +1 -1
  337. package/dist/security/operationScope.d.ts +21 -0
  338. package/dist/security/operationScope.js +36 -0
  339. package/dist/security/operationScope.js.map +1 -0
  340. package/dist/security/permissionsTranslator.js +21 -0
  341. package/dist/security/permissionsTranslator.js.map +1 -1
  342. package/dist/security/tokenAuthentication.d.ts +19 -1
  343. package/dist/security/tokenAuthentication.js +191 -10
  344. package/dist/security/tokenAuthentication.js.map +1 -1
  345. package/dist/security/user.js +4 -3
  346. package/dist/security/user.js.map +1 -1
  347. package/dist/server/DurableSubscriptionsSession.d.ts +2 -2
  348. package/dist/server/DurableSubscriptionsSession.js +67 -10
  349. package/dist/server/DurableSubscriptionsSession.js.map +1 -1
  350. package/dist/server/REST.js +106 -2
  351. package/dist/server/REST.js.map +1 -1
  352. package/dist/server/graphqlQuerying.js +4 -0
  353. package/dist/server/graphqlQuerying.js.map +1 -1
  354. package/dist/server/http.d.ts +16 -1
  355. package/dist/server/http.js +122 -17
  356. package/dist/server/http.js.map +1 -1
  357. package/dist/server/itc/serverHandlers.js +8 -1
  358. package/dist/server/itc/serverHandlers.js.map +1 -1
  359. package/dist/server/jobs/jobProcess.js +6 -2
  360. package/dist/server/jobs/jobProcess.js.map +1 -1
  361. package/dist/server/jobs/jobs.js +4 -1
  362. package/dist/server/jobs/jobs.js.map +1 -1
  363. package/dist/server/liveSubscriptionAuth.d.ts +26 -4
  364. package/dist/server/liveSubscriptionAuth.js +105 -39
  365. package/dist/server/liveSubscriptionAuth.js.map +1 -1
  366. package/dist/server/loadRootComponents.js +49 -10
  367. package/dist/server/loadRootComponents.js.map +1 -1
  368. package/dist/server/mqtt.d.ts +2 -0
  369. package/dist/server/mqtt.js +165 -30
  370. package/dist/server/mqtt.js.map +1 -1
  371. package/dist/server/nodeName.d.ts +2 -0
  372. package/dist/server/nodeName.js +107 -23
  373. package/dist/server/nodeName.js.map +1 -1
  374. package/dist/server/serverHelpers/Headers.d.ts +27 -0
  375. package/dist/server/serverHelpers/Headers.js +145 -1
  376. package/dist/server/serverHelpers/Headers.js.map +1 -1
  377. package/dist/server/serverHelpers/NodeAdapterResponse.d.ts +48 -0
  378. package/dist/server/serverHelpers/NodeAdapterResponse.js +220 -0
  379. package/dist/server/serverHelpers/NodeAdapterResponse.js.map +1 -0
  380. package/dist/server/serverHelpers/Request.d.ts +5 -10
  381. package/dist/server/serverHelpers/Request.js +38 -136
  382. package/dist/server/serverHelpers/Request.js.map +1 -1
  383. package/dist/server/serverHelpers/contentTypes.d.ts +11 -0
  384. package/dist/server/serverHelpers/contentTypes.js +221 -40
  385. package/dist/server/serverHelpers/contentTypes.js.map +1 -1
  386. package/dist/server/serverHelpers/deployValidationState.d.ts +3 -0
  387. package/dist/server/serverHelpers/deployValidationState.js +9 -19
  388. package/dist/server/serverHelpers/deployValidationState.js.map +1 -1
  389. package/dist/server/serverHelpers/operationAuthorizationState.d.ts +12 -0
  390. package/dist/server/serverHelpers/operationAuthorizationState.js +24 -2
  391. package/dist/server/serverHelpers/operationAuthorizationState.js.map +1 -1
  392. package/dist/server/serverHelpers/registeredOperations.d.ts +5 -4
  393. package/dist/server/serverHelpers/registeredOperations.js +74 -21
  394. package/dist/server/serverHelpers/registeredOperations.js.map +1 -1
  395. package/dist/server/serverHelpers/requestSanitization.d.ts +11 -0
  396. package/dist/server/serverHelpers/requestSanitization.js +20 -0
  397. package/dist/server/serverHelpers/requestSanitization.js.map +1 -0
  398. package/dist/server/serverHelpers/serverHandlers.js +6 -3
  399. package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
  400. package/dist/server/serverHelpers/serverUtilities.d.ts +18 -0
  401. package/dist/server/serverHelpers/serverUtilities.js +178 -29
  402. package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
  403. package/dist/server/serverHelpers/sharedMessageEncoding.d.ts +67 -0
  404. package/dist/server/serverHelpers/sharedMessageEncoding.js +280 -0
  405. package/dist/server/serverHelpers/sharedMessageEncoding.js.map +1 -0
  406. package/dist/server/serverHelpers/uwsServer.js +19 -1
  407. package/dist/server/serverHelpers/uwsServer.js.map +1 -1
  408. package/dist/server/static.js +24 -28
  409. package/dist/server/static.js.map +1 -1
  410. package/dist/server/storageReclamation.d.ts +5 -0
  411. package/dist/server/storageReclamation.js +17 -1
  412. package/dist/server/storageReclamation.js.map +1 -1
  413. package/dist/server/threads/isolatedApplications.d.ts +47 -0
  414. package/dist/server/threads/isolatedApplications.js +171 -0
  415. package/dist/server/threads/isolatedApplications.js.map +1 -0
  416. package/dist/server/threads/itc.d.ts +7 -2
  417. package/dist/server/threads/itc.js +5 -1
  418. package/dist/server/threads/itc.js.map +1 -1
  419. package/dist/server/threads/logRotationTransport.d.ts +1 -0
  420. package/dist/server/threads/logRotationTransport.js +33 -0
  421. package/dist/server/threads/logRotationTransport.js.map +1 -0
  422. package/dist/server/threads/manageThreads.d.ts +83 -3
  423. package/dist/server/threads/manageThreads.js +769 -75
  424. package/dist/server/threads/manageThreads.js.map +1 -1
  425. package/dist/server/threads/socketRouter.d.ts +1 -0
  426. package/dist/server/threads/socketRouter.js +277 -31
  427. package/dist/server/threads/socketRouter.js.map +1 -1
  428. package/dist/server/threads/threadHeapMemory.d.ts +2 -0
  429. package/dist/server/threads/threadHeapMemory.js +31 -0
  430. package/dist/server/threads/threadHeapMemory.js.map +1 -0
  431. package/dist/server/threads/threadServer.js +76 -22
  432. package/dist/server/threads/threadServer.js.map +1 -1
  433. package/dist/sqlEngine/config.d.ts +1 -3
  434. package/dist/sqlEngine/config.js +19 -16
  435. package/dist/sqlEngine/config.js.map +1 -1
  436. package/dist/sqlTranslator/index.d.ts +1 -1
  437. package/dist/sqlTranslator/index.js +30 -7
  438. package/dist/sqlTranslator/index.js.map +1 -1
  439. package/dist/upgrade/directives/5-3-0.d.ts +7 -0
  440. package/dist/upgrade/directives/5-3-0.js +148 -0
  441. package/dist/upgrade/directives/5-3-0.js.map +1 -0
  442. package/dist/upgrade/directives/directivesController.js +2 -1
  443. package/dist/upgrade/directives/directivesController.js.map +1 -1
  444. package/dist/utility/OperationFunctionCaller.js +2 -1
  445. package/dist/utility/OperationFunctionCaller.js.map +1 -1
  446. package/dist/utility/common_utils.d.ts +16 -0
  447. package/dist/utility/common_utils.js +32 -6
  448. package/dist/utility/common_utils.js.map +1 -1
  449. package/dist/utility/componentNames.d.ts +8 -0
  450. package/dist/utility/componentNames.js +12 -1
  451. package/dist/utility/componentNames.js.map +1 -1
  452. package/dist/utility/environment/environmentManager.js +3 -6
  453. package/dist/utility/environment/environmentManager.js.map +1 -1
  454. package/dist/utility/environment/systemInformation.d.ts +1 -0
  455. package/dist/utility/environment/systemInformation.js +1 -0
  456. package/dist/utility/environment/systemInformation.js.map +1 -1
  457. package/dist/utility/errors/commonErrors.d.ts +2 -0
  458. package/dist/utility/errors/commonErrors.js +2 -0
  459. package/dist/utility/errors/commonErrors.js.map +1 -1
  460. package/dist/utility/errors/hdbError.d.ts +33 -0
  461. package/dist/utility/errors/hdbError.js +58 -1
  462. package/dist/utility/errors/hdbError.js.map +1 -1
  463. package/dist/utility/globalSchema.d.ts +18 -0
  464. package/dist/utility/hdbTerms.d.ts +18 -0
  465. package/dist/utility/hdbTerms.js +20 -2
  466. package/dist/utility/hdbTerms.js.map +1 -1
  467. package/dist/utility/logging/harper_logger.d.ts +2 -0
  468. package/dist/utility/logging/harper_logger.js +286 -30
  469. package/dist/utility/logging/harper_logger.js.map +1 -1
  470. package/dist/utility/logging/logGenerationCoordinator.d.ts +35 -0
  471. package/dist/utility/logging/logGenerationCoordinator.js +184 -0
  472. package/dist/utility/logging/logGenerationCoordinator.js.map +1 -0
  473. package/dist/utility/logging/logRotation.d.ts +46 -0
  474. package/dist/utility/logging/logRotation.js +365 -0
  475. package/dist/utility/logging/logRotation.js.map +1 -0
  476. package/dist/utility/logging/logRotator.d.ts +1 -1
  477. package/dist/utility/logging/logRotator.js +192 -85
  478. package/dist/utility/logging/logRotator.js.map +1 -1
  479. package/dist/utility/nodeIdentity.d.ts +9 -0
  480. package/dist/utility/nodeIdentity.js +58 -0
  481. package/dist/utility/nodeIdentity.js.map +1 -0
  482. package/dist/utility/npmUtilities.js +11 -7
  483. package/dist/utility/npmUtilities.js.map +1 -1
  484. package/dist/utility/operationPermissions.d.ts +3 -1
  485. package/dist/utility/operationPermissions.js +16 -1
  486. package/dist/utility/operationPermissions.js.map +1 -1
  487. package/dist/utility/operation_authorization.d.ts +10 -7
  488. package/dist/utility/operation_authorization.js +212 -41
  489. package/dist/utility/operation_authorization.js.map +1 -1
  490. package/dist/utility/watchPath.d.ts +29 -0
  491. package/dist/utility/watchPath.js +68 -0
  492. package/dist/utility/watchPath.js.map +1 -0
  493. package/dist/utility/watcherFallback.d.ts +41 -0
  494. package/dist/utility/watcherFallback.js +153 -0
  495. package/dist/utility/watcherFallback.js.map +1 -1
  496. package/dist/validation/configValidator.d.ts +12 -0
  497. package/dist/validation/configValidator.js +205 -75
  498. package/dist/validation/configValidator.js.map +1 -1
  499. package/dist/validation/installValidator.js +12 -0
  500. package/dist/validation/installValidator.js.map +1 -1
  501. package/dist/validation/validationWrapper.d.ts +11 -0
  502. package/dist/validation/validationWrapper.js +16 -3
  503. package/dist/validation/validationWrapper.js.map +1 -1
  504. package/index.ts +8 -0
  505. package/json/systemSchema.json +55 -0
  506. package/npm-shrinkwrap.json +286 -194
  507. package/package.json +15 -7
  508. package/resources/DESIGN.md +219 -52
  509. package/resources/DatabaseTransaction.ts +657 -52
  510. package/resources/LMDBTransaction.ts +46 -6
  511. package/resources/PrimaryRocksDatabase.ts +46 -7
  512. package/resources/RecordEncoder.ts +124 -9
  513. package/resources/RequestTarget.ts +2 -0
  514. package/resources/Resource.ts +114 -22
  515. package/resources/ResourceInterface.ts +31 -0
  516. package/resources/RocksIndexStore.ts +30 -9
  517. package/resources/RocksTransactionLogStore.ts +188 -51
  518. package/resources/Table.ts +1960 -301
  519. package/resources/analytics/write.ts +10 -3
  520. package/resources/auditStore.ts +647 -32
  521. package/resources/blob.ts +1029 -110
  522. package/resources/branchDatabase.ts +941 -0
  523. package/resources/crdt.ts +76 -12
  524. package/resources/dataLoader.ts +3 -4
  525. package/resources/databases.ts +1584 -320
  526. package/resources/defineTable.ts +18 -2
  527. package/resources/derivedIndexRegistry.ts +56 -0
  528. package/resources/derivedIndexRuntime.ts +2292 -0
  529. package/resources/graphql.ts +72 -17
  530. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +911 -48
  531. package/resources/indexes/hnswDerivedIndex.ts +531 -0
  532. package/resources/indexes/hnswPlaneBinding.ts +174 -0
  533. package/resources/longLivedTransactions.ts +360 -0
  534. package/resources/models/backendRegistry.ts +84 -2
  535. package/resources/models/bootstrap.ts +473 -28
  536. package/resources/nodeIdMapping.ts +50 -0
  537. package/resources/recordLock.ts +419 -0
  538. package/resources/recordLockCoordinator.ts +3043 -0
  539. package/resources/replayLogs.ts +152 -26
  540. package/resources/replayLogsGuards.ts +171 -8
  541. package/resources/replicatedApplyFailure.ts +77 -0
  542. package/resources/scheduler/scheduler.ts +4 -4
  543. package/resources/search.ts +288 -46
  544. package/resources/tracked.ts +73 -22
  545. package/resources/transactionBroadcast.ts +3 -3
  546. package/security/auth.ts +68 -29
  547. package/security/authn/oidc/claims.ts +72 -0
  548. package/security/authn/oidc/identityToken.ts +129 -0
  549. package/security/authn/oidc/jwks.ts +260 -0
  550. package/security/authn/oidc/providers/generic.ts +40 -0
  551. package/security/authn/oidc/providers/githubActions.ts +137 -0
  552. package/security/authn/oidc/providers/index.ts +52 -0
  553. package/security/authn/oidc/tokenExchange.ts +300 -0
  554. package/security/authn/oidc/trustPolicyOperations.ts +343 -0
  555. package/security/authn/oidc/types.ts +41 -0
  556. package/security/certificateVerification/index.ts +54 -13
  557. package/security/certificateVerification/trustedIssuers.ts +76 -0
  558. package/security/certificateVerification/types.ts +1 -0
  559. package/security/credentialProvenance.ts +47 -0
  560. package/security/credentialRejection.ts +22 -0
  561. package/security/deferredAuthentication.ts +71 -0
  562. package/security/impersonation.ts +117 -12
  563. package/security/jsLoader.ts +83 -18
  564. package/security/keys.ts +298 -72
  565. package/security/operationScope.ts +33 -0
  566. package/security/permissionsTranslator.js +23 -0
  567. package/security/tokenAuthentication.ts +233 -12
  568. package/security/user.ts +4 -3
  569. package/server/DESIGN.md +194 -16
  570. package/server/DurableSubscriptionsSession.ts +71 -11
  571. package/server/REST.ts +115 -4
  572. package/server/graphqlQuerying.ts +4 -0
  573. package/server/http.ts +133 -20
  574. package/server/itc/serverHandlers.js +8 -1
  575. package/server/jobs/jobProcess.ts +8 -2
  576. package/server/jobs/jobs.ts +4 -1
  577. package/server/liveSubscriptionAuth.ts +129 -46
  578. package/server/loadRootComponents.js +50 -8
  579. package/server/mqtt.ts +179 -38
  580. package/server/nodeName.ts +103 -21
  581. package/server/serverHelpers/Headers.ts +135 -0
  582. package/server/serverHelpers/NodeAdapterResponse.ts +221 -0
  583. package/server/serverHelpers/Request.ts +33 -131
  584. package/server/serverHelpers/contentTypes.ts +217 -36
  585. package/server/serverHelpers/deployValidationState.ts +24 -13
  586. package/server/serverHelpers/operationAuthorizationState.ts +34 -3
  587. package/server/serverHelpers/registeredOperations.ts +79 -22
  588. package/server/serverHelpers/requestSanitization.ts +15 -0
  589. package/server/serverHelpers/serverHandlers.js +6 -3
  590. package/server/serverHelpers/serverUtilities.ts +232 -40
  591. package/server/serverHelpers/sharedMessageEncoding.ts +307 -0
  592. package/server/serverHelpers/uwsServer.ts +17 -2
  593. package/server/static.ts +23 -29
  594. package/server/storageReclamation.ts +15 -2
  595. package/server/threads/isolatedApplications.ts +157 -0
  596. package/server/threads/itc.js +11 -1
  597. package/server/threads/logRotationTransport.ts +40 -0
  598. package/server/threads/manageThreads.js +771 -66
  599. package/server/threads/socketRouter.ts +291 -30
  600. package/server/threads/threadHeapMemory.ts +26 -0
  601. package/server/threads/threadServer.js +73 -22
  602. package/sqlTranslator/index.ts +31 -8
  603. package/studio/web/assets/{Chat-4RrB5134.js → Chat-D3j-1yY1.js} +1 -1
  604. package/studio/web/assets/{FloatingChat-omlNMDcJ.js → FloatingChat-BxJGYcfB.js} +3 -3
  605. package/studio/web/assets/{apiToken-Bke3wvfZ.js → apiToken-CT55oWOe.js} +1 -1
  606. package/studio/web/assets/{applications-DvFDYJgK.js → applications-D9Ct9_vm.js} +1 -1
  607. package/studio/web/assets/{cssMode-C1vRa7zh.js → cssMode-DV8H7VwA.js} +1 -1
  608. package/studio/web/assets/{editor-3XRWEDWX.js → editor-uatc0unt.js} +1 -1
  609. package/studio/web/assets/{html-CTY5tdMr.js → html-Bm6D6paN.js} +1 -1
  610. package/studio/web/assets/{htmlMode-CG1vSD9t.js → htmlMode-CEn7tpLG.js} +1 -1
  611. package/studio/web/assets/{index-Dfpeofdu.js → index-BIXW6Pu4.js} +5 -5
  612. package/studio/web/assets/{index.lazy-B1VOIv-t.js → index.lazy-UI7L-Vrk.js} +1 -1
  613. package/studio/web/assets/{javascript-CJeJzGnI.js → javascript-CJ0G3AFZ.js} +1 -1
  614. package/studio/web/assets/{jsonMode-CYPBwM82.js → jsonMode-DQADAYEa.js} +1 -1
  615. package/studio/web/assets/{languageServices-IKH4GUHl.js → languageServices-CAQJXWcI.js} +1 -1
  616. package/studio/web/assets/{lspLanguageFeatures-BC8_gxKG.js → lspLanguageFeatures-CCQ8P5sY.js} +1 -1
  617. package/studio/web/assets/{notifications-BfKBpYcq.js → notifications-BbxTU6Aw.js} +1 -1
  618. package/studio/web/assets/{notifications-DFbArTfC.js → notifications-Cvb3P1lB.js} +1 -1
  619. package/studio/web/assets/{profile-Q4-T6c-S.js → profile-Yyb7gsvL.js} +1 -1
  620. package/studio/web/assets/{regions-CtkV0xje.js → regions-OgjGHlU5.js} +1 -1
  621. package/studio/web/assets/{register-1ZZuMsiA.js → register-6qwNEOY3.js} +2 -2
  622. package/studio/web/assets/{setComponentFile-ZWLcWv5X.js → setComponentFile-BilDMtgB.js} +1 -1
  623. package/studio/web/assets/{setup-DWprJyJy.js → setup-J6qJ7OIU.js} +2 -2
  624. package/studio/web/assets/{status--aNm8isn.js → status-0RWGcfyD.js} +1 -1
  625. package/studio/web/assets/{toggleHighContrast-Cq_lt3XD.js → toggleHighContrast-BIn-vErT.js} +1 -1
  626. package/studio/web/assets/{tsMode-pjgytARx.js → tsMode-DgUXku4d.js} +1 -1
  627. package/studio/web/assets/{typescript-Cdg0mqUh.js → typescript-C9orXcsM.js} +1 -1
  628. package/studio/web/assets/{useEntityRestURL-RZhaY8Rn.js → useEntityRestURL-BEoXXbUB.js} +1 -1
  629. package/studio/web/assets/{workers-BgoXIqQe.js → workers-JVzSDmgx.js} +1 -1
  630. package/studio/web/assets/{xml-BwSeDMiP.js → xml-Cq-S8S4X.js} +1 -1
  631. package/studio/web/assets/{yaml-DotCUG5l.js → yaml-sfoRdh1M.js} +1 -1
  632. package/studio/web/index.html +1 -1
  633. package/upgrade/directives/5-3-0.ts +132 -0
  634. package/upgrade/directives/directivesController.ts +2 -1
  635. package/utility/OperationFunctionCaller.ts +2 -1
  636. package/utility/common_utils.ts +30 -5
  637. package/utility/componentNames.ts +12 -0
  638. package/utility/environment/environmentManager.ts +3 -7
  639. package/utility/environment/systemInformation.ts +7 -0
  640. package/utility/errors/commonErrors.ts +4 -0
  641. package/utility/errors/hdbError.ts +57 -0
  642. package/utility/hdbTerms.ts +19 -0
  643. package/utility/logging/harper_logger.ts +278 -26
  644. package/utility/logging/logGenerationCoordinator.ts +196 -0
  645. package/utility/logging/logRotation.ts +367 -0
  646. package/utility/logging/logRotator.ts +213 -81
  647. package/utility/nodeIdentity.ts +45 -0
  648. package/utility/npmUtilities.ts +12 -8
  649. package/utility/operationPermissions.ts +18 -1
  650. package/utility/operation_authorization.ts +231 -42
  651. package/utility/watchPath.ts +63 -0
  652. package/utility/watcherFallback.ts +148 -0
  653. package/validation/configValidator.ts +215 -75
  654. package/validation/installValidator.ts +15 -0
  655. package/validation/validationWrapper.ts +18 -4
@@ -37,6 +37,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.forComponent = exports.getLogFilePath = exports.externalLogger = exports.logLevel = exports.OUTPUTS = void 0;
40
+ exports.updateLogger = updateLogger;
40
41
  exports.isErrorLike = isErrorLike;
41
42
  exports.disableStdio = disableStdio;
42
43
  exports.isStdioBrokenError = isStdioBrokenError;
@@ -72,6 +73,8 @@ const packageUtils_js_1 = require("../../utility/packageUtils.js");
72
73
  const globals_js_1 = require("../../globals.js");
73
74
  const console_1 = require("console");
74
75
  const node_util_1 = require("node:util");
76
+ const logRotation_ts_1 = require("./logRotation.js");
77
+ const logGenerationCoordinator_ts_1 = require("./logGenerationCoordinator.js");
75
78
  const { isNativeError } = node_util_1.types;
76
79
  // store the native write function so we can call it after we write to the log file (and store it on process.stdout
77
80
  // because unit tests will create multiple instances of this module)
@@ -100,6 +103,17 @@ exports.OUTPUTS = {
100
103
  // Location of default config YAML.
101
104
  const DEFAULT_CONFIG_FILE = join(packageUtils_js_1.PACKAGE_ROOT, 'static', hdbTerms.HDB_DEFAULT_CONFIG_FILE);
102
105
  const CLOSE_LOG_FD_TIMEOUT = 10000;
106
+ // Above the module-scope initLogSettings() call below, which reaches getFileLogger: a const
107
+ // declared after it is still in its temporal dead zone when the file sink first reads one.
108
+ const LOG_TIME_USAGE_THRESHOLD = 100;
109
+ // How long to write straight to stdio after the log file refuses an append.
110
+ const APPEND_RETRY_COOLDOWN = 5000;
111
+ // Ceiling on how often a failing rotation may report itself; the failure repeats every check point.
112
+ const ROTATION_REPORT_INTERVAL = 60000;
113
+ const SET_ROTATION_POLICY = Symbol('setRotationPolicy');
114
+ const GET_ROTATION_POLICY = Symbol('getRotationPolicy');
115
+ const FILE_ROTATION_SOURCE = Symbol('fileRotationSource');
116
+ const SERVICE_NAME = worker_threads_1.workerData?.name?.replace(/ /g, '-') || 'main';
103
117
  let logConsole;
104
118
  let log_to_file;
105
119
  let logToStdstreams;
@@ -149,8 +163,19 @@ let logImmediately;
149
163
  // Call init to get all the required log settings.
150
164
  let hdbProperties;
151
165
  let rootConfig;
152
- function updateLogger(logger, logOptions, name) {
153
- logger.rotation = logOptions.rotation;
166
+ // `mainLoggerRef` defaults to the module's private `mainLogger` singleton (the real production
167
+ // behavior) but can be overridden by callers (currently just tests) so the inheritance decision
168
+ // below can be exercised against a throwaway logger without reaching into module-private state.
169
+ function updateLogger(logger, logOptions, name, mainLoggerRef = mainLogger) {
170
+ // Fall back to the main logger's rotation (like level/path below) so an external/component
171
+ // logger with no rotation block of its own inherits maxSize/interval/etc rather than losing
172
+ // rotation entirely (#1877). Excluded when `logger` IS mainLoggerRef: the fallback would just
173
+ // reassign mainLogger.rotation to itself, making it impossible to ever clear main's rotation.
174
+ const inheritedRotation = logOptions.rotation ?? (logger === mainLoggerRef ? undefined : mainLoggerRef?.rotation);
175
+ const loggerPolicy = logger[GET_ROTATION_POLICY]?.();
176
+ const mainPolicy = mainLoggerRef?.[GET_ROTATION_POLICY]?.();
177
+ const inheritsRotation = logOptions.rotation == null && logger !== mainLoggerRef;
178
+ const rotationSource = inheritsRotation ? mainPolicy?.source : loggerPolicy?.ownSource;
154
179
  let path = logOptions.path;
155
180
  if (path) {
156
181
  if (!logOptions.root)
@@ -160,20 +185,49 @@ function updateLogger(logger, logOptions, name) {
160
185
  path = join(logOptions.root, logName);
161
186
  }
162
187
  else {
163
- path = mainLogger.path;
188
+ path = mainLoggerRef.path;
164
189
  if (!logOptions.root)
165
190
  logOptions.root = pathModule.dirname(path);
166
191
  }
192
+ if (inheritedRotation && inheritedRotation === mainLoggerRef?.rotation && path !== mainLoggerRef?.path) {
193
+ // This logger has no rotation block of its own and is inheriting main's wholesale — but
194
+ // inheriting `rotation.path` too would point this logger's archives at wherever main
195
+ // archives to. If this logger's file lives on a different filesystem/volume than that
196
+ // directory, the rotator's fs.rename() there fails with EXDEV and the tick error leaks
197
+ // (contained in logRotator.ts) without ever rotating this log. Strip the inherited path so
198
+ // rotation instead defaults beside this logger's own path (logRotator's own <log dir>/rotated
199
+ // fallback); an explicit `rotation.path` in this logger's own config still wins, since that
200
+ // goes through `logOptions.rotation` above, not this fallback. Clone rather than mutate:
201
+ // `inheritedRotation` is the literal object shared by mainLogger.rotation and every other
202
+ // component that inherited it.
203
+ //
204
+ // Only when the paths differ. A logger writing to main's own file shares main's rotation
205
+ // state — file loggers are cached per path — so stripping there discards the operator's
206
+ // configured rotation.path for the main log itself, which no EXDEV risk justifies.
207
+ const { path: _inheritedPath, ...rotationWithoutPath } = inheritedRotation;
208
+ setRotationPolicy(rotationWithoutPath);
209
+ }
210
+ else {
211
+ setRotationPolicy(inheritedRotation);
212
+ }
213
+ // After the rotation above: assigning `path` goes through the setter that rebuilds this path's
214
+ // file logger, and it reads `logger.rotation` as it stands at that moment.
167
215
  if (path)
168
216
  logger.path = path;
169
217
  else
170
218
  console.error('No path for logger', logOptions);
171
- logger.level = LOG_LEVEL_HIERARCHY[logOptions.level] ?? mainLogger?.level ?? LOG_LEVEL_HIERARCHY.info;
219
+ logger.level = LOG_LEVEL_HIERARCHY[logOptions.level] ?? mainLoggerRef?.level ?? LOG_LEVEL_HIERARCHY.info;
172
220
  updateConditional(logger);
173
221
  logger.logToStdstreams = logOptions.stdStreams ?? false;
174
222
  // if there is a configured tag or if a component is logging to default/main log path, use the component name as the tag
175
223
  // to differentiate it
176
- logger.tag = logOptions.tag ?? ((mainLogger.path === logger.path || exports.externalLogger.path === logger.path) && name);
224
+ logger.tag = logOptions.tag ?? ((mainLoggerRef.path === logger.path || exports.externalLogger.path === logger.path) && name);
225
+ function setRotationPolicy(rotation) {
226
+ if (logger[SET_ROTATION_POLICY])
227
+ logger[SET_ROTATION_POLICY](rotation, rotationSource, inheritsRotation);
228
+ else
229
+ logger.rotation = rotation;
230
+ }
177
231
  }
178
232
  // creates a logger where the methods are only defined if they are within the log level.
179
233
  // Using this conditional logger means that every method call must be optional like log.trace?.('message),
@@ -202,13 +256,25 @@ function resolveLogPath(configPath, rootPath) {
202
256
  async function updateLogSettings() {
203
257
  if (!rootConfig) {
204
258
  // set up the initial watcher
205
- rootConfig = new RootConfigWatcher_ts_1.RootConfigWatcher();
259
+ rootConfig = (0, RootConfigWatcher_ts_1.getSharedRootConfigWatcher)();
206
260
  // wait for it to be ready
207
261
  await rootConfig.ready;
208
262
  // TODO: Any way to differentiate changes that we can and can't handle?
209
263
  rootConfig.on('change', updateLogSettings);
210
264
  }
211
- let rootConfigObject = rootConfig.config;
265
+ applyLogSettings(rootConfig.config);
266
+ }
267
+ // Separate from the watcher wiring above because the watcher it builds reads a process-wide path,
268
+ // which leaves no way to exercise these settings against a given config.
269
+ function applyLogSettings(rootConfigObject) {
270
+ // `ready` settles on every terminal read outcome, including ones that carry no config at all —
271
+ // see DESIGN.md, "Every terminal read outcome settles the barrier". Applying that as settings
272
+ // would not be "the defaults": `updateLogger` reads an absent `rotation` as rotation off and an
273
+ // absent `console` as console off, so an unreadable config would silently disable logging.
274
+ // What `initLogSettings()` established at startup stands until a real config arrives, which
275
+ // is why the watcher settles those outcomes with no config rather than an empty one.
276
+ if (!rootConfigObject || typeof rootConfigObject !== 'object')
277
+ return;
212
278
  const logOptions = rootConfigObject.logging ?? {};
213
279
  // Resolve relative paths against rootPath from the same config
214
280
  const rootPath = rootConfigObject.rootPath;
@@ -231,7 +297,9 @@ async function updateLogSettings() {
231
297
  for (const name in rootConfigObject) {
232
298
  // we now scan each component to see if it has logging individual configured
233
299
  const component = rootConfigObject[name];
234
- if (component.logging) {
300
+ // `myComponent:` with nothing under it parses to null, and an async listener's TypeError
301
+ // escapes the watcher's emit guard as an unhandled rejection.
302
+ if (component?.logging) {
235
303
  updateLogger(mainLogger.forComponent(name), component.logging, name);
236
304
  }
237
305
  else if (mainLogger.hasComponent(name)) {
@@ -431,6 +499,8 @@ module.exports = {
431
499
  // we can start using the RootConfigWatcher
432
500
  start: updateLogSettings,
433
501
  startOnMainThread: updateLogSettings,
502
+ // Test-only: applies a config without the process-wide watcher `updateLogSettings` builds.
503
+ _applyLogSettingsForTests: applyLogSettings,
434
504
  errorToString,
435
505
  errorForLog,
436
506
  inspectForLog,
@@ -438,7 +508,19 @@ module.exports = {
438
508
  disableStdio,
439
509
  isStdioBrokenError,
440
510
  externalLogger: exports.externalLogger,
511
+ updateLogger,
441
512
  };
513
+ // Writes past the stdio guard installed by installStdioGuard, which would otherwise route the
514
+ // text back into the file logger this is the fallback for, and swallows a broken pipe - there is
515
+ // nowhere left to report it.
516
+ function writeToStdioDirectly(stream, text) {
517
+ try {
518
+ nativeStdWrite.call(stream, text);
519
+ }
520
+ catch {
521
+ // stdio is gone too
522
+ }
523
+ }
442
524
  // A bare no-op would read as permanent backpressure to a pipe()'d source; this drains and
443
525
  // discards instead.
444
526
  function noopWrite(_chunk, encoding, callback) {
@@ -479,6 +561,14 @@ function logsAtLevel(level) {
479
561
  function initLogSettings(forceInit = false) {
480
562
  try {
481
563
  if (hdbProperties === undefined || forceInit) {
564
+ if (forceInit && mainLogger?.[SET_ROTATION_POLICY]) {
565
+ const currentPath = mainLogger.path;
566
+ if (currentPath) {
567
+ const { ownSource } = mainLogger[GET_ROTATION_POLICY]();
568
+ mainLogger[SET_ROTATION_POLICY](undefined, ownSource, false);
569
+ mainLogger.path = currentPath;
570
+ }
571
+ }
482
572
  closeLogFile();
483
573
  const bootPropsFilePath = getPropsFilePath();
484
574
  let properties = (0, assignCmdEnvVariables_ts_1.default)(['ROOTPATH']);
@@ -557,10 +647,17 @@ function initLogSettings(forceInit = false) {
557
647
  log_to_file = false;
558
648
  logToStdstreams = true;
559
649
  exports.logLevel = exports.logLevel === undefined ? defaultLevel : exports.logLevel;
560
- mainLogger = createLogger({ level: exports.logLevel });
650
+ // createLogger shadows the module-level `logToStdstreams` with this option, so omitting it
651
+ // drops every log written before a config exists rather than routing it to the streams.
652
+ mainLogger = createLogger({ level: exports.logLevel, stdStreams: logToStdstreams });
561
653
  // setup the external logger
562
654
  exports.externalLogger = mainLogger.forComponent('external');
563
655
  exports.externalLogger.tag = null; // don't tag by default
656
+ // The streams are this branch's only sink, so it needs the same EPIPE/EIO listeners the
657
+ // configured path installs below: `harper install | head -1` closes the reader, and the
658
+ // async error would otherwise land on a stream with none and take the install down. The
659
+ // guard's write override is inert here, because `log_to_file` is false.
660
+ stdioLogging();
564
661
  return;
565
662
  }
566
663
  console.error(err);
@@ -648,14 +745,18 @@ function suppressLogging(callback) {
648
745
  loggingEnabled = true;
649
746
  }
650
747
  }
651
- const SERVICE_NAME = worker_threads_1.workerData?.name?.replace(/ /g, '-') || 'main';
652
748
  // these are used to store information about the current service and tag so we can prepend them to the log during
653
749
  // the writes, without having to pass the information through the Console instance
654
750
  let currentLevel = 'info'; // default is info
655
751
  let currentServiceName;
656
752
  let currentTag;
657
753
  function createLogger(options = {}) {
658
- let { path: logFilePath, level: logLevel, stdStreams: logToStdstreams, rotation, isExternalInstance, writeToLog, component, } = options;
754
+ let { path: logFilePath, level: logLevel, stdStreams: logToStdstreams, rotation, isExternalInstance, writeToLog, component, rotationSource, rotationInherited = false, } = options;
755
+ const ownRotationSource = Symbol('rotationPolicySource');
756
+ let currentRotationSource = rotationSource ?? ownRotationSource;
757
+ let previousRotationSource;
758
+ let currentRotationInherited = rotationInherited;
759
+ let rotationChangeIsAuthoritative = rotation !== undefined;
659
760
  if (!logLevel)
660
761
  logLevel = 'info';
661
762
  let level = typeof logLevel === 'number' ? logLevel : LOG_LEVEL_HIERARCHY[logLevel];
@@ -706,7 +807,8 @@ function createLogger(options = {}) {
706
807
  else if (logToStdstreams)
707
808
  process.stderr.write(log);
708
809
  }
709
- let logToFile = logFilePath && getFileLogger(logFilePath, rotation, isExternalInstance);
810
+ let logToFile = logFilePath && getFileLogger(logFilePath, rotation, isExternalInstance, rotationPolicy());
811
+ rotationPolicyApplied();
710
812
  function logPrepend(write) {
711
813
  return {
712
814
  write(log) {
@@ -728,6 +830,14 @@ function createLogger(options = {}) {
728
830
  stderr: logPrepend(writeToLog ?? logStdErr),
729
831
  colorMode: (logToStdstreams && colorMode) || false,
730
832
  }, level);
833
+ logger[SET_ROTATION_POLICY] = function (newRotation, source = ownRotationSource, inherited = false) {
834
+ previousRotationSource = currentRotationSource;
835
+ currentRotationSource = source ?? ownRotationSource;
836
+ currentRotationInherited = inherited;
837
+ rotationChangeIsAuthoritative = true;
838
+ logger.rotation = newRotation;
839
+ };
840
+ logger[GET_ROTATION_POLICY] = () => ({ ownSource: ownRotationSource, source: currentRotationSource });
731
841
  updateConditional(logger);
732
842
  logger.path = logFilePath;
733
843
  Object.defineProperty(logger, 'path', {
@@ -736,7 +846,10 @@ function createLogger(options = {}) {
736
846
  },
737
847
  set(path) {
738
848
  logFilePath = path;
739
- logToFile = getFileLogger(logFilePath, logger.rotation, isExternalInstance);
849
+ if (!logFilePath)
850
+ return;
851
+ logToFile = getFileLogger(logFilePath, logger.rotation, isExternalInstance, rotationPolicy());
852
+ rotationPolicyApplied();
740
853
  if (isExternalInstance)
741
854
  writeToLogFile = logToFile;
742
855
  },
@@ -750,12 +863,15 @@ function createLogger(options = {}) {
750
863
  let componentLogger = components.get(name);
751
864
  if (!componentLogger) {
752
865
  const protoLogger = isExternal ? exports.externalLogger : logger;
866
+ const protoRotationPolicy = protoLogger[GET_ROTATION_POLICY]?.();
753
867
  componentLogger = createLogger({
754
868
  path: protoLogger.path,
755
869
  level: protoLogger.level,
756
870
  stdStreams: protoLogger.logToStdstreams,
757
871
  isExternalInstance: isExternal || name === 'external',
758
872
  rotation: protoLogger.rotation,
873
+ rotationSource: protoRotationPolicy?.source,
874
+ rotationInherited: true,
759
875
  writeToLog,
760
876
  component: true,
761
877
  });
@@ -772,33 +888,80 @@ function createLogger(options = {}) {
772
888
  logger.components = components;
773
889
  }
774
890
  return logger;
891
+ function rotationPolicy() {
892
+ return {
893
+ source: currentRotationSource,
894
+ previousSource: previousRotationSource,
895
+ inherited: currentRotationInherited,
896
+ authoritative: rotationChangeIsAuthoritative,
897
+ };
898
+ }
899
+ function rotationPolicyApplied() {
900
+ previousRotationSource = currentRotationSource;
901
+ rotationChangeIsAuthoritative = false;
902
+ }
775
903
  }
776
- const LOG_TIME_USAGE_THRESHOLD = 100;
777
904
  /**
778
905
  * Get the file logger for the given path. If it doesn't exist, create it.
779
906
  * @param path
780
907
  * @param isExternalInstance
781
908
  * @return {any}
782
909
  */
783
- function getFileLogger(path, rotation, isExternalInstance) {
910
+ function getFileLogger(path, rotation, isExternalInstance, rotationPolicy) {
784
911
  let logger = fileLoggers.get(path);
785
- let logFD, loggedFDError, logTimer;
912
+ let logFD, loggedFDError, loggedAppendError, logTimer, retryAppendAfter;
786
913
  let logBuffer;
914
+ let rotationProblemNotice;
787
915
  let logTimeUsage = 0;
916
+ let rotationGuard, logFDIdentity, nextRotationReport = 0;
788
917
  if (!logger) {
789
918
  logger = logToFile;
790
919
  logger.closeLogFile = closeLogFile;
920
+ // The guard has to be installed through the live closure: later calls for this path get the
921
+ // cached logger back, and their own logFD/logBuffer are dead.
922
+ logger.installRotationGuard = installRotationGuard;
791
923
  logger.path = path;
792
924
  fileLoggers.set(path, logger);
793
- }
794
- if (worker_threads_1.isMainThread && JSON.stringify(rotation) !== JSON.stringify(logger.rotation)) {
925
+ // Registered by the sink, not by the size guard: a thread that writes this file but has no
926
+ // guard (no maxSize, or rotation driven only by interval) still holds a descriptor, and an
927
+ // answer from it has to mean "released" rather than only "handler ran".
928
+ (0, logGenerationCoordinator_ts_1.registerLogSink)(path, { identity: () => logFDIdentity, close: closeLogFile });
929
+ }
930
+ const currentSource = logger[FILE_ROTATION_SOURCE];
931
+ const sameSource = currentSource === rotationPolicy.source;
932
+ const replacesPreviousSource = currentSource !== undefined && currentSource === rotationPolicy.previousSource;
933
+ const canInstall = rotation !== undefined &&
934
+ (!rotationPolicy.inherited || currentSource === undefined || sameSource || replacesPreviousSource);
935
+ const canClear = rotation === undefined && rotationPolicy.authoritative && (sameSource || replacesPreviousSource);
936
+ let reconfigured = false;
937
+ if (canInstall) {
938
+ logger[FILE_ROTATION_SOURCE] = rotationPolicy.source;
939
+ reconfigured = JSON.stringify(rotation) !== JSON.stringify(logger.rotation);
940
+ }
941
+ if (reconfigured) {
795
942
  logger.rotation = rotation;
943
+ // Every writing thread, and synchronously: request logging is produced by the HTTP workers, and
944
+ // at the rates that make maxSize matter a deferred guard misses megabytes before it exists.
945
+ logger.installRotationGuard(rotation);
946
+ }
947
+ else if (canClear) {
948
+ logger.rotation = undefined;
949
+ logger[FILE_ROTATION_SOURCE] = undefined;
950
+ logger.installRotationGuard(undefined);
951
+ reconfigured = true;
952
+ }
953
+ if (worker_threads_1.isMainThread && reconfigured) {
796
954
  setTimeout(() => {
797
- logger.rotator?.end();
798
- if (!rotation)
799
- return;
800
- const { logRotator } = require('./logRotator');
955
+ // Everything inside the try: a throw from a timer callback is unhandled, and neither
956
+ // require('./logRotator') (which reaches environmentManager's synchronous init) nor a
957
+ // rotator teardown may take the process down over log rotation (#847).
801
958
  try {
959
+ const previousRotator = logger.rotator;
960
+ logger.rotator = undefined;
961
+ previousRotator?.end();
962
+ if (!rotation)
963
+ return;
964
+ const { logRotator } = require('./logRotator');
802
965
  logger.rotator = logRotator({
803
966
  logger,
804
967
  ...rotation,
@@ -810,6 +973,50 @@ function getFileLogger(path, rotation, isExternalInstance) {
810
973
  }, 100);
811
974
  }
812
975
  return logger;
976
+ function installRotationGuard(newRotation) {
977
+ rotationGuard = undefined;
978
+ if (!newRotation || newRotation.enabled === false)
979
+ return;
980
+ const maxBytes = (0, logRotation_ts_1.parseMaxSize)(newRotation.maxSize);
981
+ if (!maxBytes) {
982
+ if (newRotation.maxSize != null)
983
+ reportRotationProblem(`logging.rotation.maxSize: ${logRotation_ts_1.INVALID_MAX_SIZE_MSG}`);
984
+ return;
985
+ }
986
+ try {
987
+ rotationGuard = (0, logRotation_ts_1.createRotationGuard)({
988
+ logPath: path,
989
+ maxBytes,
990
+ rotatedLogDir: (0, logRotation_ts_1.resolveRotatedLogDir)(path, newRotation.path),
991
+ // From the rotation block rather than environmentManager (which logRotator still reads):
992
+ // environmentManager imports this module, so it cannot be reached from the write path.
993
+ compress: newRotation.compress,
994
+ getLogIdentity: () => logFDIdentity,
995
+ closeLogFile,
996
+ report: reportRotationProblem,
997
+ onRotated(archivePath) {
998
+ // Same shape as every other line in the file: written straight to the sink, this
999
+ // bypasses the prefix createLogger's logPrepend adds, and readLog parses by level.
1000
+ logToFile(`[${SERVICE_NAME}/${worker_threads_1.threadId}] [notify]: hdb.log rotated, old log moved to ${archivePath}`);
1001
+ },
1002
+ });
1003
+ }
1004
+ catch (error) {
1005
+ reportRotationProblem(`log rotation is disabled for ${path}: ${error}`);
1006
+ }
1007
+ }
1008
+ function reportRotationProblem(text) {
1009
+ // Straight to stdio, never back through this sink: the sink is what rotation is failing on.
1010
+ // Rate-limited rather than once-only, so a later, different failure is still reported.
1011
+ if (nextRotationReport > performance.now())
1012
+ return;
1013
+ nextRotationReport = performance.now() + ROTATION_REPORT_INTERVAL;
1014
+ const message = `Harper log rotation problem — ${text}`;
1015
+ // Scripted services discard stdio. Preserve the warning in the active file on the next
1016
+ // successful append as well, without recursing through the rotation guard.
1017
+ rotationProblemNotice = `${new Date().toISOString()} [${SERVICE_NAME}/${worker_threads_1.threadId}] [error]: ${message}\n`;
1018
+ writeToStdioDirectly(process.stderr, `${message}\n`);
1019
+ }
813
1020
  function logToFile(log) {
814
1021
  let entry = `${new Date().toISOString()} ${log}${log.endsWith('\n') ? '' : '\n'}`;
815
1022
  if (logBuffer) {
@@ -839,19 +1046,51 @@ function getFileLogger(path, rotation, isExternalInstance) {
839
1046
  }
840
1047
  // this is called on a timer, and will write the log buffer to the file
841
1048
  function logQueuedData(entry) {
1049
+ const payload = logBuffer ? logBuffer.join('') : entry;
1050
+ // Released before anything can re-enter: the rotation notice is written from inside the append
1051
+ // below, and a re-entrant flush still holding this batch would write it twice.
1052
+ logBuffer = null;
1053
+ if (payload === undefined)
1054
+ return;
1055
+ // A file that just refused a write will refuse the next one too, and every attempt costs a
1056
+ // failed syscall plus a thrown error on whatever path is logging - which, on a full volume,
1057
+ // is the request path at full rate. Go straight to stdio until the cooldown expires.
1058
+ // Opened after the guard: a guard recovering by rotation closes this descriptor first.
1059
+ const mayAppend = !(retryAppendAfter > performance.now()) && (rotationGuard?.beforeAppend() ?? true);
842
1060
  openLogFile(undefined);
843
- if (logFD) {
1061
+ if (logFD && mayAppend) {
844
1062
  let startTime = performance.now();
845
- fs.appendFileSync(logFD, logBuffer ? logBuffer.join('') : entry);
1063
+ try {
1064
+ const appendPayload = rotationProblemNotice ? rotationProblemNotice + payload : payload;
1065
+ const appendBuffer = Buffer.from(appendPayload);
1066
+ fs.appendFileSync(logFD, appendBuffer);
1067
+ rotationProblemNotice = undefined;
1068
+ // Both cleared, so a volume that fills again months later reports itself again
1069
+ retryAppendAfter = undefined;
1070
+ loggedAppendError = false;
1071
+ rotationGuard?.recordWrite(appendBuffer.length);
1072
+ }
1073
+ catch (error) {
1074
+ retryAppendAfter = performance.now() + APPEND_RETRY_COOLDOWN;
1075
+ // A log write must never take the process down: on an exhausted volume this throws from
1076
+ // both inline and timer call sites, making every log statement a crash point (#847).
1077
+ // The fallback goes through nativeStdWrite rather than console because
1078
+ // installStdioGuard routes console output back into this same file logger when
1079
+ // logging.file and logging.console are both on, which would recurse until the stack blew.
1080
+ if (!loggedAppendError) {
1081
+ loggedAppendError = true;
1082
+ writeToStdioDirectly(process.stderr, `Harper cannot write to its log file: ${error}\n`);
1083
+ }
1084
+ writeToStdioDirectly(process.stdout, payload);
1085
+ return;
1086
+ }
846
1087
  let endTime = performance.now();
847
1088
  // determine if we are using more than about two percent of processing time for log writes recently, and if so, we
848
1089
  // will start buffering
849
1090
  logTimeUsage = Math.max(endTime, logTimeUsage) + (endTime - startTime) * 50;
850
1091
  }
851
- else if (!loggedFDError)
852
- console.log(logBuffer ? logBuffer.join('') : entry);
853
- if (logBuffer)
854
- logBuffer = null;
1092
+ else
1093
+ writeToStdioDirectly(process.stdout, payload);
855
1094
  }
856
1095
  function closeLogFile(_unused) {
857
1096
  try {
@@ -859,6 +1098,7 @@ function getFileLogger(path, rotation, isExternalInstance) {
859
1098
  }
860
1099
  catch { }
861
1100
  logFD = null;
1101
+ logFDIdentity = null;
862
1102
  if (isExternalInstance)
863
1103
  mainLogFd = null;
864
1104
  }
@@ -866,14 +1106,29 @@ function getFileLogger(path, rotation, isExternalInstance) {
866
1106
  if (!logFD) {
867
1107
  try {
868
1108
  logFD = fs.openSync(path, 'a');
1109
+ // Which generation this descriptor belongs to, recorded once here so the size guard's
1110
+ // checkpoint needs a single pathname stat to tell whether the file has moved under it.
1111
+ try {
1112
+ const opened = fs.fstatSync(logFD);
1113
+ logFDIdentity = { ino: opened.ino, dev: opened.dev };
1114
+ }
1115
+ catch {
1116
+ logFDIdentity = null;
1117
+ }
869
1118
  if (isExternalInstance)
870
1119
  mainLogFd = logFD;
871
1120
  }
872
1121
  catch (error) {
873
1122
  if (error.code === 'ENOENT' && !isRetry) {
874
1123
  // if the directory doesn't exist, create it
875
- fs.mkdirpSync(pathModule.dirname(path));
876
- return openLogFile(true);
1124
+ try {
1125
+ fs.mkdirpSync(pathModule.dirname(path));
1126
+ return openLogFile(true);
1127
+ }
1128
+ catch (mkdirError) {
1129
+ // creating the log directory can fail for the same reason the log write can
1130
+ error = mkdirError;
1131
+ }
877
1132
  }
878
1133
  if (!loggedFDError) {
879
1134
  loggedFDError = true;
@@ -1906,5 +2161,6 @@ exports.default = {
1906
2161
  errorForLog,
1907
2162
  inspectForLog,
1908
2163
  isErrorLike,
2164
+ updateLogger,
1909
2165
  };
1910
2166
  //# sourceMappingURL=harper_logger.js.map