@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,311 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var Health_exports = {};
30
+ __export(Health_exports, {
31
+ Activity: () => Activity,
32
+ Attention: () => Attention,
33
+ Freshness: () => Freshness,
34
+ HealthConfigurationError: () => HealthConfigurationError,
35
+ HealthObservation: () => HealthObservation,
36
+ HealthState: () => HealthState,
37
+ ProbeReport: () => ProbeReport,
38
+ ReasonCode: () => ReasonCode,
39
+ StatusRollup: () => StatusRollup,
40
+ SubjectState: () => SubjectState,
41
+ defaultPolicy: () => defaultPolicy,
42
+ evaluate: () => evaluate,
43
+ latestObservation: () => latestObservation,
44
+ lifecycleRunChecker: () => lifecycleRunChecker,
45
+ lifecycleSessionChecker: () => lifecycleSessionChecker,
46
+ makeRegistry: () => makeRegistry,
47
+ nextDelay: () => nextDelay,
48
+ registeredCheckers: () => registeredCheckers,
49
+ rollup: () => rollup,
50
+ runIncarnation: () => runIncarnation,
51
+ statusObservedEventType: () => statusObservedEventType,
52
+ waitReason: () => waitReason
53
+ });
54
+ module.exports = __toCommonJS(Health_exports);
55
+ var Sha256 = __toESM(require("@smthrs/crypto/Sha256"), 1);
56
+ var Fault = __toESM(require("@smthrs/flow/Fault"), 1);
57
+ var import_effect = require("effect");
58
+ var import_JevSessionChecker = require("./JevSessionChecker.js");
59
+ const SubjectState = import_effect.Schema.Literals([
60
+ "accepted",
61
+ "running",
62
+ "parked",
63
+ "waiting-approval",
64
+ "completed",
65
+ "failed",
66
+ "cancelled",
67
+ "spawning",
68
+ "exited"
69
+ ]);
70
+ const HealthState = import_effect.Schema.Literals([
71
+ "healthy",
72
+ "stalled",
73
+ "wedged-node",
74
+ "runaway-loop",
75
+ "awaiting-human",
76
+ "failing",
77
+ "unknown"
78
+ ]);
79
+ const Activity = import_effect.Schema.Literals(["working", "idle", "needs-input", "unknown"]);
80
+ const Attention = import_effect.Schema.Literals(["none", "awaiting-approval", "needs-input", "needs-resume", "unhealthy"]);
81
+ const Freshness = import_effect.Schema.Literals(["fresh", "stale", "unobserved"]);
82
+ const ReasonCode = import_effect.Schema.Literals([
83
+ "ok",
84
+ "no-progress",
85
+ "awaiting-reply",
86
+ "prompt-detected",
87
+ "quota-wait",
88
+ "timer-wait",
89
+ "event-wait",
90
+ "released",
91
+ "unreachable",
92
+ "probe-timeout",
93
+ "probe-error",
94
+ "owner-changed"
95
+ ]);
96
+ const ProbeReport = import_effect.Schema.Struct({ activity: Activity, reason: import_effect.Schema.optional(ReasonCode) });
97
+ const Counter = import_effect.Schema.Int.pipe(import_effect.Schema.check(import_effect.Schema.isGreaterThanOrEqualTo(0)));
98
+ const HealthObservation = import_effect.Schema.Struct({
99
+ subjectId: import_effect.Schema.String,
100
+ state: SubjectState,
101
+ checkerId: import_effect.Schema.String,
102
+ monitorId: import_effect.Schema.String,
103
+ incarnation: import_effect.Schema.String,
104
+ evidenceSeq: Counter,
105
+ observedAt: Counter,
106
+ expiresAt: Counter,
107
+ durationMs: Counter,
108
+ baseHealth: import_effect.Schema.optional(HealthState),
109
+ outcome: import_effect.Schema.Literals(["ok", "timeout", "error", "interrupted", "discarded"]),
110
+ report: import_effect.Schema.optional(ProbeReport),
111
+ reason: import_effect.Schema.optional(ReasonCode)
112
+ });
113
+ const StatusRollup = import_effect.Schema.Struct({
114
+ subjectId: import_effect.Schema.String,
115
+ state: SubjectState,
116
+ activity: Activity,
117
+ health: HealthState,
118
+ attention: Attention,
119
+ freshness: Freshness,
120
+ reason: import_effect.Schema.optional(ReasonCode),
121
+ provenance: import_effect.Schema.optional(import_effect.Schema.Struct({
122
+ checkerId: import_effect.Schema.String,
123
+ monitorId: import_effect.Schema.String,
124
+ observedAt: Counter,
125
+ expiresAt: Counter,
126
+ evidenceSeq: Counter,
127
+ incarnation: import_effect.Schema.String,
128
+ version: Counter
129
+ })),
130
+ updatedAt: Counter
131
+ });
132
+ const statusObservedEventType = "control.status.observed";
133
+ const runIncarnation = (run) => Sha256.digestSync(JSON.stringify([
134
+ run.runId,
135
+ run.createdAt,
136
+ run.updatedAt,
137
+ run.ownerId ?? null,
138
+ run.parkedBy ?? null,
139
+ run.status,
140
+ run.waitingReason ?? null
141
+ ]));
142
+ class HealthConfigurationError extends import_effect.Schema.TaggedError()("HealthConfigurationError", {
143
+ reason: import_effect.Schema.Literals(["invalid-policy", "invalid-checker", "invalid-config"])
144
+ }) {
145
+ }
146
+ Fault.register("HealthConfigurationError", "bug");
147
+ const defaultPolicy = {
148
+ intervalMs: 5e3,
149
+ timeoutMs: 2e3,
150
+ ttlMs: 2e4,
151
+ stallAfterMs: 12e4,
152
+ backoff: { initialMs: 5e3, maxMs: 6e4, factor: 2 }
153
+ };
154
+ const waitReason = (state, waitingReason) => state !== "parked" ? void 0 : waitingReason === "quota" ? "quota-wait" : waitingReason === "timer" ? "timer-wait" : waitingReason === "event" ? "event-wait" : void 0;
155
+ const lifecycleRunChecker = {
156
+ id: "lifecycle.run",
157
+ probe: (context) => import_effect.Effect.succeed({ activity: "unknown", reason: waitReason(context.state, context.summary?.waitingReason) ?? "ok" })
158
+ };
159
+ const lifecycleSessionChecker = {
160
+ id: "lifecycle.session",
161
+ probe: () => import_effect.Effect.succeed({ activity: "unknown", reason: "ok" })
162
+ };
163
+ const hostCheckers = (evaluator) => [
164
+ (0, import_JevSessionChecker.makeJevSessionChecker)({ evaluator })
165
+ ];
166
+ const registeredCheckers = hostCheckers(void 0);
167
+ const bounded = (value, min, max) => Number.isSafeInteger(value) && value >= min && value <= max;
168
+ const invalid = (reason) => {
169
+ throw new HealthConfigurationError({ reason });
170
+ };
171
+ const makeRegistry = (config = {}, kind = "run", evaluator) => {
172
+ const fallback = kind === "run" ? lifecycleRunChecker : lifecycleSessionChecker;
173
+ const checkers = new Map([
174
+ [fallback.id, fallback],
175
+ ...hostCheckers(evaluator).map((checker) => [checker.id, checker])
176
+ ]);
177
+ for (const checker of config.checkers ?? []) {
178
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9._/-]{0,127}$/.test(checker.id) || checkers.has(checker.id)) invalid("invalid-checker");
179
+ checkers.set(checker.id, checker);
180
+ }
181
+ const resolve = (binding) => {
182
+ const checker = binding === void 0 ? fallback : checkers.get(binding.checkerId) ?? fallback;
183
+ const merged = { ...defaultPolicy, ...checker.defaults, ...binding?.policy };
184
+ if (merged.backoff == null || typeof merged.backoff !== "object") invalid("invalid-policy");
185
+ const policy = { ...merged, backoff: { ...merged.backoff } };
186
+ if (!bounded(policy.intervalMs, 10, 36e5) || !bounded(policy.timeoutMs, 1, 6e4) || !bounded(policy.ttlMs, policy.timeoutMs, 864e5) || !bounded(policy.stallAfterMs, policy.intervalMs, 864e5) || !bounded(policy.backoff.initialMs, 10, 36e5) || !bounded(policy.backoff.maxMs, policy.backoff.initialMs, 36e5) || !Number.isFinite(policy.backoff.factor) || policy.backoff.factor < 1 || policy.backoff.factor > 10) invalid("invalid-policy");
187
+ let decoded = void 0;
188
+ if (checker !== fallback || binding?.checkerId === fallback.id) {
189
+ if (checker.configSchema !== void 0) {
190
+ try {
191
+ decoded = import_effect.Schema.decodeUnknownSync(checker.configSchema)(binding?.config);
192
+ } catch {
193
+ invalid("invalid-config");
194
+ }
195
+ } else if (binding?.config !== void 0) invalid("invalid-config");
196
+ }
197
+ return { checker, config: decoded, policy, exposeOutput: binding?.exposeOutput === true };
198
+ };
199
+ const defaults = resolve();
200
+ const bindings = new Map(Object.entries(config.bindings ?? {}).map(([key, value]) => [key, resolve(value)]));
201
+ const maxSubjects = config.limits?.maxSubjects ?? 128;
202
+ const maxConcurrentProbes = config.limits?.maxConcurrentProbes ?? 8;
203
+ if (!bounded(maxSubjects, 1, 500) || !bounded(maxConcurrentProbes, 1, 64)) invalid("invalid-policy");
204
+ return { resolve: (key) => bindings.get(key) ?? defaults, limits: { maxSubjects, maxConcurrentProbes } };
205
+ };
206
+ const nextDelay = (policy, consecutiveFailures) => consecutiveFailures <= 0 ? policy.intervalMs : Math.max(
207
+ policy.intervalMs,
208
+ Math.min(
209
+ policy.backoff.maxMs,
210
+ policy.backoff.initialMs * policy.backoff.factor ** Math.min(consecutiveFailures - 1, 32)
211
+ )
212
+ );
213
+ const outcomes = import_effect.Metric.counter("smithers.health.probes");
214
+ const durations = import_effect.Metric.histogram("smithers.health.probe_duration_ms", {
215
+ boundaries: [1, 10, 100, 1e3, 5e3, 6e4]
216
+ });
217
+ const decodeReport = import_effect.Schema.decodeUnknownSync(ProbeReport);
218
+ const evaluate = (check, context, stamp) => import_effect.Effect.gen(function* () {
219
+ const subjectId = context.subjectId;
220
+ const state = context.state;
221
+ const captured = { ...stamp };
222
+ const started = yield* import_effect.Effect.clockWith((clock) => clock.currentTimeMillis);
223
+ const result = yield* import_effect.Effect.suspend(() => check.checker.probe(context, check.config)).pipe(
224
+ import_effect.Effect.flatMap((candidate) => import_effect.Effect.try({ try: () => decodeReport(candidate), catch: () => "invalid-report" })),
225
+ import_effect.Effect.map((report) => ({ outcome: "ok", report })),
226
+ import_effect.Effect.catchCause(
227
+ (cause) => import_effect.Cause.hasInterruptsOnly(cause) ? import_effect.Effect.interrupt : import_effect.Effect.succeed({ outcome: "error", reason: "probe-error" })
228
+ ),
229
+ import_effect.Effect.timeoutOrElse({
230
+ duration: check.policy.timeoutMs,
231
+ orElse: () => import_effect.Effect.succeed({ outcome: "timeout", reason: "probe-timeout" })
232
+ }),
233
+ import_effect.Effect.tap(
234
+ (outcome) => import_effect.Effect.annotateCurrentSpan({
235
+ outcome: outcome.outcome,
236
+ activity: "report" in outcome ? outcome.report.activity : "unknown"
237
+ })
238
+ ),
239
+ import_effect.Effect.withSpan("smithers.health.probe", {
240
+ attributes: {
241
+ subjectKind: context.session === void 0 ? "run" : "session",
242
+ subjectId,
243
+ checkerId: check.checker.id,
244
+ monitorId: captured.monitorId
245
+ }
246
+ })
247
+ );
248
+ const observedAt = yield* import_effect.Effect.clockWith((clock) => clock.currentTimeMillis);
249
+ const durationMs = Math.max(0, observedAt - started);
250
+ yield* import_effect.Metric.update(outcomes.pipe(import_effect.Metric.withAttributes({ outcome: result.outcome })), 1);
251
+ yield* import_effect.Metric.update(durations, durationMs);
252
+ return {
253
+ subjectId,
254
+ state,
255
+ checkerId: check.checker.id,
256
+ ...captured,
257
+ observedAt,
258
+ expiresAt: observedAt + check.policy.ttlMs,
259
+ durationMs,
260
+ ...result
261
+ };
262
+ });
263
+ const latestObservation = (candidates, subjectId, incarnation) => {
264
+ let selected;
265
+ for (const candidate of candidates) {
266
+ const observation = candidate.observation;
267
+ if (observation.subjectId !== subjectId || observation.incarnation !== incarnation || observation.outcome === "discarded") continue;
268
+ if (selected === void 0 || observation.evidenceSeq > selected.observation.evidenceSeq || observation.evidenceSeq === selected.observation.evidenceSeq && candidate.sequence > selected.sequence) selected = candidate;
269
+ }
270
+ return selected;
271
+ };
272
+ const rollup = (input) => {
273
+ const latest = input.latest;
274
+ const reading = latest?.observation;
275
+ const freshness = reading === void 0 ? "unobserved" : reading.subjectId !== input.subjectId || reading.incarnation !== input.incarnation || reading.state !== input.state || reading.outcome !== "ok" || reading.report === void 0 || input.now < reading.observedAt || input.now >= reading.expiresAt || input.evidenceSeq !== void 0 && reading.evidenceSeq < input.evidenceSeq ? "stale" : "fresh";
276
+ const terminal = input.state === "completed" || input.state === "failed" || input.state === "cancelled" || input.state === "exited";
277
+ const approval = input.state === "waiting-approval" || input.state === "parked" && input.waitingReason === "approval";
278
+ const released = input.state === "parked" && input.waitingReason === "released";
279
+ const waiting = waitReason(input.state, input.waitingReason);
280
+ let activity = freshness === "fresh" && !terminal && !approval && !released ? reading.report.activity : "unknown";
281
+ let health = input.state === "failed" ? "failing" : input.state === "exited" ? input.exitCode === 0 ? "healthy" : input.exitCode == null ? "unknown" : "failing" : terminal ? "healthy" : approval || released ? "awaiting-human" : waiting !== void 0 ? "healthy" : input.state === "parked" && input.waitingReason === void 0 ? "awaiting-human" : freshness !== "fresh" ? "unknown" : input.baseHealth ?? "unknown";
282
+ const reason = approval ? "awaiting-reply" : released ? "released" : waiting ?? (freshness === "fresh" ? reading?.report?.reason : reading?.reason);
283
+ if (!terminal && !approval && !released && waiting === void 0 && freshness === "fresh") {
284
+ if (reason === "unreachable" && health !== "awaiting-human") health = "failing";
285
+ else if (reason === "no-progress" && health === "healthy") health = "stalled";
286
+ }
287
+ if (waiting !== void 0) activity = "unknown";
288
+ const attention = approval ? "awaiting-approval" : released ? "needs-resume" : activity === "needs-input" ? "needs-input" : ["stalled", "wedged-node", "runaway-loop", "failing"].includes(health) ? "unhealthy" : "none";
289
+ return {
290
+ subjectId: input.subjectId,
291
+ state: input.state,
292
+ activity,
293
+ health,
294
+ attention,
295
+ freshness,
296
+ ...reason === void 0 ? {} : { reason },
297
+ ...reading === void 0 ? {} : {
298
+ provenance: {
299
+ checkerId: reading.checkerId,
300
+ monitorId: reading.monitorId,
301
+ observedAt: reading.observedAt,
302
+ expiresAt: reading.expiresAt,
303
+ evidenceSeq: reading.evidenceSeq,
304
+ incarnation: reading.incarnation,
305
+ version: latest.sequence
306
+ }
307
+ },
308
+ updatedAt: Math.max(input.updatedAt, reading?.observedAt ?? 0)
309
+ };
310
+ };
311
+ //# sourceMappingURL=Health.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/Health.ts"],
4
+ "sourcesContent": ["/** Observational health contracts shared by durable runs and native sessions.\n * @since 1.0.0\n */\n\nimport * as Sha256 from \"@smthrs/crypto/Sha256\"\nimport * as Fault from \"@smthrs/flow/Fault\"\nimport type * as Evaluator from \"@smthrs/model/Evaluator\"\nimport { Cause, Effect, Metric, Schema } from \"effect\"\nimport type { ControlEvent, RunSummary } from \"./ControlSchema.ts\"\nimport { makeJevSessionChecker } from \"./JevSessionChecker.ts\"\n\n/** Authoritative subject lifecycle.\n * @category schemas\n * @since 1.0.0\n */\nexport const SubjectState = Schema.Literals([\n \"accepted\",\n \"running\",\n \"parked\",\n \"waiting-approval\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n \"spawning\",\n \"exited\"\n])\n/** Authoritative subject lifecycle.\n * @category models\n * @since 1.0.0\n */\nexport type SubjectState = typeof SubjectState.Type\n/** Health vocabulary shared with Monitor.\n * @category schemas\n * @since 1.0.0\n */\nexport const HealthState = Schema.Literals([\n \"healthy\",\n \"stalled\",\n \"wedged-node\",\n \"runaway-loop\",\n \"awaiting-human\",\n \"failing\",\n \"unknown\"\n])\n/** Derived subject health.\n * @category models\n * @since 1.0.0\n */\nexport type HealthState = typeof HealthState.Type\n/** Only explicit semantic checks establish activity.\n * @category schemas\n * @since 1.0.0\n */\nexport const Activity = Schema.Literals([\"working\", \"idle\", \"needs-input\", \"unknown\"])\n/** Semantic activity.\n * @category models\n * @since 1.0.0\n */\nexport type Activity = typeof Activity.Type\n/** Attention never confers permission to act. `needs-resume` is a run parked over\n * executions its owner released: nothing restarts them until `smthrs runs resume`.\n * @category schemas\n * @since 1.0.0\n */\nexport const Attention = Schema.Literals([\"none\", \"awaiting-approval\", \"needs-input\", \"needs-resume\", \"unhealthy\"])\n/** Human attention.\n * @category models\n * @since 1.0.0\n */\nexport type Attention = typeof Attention.Type\n/** Whether a successful reading still describes this subject.\n * @category schemas\n * @since 1.0.0\n */\nexport const Freshness = Schema.Literals([\"fresh\", \"stale\", \"unobserved\"])\n/** Reading freshness.\n * @category models\n * @since 1.0.0\n */\nexport type Freshness = typeof Freshness.Type\n/** Public reasons; arbitrary exception text and terminal bytes never cross this boundary.\n * @category schemas\n * @since 1.0.0\n */\nexport const ReasonCode = Schema.Literals([\n \"ok\",\n \"no-progress\",\n \"awaiting-reply\",\n \"prompt-detected\",\n \"quota-wait\",\n \"timer-wait\",\n \"event-wait\",\n \"released\",\n \"unreachable\",\n \"probe-timeout\",\n \"probe-error\",\n \"owner-changed\"\n])\n/** Public reason code.\n * @category models\n * @since 1.0.0\n */\nexport type ReasonCode = typeof ReasonCode.Type\n/** Validated checker output, containing no authority or ordering fields.\n * @category schemas\n * @since 1.0.0\n */\nexport const ProbeReport = Schema.Struct({ activity: Activity, reason: Schema.optional(ReasonCode) })\n/** Validated checker output.\n * @category models\n * @since 1.0.0\n */\nexport type ProbeReport = typeof ProbeReport.Type\nconst Counter = Schema.Int.pipe(Schema.check(Schema.isGreaterThanOrEqualTo(0)))\n\n/** A host-stamped observation; its journal sequence is supplied by the durable writer.\n * @category schemas\n * @since 1.0.0\n */\nexport const HealthObservation = Schema.Struct({\n subjectId: Schema.String,\n state: SubjectState,\n checkerId: Schema.String,\n monitorId: Schema.String,\n incarnation: Schema.String,\n evidenceSeq: Counter,\n observedAt: Counter,\n expiresAt: Counter,\n durationMs: Counter,\n baseHealth: Schema.optional(HealthState),\n outcome: Schema.Literals([\"ok\", \"timeout\", \"error\", \"interrupted\", \"discarded\"]),\n report: Schema.optional(ProbeReport),\n reason: Schema.optional(ReasonCode)\n})\n/** A host-stamped observation.\n * @category models\n * @since 1.0.0\n */\nexport type HealthObservation = typeof HealthObservation.Type\n/** One observation with its authoritative publication order.\n * @category models\n * @since 1.0.0\n */\nexport interface RecordedObservation {\n readonly observation: HealthObservation\n readonly sequence: number\n}\n/** The additive wire contract rendered by every status surface.\n * @category schemas\n * @since 1.0.0\n */\nexport const StatusRollup = Schema.Struct({\n subjectId: Schema.String,\n state: SubjectState,\n activity: Activity,\n health: HealthState,\n attention: Attention,\n freshness: Freshness,\n reason: Schema.optional(ReasonCode),\n provenance: Schema.optional(Schema.Struct({\n checkerId: Schema.String,\n monitorId: Schema.String,\n observedAt: Counter,\n expiresAt: Counter,\n evidenceSeq: Counter,\n incarnation: Schema.String,\n version: Counter\n })),\n updatedAt: Counter\n})\n/** The additive wire contract.\n * @category models\n * @since 1.0.0\n */\nexport type StatusRollup = typeof StatusRollup.Type\n/** Durable event type for observational health.\n * @category constants\n * @since 1.0.0\n */\nexport const statusObservedEventType = \"control.status.observed\"\n/** Opaque identity of the authoritative run ownership and lifecycle point being observed.\n * Equality is meaningful; lexical or numeric ordering is not.\n * @category getters\n * @since 1.0.0\n */\nexport const runIncarnation = (run: RunSummary): string =>\n Sha256.digestSync(JSON.stringify([\n run.runId,\n run.createdAt,\n run.updatedAt,\n run.ownerId ?? null,\n run.parkedBy ?? null,\n run.status,\n run.waitingReason ?? null\n ]))\n\n/** Read-only evidence, deliberately excluding mutation ports and terminal text by default.\n * Checkers are trusted host TypeScript, not a sandbox: captured ambient authority remains their author's responsibility.\n * @category models\n * @since 1.0.0\n */\nexport interface ProbeContext {\n readonly subjectId: string\n readonly state: SubjectState\n readonly events: ReadonlyArray<ControlEvent>\n readonly summary?: RunSummary | undefined\n readonly session?: {\n readonly alive: boolean\n readonly exitCode: number | null\n readonly outputCursor: number\n readonly outputTail?: string | undefined\n } | undefined\n readonly sinceCursor: number\n}\n/** Bounded polling, expiry and failure backoff.\n * @category models\n * @since 1.0.0\n */\nexport interface CheckPolicy {\n readonly intervalMs: number\n readonly timeoutMs: number\n readonly ttlMs: number\n /** Grace for silent work before the flow host considers missing progress unhealthy. */\n readonly stallAfterMs: number\n readonly backoff: { readonly initialMs: number; readonly maxMs: number; readonly factor: number }\n}\n/** Trusted host checker; supply service requirements around its Effect before registration.\n * @category models\n * @since 1.0.0\n */\nexport interface HealthChecker<C = unknown> {\n readonly id: string\n readonly configSchema?: Schema.Codec<C, unknown> | undefined\n readonly defaults?: Partial<CheckPolicy> | undefined\n readonly probe: (context: ProbeContext, config: C) => Effect.Effect<ProbeReport, unknown>\n}\n/** Data may select a registered checker but never executable code.\n * @category models\n * @since 1.0.0\n */\nexport interface HealthBinding {\n readonly checkerId: string\n readonly config?: unknown\n readonly policy?: Partial<CheckPolicy> | undefined\n readonly exposeOutput?: boolean | undefined\n}\n/** Trusted host health configuration.\n * @category models\n * @since 1.0.0\n */\nexport interface HealthConfig {\n // A heterogeneous registry erases C only after each binding is decoded by its own schema.\n readonly checkers?: ReadonlyArray<HealthChecker<any>> | undefined\n readonly bindings?: Readonly<Record<string, HealthBinding>> | undefined\n readonly limits?: { readonly maxSubjects?: number; readonly maxConcurrentProbes?: number } | undefined\n}\n/** Fully admitted checker binding.\n * @category models\n * @since 1.0.0\n */\nexport interface ResolvedCheck {\n readonly checker: HealthChecker<any>\n readonly config: unknown\n readonly policy: CheckPolicy\n readonly exposeOutput: boolean\n}\n/** Host registry, built once before admitting subjects.\n * @category models\n * @since 1.0.0\n */\nexport interface Registry {\n readonly resolve: (key: string) => ResolvedCheck\n readonly limits: { readonly maxSubjects: number; readonly maxConcurrentProbes: number }\n}\n/** Invalid trusted configuration fails startup instead of silently running another policy.\n * @category errors\n * @since 1.0.0\n */\nexport class HealthConfigurationError\n extends Schema.TaggedError<HealthConfigurationError>()(\"HealthConfigurationError\", {\n reason: Schema.Literals([\"invalid-policy\", \"invalid-checker\", \"invalid-config\"])\n })\n{}\nFault.register(\"HealthConfigurationError\", \"bug\")\n/** Safe cadence used by unconfigured hosts.\n * @category constants\n * @since 1.0.0\n */\nexport const defaultPolicy: CheckPolicy = {\n intervalMs: 5_000,\n timeoutMs: 2_000,\n ttlMs: 20_000,\n stallAfterMs: 120_000,\n backoff: { initialMs: 5_000, maxMs: 60_000, factor: 2 }\n}\n/** A known engine wait is a lifecycle fact, not missing progress.\n * @category getters\n * @since 1.0.0\n */\nexport const waitReason = (state: SubjectState, waitingReason?: string): ReasonCode | undefined =>\n state !== \"parked\" ? undefined : waitingReason === \"quota\" ?\n \"quota-wait\"\n : waitingReason === \"timer\"\n ? \"timer-wait\"\n : waitingReason === \"event\"\n ? \"event-wait\"\n : undefined\n/** Flow default observes lifecycle without inventing semantic activity.\n * @category constants\n * @since 1.0.0\n */\nexport const lifecycleRunChecker: HealthChecker = {\n id: \"lifecycle.run\",\n probe: (context) =>\n Effect.succeed({ activity: \"unknown\", reason: waitReason(context.state, context.summary?.waitingReason) ?? \"ok\" })\n}\n/** Session default never interprets silence or output movement as task activity.\n * @category constants\n * @since 1.0.0\n */\nexport const lifecycleSessionChecker: HealthChecker = {\n id: \"lifecycle.session\",\n probe: () => Effect.succeed({ activity: \"unknown\", reason: \"ok\" })\n}\nconst hostCheckers = (evaluator: Evaluator.Evaluator | undefined): ReadonlyArray<HealthChecker<any>> => [\n makeJevSessionChecker({ evaluator })\n]\n/** Checkers every host may bind by id, beyond the lifecycle default it always has.\n *\n * Registration is not a binding. A host opts in by naming one of these as a\n * `HealthBinding.checkerId`; a host that names none keeps the lifecycle\n * default, and no entry here is ever consulted for an unbound subject.\n *\n * @category constants\n * @since 1.0.0\n */\nexport const registeredCheckers: ReadonlyArray<HealthChecker<any>> = hostCheckers(undefined)\nconst bounded = (value: number, min: number, max: number) => Number.isSafeInteger(value) && value >= min && value <= max\nconst invalid = (reason: HealthConfigurationError[\"reason\"]): never => {\n throw new HealthConfigurationError({ reason })\n}\n/** Admit a host registry and all configured bindings. Unknown checker ids use the lifecycle default.\n * @category constructors\n * @since 1.0.0\n */\nexport const makeRegistry = (\n config: HealthConfig = {},\n kind: \"run\" | \"session\" = \"run\",\n evaluator?: Evaluator.Evaluator\n): Registry => {\n const fallback = kind === \"run\" ? lifecycleRunChecker : lifecycleSessionChecker\n const checkers = new Map<string, ResolvedCheck[\"checker\"]>([\n [fallback.id, fallback],\n ...hostCheckers(evaluator).map((checker) => [checker.id, checker] as const)\n ])\n for (const checker of config.checkers ?? []) {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9._/-]{0,127}$/.test(checker.id) || checkers.has(checker.id)) invalid(\"invalid-checker\")\n checkers.set(checker.id, checker)\n }\n const resolve = (binding?: HealthBinding): ResolvedCheck => {\n const checker = binding === undefined ? fallback : checkers.get(binding.checkerId) ?? fallback\n const merged = { ...defaultPolicy, ...checker.defaults, ...binding?.policy }\n if (merged.backoff == null || typeof merged.backoff !== \"object\") invalid(\"invalid-policy\")\n const policy = { ...merged, backoff: { ...merged.backoff } }\n if (\n !bounded(policy.intervalMs, 10, 3_600_000) || !bounded(policy.timeoutMs, 1, 60_000) ||\n !bounded(policy.ttlMs, policy.timeoutMs, 86_400_000) ||\n !bounded(policy.stallAfterMs, policy.intervalMs, 86_400_000) ||\n !bounded(policy.backoff.initialMs, 10, 3_600_000) ||\n !bounded(policy.backoff.maxMs, policy.backoff.initialMs, 3_600_000) ||\n !Number.isFinite(policy.backoff.factor) || policy.backoff.factor < 1 || policy.backoff.factor > 10\n ) invalid(\"invalid-policy\")\n let decoded: unknown = undefined\n if (checker !== fallback || binding?.checkerId === fallback.id) {\n if (checker.configSchema !== undefined) {\n try {\n decoded = Schema.decodeUnknownSync(checker.configSchema)(binding?.config)\n } catch {\n invalid(\"invalid-config\")\n }\n } else if (binding?.config !== undefined) invalid(\"invalid-config\")\n }\n return { checker, config: decoded, policy, exposeOutput: binding?.exposeOutput === true }\n }\n const defaults = resolve()\n const bindings = new Map(Object.entries(config.bindings ?? {}).map(([key, value]) => [key, resolve(value)]))\n const maxSubjects = config.limits?.maxSubjects ?? 128\n const maxConcurrentProbes = config.limits?.maxConcurrentProbes ?? 8\n if (!bounded(maxSubjects, 1, 500) || !bounded(maxConcurrentProbes, 1, 64)) invalid(\"invalid-policy\")\n return { resolve: (key) => bindings.get(key) ?? defaults, limits: { maxSubjects, maxConcurrentProbes } }\n}\n/** Failure delay, bounded even when a subject has failed for a long time.\n * @category getters\n * @since 1.0.0\n */\nexport const nextDelay = (policy: CheckPolicy, consecutiveFailures: number): number =>\n consecutiveFailures <= 0 ? policy.intervalMs : Math.max(\n policy.intervalMs,\n Math.min(\n policy.backoff.maxMs,\n policy.backoff.initialMs * policy.backoff.factor ** Math.min(consecutiveFailures - 1, 32)\n )\n )\n/** Host-only ordering stamp captured before a probe.\n * @category models\n * @since 1.0.0\n */\nexport interface ObservationStamp {\n readonly monitorId: string\n readonly incarnation: string\n readonly evidenceSeq: number\n}\nconst outcomes = Metric.counter(\"smithers.health.probes\")\nconst durations = Metric.histogram(\"smithers.health.probe_duration_ms\", {\n boundaries: [1, 10, 100, 1_000, 5_000, 60_000]\n})\nconst decodeReport = Schema.decodeUnknownSync(ProbeReport)\n/** Evaluate one trusted checker with bounded timeout and safe failure values. Scope interruption propagates.\n * The host must still compare current ownership/lifecycle before durably publishing the returned observation.\n * @category constructors\n * @since 1.0.0\n */\nexport const evaluate = (\n check: ResolvedCheck,\n context: ProbeContext,\n stamp: ObservationStamp\n): Effect.Effect<HealthObservation> =>\n Effect.gen(function*() {\n const subjectId = context.subjectId\n const state = context.state\n const captured = { ...stamp }\n const started = yield* Effect.clockWith((clock) => clock.currentTimeMillis)\n const result = yield* Effect.suspend(() => check.checker.probe(context, check.config)).pipe(\n Effect.flatMap((candidate) => Effect.try({ try: () => decodeReport(candidate), catch: () => \"invalid-report\" })),\n Effect.map((report) => ({ outcome: \"ok\" as const, report })),\n Effect.catchCause((cause) =>\n Cause.hasInterruptsOnly(cause)\n ? Effect.interrupt\n : Effect.succeed({ outcome: \"error\" as const, reason: \"probe-error\" as const })\n ),\n Effect.timeoutOrElse({\n duration: check.policy.timeoutMs,\n orElse: () => Effect.succeed({ outcome: \"timeout\" as const, reason: \"probe-timeout\" as const })\n }),\n Effect.tap((outcome) =>\n Effect.annotateCurrentSpan({\n outcome: outcome.outcome,\n activity: \"report\" in outcome ? outcome.report.activity : \"unknown\"\n })\n ),\n Effect.withSpan(\"smithers.health.probe\", {\n attributes: {\n subjectKind: context.session === undefined ? \"run\" : \"session\",\n subjectId,\n checkerId: check.checker.id,\n monitorId: captured.monitorId\n }\n })\n )\n const observedAt = yield* Effect.clockWith((clock) => clock.currentTimeMillis)\n const durationMs = Math.max(0, observedAt - started)\n yield* Metric.update(outcomes.pipe(Metric.withAttributes({ outcome: result.outcome })), 1)\n yield* Metric.update(durations, durationMs)\n return {\n subjectId,\n state,\n checkerId: check.checker.id,\n ...captured,\n observedAt,\n expiresAt: observedAt + check.policy.ttlMs,\n durationMs,\n ...result\n }\n })\n\n/** Select evidence for the current opaque owner incarnation, breaking equal evidence ties by durable sequence.\n * @category projections\n * @since 1.0.0\n */\nexport const latestObservation = (\n candidates: ReadonlyArray<RecordedObservation>,\n subjectId: string,\n incarnation: string\n): RecordedObservation | undefined => {\n let selected: RecordedObservation | undefined\n for (const candidate of candidates) {\n const observation = candidate.observation\n if (\n observation.subjectId !== subjectId || observation.incarnation !== incarnation ||\n observation.outcome === \"discarded\"\n ) continue\n if (\n selected === undefined || observation.evidenceSeq > selected.observation.evidenceSeq ||\n observation.evidenceSeq === selected.observation.evidenceSeq && candidate.sequence > selected.sequence\n ) selected = candidate\n }\n return selected\n}\n/** Authoritative facts supplied independently of checker output.\n * @category models\n * @since 1.0.0\n */\nexport interface RollupInput {\n readonly subjectId: string\n readonly state: SubjectState\n readonly incarnation: string\n readonly waitingReason?: string | undefined\n readonly exitCode?: number | null | undefined\n readonly baseHealth?: HealthState | undefined\n readonly latest?: RecordedObservation | undefined\n readonly evidenceSeq?: number | undefined\n readonly now: number\n readonly updatedAt: number\n}\n/** Pure precedence: lifecycle and approvals win, and stale probes never establish activity.\n * @category projections\n * @since 1.0.0\n */\nexport const rollup = (input: RollupInput): StatusRollup => {\n const latest = input.latest\n const reading = latest?.observation\n const freshness = reading === undefined ?\n \"unobserved\" :\n reading.subjectId !== input.subjectId || reading.incarnation !== input.incarnation ||\n reading.state !== input.state ||\n reading.outcome !== \"ok\" || reading.report === undefined || input.now < reading.observedAt ||\n input.now >= reading.expiresAt ||\n (input.evidenceSeq !== undefined && reading.evidenceSeq < input.evidenceSeq) ?\n \"stale\" :\n \"fresh\"\n const terminal = input.state === \"completed\" || input.state === \"failed\" || input.state === \"cancelled\" ||\n input.state === \"exited\"\n const approval = input.state === \"waiting-approval\" || input.state === \"parked\" && input.waitingReason === \"approval\"\n // Released executions stay parked until an operator resumes the run (#3328).\n const released = input.state === \"parked\" && input.waitingReason === \"released\"\n const waiting = waitReason(input.state, input.waitingReason)\n let activity: typeof Activity.Type = freshness === \"fresh\" && !terminal && !approval && !released\n ? reading!.report!.activity\n : \"unknown\"\n let health: HealthState = input.state === \"failed\" ? \"failing\" : input.state === \"exited\" ?\n input.exitCode === 0 ? \"healthy\" : input.exitCode == null ? \"unknown\" : \"failing\" :\n terminal ?\n \"healthy\" :\n approval || released ?\n \"awaiting-human\" :\n waiting !== undefined ?\n \"healthy\" :\n input.state === \"parked\" && input.waitingReason === undefined ?\n \"awaiting-human\" :\n freshness !== \"fresh\"\n ? \"unknown\"\n : input.baseHealth ?? \"unknown\"\n const reason = approval\n ? \"awaiting-reply\"\n : released\n ? \"released\"\n : waiting ?? (freshness === \"fresh\" ? reading?.report?.reason : reading?.reason)\n if (!terminal && !approval && !released && waiting === undefined && freshness === \"fresh\") {\n if (reason === \"unreachable\" && health !== \"awaiting-human\") health = \"failing\"\n else if (reason === \"no-progress\" && health === \"healthy\") health = \"stalled\"\n }\n if (waiting !== undefined) activity = \"unknown\"\n const attention: typeof Attention.Type = approval ? \"awaiting-approval\" : released ?\n \"needs-resume\" :\n activity === \"needs-input\" ?\n \"needs-input\" :\n [\"stalled\", \"wedged-node\", \"runaway-loop\", \"failing\"].includes(health)\n ? \"unhealthy\"\n : \"none\"\n return {\n subjectId: input.subjectId,\n state: input.state,\n activity,\n health,\n attention,\n freshness,\n ...(reason === undefined ? {} : { reason }),\n ...(reading === undefined ? {} : {\n provenance: {\n checkerId: reading.checkerId,\n monitorId: reading.monitorId,\n observedAt: reading.observedAt,\n expiresAt: reading.expiresAt,\n evidenceSeq: reading.evidenceSeq,\n incarnation: reading.incarnation,\n version: latest!.sequence\n }\n }),\n updatedAt: Math.max(input.updatedAt, reading?.observedAt ?? 0)\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Session activity judged by the host's existing evaluator.
3
+ * @since 1.0.0
4
+ */
5
+ import type * as Evaluator from "@smthrs/model/Evaluator";
6
+ import { Schema } from "effect";
7
+ import type { HealthChecker } from "./Health.ts";
8
+ declare const JevProbeError_base: Schema.Class<JevProbeError, Schema.TaggedStruct<"JevProbeError", {
9
+ readonly reason: Schema.Literals<readonly ["unconfigured", "http", "timeout", "unreachable", "malformed"]>;
10
+ readonly status: Schema.optional<Schema.Number>;
11
+ }>, import("effect/Cause").YieldableError>;
12
+ /** The configured judge could not produce a usable observation.
13
+ * @category errors
14
+ * @since 1.0.0
15
+ */
16
+ export declare class JevProbeError extends JevProbeError_base {
17
+ }
18
+ /** Maximum terminal evidence retained for one judgment.
19
+ * @category constants
20
+ * @since 1.0.0
21
+ */
22
+ export declare const jevStateTailCharacters: number;
23
+ /** Subscription judgments have a bounded deadline.
24
+ * @category constants
25
+ * @since 1.0.0
26
+ */
27
+ export declare const jevRequestTimeoutMs = 45000;
28
+ /** Probe budget, longer than the request deadline.
29
+ * @category constants
30
+ * @since 1.0.0
31
+ */
32
+ export declare const jevProbeTimeoutMs = 50000;
33
+ /** Minimum confidence for an activity report.
34
+ * @category constants
35
+ * @since 1.0.0
36
+ */
37
+ export declare const jevConfidenceFloor = 0.7;
38
+ /** The host evaluator and its bounded request deadline.
39
+ * @category models
40
+ * @since 1.0.0
41
+ */
42
+ export interface JevSessionCheckerOptions {
43
+ readonly evaluator?: Evaluator.Evaluator | undefined;
44
+ readonly timeoutMs?: number | undefined;
45
+ }
46
+ /** Uses the same judge as flow completion, with no independent auth path.
47
+ * @category constructors
48
+ * @since 1.0.0
49
+ */
50
+ export declare const makeJevSessionChecker: (options?: JevSessionCheckerOptions) => HealthChecker;
51
+ /** Registered but unconfigured until a host supplies its evaluator.
52
+ * @category constants
53
+ * @since 1.0.0
54
+ */
55
+ export declare const jevSessionChecker: HealthChecker;
56
+ export {};
57
+ //# sourceMappingURL=JevSessionChecker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JevSessionChecker.d.ts","sourceRoot":"","sources":["../../src/JevSessionChecker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,KAAK,SAAS,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAA;;;;;AAE7D;;;GAGG;AACH,qBAAa,aAAc,SAAQ,kBAGjC;CAAG;AAYL;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAAW,CAAA;AAC9C;;;GAGG;AACH,eAAO,MAAM,mBAAmB,QAAS,CAAA;AACzC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAAS,CAAA;AACvC;;;GAGG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAA;AACrC;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAA;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACxC;AAoBD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAS,wBAA6B,KAAG,aAyC7E,CAAA;AACF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,aAAuC,CAAA"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var JevSessionChecker_exports = {};
30
+ __export(JevSessionChecker_exports, {
31
+ JevProbeError: () => JevProbeError,
32
+ jevConfidenceFloor: () => jevConfidenceFloor,
33
+ jevProbeTimeoutMs: () => jevProbeTimeoutMs,
34
+ jevRequestTimeoutMs: () => jevRequestTimeoutMs,
35
+ jevSessionChecker: () => jevSessionChecker,
36
+ jevStateTailCharacters: () => jevStateTailCharacters,
37
+ makeJevSessionChecker: () => makeJevSessionChecker
38
+ });
39
+ module.exports = __toCommonJS(JevSessionChecker_exports);
40
+ var Fault = __toESM(require("@smthrs/flow/Fault"), 1);
41
+ var import_effect = require("effect");
42
+ class JevProbeError extends import_effect.Schema.TaggedError()("JevProbeError", {
43
+ reason: import_effect.Schema.Literals(["unconfigured", "http", "timeout", "unreachable", "malformed"]),
44
+ status: import_effect.Schema.optional(import_effect.Schema.Number)
45
+ }) {
46
+ }
47
+ Fault.register(
48
+ "JevProbeError",
49
+ {
50
+ unconfigured: "policy",
51
+ http: "dependency",
52
+ timeout: "dependency",
53
+ unreachable: "dependency",
54
+ malformed: "dependency"
55
+ },
56
+ "reason"
57
+ );
58
+ const jevStateTailCharacters = 4 * 1024;
59
+ const jevRequestTimeoutMs = 45e3;
60
+ const jevProbeTimeoutMs = 5e4;
61
+ const jevConfidenceFloor = 0.7;
62
+ const lifecycleReport = { activity: "unknown", reason: "ok" };
63
+ const activityCriteria = {
64
+ "working": "the agent is executing tools, editing files, or producing work",
65
+ "idle": "the agent finished and is producing nothing",
66
+ "needs-input": "the agent asked the person a question, requested approval or a credential, and is waiting"
67
+ };
68
+ const questions = {
69
+ activity: {
70
+ type: "choice",
71
+ instructions: "Read the tail of this agent session's output. What is the agent doing right now?",
72
+ criteria: activityCriteria
73
+ },
74
+ question: {
75
+ type: "boolean",
76
+ instructions: "Does the output end with the agent waiting for a person to answer?"
77
+ }
78
+ };
79
+ const makeJevSessionChecker = (options = {}) => ({
80
+ id: "jev.session",
81
+ defaults: { timeoutMs: jevProbeTimeoutMs, ttlMs: 6e4 },
82
+ probe: (context) => import_effect.Effect.gen(function* () {
83
+ const session = context.session;
84
+ const tail = session?.outputTail;
85
+ if (session === void 0 || !session.alive || tail === void 0 || tail === "") return lifecycleReport;
86
+ if (options.evaluator === void 0) return yield* import_effect.Effect.fail(new JevProbeError({ reason: "unconfigured" }));
87
+ const result = yield* options.evaluator.evaluate({
88
+ state: { alive: session.alive, exitCode: session.exitCode, outputTail: tail.slice(-jevStateTailCharacters) },
89
+ questions
90
+ }).pipe(
91
+ import_effect.Effect.mapError(
92
+ (error) => new JevProbeError({
93
+ reason: error.code === "timeout" ? "timeout" : error.code === "refused" ? "http" : error.code === "unreachable" ? "unreachable" : "malformed",
94
+ ...error.status === void 0 ? {} : { status: error.status }
95
+ })
96
+ ),
97
+ import_effect.Effect.timeoutOrElse({
98
+ duration: options.timeoutMs ?? jevRequestTimeoutMs,
99
+ orElse: () => import_effect.Effect.fail(new JevProbeError({ reason: "timeout" }))
100
+ })
101
+ );
102
+ const answer = result.answers.activity;
103
+ if (answer?.type !== "choice" || !Object.hasOwn(activityCriteria, answer.choice)) {
104
+ return yield* import_effect.Effect.fail(new JevProbeError({ reason: "malformed" }));
105
+ }
106
+ const confidence = result.confidence?.activity ?? answer.probabilities?.[answer.choice] ?? 0;
107
+ if (!Number.isFinite(confidence) || confidence < jevConfidenceFloor || confidence > 1) return lifecycleReport;
108
+ const choice = answer.choice;
109
+ return choice === "needs-input" ? { activity: choice, reason: "prompt-detected" } : { activity: choice, reason: "ok" };
110
+ })
111
+ });
112
+ const jevSessionChecker = makeJevSessionChecker();
113
+ //# sourceMappingURL=JevSessionChecker.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/JevSessionChecker.ts"],
4
+ "sourcesContent": ["/**\n * Session activity judged by the host's existing evaluator.\n * @since 1.0.0\n */\n\nimport * as Fault from \"@smthrs/flow/Fault\"\nimport type * as Evaluator from \"@smthrs/model/Evaluator\"\nimport { Effect, Schema } from \"effect\"\nimport type { HealthChecker, ProbeReport } from \"./Health.ts\"\n\n/** The configured judge could not produce a usable observation.\n * @category errors\n * @since 1.0.0\n */\nexport class JevProbeError extends Schema.TaggedError<JevProbeError>()(\"JevProbeError\", {\n reason: Schema.Literals([\"unconfigured\", \"http\", \"timeout\", \"unreachable\", \"malformed\"]),\n status: Schema.optional(Schema.Number)\n}) {}\nFault.register(\n \"JevProbeError\",\n {\n unconfigured: \"policy\",\n http: \"dependency\",\n timeout: \"dependency\",\n unreachable: \"dependency\",\n malformed: \"dependency\"\n } satisfies Fault.Rows<JevProbeError[\"reason\"]>,\n \"reason\"\n)\n/** Maximum terminal evidence retained for one judgment.\n * @category constants\n * @since 1.0.0\n */\nexport const jevStateTailCharacters = 4 * 1024\n/** Subscription judgments have a bounded deadline.\n * @category constants\n * @since 1.0.0\n */\nexport const jevRequestTimeoutMs = 45_000\n/** Probe budget, longer than the request deadline.\n * @category constants\n * @since 1.0.0\n */\nexport const jevProbeTimeoutMs = 50_000\n/** Minimum confidence for an activity report.\n * @category constants\n * @since 1.0.0\n */\nexport const jevConfidenceFloor = 0.7\n/** The host evaluator and its bounded request deadline.\n * @category models\n * @since 1.0.0\n */\nexport interface JevSessionCheckerOptions {\n readonly evaluator?: Evaluator.Evaluator | undefined\n readonly timeoutMs?: number | undefined\n}\nconst lifecycleReport: ProbeReport = { activity: \"unknown\", reason: \"ok\" }\nconst activityCriteria = {\n \"working\": \"the agent is executing tools, editing files, or producing work\",\n \"idle\": \"the agent finished and is producing nothing\",\n \"needs-input\": \"the agent asked the person a question, requested approval or a credential, and is waiting\"\n} as const\n\nconst questions = {\n activity: {\n type: \"choice\",\n instructions: \"Read the tail of this agent session's output. What is the agent doing right now?\",\n criteria: activityCriteria\n },\n question: {\n type: \"boolean\",\n instructions: \"Does the output end with the agent waiting for a person to answer?\"\n }\n} as const\n\n/** Uses the same judge as flow completion, with no independent auth path.\n * @category constructors\n * @since 1.0.0\n */\nexport const makeJevSessionChecker = (options: JevSessionCheckerOptions = {}): HealthChecker => ({\n id: \"jev.session\",\n defaults: { timeoutMs: jevProbeTimeoutMs, ttlMs: 60_000 },\n probe: (context) =>\n Effect.gen(function*() {\n const session = context.session\n const tail = session?.outputTail\n if (session === undefined || !session.alive || tail === undefined || tail === \"\") return lifecycleReport\n if (options.evaluator === undefined) return yield* Effect.fail(new JevProbeError({ reason: \"unconfigured\" }))\n const result = yield* options.evaluator.evaluate({\n state: { alive: session.alive, exitCode: session.exitCode, outputTail: tail.slice(-jevStateTailCharacters) },\n questions\n }).pipe(\n Effect.mapError((error) =>\n new JevProbeError({\n reason: error.code === \"timeout\"\n ? \"timeout\"\n : error.code === \"refused\"\n ? \"http\"\n : error.code === \"unreachable\"\n ? \"unreachable\"\n : \"malformed\",\n ...(error.status === undefined ? {} : { status: error.status })\n })\n ),\n Effect.timeoutOrElse({\n duration: options.timeoutMs ?? jevRequestTimeoutMs,\n orElse: () => Effect.fail(new JevProbeError({ reason: \"timeout\" }))\n })\n )\n const answer = result.answers.activity\n if (answer?.type !== \"choice\" || !Object.hasOwn(activityCriteria, answer.choice)) {\n return yield* Effect.fail(new JevProbeError({ reason: \"malformed\" }))\n }\n const confidence = result.confidence?.activity ?? answer.probabilities?.[answer.choice] ?? 0\n if (!Number.isFinite(confidence) || confidence < jevConfidenceFloor || confidence > 1) return lifecycleReport\n const choice = answer.choice as keyof typeof activityCriteria\n return choice === \"needs-input\"\n ? { activity: choice, reason: \"prompt-detected\" }\n : { activity: choice, reason: \"ok\" }\n })\n})\n/** Registered but unconfigured until a host supplies its evaluator.\n * @category constants\n * @since 1.0.0\n */\nexport const jevSessionChecker: HealthChecker = makeJevSessionChecker()\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,YAAuB;AAEvB,oBAA+B;AAOxB,MAAM,sBAAsB,qBAAO,YAA2B,EAAE,iBAAiB;AAAA,EACtF,QAAQ,qBAAO,SAAS,CAAC,gBAAgB,QAAQ,WAAW,eAAe,WAAW,CAAC;AAAA,EACvF,QAAQ,qBAAO,SAAS,qBAAO,MAAM;AACvC,CAAC,EAAE;AAAC;AACJ,MAAM;AAAA,EACJ;AAAA,EACA;AAAA,IACE,cAAc;AAAA,IACd,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AAAA,EACA;AACF;AAKO,MAAM,yBAAyB,IAAI;AAKnC,MAAM,sBAAsB;AAK5B,MAAM,oBAAoB;AAK1B,MAAM,qBAAqB;AASlC,MAAM,kBAA+B,EAAE,UAAU,WAAW,QAAQ,KAAK;AACzE,MAAM,mBAAmB;AAAA,EACvB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,eAAe;AACjB;AAEA,MAAM,YAAY;AAAA,EAChB,UAAU;AAAA,IACR,MAAM;AAAA,IACN,cAAc;AAAA,IACd,UAAU;AAAA,EACZ;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AACF;AAMO,MAAM,wBAAwB,CAAC,UAAoC,CAAC,OAAsB;AAAA,EAC/F,IAAI;AAAA,EACJ,UAAU,EAAE,WAAW,mBAAmB,OAAO,IAAO;AAAA,EACxD,OAAO,CAAC,YACN,qBAAO,IAAI,aAAY;AACrB,UAAM,UAAU,QAAQ;AACxB,UAAM,OAAO,SAAS;AACtB,QAAI,YAAY,UAAa,CAAC,QAAQ,SAAS,SAAS,UAAa,SAAS,GAAI,QAAO;AACzF,QAAI,QAAQ,cAAc,OAAW,QAAO,OAAO,qBAAO,KAAK,IAAI,cAAc,EAAE,QAAQ,eAAe,CAAC,CAAC;AAC5G,UAAM,SAAS,OAAO,QAAQ,UAAU,SAAS;AAAA,MAC/C,OAAO,EAAE,OAAO,QAAQ,OAAO,UAAU,QAAQ,UAAU,YAAY,KAAK,MAAM,CAAC,sBAAsB,EAAE;AAAA,MAC3G;AAAA,IACF,CAAC,EAAE;AAAA,MACD,qBAAO;AAAA,QAAS,CAAC,UACf,IAAI,cAAc;AAAA,UAChB,QAAQ,MAAM,SAAS,YACnB,YACA,MAAM,SAAS,YACf,SACA,MAAM,SAAS,gBACf,gBACA;AAAA,UACJ,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,QAC/D,CAAC;AAAA,MACH;AAAA,MACA,qBAAO,cAAc;AAAA,QACnB,UAAU,QAAQ,aAAa;AAAA,QAC/B,QAAQ,MAAM,qBAAO,KAAK,IAAI,cAAc,EAAE,QAAQ,UAAU,CAAC,CAAC;AAAA,MACpE,CAAC;AAAA,IACH;AACA,UAAM,SAAS,OAAO,QAAQ;AAC9B,QAAI,QAAQ,SAAS,YAAY,CAAC,OAAO,OAAO,kBAAkB,OAAO,MAAM,GAAG;AAChF,aAAO,OAAO,qBAAO,KAAK,IAAI,cAAc,EAAE,QAAQ,YAAY,CAAC,CAAC;AAAA,IACtE;AACA,UAAM,aAAa,OAAO,YAAY,YAAY,OAAO,gBAAgB,OAAO,MAAM,KAAK;AAC3F,QAAI,CAAC,OAAO,SAAS,UAAU,KAAK,aAAa,sBAAsB,aAAa,EAAG,QAAO;AAC9F,UAAM,SAAS,OAAO;AACtB,WAAO,WAAW,gBACd,EAAE,UAAU,QAAQ,QAAQ,kBAAkB,IAC9C,EAAE,UAAU,QAAQ,QAAQ,KAAK;AAAA,EACvC,CAAC;AACL;AAKO,MAAM,oBAAmC,sBAAsB;",
6
+ "names": []
7
+ }