agentfootprint 9.116.0 → 9.117.0

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 (503) hide show
  1. package/CAPABILITIES.md +8 -0
  2. package/dist/adapters/identity/directory/directoryPasswords.js +203 -0
  3. package/dist/adapters/identity/directory/directoryPasswords.js.map +1 -0
  4. package/dist/adapters/identity/directory/ldapDirectory.js +187 -0
  5. package/dist/adapters/identity/directory/ldapDirectory.js.map +1 -0
  6. package/dist/adapters/identity/directory/port.js +54 -0
  7. package/dist/adapters/identity/directory/port.js.map +1 -0
  8. package/dist/adapters/identity/jwks.js +30 -156
  9. package/dist/adapters/identity/jwks.js.map +1 -1
  10. package/dist/adapters/identity/localPassword.js +210 -0
  11. package/dist/adapters/identity/localPassword.js.map +1 -0
  12. package/dist/adapters/identity/oidc.js +303 -0
  13. package/dist/adapters/identity/oidc.js.map +1 -0
  14. package/dist/adapters/identity/oidcSignIn.js +324 -0
  15. package/dist/adapters/identity/oidcSignIn.js.map +1 -0
  16. package/dist/adapters/identity/strategies/browserChoice.js +198 -0
  17. package/dist/adapters/identity/strategies/browserChoice.js.map +1 -0
  18. package/dist/adapters/identity/strategies/choose.js +311 -0
  19. package/dist/adapters/identity/strategies/choose.js.map +1 -0
  20. package/dist/adapters/identity/strategies/config.js +161 -0
  21. package/dist/adapters/identity/strategies/config.js.map +1 -0
  22. package/dist/adapters/identity/strategies/directoryChoice.js +168 -0
  23. package/dist/adapters/identity/strategies/directoryChoice.js.map +1 -0
  24. package/dist/adapters/identity/strategies/doorError.js +30 -0
  25. package/dist/adapters/identity/strategies/doorError.js.map +1 -0
  26. package/dist/adapters/identity/strategies/localChoice.js +82 -0
  27. package/dist/adapters/identity/strategies/localChoice.js.map +1 -0
  28. package/dist/adapters/identity/strategies/proxyChoice.js +124 -0
  29. package/dist/adapters/identity/strategies/proxyChoice.js.map +1 -0
  30. package/dist/adapters/identity/strategies/vocabulary.js +218 -0
  31. package/dist/adapters/identity/strategies/vocabulary.js.map +1 -0
  32. package/dist/adapters/identity/verify/claims.js +97 -0
  33. package/dist/adapters/identity/verify/claims.js.map +1 -0
  34. package/dist/adapters/identity/verify/discovery.js +179 -0
  35. package/dist/adapters/identity/verify/discovery.js.map +1 -0
  36. package/dist/adapters/identity/verify/jwtCore.js +206 -0
  37. package/dist/adapters/identity/verify/jwtCore.js.map +1 -0
  38. package/dist/adapters/identity/verify/personTest.js +88 -0
  39. package/dist/adapters/identity/verify/personTest.js.map +1 -0
  40. package/dist/adapters/observability/audit.js +5 -0
  41. package/dist/adapters/observability/audit.js.map +1 -1
  42. package/dist/adapters/observability/cloudwatch.js +3 -1
  43. package/dist/adapters/observability/cloudwatch.js.map +1 -1
  44. package/dist/adapters/observability/file.js +5 -1
  45. package/dist/adapters/observability/file.js.map +1 -1
  46. package/dist/adapters/observability/otel.js +4 -3
  47. package/dist/adapters/observability/otel.js.map +1 -1
  48. package/dist/adapters/observability/xray.js +2 -1
  49. package/dist/adapters/observability/xray.js.map +1 -1
  50. package/dist/artifacts/recordingArtifact.js +6 -2
  51. package/dist/artifacts/recordingArtifact.js.map +1 -1
  52. package/dist/core/Agent.js +124 -9
  53. package/dist/core/Agent.js.map +1 -1
  54. package/dist/core/RunnerBase.js +15 -1
  55. package/dist/core/RunnerBase.js.map +1 -1
  56. package/dist/core/agent/AgentBuilder.js +9 -7
  57. package/dist/core/agent/AgentBuilder.js.map +1 -1
  58. package/dist/core/agent/callerIdentity.js +206 -0
  59. package/dist/core/agent/callerIdentity.js.map +1 -0
  60. package/dist/core/agent/findings/answerText.js +1 -1
  61. package/dist/core/agent/findings/peel.js +83 -0
  62. package/dist/core/agent/findings/peel.js.map +1 -0
  63. package/dist/core/agent/findings/reserved.js +3 -63
  64. package/dist/core/agent/findings/reserved.js.map +1 -1
  65. package/dist/core/agent/servingConversation.js +76 -0
  66. package/dist/core/agent/servingConversation.js.map +1 -0
  67. package/dist/core/agent/stages/callLLM.js +10 -6
  68. package/dist/core/agent/stages/callLLM.js.map +1 -1
  69. package/dist/core/agent/stages/route.js +69 -33
  70. package/dist/core/agent/stages/route.js.map +1 -1
  71. package/dist/core/agent/stages/seed.js +15 -2
  72. package/dist/core/agent/stages/seed.js.map +1 -1
  73. package/dist/core/agent/validators.js +9 -2
  74. package/dist/core/agent/validators.js.map +1 -1
  75. package/dist/core/conversation.js +37 -1
  76. package/dist/core/conversation.js.map +1 -1
  77. package/dist/core/flowchartAsTool.js +2 -0
  78. package/dist/core/flowchartAsTool.js.map +1 -1
  79. package/dist/core/runbook/runbookAsTool.js +2 -0
  80. package/dist/core/runbook/runbookAsTool.js.map +1 -1
  81. package/dist/debug.js.map +1 -1
  82. package/dist/doors/security.js +3 -0
  83. package/dist/doors/security.js.map +1 -1
  84. package/dist/esm/adapters/identity/directory/directoryPasswords.d.ts +94 -0
  85. package/dist/esm/adapters/identity/directory/directoryPasswords.js +196 -0
  86. package/dist/esm/adapters/identity/directory/directoryPasswords.js.map +1 -0
  87. package/dist/esm/adapters/identity/directory/ldapDirectory.d.ts +53 -0
  88. package/dist/esm/adapters/identity/directory/ldapDirectory.js +158 -0
  89. package/dist/esm/adapters/identity/directory/ldapDirectory.js.map +1 -0
  90. package/dist/esm/adapters/identity/directory/port.d.ts +42 -0
  91. package/dist/esm/adapters/identity/directory/port.js +49 -0
  92. package/dist/esm/adapters/identity/directory/port.js.map +1 -0
  93. package/dist/esm/adapters/identity/jwks.d.ts +29 -22
  94. package/dist/esm/adapters/identity/jwks.js +28 -131
  95. package/dist/esm/adapters/identity/jwks.js.map +1 -1
  96. package/dist/esm/adapters/identity/localPassword.d.ts +87 -0
  97. package/dist/esm/adapters/identity/localPassword.js +204 -0
  98. package/dist/esm/adapters/identity/localPassword.js.map +1 -0
  99. package/dist/esm/adapters/identity/oidc.d.ts +141 -0
  100. package/dist/esm/adapters/identity/oidc.js +299 -0
  101. package/dist/esm/adapters/identity/oidc.js.map +1 -0
  102. package/dist/esm/adapters/identity/oidcSignIn.d.ts +102 -0
  103. package/dist/esm/adapters/identity/oidcSignIn.js +295 -0
  104. package/dist/esm/adapters/identity/oidcSignIn.js.map +1 -0
  105. package/dist/esm/adapters/identity/strategies/browserChoice.d.ts +43 -0
  106. package/dist/esm/adapters/identity/strategies/browserChoice.js +193 -0
  107. package/dist/esm/adapters/identity/strategies/browserChoice.js.map +1 -0
  108. package/dist/esm/adapters/identity/strategies/choose.d.ts +113 -0
  109. package/dist/esm/adapters/identity/strategies/choose.js +303 -0
  110. package/dist/esm/adapters/identity/strategies/choose.js.map +1 -0
  111. package/dist/esm/adapters/identity/strategies/config.d.ts +140 -0
  112. package/dist/esm/adapters/identity/strategies/config.js +155 -0
  113. package/dist/esm/adapters/identity/strategies/config.js.map +1 -0
  114. package/dist/esm/adapters/identity/strategies/directoryChoice.d.ts +36 -0
  115. package/dist/esm/adapters/identity/strategies/directoryChoice.js +164 -0
  116. package/dist/esm/adapters/identity/strategies/directoryChoice.js.map +1 -0
  117. package/dist/esm/adapters/identity/strategies/doorError.d.ts +8 -0
  118. package/dist/esm/adapters/identity/strategies/doorError.js +26 -0
  119. package/dist/esm/adapters/identity/strategies/doorError.js.map +1 -0
  120. package/dist/esm/adapters/identity/strategies/localChoice.d.ts +16 -0
  121. package/dist/esm/adapters/identity/strategies/localChoice.js +78 -0
  122. package/dist/esm/adapters/identity/strategies/localChoice.js.map +1 -0
  123. package/dist/esm/adapters/identity/strategies/proxyChoice.d.ts +34 -0
  124. package/dist/esm/adapters/identity/strategies/proxyChoice.js +120 -0
  125. package/dist/esm/adapters/identity/strategies/proxyChoice.js.map +1 -0
  126. package/dist/esm/adapters/identity/strategies/vocabulary.d.ts +37 -0
  127. package/dist/esm/adapters/identity/strategies/vocabulary.js +214 -0
  128. package/dist/esm/adapters/identity/strategies/vocabulary.js.map +1 -0
  129. package/dist/esm/adapters/identity/verify/claims.d.ts +53 -0
  130. package/dist/esm/adapters/identity/verify/claims.js +89 -0
  131. package/dist/esm/adapters/identity/verify/claims.js.map +1 -0
  132. package/dist/esm/adapters/identity/verify/discovery.d.ts +80 -0
  133. package/dist/esm/adapters/identity/verify/discovery.js +173 -0
  134. package/dist/esm/adapters/identity/verify/discovery.js.map +1 -0
  135. package/dist/esm/adapters/identity/verify/jwtCore.d.ts +89 -0
  136. package/dist/esm/adapters/identity/verify/jwtCore.js +176 -0
  137. package/dist/esm/adapters/identity/verify/jwtCore.js.map +1 -0
  138. package/dist/esm/adapters/identity/verify/personTest.d.ts +61 -0
  139. package/dist/esm/adapters/identity/verify/personTest.js +83 -0
  140. package/dist/esm/adapters/identity/verify/personTest.js.map +1 -0
  141. package/dist/esm/adapters/observability/audit.js +5 -0
  142. package/dist/esm/adapters/observability/audit.js.map +1 -1
  143. package/dist/esm/adapters/observability/cloudwatch.js +3 -1
  144. package/dist/esm/adapters/observability/cloudwatch.js.map +1 -1
  145. package/dist/esm/adapters/observability/file.js +5 -1
  146. package/dist/esm/adapters/observability/file.js.map +1 -1
  147. package/dist/esm/adapters/observability/otel.js +4 -3
  148. package/dist/esm/adapters/observability/otel.js.map +1 -1
  149. package/dist/esm/adapters/observability/xray.js +2 -1
  150. package/dist/esm/adapters/observability/xray.js.map +1 -1
  151. package/dist/esm/artifacts/recordingArtifact.js +6 -2
  152. package/dist/esm/artifacts/recordingArtifact.js.map +1 -1
  153. package/dist/esm/core/Agent.d.ts +41 -1
  154. package/dist/esm/core/Agent.js +125 -10
  155. package/dist/esm/core/Agent.js.map +1 -1
  156. package/dist/esm/core/RunnerBase.d.ts +11 -0
  157. package/dist/esm/core/RunnerBase.js +13 -0
  158. package/dist/esm/core/RunnerBase.js.map +1 -1
  159. package/dist/esm/core/agent/AgentBuilder.js +9 -7
  160. package/dist/esm/core/agent/AgentBuilder.js.map +1 -1
  161. package/dist/esm/core/agent/callerIdentity.d.ts +94 -0
  162. package/dist/esm/core/agent/callerIdentity.js +198 -0
  163. package/dist/esm/core/agent/callerIdentity.js.map +1 -0
  164. package/dist/esm/core/agent/findings/answerText.d.ts +1 -1
  165. package/dist/esm/core/agent/findings/answerText.js +1 -1
  166. package/dist/esm/core/agent/findings/peel.d.ts +36 -0
  167. package/dist/esm/core/agent/findings/peel.js +77 -0
  168. package/dist/esm/core/agent/findings/peel.js.map +1 -0
  169. package/dist/esm/core/agent/findings/reserved.d.ts +13 -22
  170. package/dist/esm/core/agent/findings/reserved.js +3 -63
  171. package/dist/esm/core/agent/findings/reserved.js.map +1 -1
  172. package/dist/esm/core/agent/servingConversation.d.ts +55 -0
  173. package/dist/esm/core/agent/servingConversation.js +67 -0
  174. package/dist/esm/core/agent/servingConversation.js.map +1 -0
  175. package/dist/esm/core/agent/stages/callLLM.js +11 -7
  176. package/dist/esm/core/agent/stages/callLLM.js.map +1 -1
  177. package/dist/esm/core/agent/stages/route.js +45 -32
  178. package/dist/esm/core/agent/stages/route.js.map +1 -1
  179. package/dist/esm/core/agent/stages/seed.js +15 -2
  180. package/dist/esm/core/agent/stages/seed.js.map +1 -1
  181. package/dist/esm/core/agent/types.d.ts +9 -0
  182. package/dist/esm/core/agent/validators.d.ts +2 -1
  183. package/dist/esm/core/agent/validators.js +9 -2
  184. package/dist/esm/core/agent/validators.js.map +1 -1
  185. package/dist/esm/core/conversation.d.ts +28 -0
  186. package/dist/esm/core/conversation.js +35 -0
  187. package/dist/esm/core/conversation.js.map +1 -1
  188. package/dist/esm/core/flowchartAsTool.js +2 -0
  189. package/dist/esm/core/flowchartAsTool.js.map +1 -1
  190. package/dist/esm/core/runbook/runbookAsTool.js +2 -0
  191. package/dist/esm/core/runbook/runbookAsTool.js.map +1 -1
  192. package/dist/esm/debug.d.ts +1 -1
  193. package/dist/esm/debug.js.map +1 -1
  194. package/dist/esm/doors/security.d.ts +3 -0
  195. package/dist/esm/doors/security.js +3 -0
  196. package/dist/esm/doors/security.js.map +1 -1
  197. package/dist/esm/hosting/errors.d.ts +45 -4
  198. package/dist/esm/hosting/errors.js +50 -8
  199. package/dist/esm/hosting/errors.js.map +1 -1
  200. package/dist/esm/hosting/httpHost.d.ts +10 -0
  201. package/dist/esm/hosting/httpHost.js +22 -5
  202. package/dist/esm/hosting/httpHost.js.map +1 -1
  203. package/dist/esm/hosting/identityVerification.d.ts +47 -3
  204. package/dist/esm/hosting/identityVerification.js +52 -2
  205. package/dist/esm/hosting/identityVerification.js.map +1 -1
  206. package/dist/esm/hosting/index.d.ts +13 -3
  207. package/dist/esm/hosting/index.js +15 -1
  208. package/dist/esm/hosting/index.js.map +1 -1
  209. package/dist/esm/hosting/ingressRecord.js +1 -0
  210. package/dist/esm/hosting/ingressRecord.js.map +1 -1
  211. package/dist/esm/hosting/nodeHost.d.ts +8 -0
  212. package/dist/esm/hosting/nodeHost.js +1 -0
  213. package/dist/esm/hosting/nodeHost.js.map +1 -1
  214. package/dist/esm/hosting/signin/browserGuard.d.ts +21 -0
  215. package/dist/esm/hosting/signin/browserGuard.js +58 -0
  216. package/dist/esm/hosting/signin/browserGuard.js.map +1 -0
  217. package/dist/esm/hosting/signin/checkGate.d.ts +24 -0
  218. package/dist/esm/hosting/signin/checkGate.js +49 -0
  219. package/dist/esm/hosting/signin/checkGate.js.map +1 -0
  220. package/dist/esm/hosting/signin/clientAddress.d.ts +28 -0
  221. package/dist/esm/hosting/signin/clientAddress.js +88 -0
  222. package/dist/esm/hosting/signin/clientAddress.js.map +1 -0
  223. package/dist/esm/hosting/signin/cookie.d.ts +75 -0
  224. package/dist/esm/hosting/signin/cookie.js +134 -0
  225. package/dist/esm/hosting/signin/cookie.js.map +1 -0
  226. package/dist/esm/hosting/signin/door.d.ts +140 -0
  227. package/dist/esm/hosting/signin/door.js +427 -0
  228. package/dist/esm/hosting/signin/door.js.map +1 -0
  229. package/dist/esm/hosting/signin/errors.d.ts +39 -0
  230. package/dist/esm/hosting/signin/errors.js +53 -0
  231. package/dist/esm/hosting/signin/errors.js.map +1 -0
  232. package/dist/esm/hosting/signin/hostSignIn.d.ts +33 -0
  233. package/dist/esm/hosting/signin/hostSignIn.js +85 -0
  234. package/dist/esm/hosting/signin/hostSignIn.js.map +1 -0
  235. package/dist/esm/hosting/signin/limits.d.ts +88 -0
  236. package/dist/esm/hosting/signin/limits.js +205 -0
  237. package/dist/esm/hosting/signin/limits.js.map +1 -0
  238. package/dist/esm/hosting/signin/memorySignIns.d.ts +51 -0
  239. package/dist/esm/hosting/signin/memorySignIns.js +120 -0
  240. package/dist/esm/hosting/signin/memorySignIns.js.map +1 -0
  241. package/dist/esm/hosting/signin/redirectRoutes.d.ts +72 -0
  242. package/dist/esm/hosting/signin/redirectRoutes.js +235 -0
  243. package/dist/esm/hosting/signin/redirectRoutes.js.map +1 -0
  244. package/dist/esm/hosting/signin/returnTo.d.ts +34 -0
  245. package/dist/esm/hosting/signin/returnTo.js +65 -0
  246. package/dist/esm/hosting/signin/returnTo.js.map +1 -0
  247. package/dist/esm/hosting/signin/seal.d.ts +36 -0
  248. package/dist/esm/hosting/signin/seal.js +72 -0
  249. package/dist/esm/hosting/signin/seal.js.map +1 -0
  250. package/dist/esm/hosting/signin/source.d.ts +35 -0
  251. package/dist/esm/hosting/signin/source.js +73 -0
  252. package/dist/esm/hosting/signin/source.js.map +1 -0
  253. package/dist/esm/hosting/signin/types.d.ts +196 -0
  254. package/dist/esm/hosting/signin/types.js +43 -0
  255. package/dist/esm/hosting/signin/types.js.map +1 -0
  256. package/dist/esm/hosting/standingAgent.d.ts +2 -2
  257. package/dist/esm/hosting/standingAgent.js +309 -46
  258. package/dist/esm/hosting/standingAgent.js.map +1 -1
  259. package/dist/esm/hosting/types.d.ts +127 -2
  260. package/dist/esm/hosting/types.js.map +1 -1
  261. package/dist/esm/hosting/webSocketConversation.d.ts +8 -0
  262. package/dist/esm/hosting/webSocketConversation.js +130 -18
  263. package/dist/esm/hosting/webSocketConversation.js.map +1 -1
  264. package/dist/esm/hosting/webSocketFrames.d.ts +2 -0
  265. package/dist/esm/hosting/webSocketFrames.js +2 -0
  266. package/dist/esm/hosting/webSocketFrames.js.map +1 -1
  267. package/dist/esm/identity.d.ts +11 -1
  268. package/dist/esm/identity.js +21 -0
  269. package/dist/esm/identity.js.map +1 -1
  270. package/dist/esm/index.d.ts +1 -1
  271. package/dist/esm/index.js +1 -1
  272. package/dist/esm/index.js.map +1 -1
  273. package/dist/esm/lib/bug-report/build.js +3 -1
  274. package/dist/esm/lib/bug-report/build.js.map +1 -1
  275. package/dist/esm/lib/trace-toolpack/index.d.ts +1 -1
  276. package/dist/esm/lib/trace-toolpack/index.js.map +1 -1
  277. package/dist/esm/lib/trace-toolpack/innerRunRecords.d.ts +38 -0
  278. package/dist/esm/lib/trace-toolpack/innerRunRecords.js +97 -13
  279. package/dist/esm/lib/trace-toolpack/innerRunRecords.js.map +1 -1
  280. package/dist/esm/lib/trace-toolpack/selfExplain.d.ts +55 -4
  281. package/dist/esm/lib/trace-toolpack/selfExplain.js +120 -12
  282. package/dist/esm/lib/trace-toolpack/selfExplain.js.map +1 -1
  283. package/dist/esm/lib/wireJson.d.ts +98 -0
  284. package/dist/esm/lib/wireJson.js +301 -0
  285. package/dist/esm/lib/wireJson.js.map +1 -0
  286. package/dist/esm/memory/causal/evidenceRecorder.js +6 -3
  287. package/dist/esm/memory/causal/evidenceRecorder.js.map +1 -1
  288. package/dist/esm/recorders/observability/fileRecordingSink.js +2 -1
  289. package/dist/esm/recorders/observability/fileRecordingSink.js.map +1 -1
  290. package/dist/esm/strategies/attach.js +13 -4
  291. package/dist/esm/strategies/attach.js.map +1 -1
  292. package/dist/esm/strategies/defaults/consoleObservability.js +2 -1
  293. package/dist/esm/strategies/defaults/consoleObservability.js.map +1 -1
  294. package/dist/esm/stream.js +4 -1
  295. package/dist/esm/stream.js.map +1 -1
  296. package/dist/hosting/errors.js +52 -9
  297. package/dist/hosting/errors.js.map +1 -1
  298. package/dist/hosting/httpHost.js +22 -5
  299. package/dist/hosting/httpHost.js.map +1 -1
  300. package/dist/hosting/identityVerification.js +55 -4
  301. package/dist/hosting/identityVerification.js.map +1 -1
  302. package/dist/hosting/index.js +39 -2
  303. package/dist/hosting/index.js.map +1 -1
  304. package/dist/hosting/ingressRecord.js +1 -0
  305. package/dist/hosting/ingressRecord.js.map +1 -1
  306. package/dist/hosting/nodeHost.js +1 -0
  307. package/dist/hosting/nodeHost.js.map +1 -1
  308. package/dist/hosting/signin/browserGuard.js +62 -0
  309. package/dist/hosting/signin/browserGuard.js.map +1 -0
  310. package/dist/hosting/signin/checkGate.js +53 -0
  311. package/dist/hosting/signin/checkGate.js.map +1 -0
  312. package/dist/hosting/signin/clientAddress.js +93 -0
  313. package/dist/hosting/signin/clientAddress.js.map +1 -0
  314. package/dist/hosting/signin/cookie.js +140 -0
  315. package/dist/hosting/signin/cookie.js.map +1 -0
  316. package/dist/hosting/signin/door.js +433 -0
  317. package/dist/hosting/signin/door.js.map +1 -0
  318. package/dist/hosting/signin/errors.js +60 -0
  319. package/dist/hosting/signin/errors.js.map +1 -0
  320. package/dist/hosting/signin/hostSignIn.js +91 -0
  321. package/dist/hosting/signin/hostSignIn.js.map +1 -0
  322. package/dist/hosting/signin/limits.js +210 -0
  323. package/dist/hosting/signin/limits.js.map +1 -0
  324. package/dist/hosting/signin/memorySignIns.js +125 -0
  325. package/dist/hosting/signin/memorySignIns.js.map +1 -0
  326. package/dist/hosting/signin/redirectRoutes.js +239 -0
  327. package/dist/hosting/signin/redirectRoutes.js.map +1 -0
  328. package/dist/hosting/signin/returnTo.js +69 -0
  329. package/dist/hosting/signin/returnTo.js.map +1 -0
  330. package/dist/hosting/signin/seal.js +79 -0
  331. package/dist/hosting/signin/seal.js.map +1 -0
  332. package/dist/hosting/signin/source.js +77 -0
  333. package/dist/hosting/signin/source.js.map +1 -0
  334. package/dist/hosting/signin/types.js +47 -0
  335. package/dist/hosting/signin/types.js.map +1 -0
  336. package/dist/hosting/standingAgent.js +307 -44
  337. package/dist/hosting/standingAgent.js.map +1 -1
  338. package/dist/hosting/types.js.map +1 -1
  339. package/dist/hosting/webSocketConversation.js +130 -18
  340. package/dist/hosting/webSocketConversation.js.map +1 -1
  341. package/dist/hosting/webSocketFrames.js +2 -0
  342. package/dist/hosting/webSocketFrames.js.map +1 -1
  343. package/dist/identity.js +38 -1
  344. package/dist/identity.js.map +1 -1
  345. package/dist/index.js +4 -3
  346. package/dist/index.js.map +1 -1
  347. package/dist/lib/bug-report/build.js +3 -1
  348. package/dist/lib/bug-report/build.js.map +1 -1
  349. package/dist/lib/trace-toolpack/index.js.map +1 -1
  350. package/dist/lib/trace-toolpack/innerRunRecords.js +99 -14
  351. package/dist/lib/trace-toolpack/innerRunRecords.js.map +1 -1
  352. package/dist/lib/trace-toolpack/selfExplain.js +120 -12
  353. package/dist/lib/trace-toolpack/selfExplain.js.map +1 -1
  354. package/dist/lib/wireJson.js +308 -0
  355. package/dist/lib/wireJson.js.map +1 -0
  356. package/dist/memory/causal/evidenceRecorder.js +6 -3
  357. package/dist/memory/causal/evidenceRecorder.js.map +1 -1
  358. package/dist/recorders/observability/fileRecordingSink.js +2 -1
  359. package/dist/recorders/observability/fileRecordingSink.js.map +1 -1
  360. package/dist/strategies/attach.js +13 -4
  361. package/dist/strategies/attach.js.map +1 -1
  362. package/dist/strategies/defaults/consoleObservability.js +2 -1
  363. package/dist/strategies/defaults/consoleObservability.js.map +1 -1
  364. package/dist/stream.js +4 -1
  365. package/dist/stream.js.map +1 -1
  366. package/dist/types/adapters/identity/directory/directoryPasswords.d.ts +95 -0
  367. package/dist/types/adapters/identity/directory/directoryPasswords.d.ts.map +1 -0
  368. package/dist/types/adapters/identity/directory/ldapDirectory.d.ts +54 -0
  369. package/dist/types/adapters/identity/directory/ldapDirectory.d.ts.map +1 -0
  370. package/dist/types/adapters/identity/directory/port.d.ts +43 -0
  371. package/dist/types/adapters/identity/directory/port.d.ts.map +1 -0
  372. package/dist/types/adapters/identity/jwks.d.ts +29 -22
  373. package/dist/types/adapters/identity/jwks.d.ts.map +1 -1
  374. package/dist/types/adapters/identity/localPassword.d.ts +88 -0
  375. package/dist/types/adapters/identity/localPassword.d.ts.map +1 -0
  376. package/dist/types/adapters/identity/oidc.d.ts +142 -0
  377. package/dist/types/adapters/identity/oidc.d.ts.map +1 -0
  378. package/dist/types/adapters/identity/oidcSignIn.d.ts +103 -0
  379. package/dist/types/adapters/identity/oidcSignIn.d.ts.map +1 -0
  380. package/dist/types/adapters/identity/strategies/browserChoice.d.ts +44 -0
  381. package/dist/types/adapters/identity/strategies/browserChoice.d.ts.map +1 -0
  382. package/dist/types/adapters/identity/strategies/choose.d.ts +114 -0
  383. package/dist/types/adapters/identity/strategies/choose.d.ts.map +1 -0
  384. package/dist/types/adapters/identity/strategies/config.d.ts +141 -0
  385. package/dist/types/adapters/identity/strategies/config.d.ts.map +1 -0
  386. package/dist/types/adapters/identity/strategies/directoryChoice.d.ts +37 -0
  387. package/dist/types/adapters/identity/strategies/directoryChoice.d.ts.map +1 -0
  388. package/dist/types/adapters/identity/strategies/doorError.d.ts +9 -0
  389. package/dist/types/adapters/identity/strategies/doorError.d.ts.map +1 -0
  390. package/dist/types/adapters/identity/strategies/localChoice.d.ts +17 -0
  391. package/dist/types/adapters/identity/strategies/localChoice.d.ts.map +1 -0
  392. package/dist/types/adapters/identity/strategies/proxyChoice.d.ts +35 -0
  393. package/dist/types/adapters/identity/strategies/proxyChoice.d.ts.map +1 -0
  394. package/dist/types/adapters/identity/strategies/vocabulary.d.ts +38 -0
  395. package/dist/types/adapters/identity/strategies/vocabulary.d.ts.map +1 -0
  396. package/dist/types/adapters/identity/verify/claims.d.ts +54 -0
  397. package/dist/types/adapters/identity/verify/claims.d.ts.map +1 -0
  398. package/dist/types/adapters/identity/verify/discovery.d.ts +81 -0
  399. package/dist/types/adapters/identity/verify/discovery.d.ts.map +1 -0
  400. package/dist/types/adapters/identity/verify/jwtCore.d.ts +90 -0
  401. package/dist/types/adapters/identity/verify/jwtCore.d.ts.map +1 -0
  402. package/dist/types/adapters/identity/verify/personTest.d.ts +62 -0
  403. package/dist/types/adapters/identity/verify/personTest.d.ts.map +1 -0
  404. package/dist/types/adapters/observability/audit.d.ts.map +1 -1
  405. package/dist/types/adapters/observability/cloudwatch.d.ts.map +1 -1
  406. package/dist/types/adapters/observability/file.d.ts.map +1 -1
  407. package/dist/types/adapters/observability/otel.d.ts.map +1 -1
  408. package/dist/types/adapters/observability/xray.d.ts.map +1 -1
  409. package/dist/types/artifacts/recordingArtifact.d.ts.map +1 -1
  410. package/dist/types/core/Agent.d.ts +41 -1
  411. package/dist/types/core/Agent.d.ts.map +1 -1
  412. package/dist/types/core/RunnerBase.d.ts +11 -0
  413. package/dist/types/core/RunnerBase.d.ts.map +1 -1
  414. package/dist/types/core/agent/AgentBuilder.d.ts.map +1 -1
  415. package/dist/types/core/agent/callerIdentity.d.ts +95 -0
  416. package/dist/types/core/agent/callerIdentity.d.ts.map +1 -0
  417. package/dist/types/core/agent/findings/answerText.d.ts +1 -1
  418. package/dist/types/core/agent/findings/peel.d.ts +37 -0
  419. package/dist/types/core/agent/findings/peel.d.ts.map +1 -0
  420. package/dist/types/core/agent/findings/reserved.d.ts +13 -22
  421. package/dist/types/core/agent/findings/reserved.d.ts.map +1 -1
  422. package/dist/types/core/agent/servingConversation.d.ts +56 -0
  423. package/dist/types/core/agent/servingConversation.d.ts.map +1 -0
  424. package/dist/types/core/agent/stages/callLLM.d.ts.map +1 -1
  425. package/dist/types/core/agent/stages/route.d.ts.map +1 -1
  426. package/dist/types/core/agent/types.d.ts +9 -0
  427. package/dist/types/core/agent/types.d.ts.map +1 -1
  428. package/dist/types/core/agent/validators.d.ts +2 -1
  429. package/dist/types/core/agent/validators.d.ts.map +1 -1
  430. package/dist/types/core/conversation.d.ts +28 -0
  431. package/dist/types/core/conversation.d.ts.map +1 -1
  432. package/dist/types/core/flowchartAsTool.d.ts.map +1 -1
  433. package/dist/types/core/runbook/runbookAsTool.d.ts.map +1 -1
  434. package/dist/types/debug.d.ts +1 -1
  435. package/dist/types/debug.d.ts.map +1 -1
  436. package/dist/types/doors/security.d.ts +3 -0
  437. package/dist/types/doors/security.d.ts.map +1 -1
  438. package/dist/types/hosting/errors.d.ts +45 -4
  439. package/dist/types/hosting/errors.d.ts.map +1 -1
  440. package/dist/types/hosting/httpHost.d.ts +10 -0
  441. package/dist/types/hosting/httpHost.d.ts.map +1 -1
  442. package/dist/types/hosting/identityVerification.d.ts +47 -3
  443. package/dist/types/hosting/identityVerification.d.ts.map +1 -1
  444. package/dist/types/hosting/index.d.ts +13 -3
  445. package/dist/types/hosting/index.d.ts.map +1 -1
  446. package/dist/types/hosting/ingressRecord.d.ts.map +1 -1
  447. package/dist/types/hosting/nodeHost.d.ts +8 -0
  448. package/dist/types/hosting/nodeHost.d.ts.map +1 -1
  449. package/dist/types/hosting/signin/browserGuard.d.ts +22 -0
  450. package/dist/types/hosting/signin/browserGuard.d.ts.map +1 -0
  451. package/dist/types/hosting/signin/checkGate.d.ts +25 -0
  452. package/dist/types/hosting/signin/checkGate.d.ts.map +1 -0
  453. package/dist/types/hosting/signin/clientAddress.d.ts +29 -0
  454. package/dist/types/hosting/signin/clientAddress.d.ts.map +1 -0
  455. package/dist/types/hosting/signin/cookie.d.ts +76 -0
  456. package/dist/types/hosting/signin/cookie.d.ts.map +1 -0
  457. package/dist/types/hosting/signin/door.d.ts +141 -0
  458. package/dist/types/hosting/signin/door.d.ts.map +1 -0
  459. package/dist/types/hosting/signin/errors.d.ts +40 -0
  460. package/dist/types/hosting/signin/errors.d.ts.map +1 -0
  461. package/dist/types/hosting/signin/hostSignIn.d.ts +34 -0
  462. package/dist/types/hosting/signin/hostSignIn.d.ts.map +1 -0
  463. package/dist/types/hosting/signin/limits.d.ts +89 -0
  464. package/dist/types/hosting/signin/limits.d.ts.map +1 -0
  465. package/dist/types/hosting/signin/memorySignIns.d.ts +52 -0
  466. package/dist/types/hosting/signin/memorySignIns.d.ts.map +1 -0
  467. package/dist/types/hosting/signin/redirectRoutes.d.ts +73 -0
  468. package/dist/types/hosting/signin/redirectRoutes.d.ts.map +1 -0
  469. package/dist/types/hosting/signin/returnTo.d.ts +35 -0
  470. package/dist/types/hosting/signin/returnTo.d.ts.map +1 -0
  471. package/dist/types/hosting/signin/seal.d.ts +37 -0
  472. package/dist/types/hosting/signin/seal.d.ts.map +1 -0
  473. package/dist/types/hosting/signin/source.d.ts +36 -0
  474. package/dist/types/hosting/signin/source.d.ts.map +1 -0
  475. package/dist/types/hosting/signin/types.d.ts +197 -0
  476. package/dist/types/hosting/signin/types.d.ts.map +1 -0
  477. package/dist/types/hosting/standingAgent.d.ts +2 -2
  478. package/dist/types/hosting/standingAgent.d.ts.map +1 -1
  479. package/dist/types/hosting/types.d.ts +127 -2
  480. package/dist/types/hosting/types.d.ts.map +1 -1
  481. package/dist/types/hosting/webSocketConversation.d.ts +8 -0
  482. package/dist/types/hosting/webSocketConversation.d.ts.map +1 -1
  483. package/dist/types/hosting/webSocketFrames.d.ts +2 -0
  484. package/dist/types/hosting/webSocketFrames.d.ts.map +1 -1
  485. package/dist/types/identity.d.ts +11 -1
  486. package/dist/types/identity.d.ts.map +1 -1
  487. package/dist/types/index.d.ts +1 -1
  488. package/dist/types/index.d.ts.map +1 -1
  489. package/dist/types/lib/bug-report/build.d.ts.map +1 -1
  490. package/dist/types/lib/trace-toolpack/index.d.ts +1 -1
  491. package/dist/types/lib/trace-toolpack/index.d.ts.map +1 -1
  492. package/dist/types/lib/trace-toolpack/innerRunRecords.d.ts +38 -0
  493. package/dist/types/lib/trace-toolpack/innerRunRecords.d.ts.map +1 -1
  494. package/dist/types/lib/trace-toolpack/selfExplain.d.ts +55 -4
  495. package/dist/types/lib/trace-toolpack/selfExplain.d.ts.map +1 -1
  496. package/dist/types/lib/wireJson.d.ts +99 -0
  497. package/dist/types/lib/wireJson.d.ts.map +1 -0
  498. package/dist/types/memory/causal/evidenceRecorder.d.ts.map +1 -1
  499. package/dist/types/recorders/observability/fileRecordingSink.d.ts.map +1 -1
  500. package/dist/types/strategies/attach.d.ts.map +1 -1
  501. package/dist/types/strategies/defaults/consoleObservability.d.ts.map +1 -1
  502. package/dist/types/stream.d.ts.map +1 -1
  503. package/package.json +12 -1
package/CAPABILITIES.md CHANGED
@@ -73,7 +73,15 @@ not in this table, search `src/index.ts` for the nearest noun before writing cod
73
73
  | proving a session store really honours the port | `runSessionLifecycleConformance` + `declared` skips (by case name WITH the reason; a declared case still RUNS) + outcomes `'passed'`/`'not-applicable'`/`'declared'`/`'failed'` | `src/hosting/conformance/` | 9.37.0 |
74
74
  | deciding who owns a contested session write | `resolveSessionOwner` | `src/hosting/sessionOwnership.ts` | 9.37.0 |
75
75
  | a host filing its OWN per-turn artifacts (a story, the person's clicks) where `artifact-get` will look for the same caller — never composing a scope itself; awaited inside the turn, bounded (`turnArtifactsTimeoutMs`, default `TURN_ARTIFACTS_TIMEOUT_MS`), revoked after it (`TurnArtifactsExpiredError`), failures on the stream (`artifacts.hand_over_failed`) | `HostReply.turnArtifacts` + `TurnArtifacts` | `src/hosting/turnArtifacts.ts` | 9.115.0 |
76
+ | a host reading or filing artifacts in the scope a redemption by the same caller reads, OUTSIDE a turn (a read by ref before a run, an app-owned route) — the redemption door's verifier (the proven person, or at an open door the session id and claim), session-id check, ownership rule and ONE scope composer; refusals as values (`unverified` / `unavailable` / `no-session` / `invalid-session` / `not-found` / `no-store`); never builds or evicts an instance, never the unscoped store; revoked with its instance | `handle.artifactsForRequest` + `ArtifactsForRequestResult` | `src/hosting/standingAgent.ts` | 9.117.0 |
76
77
  | refusing a forged cross-site request, DNS rebinding or an oversized session id at the hosting door — before any handler, in every identity mode; the same rule for an app's own routes beside the door | `doorGuard` + `checkSessionId` + `MAX_SESSION_ID_LENGTH` + `CrossSiteOptions` (`allowedOrigins` / `allowedHosts` / `requireJsonContentType` on `httpHost`, `nodeHost` and the hosted-runtime adapters, which default the browser rules OFF on a non-loopback bind; a loopback bind defaults `allowedHosts` to the loopback names) + `AgentHost.onRefusal` (feeds the ingress record) | `src/hosting/doorGuard.ts` | 9.115.0 |
78
+ | choosing how callers prove who they are from CONFIG at install time — one strategy per deployment, a wrong or missing setting refused at boot by name (production must name its strategy, even `open`; a typo or a key a later release reads is never ignored), an unreachable IdP started with a banner warning and 503s, a boot banner with no secrets | `identityFromConfig` + `identityConfigFromEnv` + `IdentityConfigError` + `IdentityChoice` (strategies `open`, `oidc-token`, `local-password`, `directory-password`, `proxy-token`) | `src/adapters/identity/strategies/` | 9.117.0 |
79
+ | refusing an application's own token posing as a PERSON at the door — verifying an access token from AD FS, Entra ID, Keycloak or Okta by discovery, with AD FS's `access_token_issuer`, a required id claim (no `sub` default), `exp` required, the person test (required scope, `idtyp: app`, `oid == sub`, roles-without-scope, the obtaining client) and group overage refused as unknown | `oidcIdentity` + `IdentityFailureClass` `'not-a-user-token'` / `'wrong-client'` / `'roles-unknown'` | `src/adapters/identity/oidc.ts` | 9.117.0 |
80
+ | keeping a browser's sign-in cookie away from every handler and log line — the transport strips it and passes only its SHA-256 key; one credential per request (a token and a sign-in together refused); a WebSocket's sign-in checked before the 101, re-checked before every inbound frame, and the socket closed when the sign-in ends | `signIn` on `nodeHost`/`httpHost` + `HostRequest.signInKey` + `readSignIn` + `withoutCredentials` + `signInSource` + `SignInStore` + `IdentityVerificationOptions.signIn` / `tokenHeader` + `'two-credentials'` | `src/hosting/signin/` | 9.117.0 |
81
+ | a browser sign-in with a password for development, tests and demos — `/auth/config`, `/auth/me`, `/auth/login`, `/auth/logout`; an HttpOnly `__Host-Http-` cookie, no IdP token in the browser; the door guard on every login, one answer for every wrong credential after a minimum time, attempt limits with growing delay, a bounded per-process store; scrypt-hashed password lists only, refused in production | `signInDoor` + `memorySignIns` + `PasswordChecker` + `localPasswords` + `hashPassword` + `IDENTITY_STRATEGY=local-password` (`identityFromConfig` → `signInDoor` / `hostSignIn`) | `src/hosting/signin/door.ts` | 9.117.0 |
82
+ | signing people in through the company's identity provider in the browser (OIDC authorization code + PKCE) — PENDING INDEPENDENT REVIEW: a sealed per-attempt transaction cookie (nothing on the server), `returnTo` pinned to the public origin, the person read from an ACCESS token by the strategy's own verify (one id for browser and bearer), private-key or secret client authentication, AD FS `resource`, 303 with no-referrer, end-session | `oidcSignIn` + `signInDoor({ redirect })` + `safeReturnTo` + `IDENTITY_CLIENT_ID` / `IDENTITY_CLIENT_KEY_FILE` / `IDENTITY_PKCE` (`identityFromConfig` → mode `redirect`) | `src/adapters/identity/oidcSignIn.ts` | 9.117.0 |
83
+ | signing people in with their Windows password against plain Active Directory (no federation server) — LDAPS only, the empty password refused before the bind, RFC 4532 Who-am-I then exactly one entry (the rename collision closed), the id = objectGUID, a nested required group, one answer for every wrong credential, limits from AD's lockout threshold (a third per ACCOUNT via `PasswordChecker.budgetKey`, reset from the LAST failure; threshold 1–2 refused unless overridden), the MFA bypass stated — PENDING INDEPENDENT REVIEW | `directoryPasswords` + `ldapDirectory` + `IDENTITY_STRATEGY=directory-password` (`IDENTITY_LDAP_*`) | `src/adapters/identity/directory/` | 9.117.0 |
84
+ | trusting a company login proxy (oauth2-proxy, mod_auth_openidc, Pomerium) only as far as the signed ACCESS token it forwards — verified with a literal issuer and a JWKS URL (no discovery, no redirects), the person test and the proxy's client check; an ID token refused; the door guard required because the proxy's cookie rides along on forged requests | `proxyTokenChoice` + `IDENTITY_PROXY_TOKEN` + `IDENTITY_PROXY_HEADER` (strategy `proxy-token` of `identityFromConfig`, mode `proxy`) | `src/adapters/identity/strategies/proxyChoice.ts` | 9.117.0 |
77
85
  | making a caller-supplied id safe for a backend | `encodeIdentityField` | `src/memory/identity/encode.ts` | 9.37.0 |
78
86
  | scoping a skill's tools so they reach the model only while it is active | `toolsFromActiveSkill` + a no-arg posture (default off) + the stamp `autoActivate: 'currentSkill'` (a default, never an override) | `src/core/agent/toolsFromActiveSkill.ts` | 9.36.0 |
79
87
  | subscribing to every event in one domain at once | `DomainWildcard` | `src/events/dispatcher.ts` | 9.4.0 |
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ /**
3
+ * directory/directoryPasswords — the `directory-password` strategy's check:
4
+ * a person types their Windows username and password, and Active Directory
5
+ * says who they are (design §4.5).
6
+ *
7
+ * The steps, in order (the sign-in door around this already applied the door
8
+ * guard, the JSON body, the minimum time and the attempt limits):
9
+ *
10
+ * 1. **An empty password is refused before the directory is touched.** RFC
11
+ * 4513 §5.1.2: a simple bind with a name and an empty password is an
12
+ * UNAUTHENTICATED bind, which a directory may answer as a success.
13
+ * 2. **The username is checked before the bind**: 1–64 characters of
14
+ * `A–Z a–z 0–9 . _ -`, after removing a trailing `@<domain>` or a leading
15
+ * `<NETBIOS>\` only when it is exactly the configured one (people paste
16
+ * their UPN, or type the down-level `CORP\alice`). Anything else — another
17
+ * `@domain` or `OTHER\`, `,`, `=`, parentheses, `*`, a space, a quote,
18
+ * letters outside ASCII (`o'brien`, `mary ann`, `josé` are legal Windows
19
+ * names this door does not take) — never reaches the directory. A password
20
+ * holding a control character never does either (Samba cuts a password at
21
+ * NUL — review idI57 N-7).
22
+ * 3. **Bind as `<name>@<domain>`** with the typed password, over LDAPS only.
23
+ * No service account, so no stored directory secret.
24
+ * 4. **Ask who it authenticated: RFC 4532 Who-am-I**, on the same connection.
25
+ * An empty answer is anonymous and refused (a second guard behind step 1).
26
+ * 5. **Parse the answer**: `u:<NETBIOS>\<sAMAccountName>` (the domain must be
27
+ * the configured NetBIOS domain) or `u:<SID>`. Anything else is refused.
28
+ * 6. **Find EXACTLY ONE entry** for that account under the base DN, by
29
+ * `sAMAccountName` or `objectSid`, every value escaped (RFC 4515). Zero or
30
+ * two is a refusal. The id is THAT entry's `objectGUID` (base64 of its 16
31
+ * bytes) — never re-derived from the typed text.
32
+ * 7. **The required group**, when set: nested membership of that same DN
33
+ * (`LDAP_MATCHING_RULE_IN_CHAIN`), the group DN escaped as a filter value.
34
+ *
35
+ * ── Why Who-am-I (the rename collision, review B-3) ─────────────────────────
36
+ * AD does not authenticate "the object whose name is the typed text". An
37
+ * explicit userPrincipalName beats another object's implicit
38
+ * `sAMAccountName@domain` (MS-ADTS "Simple Authentication"). If Jane's UPN is
39
+ * `jsmith@corp` and a new John's sAMAccountName is `jsmith`, Jane typing
40
+ * `jsmith` and HER password authenticates Jane — and a search for
41
+ * `sAMAccountName=jsmith` finds John. Asking the directory which object it
42
+ * authenticated is the only answer that cannot hand Jane John's conversations.
43
+ *
44
+ * **The attempt budget is kept per ACCOUNT** (`budgetKey`, review idI57 B-1):
45
+ * AD folds case and binds `alice`, `CORP\alice` and `alice@corp` to one
46
+ * object, so the door counts them under one key — lower-cased, prefix and
47
+ * suffix removed, NFC.
48
+ *
49
+ * Every wrong credential — an unknown name, a wrong password, an expired or
50
+ * must-change password (AD sub-codes 52e, 525, 530, 531, 532, 533, 701, 773,
51
+ * 775), a name that fails the pattern, a missing group — is ONE answer
52
+ * (`undefined`). A directory that cannot be reached throws
53
+ * `PasswordCheckUnreachableError` (the door answers 503 and un-counts the
54
+ * attempt); a failure after the bind was sent throws anything else (503, and
55
+ * the attempt stays counted — AD may have counted it). The password is never
56
+ * stored, logged or forwarded.
57
+ */
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.accountFilter = exports.accountBudgetKey = exports.accountName = exports.directoryPasswords = void 0;
60
+ const errors_js_1 = require("../../../hosting/signin/errors.js");
61
+ const port_js_1 = require("./port.js");
62
+ const NAME = /^[A-Za-z0-9._-]{1,64}$/;
63
+ const CONTROL_CHARACTER = /\p{Cc}/u;
64
+ /** One RDN component per comma: `attr=value`, nothing a filter or DN parser would read twice. */
65
+ const BASE_DN = /^[A-Za-z][A-Za-z0-9-]*=[^,=+<>#;\\"()*\p{Cc}]+(?:,\s*[A-Za-z][A-Za-z0-9-]*=[^,=+<>#;\\"()*\p{Cc}]+)*$/u;
66
+ /** LDAP_MATCHING_RULE_IN_CHAIN: nested group membership. */
67
+ const IN_CHAIN = '1.2.840.113556.1.4.1941';
68
+ function directoryPasswords(options) {
69
+ const domain = required(options.domain, 'domain');
70
+ const netbios = required(options.netbiosDomain, 'netbiosDomain').toUpperCase();
71
+ const baseDn = required(options.baseDn, 'baseDn');
72
+ if (!BASE_DN.test(baseDn)) {
73
+ throw new TypeError(`[identity] directoryPasswords: baseDn '${baseDn}' is not a DN (DC=corp,DC=example).`);
74
+ }
75
+ const suffix = `@${domain}`.toLowerCase();
76
+ return {
77
+ strategy: 'directory-password',
78
+ budgetKey: (typed) => accountBudgetKey(typed),
79
+ async check(typed, password) {
80
+ if (password.length === 0 || CONTROL_CHARACTER.test(password))
81
+ return undefined;
82
+ const name = accountName(typed, suffix, netbios);
83
+ if (name === undefined)
84
+ return undefined;
85
+ let session;
86
+ try {
87
+ session = await options.directory.open();
88
+ }
89
+ catch (err) {
90
+ // Opening a session sends nothing (no password has left this process).
91
+ if (err instanceof errors_js_1.PasswordCheckUnreachableError)
92
+ throw err;
93
+ throw new errors_js_1.PasswordCheckUnreachableError('the directory could not be opened', {
94
+ cause: err,
95
+ });
96
+ }
97
+ try {
98
+ return await authenticated(session, name, password);
99
+ }
100
+ finally {
101
+ await session.close().catch(() => undefined);
102
+ }
103
+ },
104
+ };
105
+ async function authenticated(session, name, password) {
106
+ if ((await session.bind(`${name}@${domain}`, password)) !== 'ok')
107
+ return undefined;
108
+ const filter = accountFilter(await session.whoAmI(), netbios);
109
+ if (filter === undefined) {
110
+ options.log?.('[identity] directory-password: Who-am-I did not name an account of this domain');
111
+ return undefined;
112
+ }
113
+ const entries = await session.search(baseDn, filter, 'sub');
114
+ if (entries.length !== 1) {
115
+ options.log?.(`[identity] directory-password: ${entries.length} entries matched the authenticated account`);
116
+ return undefined;
117
+ }
118
+ const entry = entries[0];
119
+ if (entry.objectGUID === undefined || entry.objectGUID.length !== 16)
120
+ return undefined;
121
+ if (options.requiredGroup !== undefined) {
122
+ const member = await session.search(entry.dn, `(memberOf:${IN_CHAIN}:=${(0, port_js_1.escapeFilterValue)(options.requiredGroup)})`, 'base');
123
+ if (member.length !== 1)
124
+ return undefined;
125
+ }
126
+ const userId = entry.objectGUID.toString('base64');
127
+ return {
128
+ identity: { userId },
129
+ ...(entry.displayName !== undefined &&
130
+ entry.displayName.length > 0 && {
131
+ displayName: entry.displayName,
132
+ }),
133
+ };
134
+ }
135
+ }
136
+ exports.directoryPasswords = directoryPasswords;
137
+ /**
138
+ * The account name to bind as, or `undefined` for a name that never reaches
139
+ * the directory. A trailing `@<domain>` and a leading `<NETBIOS>\` are
140
+ * removed only when they are exactly the configured ones.
141
+ */
142
+ function accountName(typed, domainSuffix, netbiosDomain) {
143
+ let name = typed.trim();
144
+ if (name.toLowerCase().endsWith(domainSuffix))
145
+ name = name.slice(0, -domainSuffix.length);
146
+ const slash = name.indexOf('\\');
147
+ if (slash > 0 && netbiosDomain !== undefined) {
148
+ if (name.slice(0, slash).toUpperCase() === netbiosDomain.toUpperCase()) {
149
+ name = name.slice(slash + 1);
150
+ }
151
+ }
152
+ return NAME.test(name) ? name : undefined;
153
+ }
154
+ exports.accountName = accountName;
155
+ /**
156
+ * The key a typed name's attempts are counted under — the ACCOUNT, as AD
157
+ * resolves it: lower-cased (AD names are case-insensitive), ANY `@suffix` and
158
+ * ANY `DOMAIN\` prefix removed, NFC. Deliberately wider than `accountName`: a
159
+ * spelling that never binds still shares the account's budget, so no spelling
160
+ * buys a fresh one (review idI57 B-1).
161
+ */
162
+ function accountBudgetKey(typed) {
163
+ let key = typed.trim().toLowerCase();
164
+ const slash = key.lastIndexOf('\\');
165
+ if (slash >= 0)
166
+ key = key.slice(slash + 1);
167
+ const at = key.indexOf('@');
168
+ if (at >= 0)
169
+ key = key.slice(0, at);
170
+ return key.trim().normalize('NFC');
171
+ }
172
+ exports.accountBudgetKey = accountBudgetKey;
173
+ /**
174
+ * Who-am-I's answer → the filter for exactly that account, or `undefined`.
175
+ * `u:CORP\alice` → `(sAMAccountName=alice)` (the domain must be ours);
176
+ * `u:S-1-5-21-…` → `(objectSid=<bytes>)`; anything else (empty = anonymous,
177
+ * `dn:` = AD LDS) is refused.
178
+ */
179
+ function accountFilter(authzId, netbiosDomain) {
180
+ if (!authzId.startsWith('u:'))
181
+ return undefined;
182
+ const who = authzId.slice(2);
183
+ const sid = (0, port_js_1.sidToBytes)(who);
184
+ if (sid !== undefined)
185
+ return `(&(objectClass=user)(objectSid=${(0, port_js_1.escapeFilterValue)(sid)}))`;
186
+ const slash = who.indexOf('\\');
187
+ if (slash <= 0)
188
+ return undefined;
189
+ if (who.slice(0, slash).toUpperCase() !== netbiosDomain.toUpperCase())
190
+ return undefined;
191
+ const sam = who.slice(slash + 1);
192
+ if (sam.length === 0)
193
+ return undefined;
194
+ return `(&(objectClass=user)(sAMAccountName=${(0, port_js_1.escapeFilterValue)(sam)}))`;
195
+ }
196
+ exports.accountFilter = accountFilter;
197
+ function required(value, name) {
198
+ if (typeof value !== 'string' || value.trim().length === 0) {
199
+ throw new TypeError(`[identity] directoryPasswords: ${name} is required.`);
200
+ }
201
+ return value.trim();
202
+ }
203
+ //# sourceMappingURL=directoryPasswords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directoryPasswords.js","sourceRoot":"","sources":["../../../../src/adapters/identity/directory/directoryPasswords.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ /**
3
+ * directory/ldapDirectory — the {@link Directory} port over LDAPS, through
4
+ * `ldapts` (an optional peer, loaded lazily — the `jose` precedent).
5
+ *
6
+ * LDAPS only: `ldap://` would send the password in the clear on the bind, and
7
+ * StartTLS needs the same DC certificate LDAPS does, so refusing it loses
8
+ * nothing real. The certificate chain is checked against the CA the operator
9
+ * supplies (`caPem`) and the host name against the URL — there is no switch to
10
+ * skip either.
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.caPemProblem = exports.ldapDirectory = exports.MissingLdaptsError = void 0;
37
+ const node_crypto_1 = require("node:crypto");
38
+ const node_tls_1 = require("node:tls");
39
+ const errors_js_1 = require("../../../hosting/signin/errors.js");
40
+ const lazyRequire_js_1 = require("../../../lib/lazyRequire.js");
41
+ /** Raised when `directory-password` is configured and `ldapts` is not installed. */
42
+ class MissingLdaptsError extends Error {
43
+ code = 'ERR_MISSING_LDAPTS';
44
+ constructor() {
45
+ super('directory-password requires the `ldapts` peer dependency.\n Install: npm install ldapts');
46
+ this.name = 'MissingLdaptsError';
47
+ }
48
+ }
49
+ exports.MissingLdaptsError = MissingLdaptsError;
50
+ /** RFC 4532 "Who am I?" extended operation. */
51
+ const WHO_AM_I = '1.3.6.1.4.1.4203.1.11.3';
52
+ /** LDAP result code 49: invalidCredentials — every wrong credential. */
53
+ const INVALID_CREDENTIALS = 49;
54
+ function ldapDirectory(options) {
55
+ let url;
56
+ try {
57
+ url = new URL(options.url);
58
+ }
59
+ catch {
60
+ throw new TypeError(`[identity] ldapDirectory: '${options.url}' is not an ldaps:// URL.`);
61
+ }
62
+ if (url.protocol !== 'ldaps:') {
63
+ throw new TypeError(`[identity] ldapDirectory: '${options.url}' is not ldaps://. A bind over plain LDAP sends ` +
64
+ `the password in the clear; use LDAPS (port 636) with the company CA.`);
65
+ }
66
+ const caProblem = caPemProblem(options.caPem);
67
+ if (caProblem !== undefined)
68
+ throw new TypeError(`[identity] ldapDirectory: ${caProblem}.`);
69
+ const timeout = options.timeoutMs ?? 5_000;
70
+ let lib = options.backend;
71
+ return {
72
+ async open() {
73
+ lib ??= await loadLdapts();
74
+ // Whether the TLS connection OPENED — the one bit that says whether a
75
+ // failed bind could have reached the DC (review idI57 S-6).
76
+ let reached = false;
77
+ const client = new lib.Client({
78
+ url: options.url,
79
+ timeout,
80
+ connectTimeout: timeout,
81
+ tlsOptions: { ca: [options.caPem], minVersion: 'TLSv1.2', rejectUnauthorized: true },
82
+ createSecureConnection: (port, host, tls) => {
83
+ const socket = (0, node_tls_1.connect)(port, host, tls);
84
+ socket.once('secureConnect', () => {
85
+ reached = true;
86
+ });
87
+ return socket;
88
+ },
89
+ });
90
+ return {
91
+ async bind(name, password) {
92
+ try {
93
+ await client.bind(name, password);
94
+ return 'ok';
95
+ }
96
+ catch (err) {
97
+ if (err?.code === INVALID_CREDENTIALS) {
98
+ const sub = /data ([0-9a-f]{3,4})/i.exec(String(err.message))?.[1];
99
+ options.log?.(`[identity] directory bind refused${sub ? ` (AD sub-code ${sub})` : ''}`);
100
+ return 'invalid';
101
+ }
102
+ // Never connected (refused, unreachable, a TLS failure): the
103
+ // password never left, so the attempt is un-counted. Connected,
104
+ // then failed (a bind that timed out): AD may have counted it,
105
+ // so the error stays an ordinary one and the door counts it.
106
+ if (!reached) {
107
+ options.log?.('[identity] directory unreachable (no TLS connection opened)');
108
+ throw new errors_js_1.PasswordCheckUnreachableError('the directory could not be reached', {
109
+ cause: err,
110
+ });
111
+ }
112
+ options.log?.('[identity] directory bind failed after it was sent (counted)');
113
+ throw err;
114
+ }
115
+ },
116
+ async whoAmI() {
117
+ const answer = await client.exop(WHO_AM_I);
118
+ return typeof answer.value === 'string' ? answer.value : '';
119
+ },
120
+ async search(base, filter, scope) {
121
+ const found = await client.search(base, {
122
+ scope,
123
+ filter,
124
+ attributes: ['objectGUID', 'displayName'],
125
+ explicitBufferAttributes: ['objectGUID'],
126
+ sizeLimit: 2,
127
+ });
128
+ return found.searchEntries.map(toEntry);
129
+ },
130
+ async close() {
131
+ await client.unbind();
132
+ },
133
+ };
134
+ },
135
+ };
136
+ }
137
+ exports.ldapDirectory = ldapDirectory;
138
+ /**
139
+ * Why a CA file is not one, or `undefined`: every PEM block must parse as an
140
+ * X.509 certificate with the CA flag set (review idI57 N-10 — a leaf
141
+ * certificate booted, then failed every sign-in).
142
+ */
143
+ function caPemProblem(caPem) {
144
+ if (typeof caPem !== 'string')
145
+ return 'caPem must be a PEM CA certificate';
146
+ const blocks = caPem.match(/-----BEGIN CERTIFICATE-----[\s\S]+?-----END CERTIFICATE-----/g);
147
+ if (blocks === null)
148
+ return 'caPem must be a PEM CA certificate';
149
+ for (const block of blocks) {
150
+ let cert;
151
+ try {
152
+ cert = new node_crypto_1.X509Certificate(block);
153
+ }
154
+ catch {
155
+ return 'caPem holds a block that is not an X.509 certificate';
156
+ }
157
+ if (!cert.ca) {
158
+ return `caPem holds a certificate that is not a CA (${cert.subject.replace(/\n/g, ', ')}); give the CA that issued the DC's certificate`;
159
+ }
160
+ }
161
+ return undefined;
162
+ }
163
+ exports.caPemProblem = caPemProblem;
164
+ function toEntry(raw) {
165
+ const guid = raw.objectGUID;
166
+ const name = raw.displayName;
167
+ return {
168
+ dn: String(raw.dn ?? ''),
169
+ ...(Buffer.isBuffer(guid) && { objectGUID: guid }),
170
+ ...(typeof name === 'string' && { displayName: name }),
171
+ };
172
+ }
173
+ async function loadLdapts() {
174
+ try {
175
+ const spec = 'ldapts';
176
+ return (await Promise.resolve(`${spec}`).then(s => __importStar(require(s))));
177
+ }
178
+ catch {
179
+ try {
180
+ return (0, lazyRequire_js_1.lazyRequire)('ldapts');
181
+ }
182
+ catch {
183
+ throw new MissingLdaptsError();
184
+ }
185
+ }
186
+ }
187
+ //# sourceMappingURL=ldapDirectory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ldapDirectory.js","sourceRoot":"","sources":["../../../../src/adapters/identity/directory/ldapDirectory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * directory/port — the four directory operations `directory-password` needs,
4
+ * as a port, so the rules run over a fake directory in tests and over LDAPS
5
+ * (`ldapDirectory`, through `ldapts`) in a deployment.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.sidToBytes = exports.escapeFilterValue = void 0;
9
+ /**
10
+ * RFC 4515 §3: escape a value for an LDAP search filter. A string escapes `*`,
11
+ * `(`, `)`, `\` and NUL (and every non-ASCII byte, so nothing depends on how a
12
+ * server reads UTF-8 in a filter); bytes are escaped whole.
13
+ */
14
+ function escapeFilterValue(value) {
15
+ const bytes = typeof value === 'string' ? Buffer.from(value, 'utf8') : value;
16
+ let out = '';
17
+ for (const byte of bytes) {
18
+ const plain = byte >= 0x20 &&
19
+ byte < 0x7f &&
20
+ byte !== 0x2a &&
21
+ byte !== 0x28 &&
22
+ byte !== 0x29 &&
23
+ byte !== 0x5c;
24
+ out += plain ? String.fromCharCode(byte) : `\\${byte.toString(16).padStart(2, '0')}`;
25
+ }
26
+ return out;
27
+ }
28
+ exports.escapeFilterValue = escapeFilterValue;
29
+ /**
30
+ * A SID in SDDL string form (`S-1-5-21-…-1104`) as the binary `objectSid` a
31
+ * filter compares, or `undefined` when it is not one.
32
+ */
33
+ function sidToBytes(sid) {
34
+ const parts = /^S-1-(\d+)((?:-\d+){0,15})$/.exec(sid);
35
+ if (parts === null)
36
+ return undefined;
37
+ const authority = BigInt(parts[1]);
38
+ const subs = parts[2]
39
+ .split('-')
40
+ .filter((p) => p.length > 0)
41
+ .map(Number);
42
+ if (authority >= 2n ** 48n || subs.some((n) => !Number.isInteger(n) || n < 0 || n > 0xffffffff)) {
43
+ return undefined;
44
+ }
45
+ const out = Buffer.alloc(8 + subs.length * 4);
46
+ out[0] = 1;
47
+ out[1] = subs.length;
48
+ for (let i = 0; i < 6; i += 1)
49
+ out[2 + i] = Number((authority >> BigInt(8 * (5 - i))) & 0xffn);
50
+ subs.forEach((n, i) => out.writeUInt32LE(n, 8 + i * 4));
51
+ return out;
52
+ }
53
+ exports.sidToBytes = sidToBytes;
54
+ //# sourceMappingURL=port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.js","sourceRoot":"","sources":["../../../../src/adapters/identity/directory/port.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AA6BH;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,KAAsB;IACtD,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7E,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GACT,IAAI,IAAI,IAAI;YACZ,IAAI,GAAG,IAAI;YACX,IAAI,KAAK,IAAI;YACb,IAAI,KAAK,IAAI;YACb,IAAI,KAAK,IAAI;YACb,IAAI,KAAK,IAAI,CAAC;QAChB,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACvF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAdD,8CAcC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAW,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAI,KAAK,CAAC,CAAC,CAAY;SAC9B,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,GAAG,CAAC,MAAM,CAAC,CAAC;IACf,IAAI,SAAS,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;QAChG,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACX,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC/F,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,GAAG,CAAC;AACb,CAAC;AAjBD,gCAiBC"}