@smthrs/control 0.0.0-stage → 1.0.0-rc.4

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 (418) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/LICENSE +21 -0
  3. package/README.md +168 -2
  4. package/dist/cjs/ApprovalAuthority.d.ts +73 -0
  5. package/dist/cjs/ApprovalAuthority.d.ts.map +1 -0
  6. package/dist/cjs/ApprovalAuthority.js +62 -0
  7. package/dist/cjs/ApprovalAuthority.js.map +7 -0
  8. package/dist/cjs/Cancellation.d.ts +107 -0
  9. package/dist/cjs/Cancellation.d.ts.map +1 -0
  10. package/dist/cjs/Cancellation.js +72 -0
  11. package/dist/cjs/Cancellation.js.map +7 -0
  12. package/dist/cjs/Channels.d.ts +170 -0
  13. package/dist/cjs/Channels.d.ts.map +1 -0
  14. package/dist/cjs/Channels.js +278 -0
  15. package/dist/cjs/Channels.js.map +7 -0
  16. package/dist/cjs/Control.d.ts +202 -0
  17. package/dist/cjs/Control.d.ts.map +1 -0
  18. package/dist/cjs/Control.js +47 -0
  19. package/dist/cjs/Control.js.map +7 -0
  20. package/dist/cjs/ControlClient.d.ts +52 -0
  21. package/dist/cjs/ControlClient.d.ts.map +1 -0
  22. package/dist/cjs/ControlClient.js +191 -0
  23. package/dist/cjs/ControlClient.js.map +7 -0
  24. package/dist/cjs/ControlError.d.ts +318 -0
  25. package/dist/cjs/ControlError.d.ts.map +1 -0
  26. package/dist/cjs/ControlError.js +249 -0
  27. package/dist/cjs/ControlError.js.map +7 -0
  28. package/dist/cjs/ControlExecutor.d.ts +372 -0
  29. package/dist/cjs/ControlExecutor.d.ts.map +1 -0
  30. package/dist/cjs/ControlExecutor.js +123 -0
  31. package/dist/cjs/ControlExecutor.js.map +7 -0
  32. package/dist/cjs/ControlFacts.d.ts +454 -0
  33. package/dist/cjs/ControlFacts.d.ts.map +1 -0
  34. package/dist/cjs/ControlFacts.js +261 -0
  35. package/dist/cjs/ControlFacts.js.map +7 -0
  36. package/dist/cjs/ControlLive.d.ts +23 -0
  37. package/dist/cjs/ControlLive.d.ts.map +1 -0
  38. package/dist/cjs/ControlLive.js +1293 -0
  39. package/dist/cjs/ControlLive.js.map +7 -0
  40. package/dist/cjs/ControlRpcs.d.ts +1204 -0
  41. package/dist/cjs/ControlRpcs.d.ts.map +1 -0
  42. package/dist/cjs/ControlRpcs.js +247 -0
  43. package/dist/cjs/ControlRpcs.js.map +7 -0
  44. package/dist/cjs/ControlRuntime.d.ts +635 -0
  45. package/dist/cjs/ControlRuntime.d.ts.map +1 -0
  46. package/dist/cjs/ControlRuntime.js +744 -0
  47. package/dist/cjs/ControlRuntime.js.map +7 -0
  48. package/dist/cjs/ControlSchema.d.ts +2642 -0
  49. package/dist/cjs/ControlSchema.d.ts.map +1 -0
  50. package/dist/cjs/ControlSchema.js +634 -0
  51. package/dist/cjs/ControlSchema.js.map +7 -0
  52. package/dist/cjs/ControlServer.d.ts +51 -0
  53. package/dist/cjs/ControlServer.d.ts.map +1 -0
  54. package/dist/cjs/ControlServer.js +121 -0
  55. package/dist/cjs/ControlServer.js.map +7 -0
  56. package/dist/cjs/Credential.d.ts +136 -0
  57. package/dist/cjs/Credential.d.ts.map +1 -0
  58. package/dist/cjs/Credential.js +168 -0
  59. package/dist/cjs/Credential.js.map +7 -0
  60. package/dist/cjs/CredentialCipher.d.ts +90 -0
  61. package/dist/cjs/CredentialCipher.d.ts.map +1 -0
  62. package/dist/cjs/CredentialCipher.js +45 -0
  63. package/dist/cjs/CredentialCipher.js.map +7 -0
  64. package/dist/cjs/CredentialStore.d.ts +97 -0
  65. package/dist/cjs/CredentialStore.d.ts.map +1 -0
  66. package/dist/cjs/CredentialStore.js +81 -0
  67. package/dist/cjs/CredentialStore.js.map +7 -0
  68. package/dist/cjs/DispatchReader.d.ts +112 -0
  69. package/dist/cjs/DispatchReader.d.ts.map +1 -0
  70. package/dist/cjs/DispatchReader.js +45 -0
  71. package/dist/cjs/DispatchReader.js.map +7 -0
  72. package/dist/cjs/Health.d.ts +333 -0
  73. package/dist/cjs/Health.d.ts.map +1 -0
  74. package/dist/cjs/Health.js +311 -0
  75. package/dist/cjs/Health.js.map +7 -0
  76. package/dist/cjs/JevSessionChecker.d.ts +57 -0
  77. package/dist/cjs/JevSessionChecker.d.ts.map +1 -0
  78. package/dist/cjs/JevSessionChecker.js +113 -0
  79. package/dist/cjs/JevSessionChecker.js.map +7 -0
  80. package/dist/cjs/Lineage.d.ts +131 -0
  81. package/dist/cjs/Lineage.d.ts.map +1 -0
  82. package/dist/cjs/Lineage.js +81 -0
  83. package/dist/cjs/Lineage.js.map +7 -0
  84. package/dist/cjs/Migrations.d.ts +34 -0
  85. package/dist/cjs/Migrations.d.ts.map +1 -0
  86. package/dist/cjs/Migrations.js +60 -0
  87. package/dist/cjs/Migrations.js.map +7 -0
  88. package/dist/cjs/Monitor.d.ts +282 -0
  89. package/dist/cjs/Monitor.d.ts.map +1 -0
  90. package/dist/cjs/Monitor.js +283 -0
  91. package/dist/cjs/Monitor.js.map +7 -0
  92. package/dist/cjs/ScopedToken.d.ts +193 -0
  93. package/dist/cjs/ScopedToken.d.ts.map +1 -0
  94. package/dist/cjs/ScopedToken.js +135 -0
  95. package/dist/cjs/ScopedToken.js.map +7 -0
  96. package/dist/cjs/SqlControlRuntime.d.ts +161 -0
  97. package/dist/cjs/SqlControlRuntime.d.ts.map +1 -0
  98. package/dist/cjs/SqlControlRuntime.js +1522 -0
  99. package/dist/cjs/SqlControlRuntime.js.map +7 -0
  100. package/dist/cjs/SqlCredentialStore.d.ts +43 -0
  101. package/dist/cjs/SqlCredentialStore.d.ts.map +1 -0
  102. package/dist/cjs/SqlCredentialStore.js +113 -0
  103. package/dist/cjs/SqlCredentialStore.js.map +7 -0
  104. package/dist/cjs/Steering.d.ts +69 -0
  105. package/dist/cjs/Steering.d.ts.map +1 -0
  106. package/dist/cjs/Steering.js +49 -0
  107. package/dist/cjs/Steering.js.map +7 -0
  108. package/dist/cjs/SystemFlows.d.ts +223 -0
  109. package/dist/cjs/SystemFlows.d.ts.map +1 -0
  110. package/dist/cjs/SystemFlows.js +195 -0
  111. package/dist/cjs/SystemFlows.js.map +7 -0
  112. package/dist/cjs/WebCryptoCipher.d.ts +49 -0
  113. package/dist/cjs/WebCryptoCipher.d.ts.map +1 -0
  114. package/dist/cjs/WebCryptoCipher.js +129 -0
  115. package/dist/cjs/WebCryptoCipher.js.map +7 -0
  116. package/dist/cjs/WebhookChannel.d.ts +113 -0
  117. package/dist/cjs/WebhookChannel.d.ts.map +1 -0
  118. package/dist/cjs/WebhookChannel.js +98 -0
  119. package/dist/cjs/WebhookChannel.js.map +7 -0
  120. package/dist/cjs/index.d.ts +160 -0
  121. package/dist/cjs/index.d.ts.map +1 -0
  122. package/dist/cjs/index.js +91 -0
  123. package/dist/cjs/index.js.map +7 -0
  124. package/dist/cjs/internal/MutationBoundary.d.ts +27 -0
  125. package/dist/cjs/internal/MutationBoundary.d.ts.map +1 -0
  126. package/dist/cjs/internal/MutationBoundary.js +50 -0
  127. package/dist/cjs/internal/MutationBoundary.js.map +7 -0
  128. package/dist/cjs/internal/activeFibers.d.ts +12 -0
  129. package/dist/cjs/internal/activeFibers.d.ts.map +1 -0
  130. package/dist/cjs/internal/activeFibers.js +30 -0
  131. package/dist/cjs/internal/activeFibers.js.map +7 -0
  132. package/dist/cjs/internal/issues.d.ts +28 -0
  133. package/dist/cjs/internal/issues.d.ts.map +1 -0
  134. package/dist/cjs/internal/issues.js +34 -0
  135. package/dist/cjs/internal/issues.js.map +7 -0
  136. package/dist/cjs/internal/planning.d.ts +347 -0
  137. package/dist/cjs/internal/planning.d.ts.map +1 -0
  138. package/dist/cjs/internal/planning.js +137 -0
  139. package/dist/cjs/internal/planning.js.map +7 -0
  140. package/dist/cjs/internal/sqlSchemaErrors.d.ts +18 -0
  141. package/dist/cjs/internal/sqlSchemaErrors.d.ts.map +1 -0
  142. package/dist/cjs/internal/sqlSchemaErrors.js +40 -0
  143. package/dist/cjs/internal/sqlSchemaErrors.js.map +7 -0
  144. package/dist/cjs/migrations/0001_control_tables.d.ts +18 -0
  145. package/dist/cjs/migrations/0001_control_tables.d.ts.map +1 -0
  146. package/dist/cjs/migrations/0001_control_tables.js +115 -0
  147. package/dist/cjs/migrations/0001_control_tables.js.map +7 -0
  148. package/dist/cjs/migrations/0002_run_keys.d.ts +15 -0
  149. package/dist/cjs/migrations/0002_run_keys.d.ts.map +1 -0
  150. package/dist/cjs/migrations/0002_run_keys.js +44 -0
  151. package/dist/cjs/migrations/0002_run_keys.js.map +7 -0
  152. package/dist/cjs/migrations/0003_signal_commands.d.ts +13 -0
  153. package/dist/cjs/migrations/0003_signal_commands.d.ts.map +1 -0
  154. package/dist/cjs/migrations/0003_signal_commands.js +50 -0
  155. package/dist/cjs/migrations/0003_signal_commands.js.map +7 -0
  156. package/dist/cjs/migrations/0004_approval_decisions.d.ts +13 -0
  157. package/dist/cjs/migrations/0004_approval_decisions.d.ts.map +1 -0
  158. package/dist/cjs/migrations/0004_approval_decisions.js +45 -0
  159. package/dist/cjs/migrations/0004_approval_decisions.js.map +7 -0
  160. package/dist/cjs/migrations/0005_signal_principals.d.ts +18 -0
  161. package/dist/cjs/migrations/0005_signal_principals.d.ts.map +1 -0
  162. package/dist/cjs/migrations/0005_signal_principals.js +45 -0
  163. package/dist/cjs/migrations/0005_signal_principals.js.map +7 -0
  164. package/dist/cjs/migrations/0006_run_principals.d.ts +18 -0
  165. package/dist/cjs/migrations/0006_run_principals.d.ts.map +1 -0
  166. package/dist/cjs/migrations/0006_run_principals.js +49 -0
  167. package/dist/cjs/migrations/0006_run_principals.js.map +7 -0
  168. package/dist/cjs/migrations/0007_resume_consent.d.ts +18 -0
  169. package/dist/cjs/migrations/0007_resume_consent.d.ts.map +1 -0
  170. package/dist/cjs/migrations/0007_resume_consent.js +46 -0
  171. package/dist/cjs/migrations/0007_resume_consent.js.map +7 -0
  172. package/dist/cjs/package.json +1 -0
  173. package/dist/cjs/test/TestControl.d.ts +19 -0
  174. package/dist/cjs/test/TestControl.d.ts.map +1 -0
  175. package/dist/cjs/test/TestControl.js +62 -0
  176. package/dist/cjs/test/TestControl.js.map +7 -0
  177. package/dist/esm/ApprovalAuthority.d.ts +73 -0
  178. package/dist/esm/ApprovalAuthority.d.ts.map +1 -0
  179. package/dist/esm/ApprovalAuthority.js +72 -0
  180. package/dist/esm/ApprovalAuthority.js.map +1 -0
  181. package/dist/esm/Cancellation.d.ts +107 -0
  182. package/dist/esm/Cancellation.d.ts.map +1 -0
  183. package/dist/esm/Cancellation.js +116 -0
  184. package/dist/esm/Cancellation.js.map +1 -0
  185. package/dist/esm/Channels.d.ts +170 -0
  186. package/dist/esm/Channels.d.ts.map +1 -0
  187. package/dist/esm/Channels.js +312 -0
  188. package/dist/esm/Channels.js.map +1 -0
  189. package/dist/esm/Control.d.ts +202 -0
  190. package/dist/esm/Control.d.ts.map +1 -0
  191. package/dist/esm/Control.js +42 -0
  192. package/dist/esm/Control.js.map +1 -0
  193. package/dist/esm/ControlClient.d.ts +52 -0
  194. package/dist/esm/ControlClient.d.ts.map +1 -0
  195. package/dist/esm/ControlClient.js +217 -0
  196. package/dist/esm/ControlClient.js.map +1 -0
  197. package/dist/esm/ControlError.d.ts +318 -0
  198. package/dist/esm/ControlError.d.ts.map +1 -0
  199. package/dist/esm/ControlError.js +359 -0
  200. package/dist/esm/ControlError.js.map +1 -0
  201. package/dist/esm/ControlExecutor.d.ts +372 -0
  202. package/dist/esm/ControlExecutor.d.ts.map +1 -0
  203. package/dist/esm/ControlExecutor.js +212 -0
  204. package/dist/esm/ControlExecutor.js.map +1 -0
  205. package/dist/esm/ControlFacts.d.ts +454 -0
  206. package/dist/esm/ControlFacts.d.ts.map +1 -0
  207. package/dist/esm/ControlFacts.js +324 -0
  208. package/dist/esm/ControlFacts.js.map +1 -0
  209. package/dist/esm/ControlLive.d.ts +23 -0
  210. package/dist/esm/ControlLive.d.ts.map +1 -0
  211. package/dist/esm/ControlLive.js +1589 -0
  212. package/dist/esm/ControlLive.js.map +1 -0
  213. package/dist/esm/ControlRpcs.d.ts +1204 -0
  214. package/dist/esm/ControlRpcs.d.ts.map +1 -0
  215. package/dist/esm/ControlRpcs.js +299 -0
  216. package/dist/esm/ControlRpcs.js.map +1 -0
  217. package/dist/esm/ControlRuntime.d.ts +635 -0
  218. package/dist/esm/ControlRuntime.d.ts.map +1 -0
  219. package/dist/esm/ControlRuntime.js +808 -0
  220. package/dist/esm/ControlRuntime.js.map +1 -0
  221. package/dist/esm/ControlSchema.d.ts +2642 -0
  222. package/dist/esm/ControlSchema.d.ts.map +1 -0
  223. package/dist/esm/ControlSchema.js +1030 -0
  224. package/dist/esm/ControlSchema.js.map +1 -0
  225. package/dist/esm/ControlServer.d.ts +51 -0
  226. package/dist/esm/ControlServer.d.ts.map +1 -0
  227. package/dist/esm/ControlServer.js +145 -0
  228. package/dist/esm/ControlServer.js.map +1 -0
  229. package/dist/esm/Credential.d.ts +136 -0
  230. package/dist/esm/Credential.d.ts.map +1 -0
  231. package/dist/esm/Credential.js +190 -0
  232. package/dist/esm/Credential.js.map +1 -0
  233. package/dist/esm/CredentialCipher.d.ts +90 -0
  234. package/dist/esm/CredentialCipher.d.ts.map +1 -0
  235. package/dist/esm/CredentialCipher.js +56 -0
  236. package/dist/esm/CredentialCipher.js.map +1 -0
  237. package/dist/esm/CredentialStore.d.ts +97 -0
  238. package/dist/esm/CredentialStore.d.ts.map +1 -0
  239. package/dist/esm/CredentialStore.js +101 -0
  240. package/dist/esm/CredentialStore.js.map +1 -0
  241. package/dist/esm/DispatchReader.d.ts +112 -0
  242. package/dist/esm/DispatchReader.d.ts.map +1 -0
  243. package/dist/esm/DispatchReader.js +76 -0
  244. package/dist/esm/DispatchReader.js.map +1 -0
  245. package/dist/esm/Health.d.ts +333 -0
  246. package/dist/esm/Health.d.ts.map +1 -0
  247. package/dist/esm/Health.js +400 -0
  248. package/dist/esm/Health.js.map +1 -0
  249. package/dist/esm/JevSessionChecker.d.ts +57 -0
  250. package/dist/esm/JevSessionChecker.d.ts.map +1 -0
  251. package/dist/esm/JevSessionChecker.js +108 -0
  252. package/dist/esm/JevSessionChecker.js.map +1 -0
  253. package/dist/esm/Lineage.d.ts +131 -0
  254. package/dist/esm/Lineage.d.ts.map +1 -0
  255. package/dist/esm/Lineage.js +174 -0
  256. package/dist/esm/Lineage.js.map +1 -0
  257. package/dist/esm/Migrations.d.ts +34 -0
  258. package/dist/esm/Migrations.d.ts.map +1 -0
  259. package/dist/esm/Migrations.js +53 -0
  260. package/dist/esm/Migrations.js.map +1 -0
  261. package/dist/esm/Monitor.d.ts +282 -0
  262. package/dist/esm/Monitor.d.ts.map +1 -0
  263. package/dist/esm/Monitor.js +415 -0
  264. package/dist/esm/Monitor.js.map +1 -0
  265. package/dist/esm/ScopedToken.d.ts +193 -0
  266. package/dist/esm/ScopedToken.d.ts.map +1 -0
  267. package/dist/esm/ScopedToken.js +224 -0
  268. package/dist/esm/ScopedToken.js.map +1 -0
  269. package/dist/esm/SqlControlRuntime.d.ts +161 -0
  270. package/dist/esm/SqlControlRuntime.d.ts.map +1 -0
  271. package/dist/esm/SqlControlRuntime.js +1756 -0
  272. package/dist/esm/SqlControlRuntime.js.map +1 -0
  273. package/dist/esm/SqlCredentialStore.d.ts +43 -0
  274. package/dist/esm/SqlCredentialStore.d.ts.map +1 -0
  275. package/dist/esm/SqlCredentialStore.js +97 -0
  276. package/dist/esm/SqlCredentialStore.js.map +1 -0
  277. package/dist/esm/Steering.d.ts +69 -0
  278. package/dist/esm/Steering.d.ts.map +1 -0
  279. package/dist/esm/Steering.js +89 -0
  280. package/dist/esm/Steering.js.map +1 -0
  281. package/dist/esm/SystemFlows.d.ts +223 -0
  282. package/dist/esm/SystemFlows.d.ts.map +1 -0
  283. package/dist/esm/SystemFlows.js +198 -0
  284. package/dist/esm/SystemFlows.js.map +1 -0
  285. package/dist/esm/WebCryptoCipher.d.ts +49 -0
  286. package/dist/esm/WebCryptoCipher.d.ts.map +1 -0
  287. package/dist/esm/WebCryptoCipher.js +123 -0
  288. package/dist/esm/WebCryptoCipher.js.map +1 -0
  289. package/dist/esm/WebhookChannel.d.ts +113 -0
  290. package/dist/esm/WebhookChannel.d.ts.map +1 -0
  291. package/dist/esm/WebhookChannel.js +109 -0
  292. package/dist/esm/WebhookChannel.js.map +1 -0
  293. package/dist/esm/index.d.ts +160 -0
  294. package/dist/esm/index.d.ts.map +1 -0
  295. package/dist/esm/index.js +160 -0
  296. package/dist/esm/index.js.map +1 -0
  297. package/dist/esm/internal/MutationBoundary.d.ts +27 -0
  298. package/dist/esm/internal/MutationBoundary.d.ts.map +1 -0
  299. package/dist/esm/internal/MutationBoundary.js +40 -0
  300. package/dist/esm/internal/MutationBoundary.js.map +1 -0
  301. package/dist/esm/internal/activeFibers.d.ts +12 -0
  302. package/dist/esm/internal/activeFibers.d.ts.map +1 -0
  303. package/dist/esm/internal/activeFibers.js +17 -0
  304. package/dist/esm/internal/activeFibers.js.map +1 -0
  305. package/dist/esm/internal/issues.d.ts +28 -0
  306. package/dist/esm/internal/issues.d.ts.map +1 -0
  307. package/dist/esm/internal/issues.js +35 -0
  308. package/dist/esm/internal/issues.js.map +1 -0
  309. package/dist/esm/internal/planning.d.ts +347 -0
  310. package/dist/esm/internal/planning.d.ts.map +1 -0
  311. package/dist/esm/internal/planning.js +199 -0
  312. package/dist/esm/internal/planning.js.map +1 -0
  313. package/dist/esm/internal/sqlSchemaErrors.d.ts +18 -0
  314. package/dist/esm/internal/sqlSchemaErrors.d.ts.map +1 -0
  315. package/dist/esm/internal/sqlSchemaErrors.js +38 -0
  316. package/dist/esm/internal/sqlSchemaErrors.js.map +1 -0
  317. package/dist/esm/migrations/0001_control_tables.d.ts +18 -0
  318. package/dist/esm/migrations/0001_control_tables.d.ts.map +1 -0
  319. package/dist/esm/migrations/0001_control_tables.js +96 -0
  320. package/dist/esm/migrations/0001_control_tables.js.map +1 -0
  321. package/dist/esm/migrations/0002_run_keys.d.ts +15 -0
  322. package/dist/esm/migrations/0002_run_keys.d.ts.map +1 -0
  323. package/dist/esm/migrations/0002_run_keys.js +22 -0
  324. package/dist/esm/migrations/0002_run_keys.js.map +1 -0
  325. package/dist/esm/migrations/0003_signal_commands.d.ts +13 -0
  326. package/dist/esm/migrations/0003_signal_commands.d.ts.map +1 -0
  327. package/dist/esm/migrations/0003_signal_commands.js +26 -0
  328. package/dist/esm/migrations/0003_signal_commands.js.map +1 -0
  329. package/dist/esm/migrations/0004_approval_decisions.d.ts +13 -0
  330. package/dist/esm/migrations/0004_approval_decisions.d.ts.map +1 -0
  331. package/dist/esm/migrations/0004_approval_decisions.js +25 -0
  332. package/dist/esm/migrations/0004_approval_decisions.js.map +1 -0
  333. package/dist/esm/migrations/0005_signal_principals.d.ts +18 -0
  334. package/dist/esm/migrations/0005_signal_principals.d.ts.map +1 -0
  335. package/dist/esm/migrations/0005_signal_principals.js +27 -0
  336. package/dist/esm/migrations/0005_signal_principals.js.map +1 -0
  337. package/dist/esm/migrations/0006_run_principals.d.ts +18 -0
  338. package/dist/esm/migrations/0006_run_principals.d.ts.map +1 -0
  339. package/dist/esm/migrations/0006_run_principals.js +30 -0
  340. package/dist/esm/migrations/0006_run_principals.js.map +1 -0
  341. package/dist/esm/migrations/0007_resume_consent.d.ts +18 -0
  342. package/dist/esm/migrations/0007_resume_consent.d.ts.map +1 -0
  343. package/dist/esm/migrations/0007_resume_consent.js +27 -0
  344. package/dist/esm/migrations/0007_resume_consent.js.map +1 -0
  345. package/dist/esm/test/TestControl.d.ts +19 -0
  346. package/dist/esm/test/TestControl.d.ts.map +1 -0
  347. package/dist/esm/test/TestControl.js +30 -0
  348. package/dist/esm/test/TestControl.js.map +1 -0
  349. package/docs/README.md +189 -0
  350. package/docs/api.md +982 -0
  351. package/docs/concepts/authority.md +109 -0
  352. package/docs/concepts/cancellation.md +129 -0
  353. package/docs/concepts/lineage.md +132 -0
  354. package/docs/concepts/ownership.md +139 -0
  355. package/docs/concepts/projections.md +203 -0
  356. package/docs/concepts/receipts.md +128 -0
  357. package/docs/guides/approvals.md +284 -0
  358. package/docs/guides/cancel-and-resume.md +162 -0
  359. package/docs/guides/durable-storage.md +147 -0
  360. package/docs/guides/implement-an-executor.md +173 -0
  361. package/docs/guides/ingest-a-webhook.md +177 -0
  362. package/docs/guides/list-runs.md +160 -0
  363. package/docs/guides/monitor-runs.md +176 -0
  364. package/docs/guides/observe-health.md +147 -0
  365. package/docs/guides/postgres-tests.md +7 -0
  366. package/docs/guides/serve-over-rpc.md +220 -0
  367. package/docs/guides/signal-a-run.md +53 -0
  368. package/docs/guides/steer-a-run.md +138 -0
  369. package/docs/guides/store-credentials.md +164 -0
  370. package/docs/guides/testing.md +139 -0
  371. package/docs/guides/watch-a-run.md +154 -0
  372. package/docs/installation.md +106 -0
  373. package/docs/quickstart.md +163 -0
  374. package/docs/troubleshooting.md +208 -0
  375. package/package.json +405 -3
  376. package/src/ApprovalAuthority.ts +114 -0
  377. package/src/Cancellation.ts +172 -0
  378. package/src/Channels.ts +493 -0
  379. package/src/Control.ts +337 -0
  380. package/src/ControlClient.ts +319 -0
  381. package/src/ControlError.ts +378 -0
  382. package/src/ControlExecutor.ts +490 -0
  383. package/src/ControlFacts.ts +383 -0
  384. package/src/ControlLive.ts +2127 -0
  385. package/src/ControlRpcs.ts +443 -0
  386. package/src/ControlRuntime.ts +1601 -0
  387. package/src/ControlSchema.ts +1380 -0
  388. package/src/ControlServer.ts +182 -0
  389. package/src/Credential.ts +310 -0
  390. package/src/CredentialCipher.ts +110 -0
  391. package/src/CredentialStore.ts +152 -0
  392. package/src/DispatchReader.ts +122 -0
  393. package/src/Health.ts +591 -0
  394. package/src/JevSessionChecker.ts +127 -0
  395. package/src/Lineage.ts +203 -0
  396. package/src/Migrations.ts +56 -0
  397. package/src/Monitor.ts +600 -0
  398. package/src/ScopedToken.ts +306 -0
  399. package/src/SqlControlRuntime.ts +2478 -0
  400. package/src/SqlCredentialStore.ts +148 -0
  401. package/src/Steering.ts +96 -0
  402. package/src/SystemFlows.ts +225 -0
  403. package/src/WebCryptoCipher.ts +169 -0
  404. package/src/WebhookChannel.ts +166 -0
  405. package/src/index.ts +188 -0
  406. package/src/internal/MutationBoundary.ts +46 -0
  407. package/src/internal/activeFibers.ts +22 -0
  408. package/src/internal/issues.ts +40 -0
  409. package/src/internal/planning.ts +262 -0
  410. package/src/internal/sqlSchemaErrors.ts +37 -0
  411. package/src/migrations/0001_control_tables.ts +99 -0
  412. package/src/migrations/0002_run_keys.ts +23 -0
  413. package/src/migrations/0003_signal_commands.ts +27 -0
  414. package/src/migrations/0004_approval_decisions.ts +25 -0
  415. package/src/migrations/0005_signal_principals.ts +27 -0
  416. package/src/migrations/0006_run_principals.ts +31 -0
  417. package/src/migrations/0007_resume_consent.ts +28 -0
  418. package/src/test/TestControl.ts +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlRpcs.d.ts","sourceRoot":"","sources":["../../src/ControlRpcs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var ControlRpcs_exports = {};
20
+ __export(ControlRpcs_exports, {
21
+ ControlAuth: () => ControlAuth,
22
+ ControlDefect: () => ControlDefect,
23
+ ControlPrincipal: () => ControlPrincipal,
24
+ ControlRpcs: () => ControlRpcs,
25
+ RunVisibility: () => RunVisibility,
26
+ anyAuthenticator: () => anyAuthenticator,
27
+ bearerAuthenticator: () => bearerAuthenticator,
28
+ bearerCredential: () => bearerCredential,
29
+ defectMessage: () => defectMessage,
30
+ layerAuth: () => layerAuth,
31
+ layerBearerAuth: () => layerBearerAuth,
32
+ layerNoopAuth: () => layerNoopAuth
33
+ });
34
+ module.exports = __toCommonJS(ControlRpcs_exports);
35
+ var import_NotificationQueue = require("@smthrs/notifications/NotificationQueue");
36
+ var import_effect = require("effect");
37
+ var import_rpc = require("effect/unstable/rpc");
38
+ var import_ControlError = require("./ControlError.js");
39
+ var import_ControlSchema = require("./ControlSchema.js");
40
+ class ControlPrincipal extends import_effect.Context.Service()(
41
+ "/control/ControlPrincipal"
42
+ ) {
43
+ }
44
+ class ControlAuth extends import_rpc.RpcMiddleware.Service()("/control/ControlAuth", { error: import_ControlError.Unauthorized }) {
45
+ }
46
+ const RunVisibility = import_effect.Context.Reference("/control/RunVisibility", { defaultValue: () => ({ seesAllRuns: () => false }) });
47
+ const defectMessage = "Something went wrong on our side. Not your fault.";
48
+ const ControlDefect = import_effect.Schema.Json.pipe(import_effect.Schema.decodeTo(
49
+ import_effect.Schema.Unknown,
50
+ import_effect.SchemaTransformation.transform({
51
+ decode: import_effect.Schema.decodeSync(import_effect.Schema.Defect()),
52
+ encode: (defect) => typeof defect === "string" ? defect : { name: "Error", message: defectMessage }
53
+ })
54
+ ));
55
+ const mutationErrors = import_effect.Schema.Union([
56
+ import_ControlError.RunNotFound,
57
+ import_ControlError.ClaimLost,
58
+ import_ControlError.InvalidInput,
59
+ import_ControlError.PersistenceError,
60
+ import_ControlError.Unavailable,
61
+ import_ControlError.TransportError,
62
+ import_ControlError.Unauthorized
63
+ ]);
64
+ const resumeErrors = import_effect.Schema.Union([
65
+ import_ControlError.RunNotFound,
66
+ import_ControlError.ClaimLost,
67
+ import_ControlError.CodeDrift,
68
+ import_ControlError.InvalidInput,
69
+ import_ControlError.PersistenceError,
70
+ import_ControlError.Unavailable,
71
+ import_ControlError.TransportError,
72
+ import_ControlError.Unauthorized
73
+ ]);
74
+ const ControlRpcs = import_rpc.RpcGroup.make(
75
+ import_rpc.Rpc.make("Plan", {
76
+ defect: ControlDefect,
77
+ payload: import_ControlSchema.PlanInputSchema,
78
+ success: import_ControlSchema.PlanCard,
79
+ error: import_effect.Schema.Union([import_ControlError.FlowNotFound, import_ControlError.InvalidInput, import_ControlError.PersistenceError, import_ControlError.Unavailable, import_ControlError.TransportError, import_ControlError.Unauthorized])
80
+ }),
81
+ import_rpc.Rpc.make("Run", {
82
+ defect: ControlDefect,
83
+ payload: import_ControlSchema.RunInputSchema,
84
+ success: import_ControlSchema.Receipt,
85
+ error: import_effect.Schema.Union([
86
+ import_ControlError.RunNotFound,
87
+ import_ControlError.PlanNotFound,
88
+ import_ControlError.PlanDenied,
89
+ import_ControlError.PlanDigestMismatch,
90
+ import_ControlError.EnvelopeMismatch,
91
+ import_ControlError.ClaimLost,
92
+ import_ControlError.CodeDrift,
93
+ import_ControlError.InvalidInput,
94
+ import_ControlError.LaunchFailed,
95
+ import_ControlError.PersistenceError,
96
+ import_ControlError.Unavailable,
97
+ import_ControlError.TransportError,
98
+ import_ControlError.Unauthorized
99
+ ])
100
+ }),
101
+ import_rpc.Rpc.make("Approve", {
102
+ defect: ControlDefect,
103
+ payload: import_ControlSchema.ApprovalInputSchema,
104
+ success: import_ControlSchema.Receipt,
105
+ error: import_effect.Schema.Union([
106
+ import_ControlError.PlanDigestMismatch,
107
+ import_ControlError.EnvelopeMismatch,
108
+ import_ControlError.AlreadyResolved,
109
+ import_ControlError.PlanNotFound,
110
+ import_ControlError.RunNotFound,
111
+ import_ControlError.CodeDrift,
112
+ import_ControlError.InvalidInput,
113
+ import_ControlError.Unauthorized,
114
+ import_ControlError.PersistenceError,
115
+ import_ControlError.Unavailable,
116
+ import_ControlError.TransportError
117
+ ])
118
+ }),
119
+ import_rpc.Rpc.make("Deny", {
120
+ defect: ControlDefect,
121
+ payload: import_ControlSchema.ApprovalInputSchema,
122
+ success: import_ControlSchema.Receipt,
123
+ error: import_effect.Schema.Union([
124
+ import_ControlError.PlanDigestMismatch,
125
+ import_ControlError.EnvelopeMismatch,
126
+ import_ControlError.AlreadyResolved,
127
+ import_ControlError.PlanNotFound,
128
+ import_ControlError.RunNotFound,
129
+ import_ControlError.CodeDrift,
130
+ import_ControlError.InvalidInput,
131
+ import_ControlError.Unauthorized,
132
+ import_ControlError.PersistenceError,
133
+ import_ControlError.Unavailable,
134
+ import_ControlError.TransportError
135
+ ])
136
+ }),
137
+ import_rpc.Rpc.make("Steer", {
138
+ defect: ControlDefect,
139
+ payload: import_ControlSchema.SteerInputSchema,
140
+ success: import_ControlSchema.Receipt,
141
+ error: import_effect.Schema.Union([
142
+ import_ControlError.RunNotFound,
143
+ import_ControlError.InvalidInput,
144
+ import_ControlError.PersistenceError,
145
+ import_ControlError.Unavailable,
146
+ import_ControlError.TransportError,
147
+ import_ControlError.Unauthorized,
148
+ import_NotificationQueue.NotificationError
149
+ ])
150
+ }),
151
+ import_rpc.Rpc.make("Signal", {
152
+ defect: ControlDefect,
153
+ payload: import_ControlSchema.SignalInputSchema,
154
+ success: import_ControlSchema.Receipt,
155
+ error: import_effect.Schema.Union([
156
+ import_ControlError.RunNotFound,
157
+ import_ControlError.NoMatchingWait,
158
+ import_ControlError.InvalidInput,
159
+ import_ControlError.PersistenceError,
160
+ import_ControlError.Unavailable,
161
+ import_ControlError.TransportError,
162
+ import_ControlError.Unauthorized
163
+ ])
164
+ }),
165
+ import_rpc.Rpc.make("Cancel", { defect: ControlDefect, payload: import_ControlSchema.CancelInputSchema, success: import_ControlSchema.Receipt, error: mutationErrors }),
166
+ import_rpc.Rpc.make("Resume", {
167
+ defect: ControlDefect,
168
+ payload: import_ControlSchema.ResumeInputSchema,
169
+ success: import_ControlSchema.Receipt,
170
+ error: resumeErrors
171
+ }),
172
+ // `list` and `watch` carry the whole `ControlError` union in their contract,
173
+ // so they name it once rather than restating its members. Two hand-copied
174
+ // lists is how `CredentialConflict` came to be a control error the union did
175
+ // not admit.
176
+ import_rpc.Rpc.make("List", {
177
+ defect: ControlDefect,
178
+ payload: import_ControlSchema.ListRequest,
179
+ success: import_ControlSchema.ListResponse,
180
+ error: import_ControlError.ControlErrorSchema
181
+ }),
182
+ import_rpc.Rpc.make("Watch", {
183
+ defect: ControlDefect,
184
+ payload: import_ControlSchema.WatchFilter,
185
+ success: import_ControlSchema.ControlEvent,
186
+ error: import_ControlError.ControlErrorSchema,
187
+ stream: true
188
+ })
189
+ ).middleware(ControlAuth);
190
+ const authorizationHeader = (headers) => {
191
+ for (const [name, value] of Object.entries(headers)) {
192
+ if (name.toLowerCase() === "authorization") return value;
193
+ }
194
+ return void 0;
195
+ };
196
+ const bearerCredential = (headers) => {
197
+ const authorization = authorizationHeader(headers);
198
+ if (authorization === void 0) return void 0;
199
+ const match = /^Bearer[\t ]+([^\t ]+)$/i.exec(authorization);
200
+ return match?.[1];
201
+ };
202
+ const encoder = new TextEncoder();
203
+ const constantTimeTokenEqual = (expected, actual) => {
204
+ const expectedBytes = encoder.encode(expected);
205
+ const actualBytes = encoder.encode(actual);
206
+ const length = Math.max(expectedBytes.length, actualBytes.length);
207
+ let difference = expectedBytes.length ^ actualBytes.length;
208
+ for (let index = 0; index < length; index++) {
209
+ difference |= (expectedBytes[index] ?? 0) ^ (actualBytes[index] ?? 0);
210
+ }
211
+ return difference === 0;
212
+ };
213
+ const bearerAuthenticator = (options) => ({
214
+ authenticate: (headers) => {
215
+ const credential = bearerCredential(headers);
216
+ return options.token.length > 0 && credential !== void 0 && constantTimeTokenEqual(options.token, credential) ? import_effect.Effect.succeed({
217
+ ...options.principal,
218
+ stampedAt: options.now?.() ?? Date.now()
219
+ }) : import_effect.Effect.fail(new import_ControlError.Unauthorized({ message: "A valid bearer credential is required" }));
220
+ }
221
+ });
222
+ const anyAuthenticator = (authenticators) => ({
223
+ authenticate: (headers, call) => authenticators.reduce(
224
+ (attempt, authenticator) => import_effect.Effect.catchTag(attempt, "/control/Unauthorized", () => authenticator.authenticate(headers, call)),
225
+ import_effect.Effect.fail(new import_ControlError.Unauthorized({ message: "A valid bearer credential is required" }))
226
+ )
227
+ });
228
+ const layerAuth = (authenticator, options = {}) => {
229
+ const visibility = { seesAllRuns: options.seesAllRuns ?? (() => false) };
230
+ return import_effect.Layer.succeed(
231
+ ControlAuth,
232
+ (effect, call) => import_effect.Effect.flatMap(
233
+ authenticator.authenticate(call.headers, { rpc: call.rpc._tag, payload: call.payload }),
234
+ (principal) => effect.pipe(
235
+ import_effect.Effect.provideService(ControlPrincipal, principal),
236
+ import_effect.Effect.provideService(RunVisibility, visibility)
237
+ )
238
+ )
239
+ );
240
+ };
241
+ const layerBearerAuth = (options) => layerAuth(bearerAuthenticator(options), { seesAllRuns: () => true });
242
+ const layerNoopAuth = (principal = {
243
+ id: "test-principal",
244
+ kind: "test",
245
+ stampedAt: 0
246
+ }) => layerAuth({ authenticate: () => import_effect.Effect.succeed(principal) }, { seesAllRuns: () => true });
247
+ //# sourceMappingURL=ControlRpcs.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ControlRpcs.ts"],
4
+ "sourcesContent": ["/**\n * Schema-backed RPC projection of the control service.\n *\n * @since 0.1.0\n */\n\nimport { NotificationError } from \"@smthrs/notifications/NotificationQueue\"\nimport { Context, Effect, Layer, Schema, SchemaTransformation } from \"effect\"\nimport { Rpc, RpcGroup, RpcMiddleware } from \"effect/unstable/rpc\"\nimport {\n AlreadyResolved,\n ClaimLost,\n CodeDrift,\n ControlErrorSchema,\n EnvelopeMismatch,\n FlowNotFound,\n InvalidInput,\n LaunchFailed,\n NoMatchingWait,\n PersistenceError,\n PlanDenied,\n PlanDigestMismatch,\n PlanNotFound,\n RunNotFound,\n TransportError,\n Unauthorized,\n Unavailable\n} from \"./ControlError.ts\"\nimport {\n ApprovalInputSchema,\n CancelInputSchema,\n ControlEvent,\n ListRequest,\n ListResponse,\n PlanCard,\n PlanInputSchema,\n type Principal,\n Receipt,\n ResumeInputSchema,\n RunInputSchema,\n SignalInputSchema,\n SteerInputSchema,\n WatchFilter\n} from \"./ControlSchema.ts\"\n\n/**\n * Authenticated principal made available to control RPC handlers.\n *\n * @category services\n * @since 0.1.0\n */\nexport class ControlPrincipal extends Context.Service<ControlPrincipal, typeof Principal.Type>()(\n \"/control/ControlPrincipal\"\n) {}\n\n/**\n * Middleware boundary that authenticates control RPC requests.\n *\n * @category middleware\n * @since 0.1.0\n */\nexport class ControlAuth extends RpcMiddleware.Service<ControlAuth, {\n provides: ControlPrincipal\n}>()(\"/control/ControlAuth\", { error: Unauthorized }) {}\n\n/**\n * Which authenticated principals read every run.\n *\n * `List` and `Watch` answer a principal this returns `true` for with every\n * run: that principal is an operator. Every other principal reads only the\n * runs it launched (`RunSummary.launchedBy`) and, from `Watch`, only their\n * events. The authentication layer decides, because it is what knows which\n * identities it can stamp: `layerBearerAuth` and `layerNoopAuth` stamp one\n * principal and make it the operator, and `layerAuth` takes the rule as an\n * option. Where nothing provides one, no principal is an operator.\n *\n * @category services\n * @since 1.0.0\n */\nexport const RunVisibility = Context.Reference<{\n readonly seesAllRuns: (principal: typeof Principal.Type) => boolean\n}>(\"/control/RunVisibility\", { defaultValue: () => ({ seesAllRuns: () => false }) })\n\n/**\n * The sentence a client reads when a control handler dies.\n *\n * @category defects\n * @since 1.0.0\n */\nexport const defectMessage = \"Something went wrong on our side. Not your fault.\"\n\n/**\n * Wire schema for a control RPC defect: an untyped failure that no procedure\n * declares.\n *\n * Encoding replaces a defect value (an `Error`, a failure an `orDie` turned\n * into a defect, any non-string value) with `{ name: \"Error\", message }`\n * carrying {@link defectMessage}, so a driver message, path, or stack never\n * reaches a client. The server logs the raw defect. A string passes unchanged:\n * the RPC server's own request-decoding sentence, which describes the caller's\n * payload, is one, and so is an author-written `Effect.die` sentence.\n *\n * Decoding is Effect's default `Schema.Defect()` decoding, so a client reads\n * this shape and an older server's shape alike, and an older client reads this\n * shape as an `Error`.\n *\n * @category defects\n * @since 1.0.0\n */\nexport const ControlDefect = Schema.Json.pipe(Schema.decodeTo(\n Schema.Unknown,\n SchemaTransformation.transform({\n decode: Schema.decodeSync(Schema.Defect()),\n encode: (defect): Schema.Json => typeof defect === \"string\" ? defect : { name: \"Error\", message: defectMessage }\n })\n))\n\nconst mutationErrors = Schema.Union([\n RunNotFound,\n ClaimLost,\n InvalidInput,\n PersistenceError,\n Unavailable,\n TransportError,\n Unauthorized\n])\n\nconst resumeErrors = Schema.Union([\n RunNotFound,\n ClaimLost,\n CodeDrift,\n InvalidInput,\n PersistenceError,\n Unavailable,\n TransportError,\n Unauthorized\n])\n\n/**\n * The ten remote procedures corresponding to `Control` operations.\n *\n * @category groups\n * @since 0.1.0\n */\nexport const ControlRpcs = RpcGroup.make(\n Rpc.make(\"Plan\", {\n defect: ControlDefect,\n payload: PlanInputSchema,\n success: PlanCard,\n error: Schema.Union([FlowNotFound, InvalidInput, PersistenceError, Unavailable, TransportError, Unauthorized])\n }),\n Rpc.make(\"Run\", {\n defect: ControlDefect,\n payload: RunInputSchema,\n success: Receipt,\n error: Schema.Union([\n RunNotFound,\n PlanNotFound,\n PlanDenied,\n PlanDigestMismatch,\n EnvelopeMismatch,\n ClaimLost,\n CodeDrift,\n InvalidInput,\n LaunchFailed,\n PersistenceError,\n Unavailable,\n TransportError,\n Unauthorized\n ])\n }),\n Rpc.make(\"Approve\", {\n defect: ControlDefect,\n payload: ApprovalInputSchema,\n success: Receipt,\n error: Schema.Union([\n PlanDigestMismatch,\n EnvelopeMismatch,\n AlreadyResolved,\n PlanNotFound,\n RunNotFound,\n CodeDrift,\n InvalidInput,\n Unauthorized,\n PersistenceError,\n Unavailable,\n TransportError\n ])\n }),\n Rpc.make(\"Deny\", {\n defect: ControlDefect,\n payload: ApprovalInputSchema,\n success: Receipt,\n error: Schema.Union([\n PlanDigestMismatch,\n EnvelopeMismatch,\n AlreadyResolved,\n PlanNotFound,\n RunNotFound,\n CodeDrift,\n InvalidInput,\n Unauthorized,\n PersistenceError,\n Unavailable,\n TransportError\n ])\n }),\n Rpc.make(\"Steer\", {\n defect: ControlDefect,\n payload: SteerInputSchema,\n success: Receipt,\n error: Schema.Union([\n RunNotFound,\n InvalidInput,\n PersistenceError,\n Unavailable,\n TransportError,\n Unauthorized,\n NotificationError\n ])\n }),\n Rpc.make(\"Signal\", {\n defect: ControlDefect,\n payload: SignalInputSchema,\n success: Receipt,\n error: Schema.Union([\n RunNotFound,\n NoMatchingWait,\n InvalidInput,\n PersistenceError,\n Unavailable,\n TransportError,\n Unauthorized\n ])\n }),\n Rpc.make(\"Cancel\", { defect: ControlDefect, payload: CancelInputSchema, success: Receipt, error: mutationErrors }),\n Rpc.make(\"Resume\", {\n defect: ControlDefect,\n payload: ResumeInputSchema,\n success: Receipt,\n error: resumeErrors\n }),\n // `list` and `watch` carry the whole `ControlError` union in their contract,\n // so they name it once rather than restating its members. Two hand-copied\n // lists is how `CredentialConflict` came to be a control error the union did\n // not admit.\n Rpc.make(\"List\", {\n defect: ControlDefect,\n payload: ListRequest,\n success: ListResponse,\n error: ControlErrorSchema\n }),\n Rpc.make(\"Watch\", {\n defect: ControlDefect,\n payload: WatchFilter,\n success: ControlEvent,\n error: ControlErrorSchema,\n stream: true\n })\n).middleware(ControlAuth)\n\n/**\n * The call a boundary is authenticating, when it knows one: the procedure's\n * tag and the payload it was sent. An edge authenticating a socket upgrade\n * knows no call and passes none.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface Call {\n readonly rpc: string\n readonly payload: unknown\n}\n\n/**\n * Header authenticator used by the control RPC boundary.\n *\n * `call` is present for an in-band RPC frame and absent at a transport edge.\n * An authenticator that grants everything ignores it; one that grants a\n * scope reads it, and admits an edge on the credential alone.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface Authenticator {\n readonly authenticate: (\n headers: Readonly<Record<string, string>>,\n call?: Call | undefined\n ) => Effect.Effect<typeof Principal.Type, Unauthorized>\n}\n\n/**\n * Configuration for the single-token bearer authenticator.\n *\n * Every request carrying the configured token receives the same principal.\n * This is the intentionally small alpha trust boundary, not a per-user\n * authorization system.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface BearerAuthOptions {\n readonly token: string\n readonly principal: Omit<typeof Principal.Type, \"stampedAt\">\n readonly now?: (() => number) | undefined\n}\n\nconst authorizationHeader = (headers: Readonly<Record<string, string>>): string | undefined => {\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() === \"authorization\") return value\n }\n return undefined\n}\n\n/**\n * The bearer credential a request carries, or `undefined` when its\n * `Authorization` header is absent or is not a well-formed bearer scheme.\n *\n * @category getters\n * @since 1.0.0\n */\nexport const bearerCredential = (headers: Readonly<Record<string, string>>): string | undefined => {\n const authorization = authorizationHeader(headers)\n if (authorization === undefined) return undefined\n const match = /^Bearer[\\t ]+([^\\t ]+)$/i.exec(authorization)\n return match?.[1]\n}\n\nconst encoder = new TextEncoder()\n\n/**\n * Compares UTF-8 credentials without returning early for a secret-dependent\n * byte or length difference.\n */\nconst constantTimeTokenEqual = (expected: string, actual: string): boolean => {\n const expectedBytes = encoder.encode(expected)\n const actualBytes = encoder.encode(actual)\n const length = Math.max(expectedBytes.length, actualBytes.length)\n let difference = expectedBytes.length ^ actualBytes.length\n\n for (let index = 0; index < length; index++) {\n difference |= (expectedBytes[index] ?? 0) ^ (actualBytes[index] ?? 0)\n }\n\n return difference === 0\n}\n\n/**\n * Authenticates one shared bearer token and stamps its server-owned principal.\n * Missing, malformed, empty, and incorrect credentials all fail closed with\n * the same `Unauthorized` response.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const bearerAuthenticator = (options: BearerAuthOptions): Authenticator => ({\n authenticate: (headers) => {\n const credential = bearerCredential(headers)\n return options.token.length > 0 && credential !== undefined && constantTimeTokenEqual(options.token, credential)\n ? Effect.succeed({\n ...options.principal,\n stampedAt: options.now?.() ?? Date.now()\n })\n : Effect.fail(new Unauthorized({ message: \"A valid bearer credential is required\" }))\n }\n})\n\n/**\n * The first authenticator to accept a request answers for all of them. Each\n * is asked in order, and a request none accepts fails with the last refusal,\n * or with the plain `Unauthorized` when there is nothing to ask.\n *\n * @category constructors\n * @since 1.0.0\n */\nexport const anyAuthenticator = (authenticators: ReadonlyArray<Authenticator>): Authenticator => ({\n authenticate: (headers, call) =>\n authenticators.reduce<Effect.Effect<typeof Principal.Type, Unauthorized>>(\n (attempt, authenticator) =>\n Effect.catchTag(attempt, \"/control/Unauthorized\", () => authenticator.authenticate(headers, call)),\n Effect.fail(new Unauthorized({ message: \"A valid bearer credential is required\" }))\n )\n})\n\n/**\n * Options for {@link layerAuth}.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface AuthOptions {\n /**\n * The operators: the principals `List` and `Watch` show every run. Omitted,\n * every principal reads only the runs it launched. See {@link RunVisibility}.\n */\n readonly seesAllRuns?: ((principal: typeof Principal.Type) => boolean) | undefined\n}\n\n/**\n * Provides `ControlAuth` from a transport-header authenticator, telling it\n * which procedure and payload each frame carries. Each authenticated call\n * also receives the {@link RunVisibility} rule for the principal it stamps.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerAuth = (authenticator: Authenticator, options: AuthOptions = {}) => {\n const visibility = { seesAllRuns: options.seesAllRuns ?? (() => false) }\n return Layer.succeed(\n ControlAuth,\n (effect, call) =>\n Effect.flatMap(\n authenticator.authenticate(call.headers, { rpc: call.rpc._tag, payload: call.payload }),\n (principal) =>\n effect.pipe(\n Effect.provideService(ControlPrincipal, principal),\n Effect.provideService(RunVisibility, visibility)\n )\n )\n )\n}\n\n/**\n * Provides `ControlAuth` using one shared bearer token. Its one principal is\n * the operator and reads every run.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerBearerAuth = (options: BearerAuthOptions) =>\n layerAuth(bearerAuthenticator(options), { seesAllRuns: () => true })\n\n/**\n * Permissive authentication middleware for tests and trusted in-process use.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerNoopAuth = (principal: typeof Principal.Type = {\n id: \"test-principal\",\n kind: \"test\",\n stampedAt: 0\n}) => layerAuth({ authenticate: () => Effect.succeed(principal) }, { seesAllRuns: () => true })\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }