@harperfast/harper 5.2.9 → 5.3.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/agent/mcpTools.ts +1 -1
  2. package/agent/session.ts +25 -14
  3. package/bin/cliOperations.ts +46 -9
  4. package/bin/copyDb.ts +282 -59
  5. package/bin/deploySetup.ts +16 -5
  6. package/bin/harper.ts +1 -1
  7. package/bin/help.ts +4 -1
  8. package/bin/lite.ts +4 -1
  9. package/bin/restart.ts +59 -3
  10. package/bin/run.ts +6 -11
  11. package/bin/upgrade.js +7 -3
  12. package/bin/workloadIdentity.ts +119 -0
  13. package/components/Application.ts +2414 -242
  14. package/components/ApplicationScope.ts +8 -0
  15. package/components/EntryHandler.ts +59 -39
  16. package/components/OptionsWatcher.ts +150 -74
  17. package/components/RuntimeModuleTracker.ts +38 -7
  18. package/components/Scope.ts +37 -15
  19. package/components/awaitRestart.ts +84 -0
  20. package/components/componentLoader.ts +340 -30
  21. package/components/componentPreparationLock.ts +16 -5
  22. package/components/mcp/adapters/harperHttp.ts +4 -0
  23. package/components/mcp/listChanged.ts +4 -0
  24. package/components/mcp/toolRegistry.ts +2 -0
  25. package/components/mcp/tools/operations.ts +9 -0
  26. package/components/mcp/tools/schemas/operationDescriptions.ts +2 -2
  27. package/components/operations.js +270 -78
  28. package/components/operationsValidation.js +49 -1
  29. package/components/status/ComponentStatusRegistry.ts +59 -0
  30. package/config/RootConfigWatcher.ts +80 -34
  31. package/config/configUtils.ts +291 -34
  32. package/config/harperConfigEnvVars.ts +170 -27
  33. package/config-root.schema.json +29 -0
  34. package/dataLayer/blobBackup.ts +160 -50
  35. package/dataLayer/delete.ts +6 -1
  36. package/dataLayer/harperBridge/ResourceBridge.ts +52 -8
  37. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
  38. package/dataLayer/hdbInfoController.ts +34 -1
  39. package/dataLayer/insert.ts +44 -1
  40. package/dataLayer/rocksdbBackup.ts +53 -10
  41. package/dataLayer/schema.ts +11 -1
  42. package/dataLayer/schemaDescribe.ts +8 -1
  43. package/dist/agent/mcpTools.js +1 -1
  44. package/dist/agent/mcpTools.js.map +1 -1
  45. package/dist/agent/session.d.ts +22 -0
  46. package/dist/agent/session.js +26 -15
  47. package/dist/agent/session.js.map +1 -1
  48. package/dist/bin/cliOperations.js +48 -9
  49. package/dist/bin/cliOperations.js.map +1 -1
  50. package/dist/bin/copyDb.d.ts +12 -1
  51. package/dist/bin/copyDb.js +248 -60
  52. package/dist/bin/copyDb.js.map +1 -1
  53. package/dist/bin/deploySetup.d.ts +2 -0
  54. package/dist/bin/deploySetup.js +11 -3
  55. package/dist/bin/deploySetup.js.map +1 -1
  56. package/dist/bin/harper.js +1 -1
  57. package/dist/bin/harper.js.map +1 -1
  58. package/dist/bin/help.js +4 -1
  59. package/dist/bin/help.js.map +1 -1
  60. package/dist/bin/lite.js +4 -1
  61. package/dist/bin/lite.js.map +1 -1
  62. package/dist/bin/restart.js +54 -5
  63. package/dist/bin/restart.js.map +1 -1
  64. package/dist/bin/run.js +4 -10
  65. package/dist/bin/run.js.map +1 -1
  66. package/dist/bin/upgrade.js +4 -3
  67. package/dist/bin/upgrade.js.map +1 -1
  68. package/dist/bin/workloadIdentity.d.ts +18 -0
  69. package/dist/bin/workloadIdentity.js +100 -0
  70. package/dist/bin/workloadIdentity.js.map +1 -0
  71. package/dist/components/Application.d.ts +139 -16
  72. package/dist/components/Application.js +2215 -267
  73. package/dist/components/Application.js.map +1 -1
  74. package/dist/components/ApplicationScope.d.ts +8 -0
  75. package/dist/components/ApplicationScope.js +7 -0
  76. package/dist/components/ApplicationScope.js.map +1 -1
  77. package/dist/components/EntryHandler.js +26 -10
  78. package/dist/components/EntryHandler.js.map +1 -1
  79. package/dist/components/OptionsWatcher.d.ts +1 -0
  80. package/dist/components/OptionsWatcher.js +141 -74
  81. package/dist/components/OptionsWatcher.js.map +1 -1
  82. package/dist/components/RuntimeModuleTracker.js +40 -6
  83. package/dist/components/RuntimeModuleTracker.js.map +1 -1
  84. package/dist/components/Scope.js +38 -13
  85. package/dist/components/Scope.js.map +1 -1
  86. package/dist/components/awaitRestart.d.ts +33 -0
  87. package/dist/components/awaitRestart.js +61 -0
  88. package/dist/components/awaitRestart.js.map +1 -0
  89. package/dist/components/componentLoader.d.ts +38 -1
  90. package/dist/components/componentLoader.js +279 -22
  91. package/dist/components/componentLoader.js.map +1 -1
  92. package/dist/components/componentPreparationLock.d.ts +5 -0
  93. package/dist/components/componentPreparationLock.js +14 -6
  94. package/dist/components/componentPreparationLock.js.map +1 -1
  95. package/dist/components/mcp/adapters/harperHttp.js +4 -0
  96. package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
  97. package/dist/components/mcp/listChanged.js +5 -0
  98. package/dist/components/mcp/listChanged.js.map +1 -1
  99. package/dist/components/mcp/toolRegistry.d.ts +1 -0
  100. package/dist/components/mcp/toolRegistry.js.map +1 -1
  101. package/dist/components/mcp/tools/operations.d.ts +5 -0
  102. package/dist/components/mcp/tools/operations.js +9 -0
  103. package/dist/components/mcp/tools/operations.js.map +1 -1
  104. package/dist/components/mcp/tools/schemas/operationDescriptions.js +2 -2
  105. package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
  106. package/dist/components/operations.js +231 -77
  107. package/dist/components/operations.js.map +1 -1
  108. package/dist/components/operationsValidation.js +49 -1
  109. package/dist/components/operationsValidation.js.map +1 -1
  110. package/dist/components/status/ComponentStatusRegistry.d.ts +0 -4
  111. package/dist/components/status/ComponentStatusRegistry.js +63 -0
  112. package/dist/components/status/ComponentStatusRegistry.js.map +1 -1
  113. package/dist/config/RootConfigWatcher.d.ts +7 -1
  114. package/dist/config/RootConfigWatcher.js +64 -27
  115. package/dist/config/RootConfigWatcher.js.map +1 -1
  116. package/dist/config/configUtils.d.ts +9 -1
  117. package/dist/config/configUtils.js +254 -33
  118. package/dist/config/configUtils.js.map +1 -1
  119. package/dist/config/harperConfigEnvVars.d.ts +16 -0
  120. package/dist/config/harperConfigEnvVars.js +162 -25
  121. package/dist/config/harperConfigEnvVars.js.map +1 -1
  122. package/dist/dataLayer/blobBackup.d.ts +49 -20
  123. package/dist/dataLayer/blobBackup.js +139 -50
  124. package/dist/dataLayer/blobBackup.js.map +1 -1
  125. package/dist/dataLayer/delete.js +1 -1
  126. package/dist/dataLayer/delete.js.map +1 -1
  127. package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +14 -1
  128. package/dist/dataLayer/harperBridge/ResourceBridge.js +51 -10
  129. package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
  130. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.d.ts +3 -1
  131. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
  132. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js.map +1 -1
  133. package/dist/dataLayer/hdbInfoController.d.ts +10 -0
  134. package/dist/dataLayer/hdbInfoController.js +30 -1
  135. package/dist/dataLayer/hdbInfoController.js.map +1 -1
  136. package/dist/dataLayer/insert.d.ts +9 -1
  137. package/dist/dataLayer/insert.js +30 -0
  138. package/dist/dataLayer/insert.js.map +1 -1
  139. package/dist/dataLayer/rocksdbBackup.d.ts +2 -2
  140. package/dist/dataLayer/rocksdbBackup.js +45 -8
  141. package/dist/dataLayer/rocksdbBackup.js.map +1 -1
  142. package/dist/dataLayer/schema.js +8 -0
  143. package/dist/dataLayer/schema.js.map +1 -1
  144. package/dist/dataLayer/schemaDescribe.js +8 -1
  145. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  146. package/dist/index.d.ts +1 -1
  147. package/dist/index.js.map +1 -1
  148. package/dist/json/systemSchema.json +52 -0
  149. package/dist/resources/DatabaseTransaction.d.ts +55 -0
  150. package/dist/resources/DatabaseTransaction.js +459 -45
  151. package/dist/resources/DatabaseTransaction.js.map +1 -1
  152. package/dist/resources/LMDBTransaction.js +22 -4
  153. package/dist/resources/LMDBTransaction.js.map +1 -1
  154. package/dist/resources/PrimaryRocksDatabase.d.ts +1 -0
  155. package/dist/resources/PrimaryRocksDatabase.js +29 -0
  156. package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
  157. package/dist/resources/RecordEncoder.d.ts +20 -0
  158. package/dist/resources/RecordEncoder.js +94 -9
  159. package/dist/resources/RecordEncoder.js.map +1 -1
  160. package/dist/resources/RequestTarget.d.ts +2 -0
  161. package/dist/resources/RequestTarget.js.map +1 -1
  162. package/dist/resources/Resource.js +20 -11
  163. package/dist/resources/Resource.js.map +1 -1
  164. package/dist/resources/ResourceInterface.d.ts +20 -1
  165. package/dist/resources/ResourceInterface.js.map +1 -1
  166. package/dist/resources/RocksIndexStore.d.ts +6 -1
  167. package/dist/resources/RocksIndexStore.js +24 -9
  168. package/dist/resources/RocksIndexStore.js.map +1 -1
  169. package/dist/resources/RocksTransactionLogStore.d.ts +14 -1
  170. package/dist/resources/RocksTransactionLogStore.js +57 -17
  171. package/dist/resources/RocksTransactionLogStore.js.map +1 -1
  172. package/dist/resources/Table.d.ts +112 -8
  173. package/dist/resources/Table.js +1073 -191
  174. package/dist/resources/Table.js.map +1 -1
  175. package/dist/resources/auditStore.d.ts +11 -2
  176. package/dist/resources/auditStore.js +325 -71
  177. package/dist/resources/auditStore.js.map +1 -1
  178. package/dist/resources/blob.d.ts +129 -9
  179. package/dist/resources/blob.js +992 -114
  180. package/dist/resources/blob.js.map +1 -1
  181. package/dist/resources/branchDatabase.d.ts +48 -0
  182. package/dist/resources/branchDatabase.js +892 -0
  183. package/dist/resources/branchDatabase.js.map +1 -0
  184. package/dist/resources/crdt.js +50 -12
  185. package/dist/resources/crdt.js.map +1 -1
  186. package/dist/resources/databases.d.ts +150 -0
  187. package/dist/resources/databases.js +1200 -239
  188. package/dist/resources/databases.js.map +1 -1
  189. package/dist/resources/defineTable.d.ts +10 -2
  190. package/dist/resources/defineTable.js +9 -1
  191. package/dist/resources/defineTable.js.map +1 -1
  192. package/dist/resources/graphql.d.ts +1 -1
  193. package/dist/resources/graphql.js +50 -15
  194. package/dist/resources/graphql.js.map +1 -1
  195. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +1 -0
  196. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +6 -2
  197. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
  198. package/dist/resources/longLivedTransactions.d.ts +71 -0
  199. package/dist/resources/longLivedTransactions.js +358 -0
  200. package/dist/resources/longLivedTransactions.js.map +1 -0
  201. package/dist/resources/models/backendRegistry.d.ts +26 -0
  202. package/dist/resources/models/backendRegistry.js +60 -2
  203. package/dist/resources/models/backendRegistry.js.map +1 -1
  204. package/dist/resources/models/bootstrap.d.ts +33 -1
  205. package/dist/resources/models/bootstrap.js +416 -31
  206. package/dist/resources/models/bootstrap.js.map +1 -1
  207. package/dist/resources/recordLock.d.ts +80 -0
  208. package/dist/resources/recordLock.js +184 -0
  209. package/dist/resources/recordLock.js.map +1 -0
  210. package/dist/resources/replayLogs.d.ts +14 -1
  211. package/dist/resources/replayLogs.js +152 -24
  212. package/dist/resources/replayLogs.js.map +1 -1
  213. package/dist/resources/replayLogsGuards.d.ts +94 -7
  214. package/dist/resources/replayLogsGuards.js +111 -7
  215. package/dist/resources/replayLogsGuards.js.map +1 -1
  216. package/dist/resources/search.js +158 -6
  217. package/dist/resources/search.js.map +1 -1
  218. package/dist/resources/transactionBroadcast.d.ts +1 -1
  219. package/dist/resources/transactionBroadcast.js +2 -2
  220. package/dist/resources/transactionBroadcast.js.map +1 -1
  221. package/dist/security/auth.js +61 -30
  222. package/dist/security/auth.js.map +1 -1
  223. package/dist/security/authn/oidc/claims.d.ts +22 -0
  224. package/dist/security/authn/oidc/claims.js +71 -0
  225. package/dist/security/authn/oidc/claims.js.map +1 -0
  226. package/dist/security/authn/oidc/identityToken.d.ts +27 -0
  227. package/dist/security/authn/oidc/identityToken.js +111 -0
  228. package/dist/security/authn/oidc/identityToken.js.map +1 -0
  229. package/dist/security/authn/oidc/jwks.d.ts +25 -0
  230. package/dist/security/authn/oidc/jwks.js +261 -0
  231. package/dist/security/authn/oidc/jwks.js.map +1 -0
  232. package/dist/security/authn/oidc/providers/generic.d.ts +13 -0
  233. package/dist/security/authn/oidc/providers/generic.js +34 -0
  234. package/dist/security/authn/oidc/providers/generic.js.map +1 -0
  235. package/dist/security/authn/oidc/providers/githubActions.d.ts +11 -0
  236. package/dist/security/authn/oidc/providers/githubActions.js +129 -0
  237. package/dist/security/authn/oidc/providers/githubActions.js.map +1 -0
  238. package/dist/security/authn/oidc/providers/index.d.ts +37 -0
  239. package/dist/security/authn/oidc/providers/index.js +24 -0
  240. package/dist/security/authn/oidc/providers/index.js.map +1 -0
  241. package/dist/security/authn/oidc/tokenExchange.d.ts +12 -0
  242. package/dist/security/authn/oidc/tokenExchange.js +306 -0
  243. package/dist/security/authn/oidc/tokenExchange.js.map +1 -0
  244. package/dist/security/authn/oidc/trustPolicyOperations.d.ts +49 -0
  245. package/dist/security/authn/oidc/trustPolicyOperations.js +358 -0
  246. package/dist/security/authn/oidc/trustPolicyOperations.js.map +1 -0
  247. package/dist/security/authn/oidc/types.d.ts +38 -0
  248. package/dist/security/authn/oidc/types.js +6 -0
  249. package/dist/security/authn/oidc/types.js.map +1 -0
  250. package/dist/security/certificateVerification/index.js +40 -11
  251. package/dist/security/certificateVerification/index.js.map +1 -1
  252. package/dist/security/certificateVerification/trustedIssuers.d.ts +24 -0
  253. package/dist/security/certificateVerification/trustedIssuers.js +79 -0
  254. package/dist/security/certificateVerification/trustedIssuers.js.map +1 -0
  255. package/dist/security/certificateVerification/types.d.ts +1 -0
  256. package/dist/security/credentialProvenance.d.ts +35 -0
  257. package/dist/security/credentialProvenance.js +51 -0
  258. package/dist/security/credentialProvenance.js.map +1 -0
  259. package/dist/security/credentialRejection.d.ts +4 -0
  260. package/dist/security/credentialRejection.js +24 -0
  261. package/dist/security/credentialRejection.js.map +1 -0
  262. package/dist/security/deferredAuthentication.d.ts +36 -0
  263. package/dist/security/deferredAuthentication.js +70 -0
  264. package/dist/security/deferredAuthentication.js.map +1 -0
  265. package/dist/security/impersonation.d.ts +21 -0
  266. package/dist/security/impersonation.js +108 -9
  267. package/dist/security/impersonation.js.map +1 -1
  268. package/dist/security/jsLoader.d.ts +6 -0
  269. package/dist/security/jsLoader.js +75 -15
  270. package/dist/security/jsLoader.js.map +1 -1
  271. package/dist/security/keys.js +301 -71
  272. package/dist/security/keys.js.map +1 -1
  273. package/dist/security/operationScope.d.ts +21 -0
  274. package/dist/security/operationScope.js +36 -0
  275. package/dist/security/operationScope.js.map +1 -0
  276. package/dist/security/permissionsTranslator.js +21 -0
  277. package/dist/security/permissionsTranslator.js.map +1 -1
  278. package/dist/security/tokenAuthentication.d.ts +19 -1
  279. package/dist/security/tokenAuthentication.js +191 -10
  280. package/dist/security/tokenAuthentication.js.map +1 -1
  281. package/dist/security/user.js +4 -3
  282. package/dist/security/user.js.map +1 -1
  283. package/dist/server/DurableSubscriptionsSession.d.ts +2 -2
  284. package/dist/server/DurableSubscriptionsSession.js +67 -10
  285. package/dist/server/DurableSubscriptionsSession.js.map +1 -1
  286. package/dist/server/REST.js +73 -0
  287. package/dist/server/REST.js.map +1 -1
  288. package/dist/server/graphqlQuerying.js +4 -0
  289. package/dist/server/graphqlQuerying.js.map +1 -1
  290. package/dist/server/http.d.ts +11 -0
  291. package/dist/server/http.js +88 -15
  292. package/dist/server/http.js.map +1 -1
  293. package/dist/server/itc/serverHandlers.js +8 -1
  294. package/dist/server/itc/serverHandlers.js.map +1 -1
  295. package/dist/server/jobs/jobProcess.js +6 -2
  296. package/dist/server/jobs/jobProcess.js.map +1 -1
  297. package/dist/server/jobs/jobs.js +4 -1
  298. package/dist/server/jobs/jobs.js.map +1 -1
  299. package/dist/server/liveSubscriptionAuth.d.ts +26 -4
  300. package/dist/server/liveSubscriptionAuth.js +105 -39
  301. package/dist/server/liveSubscriptionAuth.js.map +1 -1
  302. package/dist/server/loadRootComponents.js +49 -10
  303. package/dist/server/loadRootComponents.js.map +1 -1
  304. package/dist/server/mqtt.d.ts +2 -0
  305. package/dist/server/mqtt.js +165 -30
  306. package/dist/server/mqtt.js.map +1 -1
  307. package/dist/server/nodeName.d.ts +2 -0
  308. package/dist/server/nodeName.js +107 -23
  309. package/dist/server/nodeName.js.map +1 -1
  310. package/dist/server/serverHelpers/Headers.d.ts +25 -0
  311. package/dist/server/serverHelpers/Headers.js +139 -1
  312. package/dist/server/serverHelpers/Headers.js.map +1 -1
  313. package/dist/server/serverHelpers/contentTypes.d.ts +9 -0
  314. package/dist/server/serverHelpers/contentTypes.js +32 -25
  315. package/dist/server/serverHelpers/contentTypes.js.map +1 -1
  316. package/dist/server/serverHelpers/deployValidationState.d.ts +3 -0
  317. package/dist/server/serverHelpers/deployValidationState.js +9 -19
  318. package/dist/server/serverHelpers/deployValidationState.js.map +1 -1
  319. package/dist/server/serverHelpers/operationAuthorizationState.d.ts +12 -0
  320. package/dist/server/serverHelpers/operationAuthorizationState.js +24 -2
  321. package/dist/server/serverHelpers/operationAuthorizationState.js.map +1 -1
  322. package/dist/server/serverHelpers/registeredOperations.d.ts +5 -4
  323. package/dist/server/serverHelpers/registeredOperations.js +74 -21
  324. package/dist/server/serverHelpers/registeredOperations.js.map +1 -1
  325. package/dist/server/serverHelpers/requestSanitization.d.ts +11 -0
  326. package/dist/server/serverHelpers/requestSanitization.js +20 -0
  327. package/dist/server/serverHelpers/requestSanitization.js.map +1 -0
  328. package/dist/server/serverHelpers/serverHandlers.js +6 -3
  329. package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
  330. package/dist/server/serverHelpers/serverUtilities.d.ts +18 -0
  331. package/dist/server/serverHelpers/serverUtilities.js +90 -20
  332. package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
  333. package/dist/server/serverHelpers/sharedMessageEncoding.d.ts +67 -0
  334. package/dist/server/serverHelpers/sharedMessageEncoding.js +280 -0
  335. package/dist/server/serverHelpers/sharedMessageEncoding.js.map +1 -0
  336. package/dist/server/serverHelpers/uwsServer.js +19 -1
  337. package/dist/server/serverHelpers/uwsServer.js.map +1 -1
  338. package/dist/server/static.js +24 -28
  339. package/dist/server/static.js.map +1 -1
  340. package/dist/server/storageReclamation.d.ts +12 -0
  341. package/dist/server/storageReclamation.js +26 -0
  342. package/dist/server/storageReclamation.js.map +1 -1
  343. package/dist/server/threads/itc.d.ts +7 -2
  344. package/dist/server/threads/itc.js +5 -1
  345. package/dist/server/threads/itc.js.map +1 -1
  346. package/dist/server/threads/manageThreads.d.ts +26 -3
  347. package/dist/server/threads/manageThreads.js +517 -65
  348. package/dist/server/threads/manageThreads.js.map +1 -1
  349. package/dist/server/threads/socketRouter.js +89 -26
  350. package/dist/server/threads/socketRouter.js.map +1 -1
  351. package/dist/server/threads/threadHeapMemory.d.ts +2 -0
  352. package/dist/server/threads/threadHeapMemory.js +31 -0
  353. package/dist/server/threads/threadHeapMemory.js.map +1 -0
  354. package/dist/server/threads/threadServer.js +46 -15
  355. package/dist/server/threads/threadServer.js.map +1 -1
  356. package/dist/sqlEngine/config.d.ts +1 -3
  357. package/dist/sqlEngine/config.js +19 -16
  358. package/dist/sqlEngine/config.js.map +1 -1
  359. package/dist/sqlTranslator/index.d.ts +1 -1
  360. package/dist/sqlTranslator/index.js +30 -7
  361. package/dist/sqlTranslator/index.js.map +1 -1
  362. package/dist/upgrade/directives/5-3-0.d.ts +7 -0
  363. package/dist/upgrade/directives/5-3-0.js +148 -0
  364. package/dist/upgrade/directives/5-3-0.js.map +1 -0
  365. package/dist/upgrade/directives/directivesController.js +2 -1
  366. package/dist/upgrade/directives/directivesController.js.map +1 -1
  367. package/dist/utility/OperationFunctionCaller.js +2 -1
  368. package/dist/utility/OperationFunctionCaller.js.map +1 -1
  369. package/dist/utility/common_utils.d.ts +16 -0
  370. package/dist/utility/common_utils.js +32 -6
  371. package/dist/utility/common_utils.js.map +1 -1
  372. package/dist/utility/componentNames.d.ts +8 -0
  373. package/dist/utility/componentNames.js +12 -1
  374. package/dist/utility/componentNames.js.map +1 -1
  375. package/dist/utility/environment/environmentManager.js +3 -6
  376. package/dist/utility/environment/environmentManager.js.map +1 -1
  377. package/dist/utility/environment/systemInformation.d.ts +1 -0
  378. package/dist/utility/environment/systemInformation.js +1 -0
  379. package/dist/utility/environment/systemInformation.js.map +1 -1
  380. package/dist/utility/errors/commonErrors.d.ts +2 -0
  381. package/dist/utility/errors/commonErrors.js +2 -0
  382. package/dist/utility/errors/commonErrors.js.map +1 -1
  383. package/dist/utility/errors/hdbError.d.ts +17 -0
  384. package/dist/utility/errors/hdbError.js +30 -1
  385. package/dist/utility/errors/hdbError.js.map +1 -1
  386. package/dist/utility/globalSchema.d.ts +18 -0
  387. package/dist/utility/hdbTerms.d.ts +16 -0
  388. package/dist/utility/hdbTerms.js +18 -2
  389. package/dist/utility/hdbTerms.js.map +1 -1
  390. package/dist/utility/logging/harper_logger.d.ts +2 -0
  391. package/dist/utility/logging/harper_logger.js +91 -14
  392. package/dist/utility/logging/harper_logger.js.map +1 -1
  393. package/dist/utility/logging/logRotator.js +76 -49
  394. package/dist/utility/logging/logRotator.js.map +1 -1
  395. package/dist/utility/nodeIdentity.d.ts +9 -0
  396. package/dist/utility/nodeIdentity.js +58 -0
  397. package/dist/utility/nodeIdentity.js.map +1 -0
  398. package/dist/utility/npmUtilities.js +9 -7
  399. package/dist/utility/npmUtilities.js.map +1 -1
  400. package/dist/utility/operationPermissions.d.ts +3 -1
  401. package/dist/utility/operationPermissions.js +16 -1
  402. package/dist/utility/operationPermissions.js.map +1 -1
  403. package/dist/utility/operation_authorization.d.ts +10 -7
  404. package/dist/utility/operation_authorization.js +212 -41
  405. package/dist/utility/operation_authorization.js.map +1 -1
  406. package/dist/utility/watchPath.d.ts +29 -0
  407. package/dist/utility/watchPath.js +68 -0
  408. package/dist/utility/watchPath.js.map +1 -0
  409. package/dist/utility/watcherFallback.d.ts +86 -0
  410. package/dist/utility/watcherFallback.js +278 -1
  411. package/dist/utility/watcherFallback.js.map +1 -1
  412. package/dist/validation/configValidator.d.ts +12 -0
  413. package/dist/validation/configValidator.js +199 -72
  414. package/dist/validation/configValidator.js.map +1 -1
  415. package/dist/validation/installValidator.js +12 -0
  416. package/dist/validation/installValidator.js.map +1 -1
  417. package/dist/validation/validationWrapper.d.ts +11 -0
  418. package/dist/validation/validationWrapper.js +16 -3
  419. package/dist/validation/validationWrapper.js.map +1 -1
  420. package/index.ts +2 -0
  421. package/json/systemSchema.json +52 -0
  422. package/npm-shrinkwrap.json +196 -194
  423. package/package.json +7 -6
  424. package/resources/DESIGN.md +114 -52
  425. package/resources/DatabaseTransaction.ts +521 -43
  426. package/resources/LMDBTransaction.ts +26 -4
  427. package/resources/PrimaryRocksDatabase.ts +28 -1
  428. package/resources/RecordEncoder.ts +103 -8
  429. package/resources/RequestTarget.ts +2 -0
  430. package/resources/Resource.ts +17 -9
  431. package/resources/ResourceInterface.ts +23 -0
  432. package/resources/RocksIndexStore.ts +30 -9
  433. package/resources/RocksTransactionLogStore.ts +78 -21
  434. package/resources/Table.ts +1110 -159
  435. package/resources/auditStore.ts +331 -73
  436. package/resources/blob.ts +1029 -110
  437. package/resources/branchDatabase.ts +941 -0
  438. package/resources/crdt.ts +76 -12
  439. package/resources/databases.ts +1310 -252
  440. package/resources/defineTable.ts +18 -2
  441. package/resources/graphql.ts +70 -16
  442. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +6 -2
  443. package/resources/longLivedTransactions.ts +360 -0
  444. package/resources/models/backendRegistry.ts +84 -2
  445. package/resources/models/bootstrap.ts +473 -28
  446. package/resources/recordLock.ts +253 -0
  447. package/resources/replayLogs.ts +147 -26
  448. package/resources/replayLogsGuards.ts +171 -8
  449. package/resources/search.ts +154 -7
  450. package/resources/transactionBroadcast.ts +3 -3
  451. package/security/auth.ts +68 -29
  452. package/security/authn/oidc/claims.ts +72 -0
  453. package/security/authn/oidc/identityToken.ts +129 -0
  454. package/security/authn/oidc/jwks.ts +260 -0
  455. package/security/authn/oidc/providers/generic.ts +40 -0
  456. package/security/authn/oidc/providers/githubActions.ts +137 -0
  457. package/security/authn/oidc/providers/index.ts +52 -0
  458. package/security/authn/oidc/tokenExchange.ts +300 -0
  459. package/security/authn/oidc/trustPolicyOperations.ts +343 -0
  460. package/security/authn/oidc/types.ts +41 -0
  461. package/security/certificateVerification/index.ts +54 -13
  462. package/security/certificateVerification/trustedIssuers.ts +76 -0
  463. package/security/certificateVerification/types.ts +1 -0
  464. package/security/credentialProvenance.ts +47 -0
  465. package/security/credentialRejection.ts +22 -0
  466. package/security/deferredAuthentication.ts +71 -0
  467. package/security/impersonation.ts +117 -12
  468. package/security/jsLoader.ts +81 -18
  469. package/security/keys.ts +298 -72
  470. package/security/operationScope.ts +33 -0
  471. package/security/permissionsTranslator.js +23 -0
  472. package/security/tokenAuthentication.ts +233 -12
  473. package/security/user.ts +4 -3
  474. package/server/DESIGN.md +183 -16
  475. package/server/DurableSubscriptionsSession.ts +71 -11
  476. package/server/REST.ts +79 -1
  477. package/server/graphqlQuerying.ts +4 -0
  478. package/server/http.ts +99 -18
  479. package/server/itc/serverHandlers.js +8 -1
  480. package/server/jobs/jobProcess.ts +8 -2
  481. package/server/jobs/jobs.ts +4 -1
  482. package/server/liveSubscriptionAuth.ts +129 -46
  483. package/server/loadRootComponents.js +50 -8
  484. package/server/mqtt.ts +179 -38
  485. package/server/nodeName.ts +103 -21
  486. package/server/serverHelpers/Headers.ts +131 -0
  487. package/server/serverHelpers/contentTypes.ts +29 -21
  488. package/server/serverHelpers/deployValidationState.ts +24 -13
  489. package/server/serverHelpers/operationAuthorizationState.ts +34 -3
  490. package/server/serverHelpers/registeredOperations.ts +79 -22
  491. package/server/serverHelpers/requestSanitization.ts +15 -0
  492. package/server/serverHelpers/serverHandlers.js +6 -3
  493. package/server/serverHelpers/serverUtilities.ts +104 -31
  494. package/server/serverHelpers/sharedMessageEncoding.ts +307 -0
  495. package/server/serverHelpers/uwsServer.ts +17 -2
  496. package/server/static.ts +23 -29
  497. package/server/storageReclamation.ts +23 -0
  498. package/server/threads/itc.js +11 -1
  499. package/server/threads/manageThreads.js +526 -56
  500. package/server/threads/socketRouter.ts +81 -26
  501. package/server/threads/threadHeapMemory.ts +26 -0
  502. package/server/threads/threadServer.js +43 -15
  503. package/sqlTranslator/index.ts +31 -8
  504. package/studio/web/assets/Chat-BnCBegQz.js +2267 -0
  505. package/studio/web/assets/FloatingChat-CoDW1ySS.js +23 -0
  506. package/studio/web/assets/{abnfDiagram-VCTEODGH-C0_BAZyO.js → abnfDiagram-VCTEODGH-B0BebmD2.js} +1 -1
  507. package/studio/web/assets/{alertDialog-DIHt7Z0r.js → alertDialog-CQyAJJhl.js} +1 -1
  508. package/studio/web/assets/{apiToken-c3Rd-w6g.js → apiToken-Bwk5BLXW.js} +1 -1
  509. package/studio/web/assets/applications-DHxGi7JH.js +296 -0
  510. package/studio/web/assets/architecture-7GRP2DOG-LB-MLAAb.js +1 -0
  511. package/studio/web/assets/{architectureDiagram-5GKGNRK7-BWzrASgm.js → architectureDiagram-5GKGNRK7-7SW3GD-K.js} +1 -1
  512. package/studio/web/assets/authStore-C3Nfubqr.js +3 -0
  513. package/studio/web/assets/{blockDiagram-NRAW4CY4-BdJX9Khj.js → blockDiagram-I7D4REHJ-BqguiadH.js} +2 -2
  514. package/studio/web/assets/{button-DhiX-njv.js → button-BIsUKRZq.js} +2 -2
  515. package/studio/web/assets/{c4Diagram-UCG6FXSJ-CI6MzGmQ.js → c4Diagram-7LVT6UL2-LBNf8t_X.js} +1 -1
  516. package/studio/web/assets/channel-yictG-U-.js +1 -0
  517. package/studio/web/assets/{chevron-up-Df2c8uoU.js → chevron-up-DtKGqDn3.js} +1 -1
  518. package/studio/web/assets/{chunk-TEH6E4GO-P87k5mNi.js → chunk-4HAMMTFA-DWtTut21.js} +1 -1
  519. package/studio/web/assets/{chunk-75Z2AOVW-BT8tVmks.js → chunk-75Z2AOVW-QGQD6th2.js} +1 -1
  520. package/studio/web/assets/{chunk-DU6HZSFF-9kAOOmI6.js → chunk-DU6HZSFF-Chq20Ba5.js} +1 -1
  521. package/studio/web/assets/{chunk-F27PBJKO-BW7ao8AY.js → chunk-F27PBJKO-BVA5EPhV.js} +1 -1
  522. package/studio/web/assets/{chunk-GMAD6QVW-BNyXpoQO.js → chunk-GMAD6QVW-BeS7S07A.js} +1 -1
  523. package/studio/web/assets/{chunk-OBVCFTLP-D4wWOqDQ.js → chunk-GVQU2GXP-sbwVIQ8i.js} +1 -1
  524. package/studio/web/assets/{chunk-G27WJ6UU-COyLMcgK.js → chunk-IMKFNOWR-Bnh3tAVd.js} +1 -1
  525. package/studio/web/assets/{chunk-JQ64N6SF-Cyz1IeLf.js → chunk-L3NEJ4N5-COfUyKII.js} +1 -1
  526. package/studio/web/assets/chunk-OSK3NFVY-ByciRftO.js +10 -0
  527. package/studio/web/assets/{chunk-P2QGCYS3-DmIFY4d7.js → chunk-P2QGCYS3-CP1VhG_c.js} +1 -1
  528. package/studio/web/assets/{chunk-POPQ4Y6H-BPrvMyKz.js → chunk-POPQ4Y6H-ClWhhkwW.js} +1 -1
  529. package/studio/web/assets/{chunk-PWAF6VOD-2zB6IW9i.js → chunk-PWAF6VOD-1z1THyS5.js} +1 -1
  530. package/studio/web/assets/{chunk-RHFEMEQ7-2FgyI8YU.js → chunk-SHT3W25Y-LpQkMsah.js} +2 -2
  531. package/studio/web/assets/{chunk-SVP7TREG-FwtbH2QC.js → chunk-SVP7TREG-jtdAHw0S.js} +1 -1
  532. package/studio/web/assets/{chunk-LCL6LL3I-HOzK_ppE.js → chunk-TICWLB2K-VOwzetX-.js} +1 -1
  533. package/studio/web/assets/classDiagram-ZZMXUADV-VaEwSy_g.js +1 -0
  534. package/studio/web/assets/classDiagram-v2-VYDZK3BY-VaEwSy_g.js +1 -0
  535. package/studio/web/assets/{createLucideIcon-BKGPfjm2.js → createLucideIcon-CzW9508A.js} +1 -1
  536. package/studio/web/assets/{cssMode-CEN2mzSA.js → cssMode-s0cWI-_M.js} +1 -1
  537. package/studio/web/assets/{cynefin-OW5HDTMX-BRkpLFQV.js → cynefin-OW5HDTMX-BbdbCvub.js} +1 -1
  538. package/studio/web/assets/{cynefinDiagram-5FMLGOSQ-CHT1DaX6.js → cynefinDiagram-5FMLGOSQ-TP-aIqbt.js} +1 -1
  539. package/studio/web/assets/{dagre-3AP2YEHR-DpUXBh63.js → dagre-GXQ25YYZ-DShnGpGo.js} +1 -1
  540. package/studio/web/assets/{diagram-S7CK7UJ4-BuymVFZT.js → diagram-S7CK7UJ4-aoCVTtcy.js} +1 -1
  541. package/studio/web/assets/{diagram-UQ7AKVKN-CyP148RM.js → diagram-UQ7AKVKN-DglXtQ6x.js} +1 -1
  542. package/studio/web/assets/{diagram-VSXAHHWV-CoCAg3M9.js → diagram-VSXAHHWV-fhEdmkwM.js} +1 -1
  543. package/studio/web/assets/{diagram-VX7I27RA-BpOqCFca.js → diagram-VX7I27RA-DccVJet6.js} +1 -1
  544. package/studio/web/assets/{diagram-Z3DM3KII-Bfpw7Vbj.js → diagram-Z3DM3KII-D-RyJJb7.js} +1 -1
  545. package/studio/web/assets/{dialog-CBf0Mr1d.js → dialog-Cn2uWgD4.js} +1 -1
  546. package/studio/web/assets/{dist-lkA3O3eM.js → dist-DP8UjMB_.js} +1 -1
  547. package/studio/web/assets/{download-BtTOBem-.js → download-B5T5r7ss.js} +1 -1
  548. package/studio/web/assets/{ebnfDiagram-PWID7BFC-DS_6aWqL.js → ebnfDiagram-PWID7BFC-DJGpIpz_.js} +1 -1
  549. package/studio/web/assets/{editor-D8oDeCTL.js → editor-DNcRHK54.js} +1 -1
  550. package/studio/web/assets/{erDiagram-SSCWMZ5O-DJNk6Fgw.js → erDiagram-RLTQ6QDP-CIfNlgkC.js} +1 -1
  551. package/studio/web/assets/eventmodeling-NTZA5JFV-CLxnp2CR.js +1 -0
  552. package/studio/web/assets/flowDiagram-HODETNUW-BIbhmz9f.js +1 -0
  553. package/studio/web/assets/{ganttDiagram-EL5Y4UJY-2pOExxMY.js → ganttDiagram-EL5Y4UJY-BxToTzzD.js} +1 -1
  554. package/studio/web/assets/{getAnalytics-D4LKGeVy.js → getAnalytics-GHK8ORfM.js} +1 -1
  555. package/studio/web/assets/{gitGraph-4MIJSDKK-CH5ZxwzF.js → gitGraph-4MIJSDKK-D2s2w8lE.js} +1 -1
  556. package/studio/web/assets/{gitGraphDiagram-WWUBYQGX-DVIsIhbO.js → gitGraphDiagram-WWUBYQGX-Dwntd4-x.js} +1 -1
  557. package/studio/web/assets/{html-u3vOg7LJ.js → html-Bdssedlg.js} +1 -1
  558. package/studio/web/assets/{htmlMode-DyO31v-P.js → htmlMode-CoDlJ3fw.js} +1 -1
  559. package/studio/web/assets/{index-Cxj2_wsl.css → index-7RMEgVG1.css} +1 -1
  560. package/studio/web/assets/index-D6sxmFLR.js +824 -0
  561. package/studio/web/assets/index.lazy-tmU5BS8s.js +2 -0
  562. package/studio/web/assets/{info-A6RAGUB7-CPQfTnaG.js → info-A6RAGUB7-DYjkvb0C.js} +1 -1
  563. package/studio/web/assets/{infoDiagram-RXCK75RN-DlwLYlwm.js → infoDiagram-27XIBGKW-Bnp1FJE5.js} +1 -1
  564. package/studio/web/assets/{ishikawaDiagram-5VMMS53U-BRXRp29U.js → ishikawaDiagram-5VMMS53U-D9Xh2r6X.js} +1 -1
  565. package/studio/web/assets/{javascript-CUvxOyTC.js → javascript-B8meVSTH.js} +1 -1
  566. package/studio/web/assets/{journeyDiagram-EYS64GPL-B0ou8k0n.js → journeyDiagram-3NMN7TZE-CokIi6ll.js} +2 -2
  567. package/studio/web/assets/{jsonMode-f_IwbF3D.js → jsonMode-DpIPd35T.js} +1 -1
  568. package/studio/web/assets/{kanban-definition-3QL26DDD-uYg7iYzp.js → kanban-definition-UXKFOSKX-CukSFJfX.js} +1 -1
  569. package/studio/web/assets/{languageServices-DXtZ6rEF.js → languageServices-C_5FMJzQ.js} +1 -1
  570. package/studio/web/assets/{lspLanguageFeatures-B4pCF1zO.js → lspLanguageFeatures-BIzNBzPK.js} +1 -1
  571. package/studio/web/assets/{mermaid-parser.core-Ck-fC8b7.js → mermaid-parser.core-BlEsOWNO.js} +3 -3
  572. package/studio/web/assets/{mermaid.core-CP8aNNYm.js → mermaid.core-BlkGaMIH.js} +5 -5
  573. package/studio/web/assets/{mindmap-definition-FBJOCRG2-CgTZ-rit.js → mindmap-definition-YA3MSWOX-IprMc_0j.js} +1 -1
  574. package/studio/web/assets/{notifications-D3tIQ4sg.js → notifications-CQf18QKb.js} +1 -1
  575. package/studio/web/assets/notifications-CvZivSbh.js +1 -0
  576. package/studio/web/assets/{packet-AYTQ26CC-DEyoPtPb.js → packet-AYTQ26CC-Bi3V04Zi.js} +1 -1
  577. package/studio/web/assets/{pegDiagram-XKGWAZYB-DrD-7sD9.js → pegDiagram-XKGWAZYB-BNuPDLZY.js} +1 -1
  578. package/studio/web/assets/{pie-WAS4IAKB-wjj-EI1d.js → pie-WAS4IAKB-_6DoDbng.js} +1 -1
  579. package/studio/web/assets/{pieDiagram-E7YTZNPT-GntqDCzv.js → pieDiagram-E7YTZNPT-DqNb6Ht2.js} +1 -1
  580. package/studio/web/assets/{profile-DZWU7MgT.js → profile-DdOwtntb.js} +1 -1
  581. package/studio/web/assets/{quadrantDiagram-AXDQQJYC-0UeqXQGd.js → quadrantDiagram-AXDQQJYC-BGH9E2YR.js} +1 -1
  582. package/studio/web/assets/{radar-RG4KPBEZ-DFSA5h7k.js → radar-RG4KPBEZ-DDdVczcL.js} +1 -1
  583. package/studio/web/assets/{railroad-74A4TZTK-CaOUG9wR.js → railroad-74A4TZTK-BJUP4Jds.js} +1 -1
  584. package/studio/web/assets/railroad-abnf-HS5TGJTU-Bm3L1L0h.js +1 -0
  585. package/studio/web/assets/railroad-ebnf-LZEXJU2U-CKzLGlkw.js +1 -0
  586. package/studio/web/assets/railroad-peg-WCYAUIDC-S8xLjslx.js +1 -0
  587. package/studio/web/assets/{railroadDiagram-O6MQD6OU-yHUELZaV.js → railroadDiagram-O6MQD6OU-DGTPh2KZ.js} +1 -1
  588. package/studio/web/assets/{regions-CkyurXzE.js → regions-n69fwagr.js} +1 -1
  589. package/studio/web/assets/{register-BUyhWjBO.js → register-PfWTCXWB.js} +3 -3
  590. package/studio/web/assets/{requirementDiagram-EFPCY7ZU-DNEGFjuW.js → requirementDiagram-BXWQKSXE-BJnO6uLz.js} +1 -1
  591. package/studio/web/assets/{sankeyDiagram-P5KCCOFB-DpyAmSVR.js → sankeyDiagram-P5KCCOFB-0vSOdymH.js} +1 -1
  592. package/studio/web/assets/{sequenceDiagram-WJ2MYXX4-TyaT7xNk.js → sequenceDiagram-WJ2MYXX4-hETizDWE.js} +1 -1
  593. package/studio/web/assets/{setComponentFile-CeyKSZAa.js → setComponentFile-Bg6O7X0S.js} +1 -1
  594. package/studio/web/assets/{setup-D2kn7cAA.js → setup-CUx_aUDl.js} +2 -2
  595. package/studio/web/assets/{stateDiagram-HBIQ2CUA-CeEdTArZ.js → stateDiagram-D77RDMKH-CdYQ_KtC.js} +1 -1
  596. package/studio/web/assets/stateDiagram-v2-MP3YSRHH-CdKuzQMT.js +1 -0
  597. package/studio/web/assets/status-D7BVKqX9.js +61 -0
  598. package/studio/web/assets/{swimlanes-XN3QIQJK-B54FmF46.js → swimlanes-42K2YHIH-B8cHIpU4.js} +1 -1
  599. package/studio/web/assets/swimlanesDiagram-VR7AAH4N-DmOSJwaH.js +8 -0
  600. package/studio/web/assets/{tabs-B_G5zscN.js → tabs-BrHu7gJi.js} +1 -1
  601. package/studio/web/assets/{timeline-definition-24CTP7MA-D-a9ujbo.js → timeline-definition-24CTP7MA-BJWYSXqF.js} +1 -1
  602. package/studio/web/assets/{toggleHighContrast-C0UW6rI2.js → toggleHighContrast-DBSyXzMr.js} +1 -1
  603. package/studio/web/assets/{treeView-Q6P3EWNA-CrW_6JnS.js → treeView-Q6P3EWNA-qxe_v6CQ.js} +1 -1
  604. package/studio/web/assets/{treemap-WGGIJYW6-BxyYLdP_.js → treemap-WGGIJYW6-dDo97XXF.js} +1 -1
  605. package/studio/web/assets/{tsMode-DBC0zmDx.js → tsMode-BByKCjBS.js} +1 -1
  606. package/studio/web/assets/{typescript-DApRQir3.js → typescript-DDLnLpw9.js} +1 -1
  607. package/studio/web/assets/{useEntityRestURL-DB6JStU1.js → useEntityRestURL-31CHGaHk.js} +1 -1
  608. package/studio/web/assets/{useLocalStorage-Dtj1QS8_.js → useLocalStorage-BqMR3D8_.js} +1 -1
  609. package/studio/web/assets/vendor-core-c2JRRJpV.js +58 -0
  610. package/studio/web/assets/vendor-datadog-CLUcJXOo.js +6 -0
  611. package/studio/web/assets/{vendor-react-Dyj4O3HE.js → vendor-react-CJV_K1u4.js} +1 -1
  612. package/studio/web/assets/vendor-tanstack-DxzraizX.js +1 -0
  613. package/studio/web/assets/{vendor-ui-vhu-UHhF.js → vendor-ui-BUjK0h8a.js} +2 -2
  614. package/studio/web/assets/{vennDiagram-4TSXK5OY-Cy7s7Mpy.js → vennDiagram-4TSXK5OY-A3i-lCdl.js} +1 -1
  615. package/studio/web/assets/{wardley-WFR3VGLG-BeBL35g2.js → wardley-WFR3VGLG-B0ik-_6g.js} +1 -1
  616. package/studio/web/assets/{wardleyDiagram-VM6X3IG4-BylmIGSg.js → wardleyDiagram-VM6X3IG4-CjrkKWUR.js} +1 -1
  617. package/studio/web/assets/{workers-C0bFIedw.js → workers-pR3jRY9D.js} +1 -1
  618. package/studio/web/assets/x-DIzaLEdK.js +1 -0
  619. package/studio/web/assets/{xml-HWd01lU-.js → xml-2iRnMhQO.js} +1 -1
  620. package/studio/web/assets/{xychartDiagram-S5SC5T6Z-CoKALMXr.js → xychartDiagram-S5SC5T6Z-Biok4GYV.js} +1 -1
  621. package/studio/web/assets/{yaml-CIH0Nt-h.js → yaml-Bf92gJpd.js} +1 -1
  622. package/studio/web/index.html +14 -14
  623. package/upgrade/directives/5-3-0.ts +132 -0
  624. package/upgrade/directives/directivesController.ts +2 -1
  625. package/utility/OperationFunctionCaller.ts +2 -1
  626. package/utility/common_utils.ts +30 -5
  627. package/utility/componentNames.ts +12 -0
  628. package/utility/environment/environmentManager.ts +3 -7
  629. package/utility/environment/systemInformation.ts +7 -0
  630. package/utility/errors/commonErrors.ts +4 -0
  631. package/utility/errors/hdbError.ts +29 -0
  632. package/utility/hdbTerms.ts +17 -0
  633. package/utility/logging/harper_logger.ts +87 -14
  634. package/utility/logging/logRotator.ts +72 -45
  635. package/utility/nodeIdentity.ts +45 -0
  636. package/utility/npmUtilities.ts +10 -8
  637. package/utility/operationPermissions.ts +18 -1
  638. package/utility/operation_authorization.ts +231 -42
  639. package/utility/watchPath.ts +63 -0
  640. package/utility/watcherFallback.ts +270 -0
  641. package/validation/configValidator.ts +209 -72
  642. package/validation/installValidator.ts +15 -0
  643. package/validation/validationWrapper.ts +18 -4
  644. package/studio/web/assets/Chat-JpO8EtUu.js +0 -2067
  645. package/studio/web/assets/FloatingChat-Bcj3xSZu.js +0 -23
  646. package/studio/web/assets/applications-ByqLRKyZ.js +0 -296
  647. package/studio/web/assets/architecture-7GRP2DOG-DNdx5tEU.js +0 -1
  648. package/studio/web/assets/authStore-qKmCZcaf.js +0 -3
  649. package/studio/web/assets/channel-DtCV8PTL.js +0 -1
  650. package/studio/web/assets/chunk-R7TYR2AO-Irip67yr.js +0 -10
  651. package/studio/web/assets/classDiagram-DTDB5LWJ-DbO_dCNE.js +0 -1
  652. package/studio/web/assets/classDiagram-v2-JRS7N3AN-DbO_dCNE.js +0 -1
  653. package/studio/web/assets/eventmodeling-NTZA5JFV-5jbe4A5P.js +0 -1
  654. package/studio/web/assets/flowDiagram-A5DVABFB-Dp9Ezlow.js +0 -1
  655. package/studio/web/assets/index-aSt5tY-L.js +0 -824
  656. package/studio/web/assets/index.lazy-B9jiPwT8.js +0 -2
  657. package/studio/web/assets/notifications-CUoYgU98.js +0 -1
  658. package/studio/web/assets/railroad-abnf-HS5TGJTU-Bc0Qi0WH.js +0 -1
  659. package/studio/web/assets/railroad-ebnf-LZEXJU2U-G8rVVZ2C.js +0 -1
  660. package/studio/web/assets/railroad-peg-WCYAUIDC-CrehKBhC.js +0 -1
  661. package/studio/web/assets/stateDiagram-v2-4QOOHH4V-D4tuw9Su.js +0 -1
  662. package/studio/web/assets/status-D7Xn5ePA.js +0 -61
  663. package/studio/web/assets/swimlanesDiagram-VK2B7HYN-XOhmNEvq.js +0 -8
  664. package/studio/web/assets/vendor-core-RCcadM3e.js +0 -73
  665. package/studio/web/assets/vendor-datadog-BRv-mOv1.js +0 -6
  666. package/studio/web/assets/vendor-tanstack-BiFWSB3W.js +0 -1
  667. package/studio/web/assets/x-B9o9hsep.js +0 -1
  668. /package/studio/web/assets/{sizeCapture-X5ZJPWSS-B0uUizjq.js → sizeCapture-INFHLROL-B0uUizjq.js} +0 -0
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ /**
3
+ * GitHub Actions provider profile (#2171).
4
+ *
5
+ * The only module that should know anything about GitHub. Its rules are deliberately stricter than
6
+ * npm's trusted-publishing model, and scoping them here means that strictness never constrains
7
+ * another issuer.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.githubActionsProfile = void 0;
11
+ exports.splitWorkflowPath = splitWorkflowPath;
12
+ const hdbError_ts_1 = require("../../../../utility/errors/hdbError.js");
13
+ /**
14
+ * Workflow references are `<owner>/<repo>/<path>@<ref>` and the ref is always a full `refs/...` name.
15
+ * Splitting on `@refs/` rather than the first or last `@` is exact, because a path segment cannot
16
+ * contain `/` — so this cannot occur inside the path, and a branch named `release@2` cannot fool it.
17
+ */
18
+ const REF_QUALIFIER = '@refs/';
19
+ /**
20
+ * GitHub's default audience is the repository owner's URL, shared by every repository under that
21
+ * owner, so accepting it would make a token minted by any repo in the org valid here — the one
22
+ * mistake the audience field exists to prevent.
23
+ */
24
+ const SHARED_DEFAULT_AUDIENCE = /^https:\/\/github\.com\/[^/]+\/?$/i;
25
+ /**
26
+ * Structural requirements on a policy's claim set, each guarding a distinct way a policy can be
27
+ * accidentally broad. Satisfying none of a row's claims admits, in order: any repository, any
28
+ * workflow in that repository, any branch that can be pushed to it.
29
+ *
30
+ * `repository_owner` is absent from the first row on purpose — it identifies an org, not a
31
+ * repository, so it would admit every repo in the org. `ref_type` is absent from the third for the
32
+ * same shape of reason: `ref_type: tag` still admits any tag, and anyone with push access can create
33
+ * one. A tag-triggered release pins `environment` and leans on GitHub's environment protection.
34
+ *
35
+ * `job_workflow_ref` pins the workflow (second row) but deliberately does NOT gate the ref (third).
36
+ * For a reusable workflow it names the workflow that RAN, not the caller that invoked it — the
37
+ * caller's ref lives in `workflow_ref`/`ref`. Its `@ref` suffix therefore describes the reusable
38
+ * workflow's own branch, which is constant however it is called, so accepting it as a ref gate would
39
+ * admit any branch of any caller repository that references that reusable workflow: precisely the
40
+ * hole the third row exists to close.
41
+ *
42
+ * `sub` is deliberately not accepted as a pin: it varies by trigger, and its format changed for
43
+ * repositories created after 2026-07-15 (immutable subjects embed owner and repo ids).
44
+ */
45
+ const STRUCTURAL_REQUIREMENTS = [
46
+ {
47
+ requirement: 'pin the repository',
48
+ claims: ['repository_id', 'repository'],
49
+ because: ' (repository_id is immutable and survives renames)',
50
+ },
51
+ {
52
+ requirement: 'pin the workflow',
53
+ claims: ['workflow_ref', 'workflow_path', 'job_workflow_ref', 'job_workflow_path'],
54
+ because: '',
55
+ },
56
+ {
57
+ requirement: 'gate the ref',
58
+ claims: ['workflow_ref', 'ref', 'environment'],
59
+ because: ' — otherwise any branch that can be pushed to the repository can run the workflow and mint a token',
60
+ },
61
+ ];
62
+ /** Returns undefined rather than guessing when the value is not a ref-qualified reference. */
63
+ function splitWorkflowPath(workflowRef) {
64
+ if (typeof workflowRef !== 'string')
65
+ return undefined;
66
+ const qualifierIndex = workflowRef.indexOf(REF_QUALIFIER);
67
+ return qualifierIndex === -1 ? undefined : workflowRef.slice(0, qualifierIndex);
68
+ }
69
+ exports.githubActionsProfile = {
70
+ name: 'GitHub Actions',
71
+ assertPolicyIsSpecific(policyClaims) {
72
+ const constrained = new Set(Object.keys(policyClaims));
73
+ for (const { requirement, claims, because } of STRUCTURAL_REQUIREMENTS) {
74
+ if (!claims.some((claimName) => constrained.has(claimName))) {
75
+ throw new hdbError_ts_1.ClientError(`claims must ${requirement} with one of: ${claims.join(', ')}${because}`);
76
+ }
77
+ }
78
+ },
79
+ assertAudienceIsSpecific(audience) {
80
+ if (SHARED_DEFAULT_AUDIENCE.test(audience)) {
81
+ throw new hdbError_ts_1.ClientError(`'audience' must identify this instance, not '${audience}' — GitHub's default audience is shared ` +
82
+ `by every repository under an owner, so a token minted for any of them would be accepted here. ` +
83
+ `Use the instance URL the CI client targets.`);
84
+ }
85
+ },
86
+ /**
87
+ * Adds `workflow_path` / `job_workflow_path` — the workflow reference with the ref removed — so a
88
+ * policy can pin the workflow *file* while gating the ref some other way. A tag-triggered release
89
+ * cannot pin `workflow_ref`, because the tag is unknown when the policy is written.
90
+ *
91
+ * A claim the token actually carries is never displaced by one we synthesized.
92
+ */
93
+ normalizeClaims(payload) {
94
+ const claims = { ...payload };
95
+ for (const [source, derived] of [
96
+ ['workflow_ref', 'workflow_path'],
97
+ ['job_workflow_ref', 'job_workflow_path'],
98
+ ]) {
99
+ const path = splitWorkflowPath(payload[source]);
100
+ if (path !== undefined && claims[derived] === undefined)
101
+ claims[derived] = path;
102
+ }
103
+ return claims;
104
+ },
105
+ /**
106
+ * A `pull_request_target` run executes the base repository's workflow with its secrets while a
107
+ * fork controls the checked-out code. A plain `pull_request` run from a fork gets no
108
+ * `id-token: write` and so cannot mint at all, but `pull_request_target` can — so it is denied
109
+ * unless a policy constrains `event_name`, which is the explicit opt-in.
110
+ */
111
+ vetoClaims(claims, policyClaims) {
112
+ if (claims.event_name === 'pull_request_target' && policyClaims.event_name === undefined) {
113
+ return 'pull_request_target is denied unless the policy constrains event_name';
114
+ }
115
+ return undefined;
116
+ },
117
+ describePrincipal(claims) {
118
+ return [
119
+ claims.repository,
120
+ claims.workflow_ref ?? claims.workflow_path,
121
+ claims.environment && `environment=${claims.environment}`,
122
+ claims.run_id && `run=${claims.run_id}`,
123
+ claims.actor && `actor=${claims.actor}`,
124
+ ]
125
+ .filter(Boolean)
126
+ .join(' ');
127
+ },
128
+ };
129
+ //# sourceMappingURL=githubActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"githubActions.js","sourceRoot":"","sources":["../../../../../security/authn/oidc/providers/githubActions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Provider profiles for OIDC trusted publishing (#2171).
3
+ *
4
+ * Everything issuer-specific lives behind this interface, resolved by normalized issuer, so the core
5
+ * stays generic: a new workload-identity issuer is a profile, not a change to verification, matching,
6
+ * or storage. Issuers with no registered profile fall back to `generic`, which is strict rather than
7
+ * permissive — see its `assertPolicyIsSpecific`.
8
+ */
9
+ import type { ClaimConstraint, TokenClaims } from '../types.ts';
10
+ import { genericProfile } from './generic.ts';
11
+ import { githubActionsProfile } from './githubActions.ts';
12
+ export interface IdentityProviderProfile {
13
+ /** Shown in policy-validation errors and the audit trail. */
14
+ name: string;
15
+ /**
16
+ * Rejects a claim set too broad to be a safe policy for this issuer. Called at write time, when
17
+ * the reader is an administrator who can act on the message.
18
+ */
19
+ assertPolicyIsSpecific(policyClaims: Record<string, ClaimConstraint>): void;
20
+ /**
21
+ * Rejects an audience the issuer shares across principals — the mistake that makes an audience
22
+ * check meaningless. A no-op for issuers with no such default.
23
+ */
24
+ assertAudienceIsSpecific(audience: string): void;
25
+ /** Adds issuer-specific derived claims. Must never displace a claim the token actually carries. */
26
+ normalizeClaims(payload: TokenClaims): TokenClaims;
27
+ /** One-line principal description for the audit trail. */
28
+ describePrincipal(claims: TokenClaims): string;
29
+ /**
30
+ * A match-time veto applied after the policy's own constraints pass, for runs this issuer should
31
+ * refuse unless a policy opts in explicitly. Returns a reason to deny, or undefined to allow.
32
+ */
33
+ vetoClaims?(claims: TokenClaims, policyClaims: Record<string, ClaimConstraint>): string | undefined;
34
+ }
35
+ /** Never returns undefined: an unregistered issuer gets the strict generic profile. */
36
+ export declare function profileForIssuer(issuer: string): IdentityProviderProfile;
37
+ export { genericProfile, githubActionsProfile };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * Provider profiles for OIDC trusted publishing (#2171).
4
+ *
5
+ * Everything issuer-specific lives behind this interface, resolved by normalized issuer, so the core
6
+ * stays generic: a new workload-identity issuer is a profile, not a change to verification, matching,
7
+ * or storage. Issuers with no registered profile fall back to `generic`, which is strict rather than
8
+ * permissive — see its `assertPolicyIsSpecific`.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.githubActionsProfile = exports.genericProfile = void 0;
12
+ exports.profileForIssuer = profileForIssuer;
13
+ const generic_ts_1 = require("./generic.js");
14
+ Object.defineProperty(exports, "genericProfile", { enumerable: true, get: function () { return generic_ts_1.genericProfile; } });
15
+ const githubActions_ts_1 = require("./githubActions.js");
16
+ Object.defineProperty(exports, "githubActionsProfile", { enumerable: true, get: function () { return githubActions_ts_1.githubActionsProfile; } });
17
+ const PROFILES_BY_ISSUER = new Map([
18
+ ['https://token.actions.githubusercontent.com', githubActions_ts_1.githubActionsProfile],
19
+ ]);
20
+ /** Never returns undefined: an unregistered issuer gets the strict generic profile. */
21
+ function profileForIssuer(issuer) {
22
+ return PROFILES_BY_ISSUER.get(issuer) ?? generic_ts_1.genericProfile;
23
+ }
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../security/authn/oidc/providers/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAwCH,4CAEC;AAvCD,6CAA8C;AAyCrC,+FAzCA,2BAAc,OAyCA;AAxCvB,yDAA0D;AAwCjC,qGAxChB,uCAAoB,OAwCgB;AAT7C,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAkC;IACnE,CAAC,6CAA6C,EAAE,uCAAoB,CAAC;CACrE,CAAC,CAAC;AAEH,uFAAuF;AACvF,SAAgB,gBAAgB,CAAC,MAAc;IAC9C,OAAO,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,2BAAc,CAAC;AACzD,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** Drops the memo below so a test can install a different table. Not used in production. */
2
+ export declare function clearTokenUseTableCache(): void;
3
+ /**
4
+ * Exchanges a CI identity token for a short-lived Harper operation token. Unauthenticated by design —
5
+ * this operation *is* the authentication, the way create_authentication_tokens is against a password.
6
+ */
7
+ export declare function exchangeOidcToken(req: any): Promise<{
8
+ operation_token: string;
9
+ expires_in: number;
10
+ username: any;
11
+ policy: string;
12
+ }>;
@@ -0,0 +1,306 @@
1
+ 'use strict';
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.clearTokenUseTableCache = clearTokenUseTableCache;
40
+ exports.exchangeOidcToken = exchangeOidcToken;
41
+ // exchange_oidc_token — the unauthenticated half of OIDC trusted publishing (#2171).
42
+ //
43
+ // A CI runner presents an identity token minted by its provider. If it verifies against a stored
44
+ // trust policy, Harper mints a short-lived operation token for the user that policy names. This is
45
+ // the only unauthenticated operation that yields a credential, so it fails closed throughout and
46
+ // refuses through rejectToken, which tells the caller nothing beyond "no".
47
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
48
+ const joi_1 = __importDefault(require("joi"));
49
+ const node_crypto_1 = require("node:crypto");
50
+ const databases_ts_1 = require("../../../resources/databases.js");
51
+ const hdbError_ts_1 = require("../../../utility/errors/hdbError.js");
52
+ const validationWrapper_ts_1 = require("../../../validation/validationWrapper.js");
53
+ const logger_ts_1 = require("../../../utility/logging/logger.js");
54
+ const harper_logger_ts_1 = __importDefault(require("../../../utility/logging/harper_logger.js"));
55
+ const env = __importStar(require("../../../utility/environment/environmentManager.js"));
56
+ const hdbTerms_ts_1 = require("../../../utility/hdbTerms.js");
57
+ const user_ts_1 = require("../../user.js");
58
+ const tokenAuthentication_ts_1 = require("../../tokenAuthentication.js");
59
+ const identityToken_ts_1 = require("./identityToken.js");
60
+ const claims_ts_1 = require("./claims.js");
61
+ const jwks_ts_1 = require("./jwks.js");
62
+ const index_ts_1 = require("./providers/index.js");
63
+ const trustPolicyOperations_ts_1 = require("./trustPolicyOperations.js");
64
+ const logger = (0, logger_ts_1.loggerWithTag)('oidc-trust');
65
+ const { AuthAuditLog } = harper_logger_ts_1.default;
66
+ // Same stream and same switches as every other authentication event (security/auth.ts), so an
67
+ // operator who turns on auth auditing sees OIDC exchanges alongside Basic, Bearer, and mTLS.
68
+ const authEventLog = harper_logger_ts_1.default.forComponent('authentication').withTag('auth-event');
69
+ /** Long enough to cover a slow deploy, short enough to be worthless by the time it reaches a log. */
70
+ const EXCHANGED_TOKEN_LIFETIME_SECONDS = 3600;
71
+ /** Keeps the replay record alive past the token's expiry by more than the verifier's clock leeway. */
72
+ const REPLAY_RECORD_PADDING_MS = 120_000;
73
+ /** Real identity tokens are ~1-2 KB; this bounds what we are willing to even parse. */
74
+ const MAX_TOKEN_LENGTH = 8192;
75
+ const TOKEN_USE_TABLE = 'hdb_oidc_token_use';
76
+ /**
77
+ * Spent identity tokens, keyed by the fingerprint below and expiring with the token, so the table
78
+ * stays proportional to in-flight tokens rather than to deploy history and never holds a credential.
79
+ *
80
+ * Replicated like other system tables, which extends the check across the cluster — but replication
81
+ * is asynchronous, so two simultaneous replays against different nodes can both land. That race is
82
+ * not a privilege escalation: whoever holds the token could obtain one operation token regardless.
83
+ * What it stops is the realistic case, a token that leaks after a legitimate run and is reused
84
+ * inside its window.
85
+ *
86
+ * table() also registers into `databases.system`, so the lookup finds it after the first call.
87
+ */
88
+ let tokenUseTable;
89
+ /** Drops the memo below so a test can install a different table. Not used in production. */
90
+ function clearTokenUseTableCache() {
91
+ tokenUseTable = undefined;
92
+ }
93
+ function getTokenUseTable() {
94
+ // Memoized per process, but `table()` is NOT skipped merely because the table already exists.
95
+ // The systemSchema stub and the 5.3.0 directive declare only the primary key — the `expiresAt`
96
+ // TTL is not expressible through CreateTableObject — so this call is what actually installs the
97
+ // TTL, layered on top of the bootstrap. Short-circuiting on existence would mean a table that
98
+ // arrived any other way (bootstrap, replication, restore, a manual create_table) never gets it,
99
+ // and replay records would then accumulate in a system table forever. hdb_certificate_cache
100
+ // does the same two-step for the same reason.
101
+ tokenUseTable ??= (0, databases_ts_1.table)({
102
+ table: TOKEN_USE_TABLE,
103
+ database: 'system',
104
+ // `audit: true` explicitly, NOT the default (which follows logging.auditLog). Auditing is the
105
+ // replication change feed (databases.ts: "auditing must be enabled for replication"), and
106
+ // replay records MUST replicate so a token spent on one node cannot be re-spent on another
107
+ // inside its window. Without this, an operator with logging.auditLog:false would silently lose
108
+ // cross-node replay protection. Its sibling hdb_oidc_trust is audited for the same reason.
109
+ audit: true,
110
+ attributes: [
111
+ { name: 'id', isPrimaryKey: true },
112
+ { name: 'policy_id' },
113
+ { name: 'used_at' },
114
+ { name: 'expiresAt', expiresAt: true, indexed: true },
115
+ ],
116
+ });
117
+ return tokenUseTable;
118
+ }
119
+ /**
120
+ * Records the exchange in the authentication audit stream. Emitted for failures as well as successes:
121
+ * a run repeatedly failing to authenticate is exactly what an audit trail is for.
122
+ */
123
+ function auditExchange(req, username, status, detail) {
124
+ const logSuccessful = env.get(hdbTerms_ts_1.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL) ?? false;
125
+ const logFailed = env.get(hdbTerms_ts_1.CONFIG_PARAMS.LOGGING_AUDITAUTHEVENTS_LOGFAILED) ?? false;
126
+ if (status === hdbTerms_ts_1.AUTH_AUDIT_STATUS.SUCCESS ? !logSuccessful : !logFailed)
127
+ return;
128
+ // serverHandlers injects baseRequest for NO_AUTH_OPERATIONS, so the transport details are here;
129
+ // they stay optional because an in-process caller (server.operation) has none.
130
+ const baseRequest = req?.baseRequest;
131
+ const log = new AuthAuditLog(username, status, hdbTerms_ts_1.AUTH_AUDIT_TYPES.AUTHENTICATION,
132
+ // Same precedence as every other auth event (security/auth.ts): behind a load balancer —
133
+ // which is every Fabric and cloud deployment — `ip` is the proxy, so an audit trail for the
134
+ // one unauthenticated credential-minting operation would record the proxy, not the runner.
135
+ baseRequest?.headers?.['x-forwarded-for'] ?? baseRequest?.ip, baseRequest?.method, baseRequest?.pathname);
136
+ log.auth_strategy = 'oidc';
137
+ Object.assign(log, detail);
138
+ if (status === hdbTerms_ts_1.AUTH_AUDIT_STATUS.SUCCESS)
139
+ authEventLog.info?.(log);
140
+ else
141
+ authEventLog.error?.(log);
142
+ }
143
+ /**
144
+ * Auditing must never change the outcome it is recording. The success emit sits inside the
145
+ * exchange's try, so a throw there would be caught and re-reported as a FAILURE for a request that
146
+ * actually succeeded; on the failure path a throw would replace the original error with the audit's.
147
+ * Swallowing here fixes both, and keeps the two call sites free of defensive wrapping.
148
+ */
149
+ function auditExchangeSafely(req, username, status, detail) {
150
+ try {
151
+ auditExchange(req, username, status, detail);
152
+ }
153
+ catch (error) {
154
+ logger.warn?.(`Failed to emit OIDC exchange audit record: ${error.message}`);
155
+ }
156
+ }
157
+ /** Verifies each distinct audience at most once, so N policies sharing one cost one verification. */
158
+ async function findMatchingPolicy(token, issuer, policies, profile) {
159
+ const claimsByAudience = new Map();
160
+ for (const policy of policies) {
161
+ // Re-validate specificity at exchange time. add_oidc_trust enforces these, but a stored row can
162
+ // arrive another way — replication from an older node that predates a check, or a restored/older
163
+ // system-DB backup — and the exchange must not trust that every row was validated when written.
164
+ // Skip (don't honor) any row that would be rejected for writing, so an under-specified policy
165
+ // (e.g. a repository pinned but no workflow/ref gate) can't mint a token. Fail closed.
166
+ try {
167
+ profile.assertAudienceIsSpecific(policy.audience);
168
+ profile.assertPolicyIsSpecific(policy.claims);
169
+ }
170
+ catch (error) {
171
+ logger.warn?.(`Ignoring trust policy '${policy.id}': ${error.message}`);
172
+ continue;
173
+ }
174
+ if (!claimsByAudience.has(policy.audience)) {
175
+ // verifyIdentityToken logs its own reason via rejectToken, but everything jwks.ts throws
176
+ // (unknown kid, unreachable host, non-2xx, oversized body, bad JSON, no usable keys) is
177
+ // thrown directly and would otherwise vanish here — the request then falls through to
178
+ // "no trust policy matched", which is actively misleading when a policy DID match and the
179
+ // failure was operational. Log every swallowed reason so an issuer outage is
180
+ // distinguishable from a misconfigured policy in the log.
181
+ const verified = await (0, identityToken_ts_1.verifyIdentityToken)(token, { issuer, audience: policy.audience }).catch((error) => {
182
+ logger.warn?.(`Verification failed for policy '${policy.id}' (audience '${policy.audience}'): ${error.message}`);
183
+ return undefined;
184
+ });
185
+ claimsByAudience.set(policy.audience, verified);
186
+ }
187
+ const claims = claimsByAudience.get(policy.audience);
188
+ if (!claims)
189
+ continue;
190
+ const mismatch = (0, claims_ts_1.matchTrustPolicyClaims)(claims, policy.claims) ?? profile.vetoClaims?.(claims, policy.claims);
191
+ if (!mismatch)
192
+ return { policy, claims };
193
+ logger.debug?.(`Trust policy '${policy.id}' did not match: ${mismatch}`);
194
+ }
195
+ return undefined;
196
+ }
197
+ /**
198
+ * Identifies a token for replay purposes: a hash of its SIGNED INPUT (`header.payload`), not of the
199
+ * whole token string. Keyed this way rather than on `issuer|jti` because not every issuer emits
200
+ * `jti` (Azure uses `uti`, others omit it), so this is strictly more general.
201
+ *
202
+ * Hashing the raw token instead would be bypassable, because the signature segment is covered by
203
+ * nothing. Base64url decoding ignores the surplus low bits of the final character, so for an RS256
204
+ * signature there are 16 distinct spellings of that segment that decode to identical bytes — every
205
+ * one of them passes `jwt.verify`, and every one hashes differently. One leaked identity token would
206
+ * buy 16 operation tokens. ES* issuers add a second, independent vector, since `s → n−s` is a
207
+ * different valid signature over the same input.
208
+ *
209
+ * The signed input has neither problem: it is exactly what the issuer asserted and what the
210
+ * signature covers, so every variant spelling and every malleable re-signing of one assertion
211
+ * collapses to one fingerprint. Hashed rather than stored so the table never holds a credential.
212
+ */
213
+ function tokenFingerprint(token) {
214
+ // Not `slice(0, 2).join('.')` on a split of the whole token: lastIndexOf keeps this O(1) in the
215
+ // signature length and cannot silently succeed on a malformed token with too few segments —
216
+ // verifyIdentityToken has already established this is a well-formed three-segment JWT.
217
+ const signedInput = token.slice(0, token.lastIndexOf('.'));
218
+ return (0, node_crypto_1.createHash)('sha256').update(signedInput).digest('base64url');
219
+ }
220
+ /**
221
+ * Marks an identity token as spent, refusing one already recorded.
222
+ *
223
+ * Recorded before the token is minted: if minting then fails the credential is burned, costing a CI
224
+ * re-run, where the reverse ordering would leave a spendable token behind. The get-then-put is not
225
+ * atomic and deliberately does not depend on Harper's optimistic concurrency to make it so — see
226
+ * getTokenUseTable for why the race is tolerable.
227
+ */
228
+ async function recordTokenUse(fingerprint, claims, policyId) {
229
+ const useTable = getTokenUseTable();
230
+ if (await useTable.get(fingerprint))
231
+ (0, identityToken_ts_1.rejectToken)(`token ${fingerprint.slice(0, 12)} has already been exchanged`);
232
+ await useTable.put({
233
+ id: fingerprint,
234
+ policy_id: policyId,
235
+ used_at: Date.now(),
236
+ expiresAt: claims.exp * 1000 + REPLAY_RECORD_PADDING_MS,
237
+ });
238
+ }
239
+ /**
240
+ * Exchanges a CI identity token for a short-lived Harper operation token. Unauthenticated by design —
241
+ * this operation *is* the authentication, the way create_authentication_tokens is against a password.
242
+ */
243
+ async function exchangeOidcToken(req) {
244
+ const validation = (0, validationWrapper_ts_1.validateBySchema)(req, joi_1.default.object({ token: joi_1.default.string().min(1).max(MAX_TOKEN_LENGTH).required() }).unknown(true));
245
+ if (validation)
246
+ throw new hdbError_ts_1.ClientError(validation.message);
247
+ // Populated as identification progresses so a failure audits with whatever was established.
248
+ const audit = {};
249
+ let username;
250
+ try {
251
+ // Nothing is trusted from this decode; it only selects candidate policies, and the signature
252
+ // is then checked against the issuer those policies declare.
253
+ const unverified = jsonwebtoken_1.default.decode(req.token, { complete: true });
254
+ let issuer;
255
+ try {
256
+ issuer = (0, jwks_ts_1.normalizeIssuer)(unverified?.payload?.iss);
257
+ }
258
+ catch {
259
+ (0, identityToken_ts_1.rejectToken)('token has no usable iss claim');
260
+ }
261
+ audit.issuer = issuer;
262
+ const profile = (0, index_ts_1.profileForIssuer)(issuer);
263
+ audit.provider = profile.name;
264
+ const policies = await (0, trustPolicyOperations_ts_1.loadEnabledPolicies)(issuer);
265
+ if (policies.length === 0)
266
+ (0, identityToken_ts_1.rejectToken)(`no enabled trust policy for issuer ${issuer}`);
267
+ const matched = await findMatchingPolicy(req.token, issuer, policies, profile);
268
+ if (!matched)
269
+ (0, identityToken_ts_1.rejectToken)(`no trust policy matched a token from ${issuer}`);
270
+ const { policy, claims } = matched;
271
+ audit.oidc_policy = policy.id;
272
+ audit.principal = profile.describePrincipal(claims);
273
+ // Resolved before the token is spent, so a policy naming a deleted or deactivated user fails
274
+ // without burning a token the runner cannot re-mint.
275
+ const users = await (0, user_ts_1.getUsersWithRolesCache)();
276
+ const user = users?.get(policy.user);
277
+ if (!user)
278
+ (0, identityToken_ts_1.rejectToken)(`trust policy '${policy.id}' names user '${policy.user}', which does not exist`);
279
+ if (user.active === false)
280
+ (0, identityToken_ts_1.rejectToken)(`trust policy '${policy.id}' names inactive user '${policy.user}'`);
281
+ username = user.username;
282
+ const fingerprint = tokenFingerprint(req.token);
283
+ audit.token_fingerprint = fingerprint.slice(0, 12);
284
+ await recordTokenUse(fingerprint, claims, policy.id);
285
+ const operationToken = await (0, tokenAuthentication_ts_1.createOperationToken)({
286
+ username: user.username,
287
+ super_user: user.role?.permission?.super_user === true,
288
+ operations: policy.operations,
289
+ }, EXCHANGED_TOKEN_LIFETIME_SECONDS);
290
+ if (policy.operations?.length)
291
+ audit.scoped_operations = policy.operations;
292
+ logger.info?.(`OIDC exchange: policy '${policy.id}' authenticated '${user.username}' for ${audit.principal}`);
293
+ auditExchangeSafely(req, username, hdbTerms_ts_1.AUTH_AUDIT_STATUS.SUCCESS, audit);
294
+ return {
295
+ operation_token: operationToken,
296
+ expires_in: EXCHANGED_TOKEN_LIFETIME_SECONDS,
297
+ username: user.username,
298
+ policy: policy.id,
299
+ };
300
+ }
301
+ catch (error) {
302
+ auditExchangeSafely(req, username, hdbTerms_ts_1.AUTH_AUDIT_STATUS.FAILURE, audit);
303
+ throw error;
304
+ }
305
+ }
306
+ //# sourceMappingURL=tokenExchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenExchange.js","sourceRoot":"","sources":["../../../../security/authn/oidc/tokenExchange.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { OidcTrustPolicy } from './types.ts';
2
+ /**
3
+ * Why a stored row must not be honored, or undefined if it is usable.
4
+ *
5
+ * add_oidc_trust enforces all of this at write time, but a row can reach the table another way —
6
+ * replication from a node predating a check, a restored backup, a direct write to the system table —
7
+ * so the exchange re-runs the same validators rather than trusting that every row was validated when
8
+ * written. Two shapes in particular fail OPEN if merely normalized instead of rejected:
9
+ *
10
+ * operations: 'deploy_component' — a scalar rather than an array. hasOperationScope tests
11
+ * Array.isArray, so the scope is silently dropped and the token is minted UNSCOPED, carrying the
12
+ * policy user's entire role. A malformed narrowing must never widen.
13
+ * enabled: 'false' — a string. `row.enabled !== false` is true for it, so a policy
14
+ * an operator meant to disable keeps minting tokens.
15
+ *
16
+ * Shares validateOperations and validateClaimConstraintShape with the add path deliberately: two
17
+ * implementations of "is this row valid" is how the write path and the read path drift apart.
18
+ */
19
+ export declare function storedPolicyProblem(row: any): string | undefined;
20
+ /**
21
+ * The policies the exchange will consider, narrowed to one issuer.
22
+ *
23
+ * Filtered inside the scan rather than by the caller: the exchange is unauthenticated and reaches
24
+ * here having done nothing but `jwt.decode`, so an anonymous caller presenting any syntactically
25
+ * valid JWT would otherwise drive a `toRecord()` allocation for every stored policy before anything
26
+ * has been verified. The scan itself stays — the table is administrator-sized, and an index here
27
+ * would buy little (see readPolicies) — but non-matching rows now cost nothing beyond the compare.
28
+ *
29
+ * A missing table yields no policies rather than throwing. On a node where the upgrade directive has
30
+ * not run, trustTable()'s descriptive ClientError would surface to an anonymous caller as a 400 with
31
+ * a body unlike the uniform 401 every other rejection returns, which both leaks node state and
32
+ * breaks the single-message property. The SU-only add/list/drop handlers still get that error, where
33
+ * it is the useful thing to say.
34
+ */
35
+ export declare function loadEnabledPolicies(issuer: string): Promise<OidcTrustPolicy[]>;
36
+ /**
37
+ * Creates or replaces a trust policy.
38
+ *
39
+ * Replace rather than merge: a partial update to a claim set is how an over-broad policy gets
40
+ * created by accident, and the whole point of `claims` is that every constraint in it was written
41
+ * deliberately.
42
+ */
43
+ export declare function addOidcTrust(req: any): Promise<Record<string, unknown>>;
44
+ export declare function listOidcTrust(req: any): Promise<{
45
+ policies: OidcTrustPolicy[];
46
+ }>;
47
+ export declare function dropOidcTrust(req: any): Promise<{
48
+ message: string;
49
+ }>;