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

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 +1280 -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 +740 -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 +1521 -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 +1585 -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 +807 -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 +5 -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 +2113 -0
  385. package/src/ControlRpcs.ts +443 -0
  386. package/src/ControlRuntime.ts +1597 -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 +2476 -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,299 @@
1
+ /**
2
+ * Schema-backed RPC projection of the control service.
3
+ *
4
+ * @since 0.1.0
5
+ */
6
+ import { NotificationError } from "@smthrs/notifications/NotificationQueue";
7
+ import { Context, Effect, Layer, Schema, SchemaTransformation } from "effect";
8
+ import { Rpc, RpcGroup, RpcMiddleware } from "effect/unstable/rpc";
9
+ import { AlreadyResolved, ClaimLost, CodeDrift, ControlErrorSchema, EnvelopeMismatch, FlowNotFound, InvalidInput, LaunchFailed, NoMatchingWait, PersistenceError, PlanDenied, PlanDigestMismatch, PlanNotFound, RunNotFound, TransportError, Unauthorized, Unavailable } from "./ControlError.js";
10
+ import { ApprovalInputSchema, CancelInputSchema, ControlEvent, ListRequest, ListResponse, PlanCard, PlanInputSchema, Receipt, ResumeInputSchema, RunInputSchema, SignalInputSchema, SteerInputSchema, WatchFilter } from "./ControlSchema.js";
11
+ /**
12
+ * Authenticated principal made available to control RPC handlers.
13
+ *
14
+ * @category services
15
+ * @since 0.1.0
16
+ */
17
+ export class ControlPrincipal extends Context.Service()("/control/ControlPrincipal") {
18
+ }
19
+ /**
20
+ * Middleware boundary that authenticates control RPC requests.
21
+ *
22
+ * @category middleware
23
+ * @since 0.1.0
24
+ */
25
+ export class ControlAuth extends RpcMiddleware.Service()("/control/ControlAuth", { error: Unauthorized }) {
26
+ }
27
+ /**
28
+ * Which authenticated principals read every run.
29
+ *
30
+ * `List` and `Watch` answer a principal this returns `true` for with every
31
+ * run: that principal is an operator. Every other principal reads only the
32
+ * runs it launched (`RunSummary.launchedBy`) and, from `Watch`, only their
33
+ * events. The authentication layer decides, because it is what knows which
34
+ * identities it can stamp: `layerBearerAuth` and `layerNoopAuth` stamp one
35
+ * principal and make it the operator, and `layerAuth` takes the rule as an
36
+ * option. Where nothing provides one, no principal is an operator.
37
+ *
38
+ * @category services
39
+ * @since 1.0.0
40
+ */
41
+ export const RunVisibility = Context.Reference("/control/RunVisibility", { defaultValue: () => ({ seesAllRuns: () => false }) });
42
+ /**
43
+ * The sentence a client reads when a control handler dies.
44
+ *
45
+ * @category defects
46
+ * @since 1.0.0
47
+ */
48
+ export const defectMessage = "Something went wrong on our side. Not your fault.";
49
+ /**
50
+ * Wire schema for a control RPC defect: an untyped failure that no procedure
51
+ * declares.
52
+ *
53
+ * Encoding replaces a defect value (an `Error`, a failure an `orDie` turned
54
+ * into a defect, any non-string value) with `{ name: "Error", message }`
55
+ * carrying {@link defectMessage}, so a driver message, path, or stack never
56
+ * reaches a client. The server logs the raw defect. A string passes unchanged:
57
+ * the RPC server's own request-decoding sentence, which describes the caller's
58
+ * payload, is one, and so is an author-written `Effect.die` sentence.
59
+ *
60
+ * Decoding is Effect's default `Schema.Defect()` decoding, so a client reads
61
+ * this shape and an older server's shape alike, and an older client reads this
62
+ * shape as an `Error`.
63
+ *
64
+ * @category defects
65
+ * @since 1.0.0
66
+ */
67
+ export const ControlDefect = Schema.Json.pipe(Schema.decodeTo(Schema.Unknown, SchemaTransformation.transform({
68
+ decode: Schema.decodeSync(Schema.Defect()),
69
+ encode: (defect) => typeof defect === "string" ? defect : { name: "Error", message: defectMessage }
70
+ })));
71
+ const mutationErrors = Schema.Union([
72
+ RunNotFound,
73
+ ClaimLost,
74
+ InvalidInput,
75
+ PersistenceError,
76
+ Unavailable,
77
+ TransportError,
78
+ Unauthorized
79
+ ]);
80
+ const resumeErrors = Schema.Union([
81
+ RunNotFound,
82
+ ClaimLost,
83
+ CodeDrift,
84
+ InvalidInput,
85
+ PersistenceError,
86
+ Unavailable,
87
+ TransportError,
88
+ Unauthorized
89
+ ]);
90
+ /**
91
+ * The ten remote procedures corresponding to `Control` operations.
92
+ *
93
+ * @category groups
94
+ * @since 0.1.0
95
+ */
96
+ export const ControlRpcs = RpcGroup.make(Rpc.make("Plan", {
97
+ defect: ControlDefect,
98
+ payload: PlanInputSchema,
99
+ success: PlanCard,
100
+ error: Schema.Union([FlowNotFound, InvalidInput, PersistenceError, Unavailable, TransportError, Unauthorized])
101
+ }), Rpc.make("Run", {
102
+ defect: ControlDefect,
103
+ payload: RunInputSchema,
104
+ success: Receipt,
105
+ error: Schema.Union([
106
+ RunNotFound,
107
+ PlanNotFound,
108
+ PlanDenied,
109
+ PlanDigestMismatch,
110
+ EnvelopeMismatch,
111
+ ClaimLost,
112
+ CodeDrift,
113
+ InvalidInput,
114
+ LaunchFailed,
115
+ PersistenceError,
116
+ Unavailable,
117
+ TransportError,
118
+ Unauthorized
119
+ ])
120
+ }), Rpc.make("Approve", {
121
+ defect: ControlDefect,
122
+ payload: ApprovalInputSchema,
123
+ success: Receipt,
124
+ error: Schema.Union([
125
+ PlanDigestMismatch,
126
+ EnvelopeMismatch,
127
+ AlreadyResolved,
128
+ PlanNotFound,
129
+ RunNotFound,
130
+ CodeDrift,
131
+ InvalidInput,
132
+ Unauthorized,
133
+ PersistenceError,
134
+ Unavailable,
135
+ TransportError
136
+ ])
137
+ }), Rpc.make("Deny", {
138
+ defect: ControlDefect,
139
+ payload: ApprovalInputSchema,
140
+ success: Receipt,
141
+ error: Schema.Union([
142
+ PlanDigestMismatch,
143
+ EnvelopeMismatch,
144
+ AlreadyResolved,
145
+ PlanNotFound,
146
+ RunNotFound,
147
+ CodeDrift,
148
+ InvalidInput,
149
+ Unauthorized,
150
+ PersistenceError,
151
+ Unavailable,
152
+ TransportError
153
+ ])
154
+ }), Rpc.make("Steer", {
155
+ defect: ControlDefect,
156
+ payload: SteerInputSchema,
157
+ success: Receipt,
158
+ error: Schema.Union([
159
+ RunNotFound,
160
+ InvalidInput,
161
+ PersistenceError,
162
+ Unavailable,
163
+ TransportError,
164
+ Unauthorized,
165
+ NotificationError
166
+ ])
167
+ }), Rpc.make("Signal", {
168
+ defect: ControlDefect,
169
+ payload: SignalInputSchema,
170
+ success: Receipt,
171
+ error: Schema.Union([
172
+ RunNotFound,
173
+ NoMatchingWait,
174
+ InvalidInput,
175
+ PersistenceError,
176
+ Unavailable,
177
+ TransportError,
178
+ Unauthorized
179
+ ])
180
+ }), Rpc.make("Cancel", { defect: ControlDefect, payload: CancelInputSchema, success: Receipt, error: mutationErrors }), Rpc.make("Resume", {
181
+ defect: ControlDefect,
182
+ payload: ResumeInputSchema,
183
+ success: Receipt,
184
+ error: resumeErrors
185
+ }),
186
+ // `list` and `watch` carry the whole `ControlError` union in their contract,
187
+ // so they name it once rather than restating its members. Two hand-copied
188
+ // lists is how `CredentialConflict` came to be a control error the union did
189
+ // not admit.
190
+ Rpc.make("List", {
191
+ defect: ControlDefect,
192
+ payload: ListRequest,
193
+ success: ListResponse,
194
+ error: ControlErrorSchema
195
+ }), Rpc.make("Watch", {
196
+ defect: ControlDefect,
197
+ payload: WatchFilter,
198
+ success: ControlEvent,
199
+ error: ControlErrorSchema,
200
+ stream: true
201
+ })).middleware(ControlAuth);
202
+ const authorizationHeader = (headers) => {
203
+ for (const [name, value] of Object.entries(headers)) {
204
+ if (name.toLowerCase() === "authorization")
205
+ return value;
206
+ }
207
+ return undefined;
208
+ };
209
+ /**
210
+ * The bearer credential a request carries, or `undefined` when its
211
+ * `Authorization` header is absent or is not a well-formed bearer scheme.
212
+ *
213
+ * @category getters
214
+ * @since 1.0.0
215
+ */
216
+ export const bearerCredential = (headers) => {
217
+ const authorization = authorizationHeader(headers);
218
+ if (authorization === undefined)
219
+ return undefined;
220
+ const match = /^Bearer[\t ]+([^\t ]+)$/i.exec(authorization);
221
+ return match?.[1];
222
+ };
223
+ const encoder = new TextEncoder();
224
+ /**
225
+ * Compares UTF-8 credentials without returning early for a secret-dependent
226
+ * byte or length difference.
227
+ */
228
+ const constantTimeTokenEqual = (expected, actual) => {
229
+ const expectedBytes = encoder.encode(expected);
230
+ const actualBytes = encoder.encode(actual);
231
+ const length = Math.max(expectedBytes.length, actualBytes.length);
232
+ let difference = expectedBytes.length ^ actualBytes.length;
233
+ for (let index = 0; index < length; index++) {
234
+ difference |= (expectedBytes[index] ?? 0) ^ (actualBytes[index] ?? 0);
235
+ }
236
+ return difference === 0;
237
+ };
238
+ /**
239
+ * Authenticates one shared bearer token and stamps its server-owned principal.
240
+ * Missing, malformed, empty, and incorrect credentials all fail closed with
241
+ * the same `Unauthorized` response.
242
+ *
243
+ * @category constructors
244
+ * @since 0.1.0
245
+ */
246
+ export const bearerAuthenticator = (options) => ({
247
+ authenticate: (headers) => {
248
+ const credential = bearerCredential(headers);
249
+ return options.token.length > 0 && credential !== undefined && constantTimeTokenEqual(options.token, credential)
250
+ ? Effect.succeed({
251
+ ...options.principal,
252
+ stampedAt: options.now?.() ?? Date.now()
253
+ })
254
+ : Effect.fail(new Unauthorized({ message: "A valid bearer credential is required" }));
255
+ }
256
+ });
257
+ /**
258
+ * The first authenticator to accept a request answers for all of them. Each
259
+ * is asked in order, and a request none accepts fails with the last refusal,
260
+ * or with the plain `Unauthorized` when there is nothing to ask.
261
+ *
262
+ * @category constructors
263
+ * @since 1.0.0
264
+ */
265
+ export const anyAuthenticator = (authenticators) => ({
266
+ authenticate: (headers, call) => authenticators.reduce((attempt, authenticator) => Effect.catchTag(attempt, "/control/Unauthorized", () => authenticator.authenticate(headers, call)), Effect.fail(new Unauthorized({ message: "A valid bearer credential is required" })))
267
+ });
268
+ /**
269
+ * Provides `ControlAuth` from a transport-header authenticator, telling it
270
+ * which procedure and payload each frame carries. Each authenticated call
271
+ * also receives the {@link RunVisibility} rule for the principal it stamps.
272
+ *
273
+ * @category layers
274
+ * @since 0.1.0
275
+ */
276
+ export const layerAuth = (authenticator, options = {}) => {
277
+ const visibility = { seesAllRuns: options.seesAllRuns ?? (() => false) };
278
+ return Layer.succeed(ControlAuth, (effect, call) => Effect.flatMap(authenticator.authenticate(call.headers, { rpc: call.rpc._tag, payload: call.payload }), (principal) => effect.pipe(Effect.provideService(ControlPrincipal, principal), Effect.provideService(RunVisibility, visibility))));
279
+ };
280
+ /**
281
+ * Provides `ControlAuth` using one shared bearer token. Its one principal is
282
+ * the operator and reads every run.
283
+ *
284
+ * @category layers
285
+ * @since 0.1.0
286
+ */
287
+ export const layerBearerAuth = (options) => layerAuth(bearerAuthenticator(options), { seesAllRuns: () => true });
288
+ /**
289
+ * Permissive authentication middleware for tests and trusted in-process use.
290
+ *
291
+ * @category layers
292
+ * @since 0.1.0
293
+ */
294
+ export const layerNoopAuth = (principal = {
295
+ id: "test-principal",
296
+ kind: "test",
297
+ stampedAt: 0
298
+ }) => layerAuth({ authenticate: () => Effect.succeed(principal) }, { seesAllRuns: () => true });
299
+ //# sourceMappingURL=ControlRpcs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlRpcs.js","sourceRoot":"","sources":["../../src/ControlRpcs.ts"],"names":[],"mappings":"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","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"]}