@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
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ /**
3
+ * OIDC discovery and JWKS retrieval for trusted publishing (#2171).
4
+ *
5
+ * The issuer's signing keys are the root of trust for an exchanged token, and the endpoint that
6
+ * reaches them is unauthenticated — hence HTTPS only, bounded body, bounded time, and a rate limit
7
+ * on the refetch an unrecognized `kid` triggers, without which forged `kid`s become one outbound
8
+ * fetch per request.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.clearJwksCache = clearJwksCache;
12
+ exports.normalizeIssuer = normalizeIssuer;
13
+ exports.getSigningKey = getSigningKey;
14
+ const node_crypto_1 = require("node:crypto");
15
+ const logger_ts_1 = require("../../../utility/logging/logger.js");
16
+ const hdbError_ts_1 = require("../../../utility/errors/hdbError.js");
17
+ const logger = (0, logger_ts_1.loggerWithTag)('oidc-trust');
18
+ const DISCOVERY_PATH = '/.well-known/openid-configuration';
19
+ /** How long a fetched key set is served without revalidation. */
20
+ const JWKS_CACHE_TTL_MS = 3_600_000;
21
+ /** Floor between refetches triggered by an unrecognized `kid`. */
22
+ const MIN_REFETCH_INTERVAL_MS = 60_000;
23
+ /**
24
+ * How long a cached key set survives a failed refetch. Bounded, so a network blip does not break
25
+ * deploys but a pulled key does not stay honored forever.
26
+ */
27
+ const STALE_KEY_GRACE_MS = 86_400_000;
28
+ const FETCH_TIMEOUT_MS = 5_000;
29
+ const MAX_RESPONSE_BYTES = 1_048_576;
30
+ /** Asymmetric only: an `oct` key in a JWKS is the setup for algorithm confusion. */
31
+ const SUPPORTED_KEY_TYPES = ['RSA', 'EC'];
32
+ const issuerKeyCache = new Map();
33
+ const inFlightLoads = new Map();
34
+ /**
35
+ * When an unrecognized `kid` last drove a refetch, per issuer. Outside the cache entry on purpose:
36
+ * every successful fetch replaces that entry, and a rate limit that resets whenever it fires is not
37
+ * a rate limit. Separating them also lets a genuine key rotation be picked up on first use.
38
+ */
39
+ const unknownKidRefetchAt = new Map();
40
+ /**
41
+ * When a refresh for an issuer last FAILED, per issuer. Tracked separately from `fetchedAt`, which a
42
+ * failed fetch does not advance — so without this, every request wave arriving after the cache went
43
+ * stale starts discovery again and rides the same timeout before falling back to the same stale key.
44
+ * The exchange is unauthenticated and picks its issuer from an unverified JWT, and issuer key ids are
45
+ * public, so an anonymous caller could keep that cycle running for the length of an issuer outage:
46
+ * exactly when the stale-key grace is supposed to be absorbing load, not generating it.
47
+ */
48
+ const failedRefreshAt = new Map();
49
+ /** How long a failed refresh suppresses the next one, while a usable stale key is still on hand. */
50
+ const FAILED_REFRESH_BACKOFF_MS = 30_000;
51
+ /**
52
+ * Bumped by every clear. A fetch that was already in flight when the cache was cleared must not
53
+ * write its now-stale result back: clearing drops `inFlightLoads`, but the orphaned fetch still
54
+ * holds a reference and would repopulate the entry an operator just discarded — which for a clear
55
+ * issued precisely because the cached key is wrong means the re-read silently does nothing.
56
+ */
57
+ let cacheGeneration = 0;
58
+ /** Drops all cached key sets. Exported for tests and for an operator forcing a re-read. */
59
+ function clearJwksCache() {
60
+ cacheGeneration++;
61
+ issuerKeyCache.clear();
62
+ inFlightLoads.clear();
63
+ unknownKidRefetchAt.clear();
64
+ failedRefreshAt.clear();
65
+ }
66
+ /**
67
+ * Canonicalizes an issuer URL. The result is both the cache key and the discovery base, so a policy
68
+ * stored with a trailing slash and one without must not become two entries for the same issuer.
69
+ */
70
+ function normalizeIssuer(issuer) {
71
+ if (typeof issuer !== 'string' || issuer === '')
72
+ throw new hdbError_ts_1.ClientError('issuer is required');
73
+ let url;
74
+ try {
75
+ url = new URL(issuer);
76
+ }
77
+ catch {
78
+ throw new hdbError_ts_1.ClientError(`issuer is not a valid URL: ${issuer}`);
79
+ }
80
+ if (url.protocol !== 'https:')
81
+ throw new hdbError_ts_1.ClientError('issuer must be an https URL');
82
+ if (url.search !== '' || url.hash !== '')
83
+ throw new hdbError_ts_1.ClientError('issuer must not carry a query or fragment');
84
+ return url.origin + (url.pathname === '/' ? '' : url.pathname.replace(/\/$/, ''));
85
+ }
86
+ /**
87
+ * `content-length` is checked first as a cheap rejection, then the body is counted as it streams —
88
+ * the header is advisory, and a hostile endpoint can simply omit it.
89
+ */
90
+ async function readBoundedJson(response, url) {
91
+ const declaredLength = Number(response.headers.get('content-length'));
92
+ if (Number.isFinite(declaredLength) && declaredLength > MAX_RESPONSE_BYTES) {
93
+ throw new hdbError_ts_1.ServerError(`Response from ${url} exceeds ${MAX_RESPONSE_BYTES} bytes`);
94
+ }
95
+ const chunks = [];
96
+ let total = 0;
97
+ if (response.body) {
98
+ for await (const chunk of response.body) {
99
+ total += chunk.length;
100
+ if (total > MAX_RESPONSE_BYTES) {
101
+ throw new hdbError_ts_1.ServerError(`Response from ${url} exceeds ${MAX_RESPONSE_BYTES} bytes`);
102
+ }
103
+ chunks.push(Buffer.from(chunk));
104
+ }
105
+ }
106
+ try {
107
+ return JSON.parse(Buffer.concat(chunks).toString('utf8'));
108
+ }
109
+ catch (error) {
110
+ throw new hdbError_ts_1.ServerError(`Response from ${url} is not valid JSON: ${error.message}`);
111
+ }
112
+ }
113
+ async function fetchJson(url) {
114
+ let response;
115
+ try {
116
+ response = await fetch(url, {
117
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
118
+ headers: { accept: 'application/json' },
119
+ redirect: 'error',
120
+ });
121
+ }
122
+ catch (error) {
123
+ throw new hdbError_ts_1.ServerError(`Could not reach ${url}: ${error.message}`);
124
+ }
125
+ if (!response.ok)
126
+ throw new hdbError_ts_1.ServerError(`${url} responded ${response.status}`);
127
+ return readBoundedJson(response, url);
128
+ }
129
+ /**
130
+ * The discovery document's own `issuer` must equal the one we asked about — the spec requires it,
131
+ * and it stops a misdirected document from quietly re-pointing an issuer we trust.
132
+ */
133
+ async function discoverJwksUri(issuer) {
134
+ const document = await fetchJson(issuer + DISCOVERY_PATH);
135
+ // Swallowed rather than propagated: normalizeIssuer raises ClientError, the wrong shape for a
136
+ // malformed *server* response.
137
+ let declaredIssuer;
138
+ try {
139
+ declaredIssuer = normalizeIssuer(document?.issuer);
140
+ }
141
+ catch {
142
+ declaredIssuer = undefined;
143
+ }
144
+ if (declaredIssuer !== issuer) {
145
+ throw new hdbError_ts_1.ServerError(`Discovery document at ${issuer} declares a different issuer`);
146
+ }
147
+ const jwksUri = document?.jwks_uri;
148
+ if (typeof jwksUri !== 'string' || !jwksUri.startsWith('https://')) {
149
+ throw new hdbError_ts_1.ServerError(`Discovery document at ${issuer} has no https jwks_uri`);
150
+ }
151
+ return jwksUri;
152
+ }
153
+ /**
154
+ * Undefined for a key we will not honor. One unusable entry must not poison the set: issuers publish
155
+ * keys for other purposes, and an unknown future type should degrade rather than fail the fetch.
156
+ */
157
+ function toSigningKey(jwk) {
158
+ if (!jwk || typeof jwk !== 'object')
159
+ return undefined;
160
+ if (typeof jwk.kid !== 'string' || jwk.kid === '')
161
+ return undefined;
162
+ if (jwk.use !== undefined && jwk.use !== 'sig')
163
+ return undefined;
164
+ if (!SUPPORTED_KEY_TYPES.includes(jwk.kty))
165
+ return undefined;
166
+ try {
167
+ return (0, node_crypto_1.createPublicKey)({ key: jwk, format: 'jwk' });
168
+ }
169
+ catch (error) {
170
+ logger.warn?.(`Skipping unusable JWK ${jwk.kid}: ${error.message}`);
171
+ return undefined;
172
+ }
173
+ }
174
+ async function fetchIssuerKeys(issuer) {
175
+ // Sampled before the first await, so any clear during the fetch is detectable at the end.
176
+ const generation = cacheGeneration;
177
+ const jwksUri = await discoverJwksUri(issuer);
178
+ const jwks = await fetchJson(jwksUri);
179
+ if (!Array.isArray(jwks?.keys))
180
+ throw new hdbError_ts_1.ServerError(`JWKS at ${jwksUri} has no keys array`);
181
+ const keys = new Map();
182
+ for (const jwk of jwks.keys) {
183
+ const key = toSigningKey(jwk);
184
+ if (key)
185
+ keys.set(jwk.kid, key);
186
+ }
187
+ if (keys.size === 0)
188
+ throw new hdbError_ts_1.ServerError(`JWKS at ${jwksUri} contains no usable signing keys`);
189
+ const entry = { keys, fetchedAt: Date.now() };
190
+ // Still returned to the caller that asked for it — it is freshly fetched and valid — but only
191
+ // cached if no clear happened while this was in flight.
192
+ if (generation === cacheGeneration)
193
+ issuerKeyCache.set(issuer, entry);
194
+ logger.debug?.(`Loaded ${keys.size} signing key(s) for ${issuer}`);
195
+ return entry;
196
+ }
197
+ /** Loads an issuer's keys, collapsing concurrent callers onto one fetch. */
198
+ function loadIssuerKeys(issuer) {
199
+ const existing = inFlightLoads.get(issuer);
200
+ if (existing)
201
+ return existing;
202
+ const load = fetchIssuerKeys(issuer).finally(() => inFlightLoads.delete(issuer));
203
+ inFlightLoads.set(issuer, load);
204
+ return load;
205
+ }
206
+ /** Resolves the public key an issuer used to sign a token, by `kid`. */
207
+ /**
208
+ * `now` exists so the two time-based bounds below can be tested — the cache TTL and, more
209
+ * importantly, the STALE_KEY_GRACE_MS ceiling that stops a pulled key being honored forever through
210
+ * a prolonged outage. Reaching either otherwise needs a cache aged past an hour, and this repo bars
211
+ * new fake timers. Mirrors the `clockTimestamp` seam verifyIdentityToken already takes, rather than
212
+ * inventing a second convention. Callers in production pass nothing.
213
+ */
214
+ async function getSigningKey(issuer, kid, now = Date.now()) {
215
+ if (typeof kid !== 'string' || kid === '')
216
+ throw new hdbError_ts_1.ClientError('Token has no key id', 401);
217
+ const normalizedIssuer = normalizeIssuer(issuer);
218
+ const cached = issuerKeyCache.get(normalizedIssuer);
219
+ if (cached && now - cached.fetchedAt < JWKS_CACHE_TTL_MS) {
220
+ const key = cached.keys.get(kid);
221
+ if (key)
222
+ return key;
223
+ // Unknown kid against a still-fresh set: refetch once, then hold the line for the window. The
224
+ // timestamp is recorded before the fetch so a failing issuer is rate-limited like a succeeding one.
225
+ if (now - (unknownKidRefetchAt.get(normalizedIssuer) ?? 0) < MIN_REFETCH_INTERVAL_MS) {
226
+ throw new hdbError_ts_1.ClientError('Token signing key is not recognized', 401);
227
+ }
228
+ unknownKidRefetchAt.set(normalizedIssuer, now);
229
+ }
230
+ // A usable stale key, if the cache is expired but still inside the grace window.
231
+ const staleKey = cached && now - cached.fetchedAt < STALE_KEY_GRACE_MS ? cached.keys.get(kid) : undefined;
232
+ // Skip the fetch entirely while a recent one is known to have failed. Not gated on having a stale
233
+ // key: the fetch is the expensive part, and the issuer we have NEVER cached is the worse case —
234
+ // there is nothing to fall back to, so without this every request rides the full discovery and
235
+ // timeout. Refusing for the backoff interval bounds what an anonymous caller can drive, at the
236
+ // cost of a legitimate first exchange waiting out that interval after a blip. Fails closed.
237
+ if (now - (failedRefreshAt.get(normalizedIssuer) ?? 0) < FAILED_REFRESH_BACKOFF_MS) {
238
+ if (staleKey)
239
+ return staleKey;
240
+ throw new hdbError_ts_1.ServerError(`Signing keys for ${normalizedIssuer} are temporarily unavailable; a recent refresh failed`);
241
+ }
242
+ let refreshed;
243
+ try {
244
+ refreshed = await loadIssuerKeys(normalizedIssuer);
245
+ }
246
+ catch (error) {
247
+ // Recorded whether or not a stale key rescues this request, so the backoff also covers the
248
+ // issuer whose keys we have never held.
249
+ failedRefreshAt.set(normalizedIssuer, now);
250
+ if (!staleKey)
251
+ throw error;
252
+ logger.warn?.(`Using cached signing key for ${normalizedIssuer}; refresh failed: ${error.message}`);
253
+ return staleKey;
254
+ }
255
+ failedRefreshAt.delete(normalizedIssuer);
256
+ const key = refreshed.keys.get(kid);
257
+ if (!key)
258
+ throw new hdbError_ts_1.ClientError('Token signing key is not recognized', 401);
259
+ return key;
260
+ }
261
+ //# sourceMappingURL=jwks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwks.js","sourceRoot":"","sources":["../../../../security/authn/oidc/jwks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Fallback profile for issuers with no registered provider profile (#2171).
3
+ *
4
+ * Strict rather than permissive: the policy must pin `sub`. That is what makes workload identity work
5
+ * with zero provider code — a Kubernetes service-account token
6
+ * (`system:serviceaccount:<namespace>:<name>`), a GCP service account, and a SPIFFE SVID all carry a
7
+ * stable canonical subject, so pinning it identifies exactly one principal.
8
+ *
9
+ * GitHub Actions needs its own profile precisely because its `sub` is the one claim you should not
10
+ * pin: it varies by trigger, and its format changed for repositories created after 2026-07-15.
11
+ */
12
+ import type { IdentityProviderProfile } from './index.ts';
13
+ export declare const genericProfile: IdentityProviderProfile;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ /**
3
+ * Fallback profile for issuers with no registered provider profile (#2171).
4
+ *
5
+ * Strict rather than permissive: the policy must pin `sub`. That is what makes workload identity work
6
+ * with zero provider code — a Kubernetes service-account token
7
+ * (`system:serviceaccount:<namespace>:<name>`), a GCP service account, and a SPIFFE SVID all carry a
8
+ * stable canonical subject, so pinning it identifies exactly one principal.
9
+ *
10
+ * GitHub Actions needs its own profile precisely because its `sub` is the one claim you should not
11
+ * pin: it varies by trigger, and its format changed for repositories created after 2026-07-15.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.genericProfile = void 0;
15
+ const hdbError_ts_1 = require("../../../../utility/errors/hdbError.js");
16
+ exports.genericProfile = {
17
+ name: 'generic OIDC',
18
+ assertPolicyIsSpecific(policyClaims) {
19
+ if (policyClaims.sub === undefined) {
20
+ throw new hdbError_ts_1.ClientError('claims must pin `sub` for an issuer with no registered provider profile — it is the only ' +
21
+ 'claim every OIDC issuer defines as identifying a single principal. Register a provider ' +
22
+ 'profile if this issuer needs richer rules.');
23
+ }
24
+ },
25
+ // No known shared default audience; the required `sub` pin already binds the policy to one principal.
26
+ assertAudienceIsSpecific() { },
27
+ normalizeClaims(payload) {
28
+ return { ...payload };
29
+ },
30
+ describePrincipal(claims) {
31
+ return typeof claims.sub === 'string' ? claims.sub : 'unknown principal';
32
+ },
33
+ };
34
+ //# sourceMappingURL=generic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.js","sourceRoot":"","sources":["../../../../../security/authn/oidc/providers/generic.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,wEAAqE;AAIxD,QAAA,cAAc,GAA4B;IACtD,IAAI,EAAE,cAAc;IAEpB,sBAAsB,CAAC,YAA6C;QACnE,IAAI,YAAY,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,yBAAW,CACpB,2FAA2F;gBAC1F,yFAAyF;gBACzF,4CAA4C,CAC7C,CAAC;QACH,CAAC;IACF,CAAC;IAED,sGAAsG;IACtG,wBAAwB,KAAU,CAAC;IAEnC,eAAe,CAAC,OAAoB;QACnC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IACvB,CAAC;IAED,iBAAiB,CAAC,MAAmB;QACpC,OAAO,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAC1E,CAAC;CACD,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * GitHub Actions provider profile (#2171).
3
+ *
4
+ * The only module that should know anything about GitHub. Its rules are deliberately stricter than
5
+ * npm's trusted-publishing model, and scoping them here means that strictness never constrains
6
+ * another issuer.
7
+ */
8
+ import type { IdentityProviderProfile } from './index.ts';
9
+ /** Returns undefined rather than guessing when the value is not a ref-qualified reference. */
10
+ export declare function splitWorkflowPath(workflowRef: unknown): string | undefined;
11
+ export declare const githubActionsProfile: IdentityProviderProfile;
@@ -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
+ }>;