@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
@@ -13,6 +13,8 @@ import { PACKAGE_ROOT } from '../../utility/packageUtils.js';
13
13
  import { _assignPackageExport } from '../../globals.js';
14
14
  import { Console } from 'console';
15
15
  import { inspect, types } from 'node:util';
16
+ import { createRotationGuard, INVALID_MAX_SIZE_MSG, parseMaxSize, resolveRotatedLogDir } from './logRotation.ts';
17
+ import { registerLogSink } from './logGenerationCoordinator.ts';
16
18
 
17
19
  const { isNativeError } = types;
18
20
  // store the native write function so we can call it after we write to the log file (and store it on process.stdout
@@ -47,6 +49,18 @@ const DEFAULT_CONFIG_FILE = join(PACKAGE_ROOT, 'static', hdbTerms.HDB_DEFAULT_CO
47
49
 
48
50
  const CLOSE_LOG_FD_TIMEOUT = 10000;
49
51
 
52
+ // Above the module-scope initLogSettings() call below, which reaches getFileLogger: a const
53
+ // declared after it is still in its temporal dead zone when the file sink first reads one.
54
+ const LOG_TIME_USAGE_THRESHOLD = 100;
55
+ // How long to write straight to stdio after the log file refuses an append.
56
+ const APPEND_RETRY_COOLDOWN = 5000;
57
+ // Ceiling on how often a failing rotation may report itself; the failure repeats every check point.
58
+ const ROTATION_REPORT_INTERVAL = 60000;
59
+ const SET_ROTATION_POLICY = Symbol('setRotationPolicy');
60
+ const GET_ROTATION_POLICY = Symbol('getRotationPolicy');
61
+ const FILE_ROTATION_SOURCE = Symbol('fileRotationSource');
62
+ const SERVICE_NAME = workerData?.name?.replace(/ /g, '-') || 'main';
63
+
50
64
  let logConsole;
51
65
  let log_to_file;
52
66
  let logToStdstreams;
@@ -100,25 +114,63 @@ let hdbProperties;
100
114
 
101
115
  let rootConfig;
102
116
 
103
- function updateLogger(logger: any, logOptions: any, name?: string) {
104
- logger.rotation = logOptions.rotation;
117
+ // `mainLoggerRef` defaults to the module's private `mainLogger` singleton (the real production
118
+ // behavior) but can be overridden by callers (currently just tests) so the inheritance decision
119
+ // below can be exercised against a throwaway logger without reaching into module-private state.
120
+ export function updateLogger(logger: any, logOptions: any, name?: string, mainLoggerRef: any = mainLogger) {
121
+ // Fall back to the main logger's rotation (like level/path below) so an external/component
122
+ // logger with no rotation block of its own inherits maxSize/interval/etc rather than losing
123
+ // rotation entirely (#1877). Excluded when `logger` IS mainLoggerRef: the fallback would just
124
+ // reassign mainLogger.rotation to itself, making it impossible to ever clear main's rotation.
125
+ const inheritedRotation = logOptions.rotation ?? (logger === mainLoggerRef ? undefined : mainLoggerRef?.rotation);
126
+ const loggerPolicy = logger[GET_ROTATION_POLICY]?.();
127
+ const mainPolicy = mainLoggerRef?.[GET_ROTATION_POLICY]?.();
128
+ const inheritsRotation = logOptions.rotation == null && logger !== mainLoggerRef;
129
+ const rotationSource = inheritsRotation ? mainPolicy?.source : loggerPolicy?.ownSource;
105
130
  let path = logOptions.path;
106
131
  if (path) {
107
132
  if (!logOptions.root) logOptions.root = pathModule.dirname(path);
108
133
  } else if (logOptions.root) {
109
134
  path = join(logOptions.root, logName);
110
135
  } else {
111
- path = mainLogger.path;
136
+ path = mainLoggerRef.path;
112
137
  if (!logOptions.root) logOptions.root = pathModule.dirname(path);
113
138
  }
139
+ if (inheritedRotation && inheritedRotation === mainLoggerRef?.rotation && path !== mainLoggerRef?.path) {
140
+ // This logger has no rotation block of its own and is inheriting main's wholesale — but
141
+ // inheriting `rotation.path` too would point this logger's archives at wherever main
142
+ // archives to. If this logger's file lives on a different filesystem/volume than that
143
+ // directory, the rotator's fs.rename() there fails with EXDEV and the tick error leaks
144
+ // (contained in logRotator.ts) without ever rotating this log. Strip the inherited path so
145
+ // rotation instead defaults beside this logger's own path (logRotator's own <log dir>/rotated
146
+ // fallback); an explicit `rotation.path` in this logger's own config still wins, since that
147
+ // goes through `logOptions.rotation` above, not this fallback. Clone rather than mutate:
148
+ // `inheritedRotation` is the literal object shared by mainLogger.rotation and every other
149
+ // component that inherited it.
150
+ //
151
+ // Only when the paths differ. A logger writing to main's own file shares main's rotation
152
+ // state — file loggers are cached per path — so stripping there discards the operator's
153
+ // configured rotation.path for the main log itself, which no EXDEV risk justifies.
154
+ const { path: _inheritedPath, ...rotationWithoutPath } = inheritedRotation;
155
+ setRotationPolicy(rotationWithoutPath);
156
+ } else {
157
+ setRotationPolicy(inheritedRotation);
158
+ }
159
+ // After the rotation above: assigning `path` goes through the setter that rebuilds this path's
160
+ // file logger, and it reads `logger.rotation` as it stands at that moment.
114
161
  if (path) logger.path = path;
115
162
  else console.error('No path for logger', logOptions);
116
- logger.level = LOG_LEVEL_HIERARCHY[logOptions.level] ?? mainLogger?.level ?? LOG_LEVEL_HIERARCHY.info;
163
+ logger.level = LOG_LEVEL_HIERARCHY[logOptions.level] ?? mainLoggerRef?.level ?? LOG_LEVEL_HIERARCHY.info;
117
164
  updateConditional(logger);
118
165
  logger.logToStdstreams = logOptions.stdStreams ?? false;
119
166
  // if there is a configured tag or if a component is logging to default/main log path, use the component name as the tag
120
167
  // to differentiate it
121
- logger.tag = logOptions.tag ?? ((mainLogger.path === logger.path || externalLogger.path === logger.path) && name);
168
+ logger.tag = logOptions.tag ?? ((mainLoggerRef.path === logger.path || externalLogger.path === logger.path) && name);
169
+
170
+ function setRotationPolicy(rotation) {
171
+ if (logger[SET_ROTATION_POLICY]) logger[SET_ROTATION_POLICY](rotation, rotationSource, inheritsRotation);
172
+ else logger.rotation = rotation;
173
+ }
122
174
  }
123
175
  // creates a logger where the methods are only defined if they are within the log level.
124
176
  // Using this conditional logger means that every method call must be optional like log.trace?.('message),
@@ -145,13 +197,25 @@ function resolveLogPath(configPath: string, rootPath: string) {
145
197
  async function updateLogSettings() {
146
198
  if (!rootConfig) {
147
199
  // set up the initial watcher
148
- rootConfig = new RootConfigWatcher();
200
+ rootConfig = getSharedRootConfigWatcher();
149
201
  // wait for it to be ready
150
202
  await rootConfig.ready;
151
203
  // TODO: Any way to differentiate changes that we can and can't handle?
152
204
  rootConfig.on('change', updateLogSettings);
153
205
  }
154
- let rootConfigObject = rootConfig.config;
206
+ applyLogSettings(rootConfig.config);
207
+ }
208
+
209
+ // Separate from the watcher wiring above because the watcher it builds reads a process-wide path,
210
+ // which leaves no way to exercise these settings against a given config.
211
+ function applyLogSettings(rootConfigObject: any) {
212
+ // `ready` settles on every terminal read outcome, including ones that carry no config at all —
213
+ // see DESIGN.md, "Every terminal read outcome settles the barrier". Applying that as settings
214
+ // would not be "the defaults": `updateLogger` reads an absent `rotation` as rotation off and an
215
+ // absent `console` as console off, so an unreadable config would silently disable logging.
216
+ // What `initLogSettings()` established at startup stands until a real config arrives, which
217
+ // is why the watcher settles those outcomes with no config rather than an empty one.
218
+ if (!rootConfigObject || typeof rootConfigObject !== 'object') return;
155
219
  const logOptions = rootConfigObject.logging ?? {};
156
220
  // Resolve relative paths against rootPath from the same config
157
221
  const rootPath = rootConfigObject.rootPath;
@@ -174,7 +238,9 @@ async function updateLogSettings() {
174
238
  for (const name in rootConfigObject) {
175
239
  // we now scan each component to see if it has logging individual configured
176
240
  const component = rootConfigObject[name];
177
- if (component.logging) {
241
+ // `myComponent:` with nothing under it parses to null, and an async listener's TypeError
242
+ // escapes the watcher's emit guard as an unhandled rejection.
243
+ if (component?.logging) {
178
244
  updateLogger(mainLogger.forComponent(name), component.logging, name);
179
245
  } else if (mainLogger.hasComponent(name)) {
180
246
  const componentLogger = mainLogger.forComponent(name);
@@ -376,6 +442,8 @@ module.exports = {
376
442
  // we can start using the RootConfigWatcher
377
443
  start: updateLogSettings,
378
444
  startOnMainThread: updateLogSettings,
445
+ // Test-only: applies a config without the process-wide watcher `updateLogSettings` builds.
446
+ _applyLogSettingsForTests: applyLogSettings,
379
447
  errorToString,
380
448
  errorForLog,
381
449
  inspectForLog,
@@ -383,8 +451,20 @@ module.exports = {
383
451
  disableStdio,
384
452
  isStdioBrokenError,
385
453
  externalLogger,
454
+ updateLogger,
386
455
  };
387
456
 
457
+ // Writes past the stdio guard installed by installStdioGuard, which would otherwise route the
458
+ // text back into the file logger this is the fallback for, and swallows a broken pipe - there is
459
+ // nowhere left to report it.
460
+ function writeToStdioDirectly(stream, text) {
461
+ try {
462
+ nativeStdWrite.call(stream, text);
463
+ } catch {
464
+ // stdio is gone too
465
+ }
466
+ }
467
+
388
468
  // A bare no-op would read as permanent backpressure to a pipe()'d source; this drains and
389
469
  // discards instead.
390
470
  function noopWrite(_chunk?: any, encoding?: any, callback?: any) {
@@ -428,6 +508,14 @@ export function logsAtLevel(level: any) {
428
508
  export function initLogSettings(forceInit = false) {
429
509
  try {
430
510
  if (hdbProperties === undefined || forceInit) {
511
+ if (forceInit && mainLogger?.[SET_ROTATION_POLICY]) {
512
+ const currentPath = mainLogger.path;
513
+ if (currentPath) {
514
+ const { ownSource } = mainLogger[GET_ROTATION_POLICY]();
515
+ mainLogger[SET_ROTATION_POLICY](undefined, ownSource, false);
516
+ mainLogger.path = currentPath;
517
+ }
518
+ }
431
519
  closeLogFile();
432
520
  const bootPropsFilePath = getPropsFilePath();
433
521
  let properties = assignCMDENVVariables(['ROOTPATH']);
@@ -510,10 +598,17 @@ export function initLogSettings(forceInit = false) {
510
598
 
511
599
  logLevel = logLevel === undefined ? defaultLevel : logLevel;
512
600
 
513
- mainLogger = createLogger({ level: logLevel });
601
+ // createLogger shadows the module-level `logToStdstreams` with this option, so omitting it
602
+ // drops every log written before a config exists rather than routing it to the streams.
603
+ mainLogger = createLogger({ level: logLevel, stdStreams: logToStdstreams });
514
604
  // setup the external logger
515
605
  externalLogger = mainLogger.forComponent('external');
516
606
  externalLogger.tag = null; // don't tag by default
607
+ // The streams are this branch's only sink, so it needs the same EPIPE/EIO listeners the
608
+ // configured path installs below: `harper install | head -1` closes the reader, and the
609
+ // async error would otherwise land on a stream with none and take the install down. The
610
+ // guard's write override is inert here, because `log_to_file` is false.
611
+ stdioLogging();
517
612
  return;
518
613
  }
519
614
 
@@ -601,7 +696,6 @@ export function suppressLogging(callback) {
601
696
  }
602
697
  }
603
698
 
604
- const SERVICE_NAME = workerData?.name?.replace(/ /g, '-') || 'main';
605
699
  // these are used to store information about the current service and tag so we can prepend them to the log during
606
700
  // the writes, without having to pass the information through the Console instance
607
701
  let currentLevel = 'info'; // default is info
@@ -616,7 +710,14 @@ export function createLogger(options: any = {} as any) {
616
710
  isExternalInstance,
617
711
  writeToLog,
618
712
  component,
713
+ rotationSource,
714
+ rotationInherited = false,
619
715
  }: any = options;
716
+ const ownRotationSource = Symbol('rotationPolicySource');
717
+ let currentRotationSource = rotationSource ?? ownRotationSource;
718
+ let previousRotationSource;
719
+ let currentRotationInherited = rotationInherited;
720
+ let rotationChangeIsAuthoritative = rotation !== undefined;
620
721
  if (!logLevel) logLevel = 'info';
621
722
  let level = typeof logLevel === 'number' ? logLevel : LOG_LEVEL_HIERARCHY[logLevel];
622
723
  let logger;
@@ -660,7 +761,8 @@ export function createLogger(options: any = {} as any) {
660
761
  }
661
762
  } else if (logToStdstreams) process.stderr.write(log);
662
763
  }
663
- let logToFile = logFilePath && getFileLogger(logFilePath, rotation, isExternalInstance);
764
+ let logToFile = logFilePath && getFileLogger(logFilePath, rotation, isExternalInstance, rotationPolicy());
765
+ rotationPolicyApplied();
664
766
  function logPrepend(write) {
665
767
  return {
666
768
  write(log) {
@@ -683,6 +785,14 @@ export function createLogger(options: any = {} as any) {
683
785
  },
684
786
  level
685
787
  );
788
+ logger[SET_ROTATION_POLICY] = function (newRotation, source = ownRotationSource, inherited = false) {
789
+ previousRotationSource = currentRotationSource;
790
+ currentRotationSource = source ?? ownRotationSource;
791
+ currentRotationInherited = inherited;
792
+ rotationChangeIsAuthoritative = true;
793
+ logger.rotation = newRotation;
794
+ };
795
+ logger[GET_ROTATION_POLICY] = () => ({ ownSource: ownRotationSource, source: currentRotationSource });
686
796
  updateConditional(logger);
687
797
  logger.path = logFilePath;
688
798
  Object.defineProperty(logger, 'path', {
@@ -691,7 +801,9 @@ export function createLogger(options: any = {} as any) {
691
801
  },
692
802
  set(path) {
693
803
  logFilePath = path;
694
- logToFile = getFileLogger(logFilePath, logger.rotation, isExternalInstance);
804
+ if (!logFilePath) return;
805
+ logToFile = getFileLogger(logFilePath, logger.rotation, isExternalInstance, rotationPolicy());
806
+ rotationPolicyApplied();
695
807
  if (isExternalInstance) writeToLogFile = logToFile;
696
808
  },
697
809
  enumerable: true,
@@ -704,12 +816,15 @@ export function createLogger(options: any = {} as any) {
704
816
  let componentLogger = components.get(name);
705
817
  if (!componentLogger) {
706
818
  const protoLogger = isExternal ? externalLogger : logger;
819
+ const protoRotationPolicy = protoLogger[GET_ROTATION_POLICY]?.();
707
820
  componentLogger = createLogger({
708
821
  path: protoLogger.path,
709
822
  level: protoLogger.level,
710
823
  stdStreams: protoLogger.logToStdstreams,
711
824
  isExternalInstance: isExternal || name === 'external',
712
825
  rotation: protoLogger.rotation,
826
+ rotationSource: protoRotationPolicy?.source,
827
+ rotationInherited: true,
713
828
  writeToLog,
714
829
  component: true,
715
830
  });
@@ -725,32 +840,83 @@ export function createLogger(options: any = {} as any) {
725
840
  logger.components = components;
726
841
  }
727
842
  return logger;
843
+
844
+ function rotationPolicy() {
845
+ return {
846
+ source: currentRotationSource,
847
+ previousSource: previousRotationSource,
848
+ inherited: currentRotationInherited,
849
+ authoritative: rotationChangeIsAuthoritative,
850
+ };
851
+ }
852
+
853
+ function rotationPolicyApplied() {
854
+ previousRotationSource = currentRotationSource;
855
+ rotationChangeIsAuthoritative = false;
856
+ }
728
857
  }
729
- const LOG_TIME_USAGE_THRESHOLD = 100;
730
858
  /**
731
859
  * Get the file logger for the given path. If it doesn't exist, create it.
732
860
  * @param path
733
861
  * @param isExternalInstance
734
862
  * @return {any}
735
863
  */
736
- function getFileLogger(path, rotation, isExternalInstance) {
864
+ function getFileLogger(path, rotation, isExternalInstance, rotationPolicy) {
737
865
  let logger = fileLoggers.get(path);
738
- let logFD, loggedFDError, logTimer;
866
+ let logFD, loggedFDError, loggedAppendError, logTimer, retryAppendAfter;
739
867
  let logBuffer;
868
+ let rotationProblemNotice;
740
869
  let logTimeUsage = 0;
870
+ let rotationGuard,
871
+ logFDIdentity,
872
+ nextRotationReport = 0;
741
873
  if (!logger) {
742
874
  logger = logToFile;
743
875
  logger.closeLogFile = closeLogFile;
876
+ // The guard has to be installed through the live closure: later calls for this path get the
877
+ // cached logger back, and their own logFD/logBuffer are dead.
878
+ logger.installRotationGuard = installRotationGuard;
744
879
  logger.path = path;
745
880
  fileLoggers.set(path, logger);
881
+ // Registered by the sink, not by the size guard: a thread that writes this file but has no
882
+ // guard (no maxSize, or rotation driven only by interval) still holds a descriptor, and an
883
+ // answer from it has to mean "released" rather than only "handler ran".
884
+ registerLogSink(path, { identity: () => logFDIdentity, close: closeLogFile });
746
885
  }
747
- if (isMainThread && JSON.stringify(rotation) !== JSON.stringify(logger.rotation)) {
886
+ const currentSource = logger[FILE_ROTATION_SOURCE];
887
+ const sameSource = currentSource === rotationPolicy.source;
888
+ const replacesPreviousSource = currentSource !== undefined && currentSource === rotationPolicy.previousSource;
889
+ const canInstall =
890
+ rotation !== undefined &&
891
+ (!rotationPolicy.inherited || currentSource === undefined || sameSource || replacesPreviousSource);
892
+ const canClear = rotation === undefined && rotationPolicy.authoritative && (sameSource || replacesPreviousSource);
893
+ let reconfigured = false;
894
+ if (canInstall) {
895
+ logger[FILE_ROTATION_SOURCE] = rotationPolicy.source;
896
+ reconfigured = JSON.stringify(rotation) !== JSON.stringify(logger.rotation);
897
+ }
898
+ if (reconfigured) {
748
899
  logger.rotation = rotation;
900
+ // Every writing thread, and synchronously: request logging is produced by the HTTP workers, and
901
+ // at the rates that make maxSize matter a deferred guard misses megabytes before it exists.
902
+ logger.installRotationGuard(rotation);
903
+ } else if (canClear) {
904
+ logger.rotation = undefined;
905
+ logger[FILE_ROTATION_SOURCE] = undefined;
906
+ logger.installRotationGuard(undefined);
907
+ reconfigured = true;
908
+ }
909
+ if (isMainThread && reconfigured) {
749
910
  setTimeout(() => {
750
- logger.rotator?.end();
751
- if (!rotation) return;
752
- const { logRotator } = require('./logRotator');
911
+ // Everything inside the try: a throw from a timer callback is unhandled, and neither
912
+ // require('./logRotator') (which reaches environmentManager's synchronous init) nor a
913
+ // rotator teardown may take the process down over log rotation (#847).
753
914
  try {
915
+ const previousRotator = logger.rotator;
916
+ logger.rotator = undefined;
917
+ previousRotator?.end();
918
+ if (!rotation) return;
919
+ const { logRotator } = require('./logRotator');
754
920
  logger.rotator = logRotator({
755
921
  logger,
756
922
  ...rotation,
@@ -761,6 +927,46 @@ function getFileLogger(path, rotation, isExternalInstance) {
761
927
  }, 100);
762
928
  }
763
929
  return logger;
930
+ function installRotationGuard(newRotation) {
931
+ rotationGuard = undefined;
932
+ if (!newRotation || newRotation.enabled === false) return;
933
+ const maxBytes = parseMaxSize(newRotation.maxSize);
934
+ if (!maxBytes) {
935
+ if (newRotation.maxSize != null) reportRotationProblem(`logging.rotation.maxSize: ${INVALID_MAX_SIZE_MSG}`);
936
+ return;
937
+ }
938
+ try {
939
+ rotationGuard = createRotationGuard({
940
+ logPath: path,
941
+ maxBytes,
942
+ rotatedLogDir: resolveRotatedLogDir(path, newRotation.path),
943
+ // From the rotation block rather than environmentManager (which logRotator still reads):
944
+ // environmentManager imports this module, so it cannot be reached from the write path.
945
+ compress: newRotation.compress,
946
+ getLogIdentity: () => logFDIdentity,
947
+ closeLogFile,
948
+ report: reportRotationProblem,
949
+ onRotated(archivePath) {
950
+ // Same shape as every other line in the file: written straight to the sink, this
951
+ // bypasses the prefix createLogger's logPrepend adds, and readLog parses by level.
952
+ logToFile(`[${SERVICE_NAME}/${threadId}] [notify]: hdb.log rotated, old log moved to ${archivePath}`);
953
+ },
954
+ });
955
+ } catch (error) {
956
+ reportRotationProblem(`log rotation is disabled for ${path}: ${error}`);
957
+ }
958
+ }
959
+ function reportRotationProblem(text) {
960
+ // Straight to stdio, never back through this sink: the sink is what rotation is failing on.
961
+ // Rate-limited rather than once-only, so a later, different failure is still reported.
962
+ if (nextRotationReport > performance.now()) return;
963
+ nextRotationReport = performance.now() + ROTATION_REPORT_INTERVAL;
964
+ const message = `Harper log rotation problem — ${text}`;
965
+ // Scripted services discard stdio. Preserve the warning in the active file on the next
966
+ // successful append as well, without recursing through the rotation guard.
967
+ rotationProblemNotice = `${new Date().toISOString()} [${SERVICE_NAME}/${threadId}] [error]: ${message}\n`;
968
+ writeToStdioDirectly(process.stderr, `${message}\n`);
969
+ }
764
970
  function logToFile(log) {
765
971
  let entry = `${new Date().toISOString()} ${log}${log.endsWith('\n') ? '' : '\n'}`;
766
972
  if (logBuffer) {
@@ -787,16 +993,47 @@ function getFileLogger(path, rotation, isExternalInstance) {
787
993
  }
788
994
  // this is called on a timer, and will write the log buffer to the file
789
995
  function logQueuedData(entry?: any) {
996
+ const payload = logBuffer ? logBuffer.join('') : entry;
997
+ // Released before anything can re-enter: the rotation notice is written from inside the append
998
+ // below, and a re-entrant flush still holding this batch would write it twice.
999
+ logBuffer = null;
1000
+ if (payload === undefined) return;
1001
+ // A file that just refused a write will refuse the next one too, and every attempt costs a
1002
+ // failed syscall plus a thrown error on whatever path is logging - which, on a full volume,
1003
+ // is the request path at full rate. Go straight to stdio until the cooldown expires.
1004
+ // Opened after the guard: a guard recovering by rotation closes this descriptor first.
1005
+ const mayAppend = !(retryAppendAfter > performance.now()) && (rotationGuard?.beforeAppend() ?? true);
790
1006
  openLogFile(undefined);
791
- if (logFD) {
1007
+ if (logFD && mayAppend) {
792
1008
  let startTime = performance.now();
793
- fs.appendFileSync(logFD, logBuffer ? logBuffer.join('') : entry);
1009
+ try {
1010
+ const appendPayload = rotationProblemNotice ? rotationProblemNotice + payload : payload;
1011
+ const appendBuffer = Buffer.from(appendPayload);
1012
+ fs.appendFileSync(logFD, appendBuffer);
1013
+ rotationProblemNotice = undefined;
1014
+ // Both cleared, so a volume that fills again months later reports itself again
1015
+ retryAppendAfter = undefined;
1016
+ loggedAppendError = false;
1017
+ rotationGuard?.recordWrite(appendBuffer.length);
1018
+ } catch (error) {
1019
+ retryAppendAfter = performance.now() + APPEND_RETRY_COOLDOWN;
1020
+ // A log write must never take the process down: on an exhausted volume this throws from
1021
+ // both inline and timer call sites, making every log statement a crash point (#847).
1022
+ // The fallback goes through nativeStdWrite rather than console because
1023
+ // installStdioGuard routes console output back into this same file logger when
1024
+ // logging.file and logging.console are both on, which would recurse until the stack blew.
1025
+ if (!loggedAppendError) {
1026
+ loggedAppendError = true;
1027
+ writeToStdioDirectly(process.stderr, `Harper cannot write to its log file: ${error}\n`);
1028
+ }
1029
+ writeToStdioDirectly(process.stdout, payload);
1030
+ return;
1031
+ }
794
1032
  let endTime = performance.now();
795
1033
  // determine if we are using more than about two percent of processing time for log writes recently, and if so, we
796
1034
  // will start buffering
797
1035
  logTimeUsage = Math.max(endTime, logTimeUsage) + (endTime - startTime) * 50;
798
- } else if (!loggedFDError) console.log(logBuffer ? logBuffer.join('') : entry);
799
- if (logBuffer) logBuffer = null;
1036
+ } else writeToStdioDirectly(process.stdout, payload);
800
1037
  }
801
1038
 
802
1039
  function closeLogFile(_unused?: any) {
@@ -804,6 +1041,7 @@ function getFileLogger(path, rotation, isExternalInstance) {
804
1041
  fs.closeSync(logFD);
805
1042
  } catch {}
806
1043
  logFD = null;
1044
+ logFDIdentity = null;
807
1045
  if (isExternalInstance) mainLogFd = null;
808
1046
  }
809
1047
 
@@ -811,12 +1049,25 @@ function getFileLogger(path, rotation, isExternalInstance) {
811
1049
  if (!logFD) {
812
1050
  try {
813
1051
  logFD = fs.openSync(path, 'a');
1052
+ // Which generation this descriptor belongs to, recorded once here so the size guard's
1053
+ // checkpoint needs a single pathname stat to tell whether the file has moved under it.
1054
+ try {
1055
+ const opened = fs.fstatSync(logFD);
1056
+ logFDIdentity = { ino: opened.ino, dev: opened.dev };
1057
+ } catch {
1058
+ logFDIdentity = null;
1059
+ }
814
1060
  if (isExternalInstance) mainLogFd = logFD;
815
1061
  } catch (error) {
816
1062
  if (error.code === 'ENOENT' && !isRetry) {
817
1063
  // if the directory doesn't exist, create it
818
- fs.mkdirpSync(pathModule.dirname(path));
819
- return openLogFile(true);
1064
+ try {
1065
+ fs.mkdirpSync(pathModule.dirname(path));
1066
+ return openLogFile(true);
1067
+ } catch (mkdirError) {
1068
+ // creating the log directory can fail for the same reason the log write can
1069
+ error = mkdirError;
1070
+ }
820
1071
  }
821
1072
  if (!loggedFDError) {
822
1073
  loggedFDError = true;
@@ -1811,7 +2062,7 @@ export function AuthAuditLog(
1811
2062
  this.path = path;
1812
2063
  }
1813
2064
  // we have to load this at the end to avoid circular dependencies problems
1814
- import { RootConfigWatcher } from '../../config/RootConfigWatcher.ts';
2065
+ import { getSharedRootConfigWatcher } from '../../config/RootConfigWatcher.ts';
1815
2066
 
1816
2067
  export const getLogFilePath = () => logFilePath;
1817
2068
  export const forComponent = (name: string, isExternal?: boolean) => mainLogger.forComponent(name, isExternal);
@@ -1846,4 +2097,5 @@ export default {
1846
2097
  errorForLog,
1847
2098
  inspectForLog,
1848
2099
  isErrorLike,
2100
+ updateLogger,
1849
2101
  };