@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,383 @@
1
+ /**
2
+ * Versioned control lifecycle facts and their shared read projection.
3
+ * @since 1.0.0
4
+ */
5
+
6
+ import { Journal, JournalEvent } from "@smthrs/journal"
7
+ import { Effect, Schema } from "effect"
8
+ import type * as ControlRuntime from "./ControlRuntime.ts"
9
+ import * as ControlSchema from "./ControlSchema.ts"
10
+
11
+ /** This is the control producer contract, independent of the harness journal format.
12
+ * @category facts
13
+ * @since 1.0.0
14
+ */
15
+ export const version = 1
16
+
17
+ /** A committed control snapshot. A baseline claims no history before its sequence.
18
+ * @category facts
19
+ * @since 1.0.0
20
+ */
21
+ export const RunFact = Schema.Struct({
22
+ factVersion: Schema.Literal(version),
23
+ baseline: Schema.Literals(["created", "legacy"]),
24
+ run: ControlSchema.RunSummary
25
+ })
26
+
27
+ /** Capture the exact result of a fenced write, inside its journal transaction.
28
+ * @category facts
29
+ * @since 1.0.0
30
+ */
31
+ export const runFact = (
32
+ run: ControlSchema.RunSummary,
33
+ baseline: "created" | "legacy" = "legacy"
34
+ ): typeof RunFact.Type => {
35
+ if (run.executionObservation !== undefined || run.executionView !== undefined) {
36
+ throw new Error("A control fact cannot persist an executor observation")
37
+ }
38
+ return Schema.decodeUnknownSync(RunFact)({ factVersion: version, baseline, run: structuredClone(run) })
39
+ }
40
+
41
+ /** The exact facts of the guard that parked a run, frozen when it tripped.
42
+ *
43
+ * `Runaway` is a run spending past an approved ceiling (`tokens`, `usd`,
44
+ * `latency`). `Stuck` is one operation that ran past its time limit
45
+ * (`model-call`, `tool-call`, `cell`). Every number is in the source's unit,
46
+ * tokens, dollars, or milliseconds: `used`, `reserved`, `max`, and `next` are
47
+ * a budget's spend, held forecast, ceiling, and refused call; `max` is a
48
+ * timeout's limit.
49
+ * `allowance` is what Continue authorizes: the raised ceiling for a budget,
50
+ * one more run of `max` for a timeout. `subject` names the operation a
51
+ * timeout interrupted.
52
+ * @category facts
53
+ * @since 1.0.0
54
+ */
55
+ export const GuardIncident = Schema.Struct({
56
+ classification: Schema.Literals(["Runaway", "Stuck"]),
57
+ source: Schema.Literals(["tokens", "usd", "latency", "model-call", "tool-call", "cell"]),
58
+ message: Schema.String,
59
+ used: Schema.optional(Schema.Number),
60
+ reserved: Schema.optional(Schema.Number),
61
+ max: Schema.optional(Schema.Number),
62
+ next: Schema.optional(Schema.Number),
63
+ allowance: Schema.optional(Schema.Number),
64
+ subject: Schema.optional(Schema.String)
65
+ })
66
+
67
+ /** The identity-bearing request admitted with its approval token.
68
+ *
69
+ * `incident` is present on a request a guard made, so a restarted host reads
70
+ * the facts the park was made on rather than measuring them again.
71
+ * @category facts
72
+ * @since 1.0.0
73
+ */
74
+ export const ApprovalRequestFact = Schema.Struct({
75
+ factVersion: Schema.Literal(version),
76
+ runId: Schema.String,
77
+ requestId: Schema.String,
78
+ question: Schema.String,
79
+ payload: ControlSchema.ApprovalPayload,
80
+ incident: Schema.optional(GuardIncident)
81
+ })
82
+
83
+ /** The exact target a committed decision resolves; old target-tag fields remain readable.
84
+ * @category facts
85
+ * @since 1.0.0
86
+ */
87
+ export const ApprovalDecisionFact = Schema.Struct({
88
+ factVersion: Schema.Literal(version),
89
+ tokenId: Schema.String,
90
+ approvalTarget: ControlSchema.ApprovalTarget
91
+ })
92
+
93
+ /** Capture and validate the target the decision writer has actually resolved.
94
+ * @category facts
95
+ * @since 1.0.0
96
+ */
97
+ export const approvalDecisionFact = (
98
+ tokenId: string,
99
+ approvalTarget: ControlSchema.ApprovalTarget
100
+ ): typeof ApprovalDecisionFact.Type =>
101
+ Schema.decodeUnknownSync(ApprovalDecisionFact)({
102
+ factVersion: version,
103
+ tokenId,
104
+ approvalTarget: structuredClone(approvalTarget)
105
+ })
106
+
107
+ /** Commit a fenced control write and the exact resulting lifecycle fact together.
108
+ * @category facts
109
+ * @since 1.0.0
110
+ */
111
+ export const commitRun = <E, R>(
112
+ journal: Journal.Service,
113
+ change: Effect.Effect<ControlSchema.RunSummary, E, R>,
114
+ sourceId: string,
115
+ eventType: string,
116
+ detail: Readonly<Record<string, unknown>> = {},
117
+ baseline: "created" | "legacy" = "legacy"
118
+ ) =>
119
+ journal.transact(Effect.gen(function*() {
120
+ const run = yield* change
121
+ yield* journal.emitDurableUnfenced(
122
+ new JournalEvent.Input({
123
+ runId: JournalEvent.RunId.make(run.runId),
124
+ sourceId: JournalEvent.SourceId.make(sourceId),
125
+ eventType,
126
+ payload: JSON.parse(
127
+ JSON.stringify({ ...detail, runId: run.runId, status: run.status, ...runFact(run, baseline) })
128
+ )
129
+ })
130
+ )
131
+ return run
132
+ }))
133
+
134
+ /** The token and submit-ready request have one durable admission boundary.
135
+ * @category facts
136
+ * @since 1.0.0
137
+ */
138
+ export const commitApprovalRequest = (
139
+ journal: Journal.Service,
140
+ runtime: Pick<ControlRuntime.Service, "registerApproval">,
141
+ input: Omit<typeof ApprovalRequestFact.Type, "factVersion">,
142
+ sourceId: string
143
+ ) =>
144
+ Effect.suspend(() => {
145
+ const fact = Schema.decodeUnknownSync(ApprovalRequestFact)({ ...structuredClone(input), factVersion: version })
146
+ const target = fact.payload.target
147
+ if (target._tag !== "Node" || target.runId !== fact.runId || target.requestId !== fact.requestId) {
148
+ return Effect.fail(
149
+ new Journal.JournalError({
150
+ code: "invalid_event",
151
+ message: "Approval request identity does not match its target"
152
+ })
153
+ )
154
+ }
155
+ return journal.transact(Effect.gen(function*() {
156
+ const token = yield* runtime.registerApproval(target)
157
+ if (token._tag === "Pending") {
158
+ yield* journal.emitDurableUnfenced(
159
+ new JournalEvent.Input({
160
+ runId: JournalEvent.RunId.make(fact.runId),
161
+ sourceId: JournalEvent.SourceId.make(sourceId),
162
+ eventType: "control.approval.requested",
163
+ payload: JSON.parse(JSON.stringify(fact))
164
+ })
165
+ )
166
+ }
167
+ return token
168
+ }))
169
+ })
170
+
171
+ /** Honest coverage of the displayed lifecycle; engine rows are a separate authority.
172
+ * @category facts
173
+ * @since 1.0.0
174
+ */
175
+ export const LifecycleProvenance = Schema.Struct({
176
+ control: Schema.Literals(["events", "legacy-snapshot", "unverified-snapshot"]),
177
+ execution: Schema.Literals(["control", "engine-observed", "engine-missing"]),
178
+ baseline: Schema.optional(Schema.Literals(["created", "legacy"])),
179
+ fromSequence: Schema.optional(Schema.Number),
180
+ throughSequence: Schema.optional(Schema.Number)
181
+ })
182
+
183
+ /** Submit-ready approval state derived solely from admitted facts.
184
+ * @category facts
185
+ * @since 1.0.0
186
+ */
187
+ export interface Approval {
188
+ readonly runId: string
189
+ readonly waitRunId?: string | undefined
190
+ readonly questionProvenance?: "events" | "legacy-observation" | "unverified-observation" | undefined
191
+ readonly requestId: string
192
+ readonly title: string
193
+ readonly request: ControlSchema.ControlEvent["payload"]
194
+ readonly payload: ControlSchema.ApprovalPayload
195
+ readonly requestedAt: number
196
+ readonly status: "pending" | "approved" | "denied"
197
+ }
198
+
199
+ const record = (value: unknown): Record<string, unknown> =>
200
+ value !== null && typeof value === "object" && !Array.isArray(value) ? value as Record<string, unknown> : {}
201
+ const string = (value: unknown): string | undefined => typeof value === "string" ? value : undefined
202
+ const key = (runId: string, requestId: string): string => JSON.stringify([runId, requestId])
203
+ const lifecycleKinds = new Set([
204
+ "control.run.accepted",
205
+ "control.run.running",
206
+ "control.run.pending",
207
+ "control.run.parked",
208
+ "control.run.waiting-approval",
209
+ "control.run.completed",
210
+ "control.run.failed",
211
+ "control.run.cancelled",
212
+ "control.run.resume",
213
+ "control.run.claimed",
214
+ "control.steer.woke"
215
+ ])
216
+ const consistentStatus = (kind: string, run: ControlSchema.RunSummary): boolean => {
217
+ if (kind === "control.run.pending") return run.status === "accepted"
218
+ if (kind === "control.run.resume" || kind === "control.run.claimed" || kind === "control.steer.woke") return true
219
+ return kind === `control.run.${run.status}`
220
+ }
221
+ const coordinationFields = [
222
+ "runId",
223
+ "flowId",
224
+ "createdAt",
225
+ "updatedAt",
226
+ "planId",
227
+ "planDigest",
228
+ "ownerId",
229
+ "parkedBy"
230
+ ] as const
231
+
232
+ /**
233
+ * One fold for gateway snapshots and subscriptions. Current writers are strict;
234
+ * legacy unnamed decisions may close only a legacy request in the same run.
235
+ * Observed human waits may seed the approval projection without claiming a
236
+ * journaled request. They still require an exact named decision, and share the
237
+ * same digest binding as admitted requests.
238
+ * Duplicate requests never reopen decisions, and a new-style unknown identity
239
+ * never consumes another gate. Snapshot fallback is explicitly unverified.
240
+ * @category facts
241
+ * @since 1.0.0
242
+ */
243
+ export const fold = (
244
+ events: ReadonlyArray<ControlSchema.ControlEvent>,
245
+ snapshot?: ControlSchema.RunSummary,
246
+ observedApprovals: ReadonlyArray<Approval> = []
247
+ ): {
248
+ readonly run: ControlSchema.RunSummary | undefined
249
+ readonly provenance: typeof LifecycleProvenance.Type
250
+ readonly approvals: ReadonlyArray<Approval>
251
+ } => {
252
+ let latest: { readonly fact: typeof RunFact.Type; readonly sequence: number } | undefined
253
+ let first: { readonly baseline: "created" | "legacy"; readonly sequence: number } | undefined
254
+ let uncovered = false
255
+ const requests = new Map<string, { readonly row: Approval; readonly versioned: boolean }>()
256
+ for (const row of observedApprovals) {
257
+ if (snapshot !== undefined && row.runId !== snapshot.runId) continue
258
+ const target = row.payload.target
259
+ if (target._tag !== "Node" || target.runId !== row.runId || target.requestId !== row.requestId) continue
260
+ requests.set(key(row.runId, row.requestId), { row: { ...row, status: "pending" }, versioned: true })
261
+ }
262
+ const decisions = new Map<string, { readonly status: "approved" | "denied"; readonly digest?: string }>()
263
+ for (const event of events) {
264
+ if (snapshot !== undefined && event.runId !== snapshot.runId) continue
265
+ const payload = record(event.payload)
266
+ if (lifecycleKinds.has(event.kind) || payload.factVersion !== undefined && event.kind.startsWith("control.run.")) {
267
+ if (
268
+ Schema.is(RunFact)(payload) && payload.run.runId === event.runId &&
269
+ payload.run.executionObservation === undefined && payload.run.executionView === undefined &&
270
+ consistentStatus(event.kind, payload.run)
271
+ ) {
272
+ latest = { fact: payload, sequence: event.sequence }
273
+ first ??= { baseline: payload.baseline, sequence: event.sequence }
274
+ // This full snapshot establishes a new baseline after a gap; the
275
+ // earlier prefix can no longer be claimed as continuously covered.
276
+ if (uncovered) first = { baseline: "legacy", sequence: event.sequence }
277
+ uncovered = false
278
+ } else if (payload.factVersion !== undefined || latest !== undefined) uncovered = true
279
+ }
280
+ if (event.kind === "control.approval.requested") {
281
+ const versioned = payload.factVersion !== undefined
282
+ if (versioned && !Schema.is(ApprovalRequestFact)(payload)) continue
283
+ const runId = string(payload.runId) ?? event.runId
284
+ const requestId = string(payload.requestId)
285
+ if (
286
+ runId === undefined || requestId === undefined || event.runId !== runId ||
287
+ payload.payload === undefined
288
+ ) continue
289
+ // Historical payloads were open JSON. Preserve their read-only display;
290
+ // only the versioned contract can establish exact target correspondence.
291
+ const submitted = payload.payload as ControlSchema.ApprovalPayload
292
+ if (
293
+ versioned &&
294
+ (submitted.target._tag !== "Node" || submitted.target.runId !== runId ||
295
+ submitted.target.requestId !== requestId)
296
+ ) continue
297
+ const identity = key(runId, requestId)
298
+ if (requests.has(identity)) continue
299
+ const decision = decisions.get(identity)
300
+ requests.set(identity, {
301
+ versioned,
302
+ row: {
303
+ runId,
304
+ requestId,
305
+ title: string(payload.question) ?? `Approval needed — ${requestId}`,
306
+ request: event.payload,
307
+ payload: submitted,
308
+ requestedAt: typeof payload.at === "number" && Number.isFinite(payload.at) ? payload.at : event.occurredAt,
309
+ status: decision !== undefined &&
310
+ (decision.digest === undefined || decision.digest === record(record(submitted).target).digest)
311
+ ? decision.status :
312
+ "pending"
313
+ }
314
+ })
315
+ }
316
+ if (event.kind === "control.approval.approved" || event.kind === "control.approval.denied") {
317
+ const status = event.kind === "control.approval.approved" ? "approved" : "denied"
318
+ let identity: string | undefined
319
+ let digest: string | undefined
320
+ if (payload.factVersion !== undefined) {
321
+ if (
322
+ !Schema.is(ApprovalDecisionFact)(payload) || payload.approvalTarget._tag !== "Node" ||
323
+ payload.approvalTarget.runId !== event.runId || payload.tokenId !== payload.approvalTarget.requestId
324
+ ) continue
325
+ identity = key(payload.approvalTarget.runId, payload.approvalTarget.requestId)
326
+ digest = payload.approvalTarget.digest
327
+ } else {
328
+ const tokenId = string(payload.tokenId) ?? string(payload.requestId)
329
+ if (tokenId !== undefined && event.runId !== undefined) identity = key(event.runId, tokenId)
330
+ else {identity = [...requests].find(([, request]) =>
331
+ !request.versioned && request.row.status === "pending" &&
332
+ request.row.runId === event.runId
333
+ )?.[0]}
334
+ }
335
+ if (identity === undefined || decisions.has(identity)) continue
336
+ const request = requests.get(identity)
337
+ if (
338
+ request !== undefined && digest !== undefined && record(record(request.row.payload).target).digest !== digest
339
+ ) continue
340
+ decisions.set(identity, { status, ...(digest === undefined ? {} : { digest }) })
341
+ if (request !== undefined) requests.set(identity, { ...request, row: { ...request.row, status } })
342
+ }
343
+ }
344
+ const matches = !uncovered && latest !== undefined && (snapshot === undefined ||
345
+ coordinationFields.every((field) => latest.fact.run[field] === snapshot[field]) &&
346
+ (snapshot.executionObservation === "observed" || latest.fact.run.status === snapshot.status))
347
+ const run = snapshot === undefined ? uncovered ? undefined : latest?.fact.run : matches
348
+ ? {
349
+ ...snapshot,
350
+ ...latest!.fact.run,
351
+ ...(snapshot.executionObservation === "observed" ?
352
+ {
353
+ status: snapshot.status,
354
+ waitingReason: snapshot.waitingReason,
355
+ parentRunId: snapshot.parentRunId,
356
+ lineageId: snapshot.lineageId,
357
+ roundOrdinal: snapshot.roundOrdinal,
358
+ pendingWaits: snapshot.pendingWaits
359
+ } :
360
+ {})
361
+ }
362
+ : snapshot
363
+ return {
364
+ run,
365
+ provenance: {
366
+ control: uncovered
367
+ ? "unverified-snapshot"
368
+ : latest === undefined
369
+ ? "legacy-snapshot"
370
+ : matches
371
+ ? "events"
372
+ : "unverified-snapshot",
373
+ execution: snapshot?.executionObservation === "observed" ?
374
+ "engine-observed"
375
+ : snapshot?.executionObservation === "missing"
376
+ ? "engine-missing"
377
+ : "control",
378
+ ...(first === undefined ? {} : { baseline: first.baseline, fromSequence: first.sequence }),
379
+ ...(latest === undefined ? {} : { throughSequence: latest.sequence })
380
+ },
381
+ approvals: [...requests.values()].map(({ row }) => row)
382
+ }
383
+ }