@smthrs/harness 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 (476) hide show
  1. package/CHANGELOG.md +387 -0
  2. package/LICENSE +21 -0
  3. package/README.md +138 -2
  4. package/dist/cjs/AgentEvent.d.ts +3092 -0
  5. package/dist/cjs/AgentEvent.d.ts.map +1 -0
  6. package/dist/cjs/AgentEvent.js +1116 -0
  7. package/dist/cjs/AgentEvent.js.map +7 -0
  8. package/dist/cjs/CallLedger.d.ts +378 -0
  9. package/dist/cjs/CallLedger.d.ts.map +1 -0
  10. package/dist/cjs/CallLedger.js +240 -0
  11. package/dist/cjs/CallLedger.js.map +7 -0
  12. package/dist/cjs/Cell.d.ts +774 -0
  13. package/dist/cjs/Cell.d.ts.map +1 -0
  14. package/dist/cjs/Cell.js +431 -0
  15. package/dist/cjs/Cell.js.map +7 -0
  16. package/dist/cjs/CellCalls.d.ts +115 -0
  17. package/dist/cjs/CellCalls.d.ts.map +1 -0
  18. package/dist/cjs/CellCalls.js +98 -0
  19. package/dist/cjs/CellCalls.js.map +7 -0
  20. package/dist/cjs/CellHistory.d.ts +102 -0
  21. package/dist/cjs/CellHistory.d.ts.map +1 -0
  22. package/dist/cjs/CellHistory.js +54 -0
  23. package/dist/cjs/CellHistory.js.map +7 -0
  24. package/dist/cjs/CellTurn.d.ts +1071 -0
  25. package/dist/cjs/CellTurn.d.ts.map +1 -0
  26. package/dist/cjs/CellTurn.js +2618 -0
  27. package/dist/cjs/CellTurn.js.map +7 -0
  28. package/dist/cjs/CellValidation.d.ts +94 -0
  29. package/dist/cjs/CellValidation.d.ts.map +1 -0
  30. package/dist/cjs/CellValidation.js +218 -0
  31. package/dist/cjs/CellValidation.js.map +7 -0
  32. package/dist/cjs/Compaction.d.ts +158 -0
  33. package/dist/cjs/Compaction.d.ts.map +1 -0
  34. package/dist/cjs/Compaction.js +189 -0
  35. package/dist/cjs/Compaction.js.map +7 -0
  36. package/dist/cjs/CompletionClaim.d.ts +801 -0
  37. package/dist/cjs/CompletionClaim.d.ts.map +1 -0
  38. package/dist/cjs/CompletionClaim.js +303 -0
  39. package/dist/cjs/CompletionClaim.js.map +7 -0
  40. package/dist/cjs/ContextWindow.d.ts +435 -0
  41. package/dist/cjs/ContextWindow.d.ts.map +1 -0
  42. package/dist/cjs/ContextWindow.js +319 -0
  43. package/dist/cjs/ContextWindow.js.map +7 -0
  44. package/dist/cjs/EngineLike.d.ts +546 -0
  45. package/dist/cjs/EngineLike.d.ts.map +1 -0
  46. package/dist/cjs/EngineLike.js +114 -0
  47. package/dist/cjs/EngineLike.js.map +7 -0
  48. package/dist/cjs/ExternalTranscript.d.ts +349 -0
  49. package/dist/cjs/ExternalTranscript.d.ts.map +1 -0
  50. package/dist/cjs/ExternalTranscript.js +826 -0
  51. package/dist/cjs/ExternalTranscript.js.map +7 -0
  52. package/dist/cjs/FailedCall.d.ts +132 -0
  53. package/dist/cjs/FailedCall.d.ts.map +1 -0
  54. package/dist/cjs/FailedCall.js +53 -0
  55. package/dist/cjs/FailedCall.js.map +7 -0
  56. package/dist/cjs/FlowBinding.d.ts +289 -0
  57. package/dist/cjs/FlowBinding.d.ts.map +1 -0
  58. package/dist/cjs/FlowBinding.js +251 -0
  59. package/dist/cjs/FlowBinding.js.map +7 -0
  60. package/dist/cjs/HarnessError.d.ts +57 -0
  61. package/dist/cjs/HarnessError.d.ts.map +1 -0
  62. package/dist/cjs/HarnessError.js +75 -0
  63. package/dist/cjs/HarnessError.js.map +7 -0
  64. package/dist/cjs/Judgement.d.ts +289 -0
  65. package/dist/cjs/Judgement.d.ts.map +1 -0
  66. package/dist/cjs/Judgement.js +240 -0
  67. package/dist/cjs/Judgement.js.map +7 -0
  68. package/dist/cjs/Monitor.d.ts +374 -0
  69. package/dist/cjs/Monitor.d.ts.map +1 -0
  70. package/dist/cjs/Monitor.js +233 -0
  71. package/dist/cjs/Monitor.js.map +7 -0
  72. package/dist/cjs/NarrowedCheck.d.ts +523 -0
  73. package/dist/cjs/NarrowedCheck.d.ts.map +1 -0
  74. package/dist/cjs/NarrowedCheck.js +263 -0
  75. package/dist/cjs/NarrowedCheck.js.map +7 -0
  76. package/dist/cjs/Notifications.d.ts +42 -0
  77. package/dist/cjs/Notifications.d.ts.map +1 -0
  78. package/dist/cjs/Notifications.js +177 -0
  79. package/dist/cjs/Notifications.js.map +7 -0
  80. package/dist/cjs/Plan.d.ts +127 -0
  81. package/dist/cjs/Plan.d.ts.map +1 -0
  82. package/dist/cjs/Plan.js +77 -0
  83. package/dist/cjs/Plan.js.map +7 -0
  84. package/dist/cjs/QuickJSSandbox.d.ts +151 -0
  85. package/dist/cjs/QuickJSSandbox.d.ts.map +1 -0
  86. package/dist/cjs/QuickJSSandbox.js +987 -0
  87. package/dist/cjs/QuickJSSandbox.js.map +7 -0
  88. package/dist/cjs/Relevance.d.ts +213 -0
  89. package/dist/cjs/Relevance.d.ts.map +1 -0
  90. package/dist/cjs/Relevance.js +183 -0
  91. package/dist/cjs/Relevance.js.map +7 -0
  92. package/dist/cjs/Sandbox.d.ts +637 -0
  93. package/dist/cjs/Sandbox.d.ts.map +1 -0
  94. package/dist/cjs/Sandbox.js +260 -0
  95. package/dist/cjs/Sandbox.js.map +7 -0
  96. package/dist/cjs/Steering.d.ts +464 -0
  97. package/dist/cjs/Steering.d.ts.map +1 -0
  98. package/dist/cjs/Steering.js +153 -0
  99. package/dist/cjs/Steering.js.map +7 -0
  100. package/dist/cjs/StructuredOutput.d.ts +252 -0
  101. package/dist/cjs/StructuredOutput.d.ts.map +1 -0
  102. package/dist/cjs/StructuredOutput.js +266 -0
  103. package/dist/cjs/StructuredOutput.js.map +7 -0
  104. package/dist/cjs/Sufficiency.d.ts +195 -0
  105. package/dist/cjs/Sufficiency.d.ts.map +1 -0
  106. package/dist/cjs/Sufficiency.js +110 -0
  107. package/dist/cjs/Sufficiency.js.map +7 -0
  108. package/dist/cjs/Supervisor.d.ts +719 -0
  109. package/dist/cjs/Supervisor.d.ts.map +1 -0
  110. package/dist/cjs/Supervisor.js +313 -0
  111. package/dist/cjs/Supervisor.js.map +7 -0
  112. package/dist/cjs/Tokens.d.ts +86 -0
  113. package/dist/cjs/Tokens.d.ts.map +1 -0
  114. package/dist/cjs/Tokens.js +72 -0
  115. package/dist/cjs/Tokens.js.map +7 -0
  116. package/dist/cjs/Transcript.d.ts +171 -0
  117. package/dist/cjs/Transcript.d.ts.map +1 -0
  118. package/dist/cjs/Transcript.js +342 -0
  119. package/dist/cjs/Transcript.js.map +7 -0
  120. package/dist/cjs/TruncatedOutput.d.ts +186 -0
  121. package/dist/cjs/TruncatedOutput.d.ts.map +1 -0
  122. package/dist/cjs/TruncatedOutput.js +143 -0
  123. package/dist/cjs/TruncatedOutput.js.map +7 -0
  124. package/dist/cjs/UnmovedTree.d.ts +113 -0
  125. package/dist/cjs/UnmovedTree.d.ts.map +1 -0
  126. package/dist/cjs/UnmovedTree.js +38 -0
  127. package/dist/cjs/UnmovedTree.js.map +7 -0
  128. package/dist/cjs/UnresolvedFailure.d.ts +196 -0
  129. package/dist/cjs/UnresolvedFailure.d.ts.map +1 -0
  130. package/dist/cjs/UnresolvedFailure.js +77 -0
  131. package/dist/cjs/UnresolvedFailure.js.map +7 -0
  132. package/dist/cjs/VacuousVerification.d.ts +237 -0
  133. package/dist/cjs/VacuousVerification.d.ts.map +1 -0
  134. package/dist/cjs/VacuousVerification.js +91 -0
  135. package/dist/cjs/VacuousVerification.js.map +7 -0
  136. package/dist/cjs/VariablesPanel.d.ts +117 -0
  137. package/dist/cjs/VariablesPanel.d.ts.map +1 -0
  138. package/dist/cjs/VariablesPanel.js +108 -0
  139. package/dist/cjs/VariablesPanel.js.map +7 -0
  140. package/dist/cjs/index.d.ts +172 -0
  141. package/dist/cjs/index.d.ts.map +1 -0
  142. package/dist/cjs/index.js +99 -0
  143. package/dist/cjs/index.js.map +7 -0
  144. package/dist/cjs/internal/bytes.d.ts +36 -0
  145. package/dist/cjs/internal/bytes.d.ts.map +1 -0
  146. package/dist/cjs/internal/bytes.js +57 -0
  147. package/dist/cjs/internal/bytes.js.map +7 -0
  148. package/dist/cjs/internal/cellPrompt.d.ts +122 -0
  149. package/dist/cjs/internal/cellPrompt.d.ts.map +1 -0
  150. package/dist/cjs/internal/cellPrompt.js +146 -0
  151. package/dist/cjs/internal/cellPrompt.js.map +7 -0
  152. package/dist/cjs/internal/compactable.d.ts +44 -0
  153. package/dist/cjs/internal/compactable.d.ts.map +1 -0
  154. package/dist/cjs/internal/compactable.js +56 -0
  155. package/dist/cjs/internal/compactable.js.map +7 -0
  156. package/dist/cjs/internal/compactionMarks.d.ts +278 -0
  157. package/dist/cjs/internal/compactionMarks.d.ts.map +1 -0
  158. package/dist/cjs/internal/compactionMarks.js +212 -0
  159. package/dist/cjs/internal/compactionMarks.js.map +7 -0
  160. package/dist/cjs/internal/demandText.d.ts +95 -0
  161. package/dist/cjs/internal/demandText.d.ts.map +1 -0
  162. package/dist/cjs/internal/demandText.js +70 -0
  163. package/dist/cjs/internal/demandText.js.map +7 -0
  164. package/dist/cjs/internal/elide.d.ts +109 -0
  165. package/dist/cjs/internal/elide.d.ts.map +1 -0
  166. package/dist/cjs/internal/elide.js +59 -0
  167. package/dist/cjs/internal/elide.js.map +7 -0
  168. package/dist/cjs/internal/frame.d.ts +463 -0
  169. package/dist/cjs/internal/frame.d.ts.map +1 -0
  170. package/dist/cjs/internal/frame.js +514 -0
  171. package/dist/cjs/internal/frame.js.map +7 -0
  172. package/dist/cjs/internal/nonNegativeSafeInt.d.ts +20 -0
  173. package/dist/cjs/internal/nonNegativeSafeInt.d.ts.map +1 -0
  174. package/dist/cjs/internal/nonNegativeSafeInt.js +29 -0
  175. package/dist/cjs/internal/nonNegativeSafeInt.js.map +7 -0
  176. package/dist/cjs/internal/paidUsage.d.ts +52 -0
  177. package/dist/cjs/internal/paidUsage.d.ts.map +1 -0
  178. package/dist/cjs/internal/paidUsage.js +70 -0
  179. package/dist/cjs/internal/paidUsage.js.map +7 -0
  180. package/dist/cjs/internal/printChannel.d.ts +233 -0
  181. package/dist/cjs/internal/printChannel.d.ts.map +1 -0
  182. package/dist/cjs/internal/printChannel.js +165 -0
  183. package/dist/cjs/internal/printChannel.js.map +7 -0
  184. package/dist/cjs/internal/printsObservation.d.ts +26 -0
  185. package/dist/cjs/internal/printsObservation.d.ts.map +1 -0
  186. package/dist/cjs/internal/printsObservation.js +27 -0
  187. package/dist/cjs/internal/printsObservation.js.map +7 -0
  188. package/dist/cjs/internal/refusal.d.ts +40 -0
  189. package/dist/cjs/internal/refusal.d.ts.map +1 -0
  190. package/dist/cjs/internal/refusal.js +45 -0
  191. package/dist/cjs/internal/refusal.js.map +7 -0
  192. package/dist/cjs/internal/supervision.d.ts +174 -0
  193. package/dist/cjs/internal/supervision.d.ts.map +1 -0
  194. package/dist/cjs/internal/supervision.js +402 -0
  195. package/dist/cjs/internal/supervision.js.map +7 -0
  196. package/dist/cjs/internal/unfinishedWork.d.ts +99 -0
  197. package/dist/cjs/internal/unfinishedWork.d.ts.map +1 -0
  198. package/dist/cjs/internal/unfinishedWork.js +80 -0
  199. package/dist/cjs/internal/unfinishedWork.js.map +7 -0
  200. package/dist/cjs/internal/unobservedCall.d.ts +112 -0
  201. package/dist/cjs/internal/unobservedCall.d.ts.map +1 -0
  202. package/dist/cjs/internal/unobservedCall.js +345 -0
  203. package/dist/cjs/internal/unobservedCall.js.map +7 -0
  204. package/dist/cjs/internal/untrustedData.d.ts +14 -0
  205. package/dist/cjs/internal/untrustedData.d.ts.map +1 -0
  206. package/dist/cjs/internal/untrustedData.js +30 -0
  207. package/dist/cjs/internal/untrustedData.js.map +7 -0
  208. package/dist/cjs/package.json +1 -0
  209. package/dist/esm/AgentEvent.d.ts +3092 -0
  210. package/dist/esm/AgentEvent.d.ts.map +1 -0
  211. package/dist/esm/AgentEvent.js +1610 -0
  212. package/dist/esm/AgentEvent.js.map +1 -0
  213. package/dist/esm/CallLedger.d.ts +378 -0
  214. package/dist/esm/CallLedger.d.ts.map +1 -0
  215. package/dist/esm/CallLedger.js +506 -0
  216. package/dist/esm/CallLedger.js.map +1 -0
  217. package/dist/esm/Cell.d.ts +774 -0
  218. package/dist/esm/Cell.d.ts.map +1 -0
  219. package/dist/esm/Cell.js +772 -0
  220. package/dist/esm/Cell.js.map +1 -0
  221. package/dist/esm/CellCalls.d.ts +115 -0
  222. package/dist/esm/CellCalls.d.ts.map +1 -0
  223. package/dist/esm/CellCalls.js +97 -0
  224. package/dist/esm/CellCalls.js.map +1 -0
  225. package/dist/esm/CellHistory.d.ts +102 -0
  226. package/dist/esm/CellHistory.d.ts.map +1 -0
  227. package/dist/esm/CellHistory.js +91 -0
  228. package/dist/esm/CellHistory.js.map +1 -0
  229. package/dist/esm/CellTurn.d.ts +1071 -0
  230. package/dist/esm/CellTurn.d.ts.map +1 -0
  231. package/dist/esm/CellTurn.js +3410 -0
  232. package/dist/esm/CellTurn.js.map +1 -0
  233. package/dist/esm/CellValidation.d.ts +94 -0
  234. package/dist/esm/CellValidation.d.ts.map +1 -0
  235. package/dist/esm/CellValidation.js +335 -0
  236. package/dist/esm/CellValidation.js.map +1 -0
  237. package/dist/esm/Compaction.d.ts +158 -0
  238. package/dist/esm/Compaction.d.ts.map +1 -0
  239. package/dist/esm/Compaction.js +216 -0
  240. package/dist/esm/Compaction.js.map +1 -0
  241. package/dist/esm/CompletionClaim.d.ts +801 -0
  242. package/dist/esm/CompletionClaim.d.ts.map +1 -0
  243. package/dist/esm/CompletionClaim.js +833 -0
  244. package/dist/esm/CompletionClaim.js.map +1 -0
  245. package/dist/esm/ContextWindow.d.ts +435 -0
  246. package/dist/esm/ContextWindow.d.ts.map +1 -0
  247. package/dist/esm/ContextWindow.js +427 -0
  248. package/dist/esm/ContextWindow.js.map +1 -0
  249. package/dist/esm/EngineLike.d.ts +546 -0
  250. package/dist/esm/EngineLike.d.ts.map +1 -0
  251. package/dist/esm/EngineLike.js +218 -0
  252. package/dist/esm/EngineLike.js.map +1 -0
  253. package/dist/esm/ExternalTranscript.d.ts +349 -0
  254. package/dist/esm/ExternalTranscript.d.ts.map +1 -0
  255. package/dist/esm/ExternalTranscript.js +987 -0
  256. package/dist/esm/ExternalTranscript.js.map +1 -0
  257. package/dist/esm/FailedCall.d.ts +132 -0
  258. package/dist/esm/FailedCall.d.ts.map +1 -0
  259. package/dist/esm/FailedCall.js +131 -0
  260. package/dist/esm/FailedCall.js.map +1 -0
  261. package/dist/esm/FlowBinding.d.ts +289 -0
  262. package/dist/esm/FlowBinding.d.ts.map +1 -0
  263. package/dist/esm/FlowBinding.js +376 -0
  264. package/dist/esm/FlowBinding.js.map +1 -0
  265. package/dist/esm/HarnessError.d.ts +57 -0
  266. package/dist/esm/HarnessError.d.ts.map +1 -0
  267. package/dist/esm/HarnessError.js +85 -0
  268. package/dist/esm/HarnessError.js.map +1 -0
  269. package/dist/esm/Judgement.d.ts +289 -0
  270. package/dist/esm/Judgement.d.ts.map +1 -0
  271. package/dist/esm/Judgement.js +305 -0
  272. package/dist/esm/Judgement.js.map +1 -0
  273. package/dist/esm/Monitor.d.ts +374 -0
  274. package/dist/esm/Monitor.d.ts.map +1 -0
  275. package/dist/esm/Monitor.js +370 -0
  276. package/dist/esm/Monitor.js.map +1 -0
  277. package/dist/esm/NarrowedCheck.d.ts +523 -0
  278. package/dist/esm/NarrowedCheck.d.ts.map +1 -0
  279. package/dist/esm/NarrowedCheck.js +612 -0
  280. package/dist/esm/NarrowedCheck.js.map +1 -0
  281. package/dist/esm/Notifications.d.ts +42 -0
  282. package/dist/esm/Notifications.d.ts.map +1 -0
  283. package/dist/esm/Notifications.js +215 -0
  284. package/dist/esm/Notifications.js.map +1 -0
  285. package/dist/esm/Plan.d.ts +127 -0
  286. package/dist/esm/Plan.d.ts.map +1 -0
  287. package/dist/esm/Plan.js +97 -0
  288. package/dist/esm/Plan.js.map +1 -0
  289. package/dist/esm/QuickJSSandbox.d.ts +151 -0
  290. package/dist/esm/QuickJSSandbox.d.ts.map +1 -0
  291. package/dist/esm/QuickJSSandbox.js +1364 -0
  292. package/dist/esm/QuickJSSandbox.js.map +1 -0
  293. package/dist/esm/Relevance.d.ts +213 -0
  294. package/dist/esm/Relevance.d.ts.map +1 -0
  295. package/dist/esm/Relevance.js +254 -0
  296. package/dist/esm/Relevance.js.map +1 -0
  297. package/dist/esm/Sandbox.d.ts +637 -0
  298. package/dist/esm/Sandbox.d.ts.map +1 -0
  299. package/dist/esm/Sandbox.js +464 -0
  300. package/dist/esm/Sandbox.js.map +1 -0
  301. package/dist/esm/Steering.d.ts +464 -0
  302. package/dist/esm/Steering.d.ts.map +1 -0
  303. package/dist/esm/Steering.js +193 -0
  304. package/dist/esm/Steering.js.map +1 -0
  305. package/dist/esm/StructuredOutput.d.ts +252 -0
  306. package/dist/esm/StructuredOutput.d.ts.map +1 -0
  307. package/dist/esm/StructuredOutput.js +430 -0
  308. package/dist/esm/StructuredOutput.js.map +1 -0
  309. package/dist/esm/Sufficiency.d.ts +195 -0
  310. package/dist/esm/Sufficiency.d.ts.map +1 -0
  311. package/dist/esm/Sufficiency.js +207 -0
  312. package/dist/esm/Sufficiency.js.map +1 -0
  313. package/dist/esm/Supervisor.d.ts +719 -0
  314. package/dist/esm/Supervisor.d.ts.map +1 -0
  315. package/dist/esm/Supervisor.js +575 -0
  316. package/dist/esm/Supervisor.js.map +1 -0
  317. package/dist/esm/Tokens.d.ts +86 -0
  318. package/dist/esm/Tokens.d.ts.map +1 -0
  319. package/dist/esm/Tokens.js +92 -0
  320. package/dist/esm/Tokens.js.map +1 -0
  321. package/dist/esm/Transcript.d.ts +171 -0
  322. package/dist/esm/Transcript.d.ts.map +1 -0
  323. package/dist/esm/Transcript.js +424 -0
  324. package/dist/esm/Transcript.js.map +1 -0
  325. package/dist/esm/TruncatedOutput.d.ts +186 -0
  326. package/dist/esm/TruncatedOutput.d.ts.map +1 -0
  327. package/dist/esm/TruncatedOutput.js +257 -0
  328. package/dist/esm/TruncatedOutput.js.map +1 -0
  329. package/dist/esm/UnmovedTree.d.ts +113 -0
  330. package/dist/esm/UnmovedTree.d.ts.map +1 -0
  331. package/dist/esm/UnmovedTree.js +90 -0
  332. package/dist/esm/UnmovedTree.js.map +1 -0
  333. package/dist/esm/UnresolvedFailure.d.ts +196 -0
  334. package/dist/esm/UnresolvedFailure.d.ts.map +1 -0
  335. package/dist/esm/UnresolvedFailure.js +218 -0
  336. package/dist/esm/UnresolvedFailure.js.map +1 -0
  337. package/dist/esm/VacuousVerification.d.ts +237 -0
  338. package/dist/esm/VacuousVerification.d.ts.map +1 -0
  339. package/dist/esm/VacuousVerification.js +245 -0
  340. package/dist/esm/VacuousVerification.js.map +1 -0
  341. package/dist/esm/VariablesPanel.d.ts +117 -0
  342. package/dist/esm/VariablesPanel.d.ts.map +1 -0
  343. package/dist/esm/VariablesPanel.js +142 -0
  344. package/dist/esm/VariablesPanel.js.map +1 -0
  345. package/dist/esm/index.d.ts +172 -0
  346. package/dist/esm/index.d.ts.map +1 -0
  347. package/dist/esm/index.js +172 -0
  348. package/dist/esm/index.js.map +1 -0
  349. package/dist/esm/internal/bytes.d.ts +36 -0
  350. package/dist/esm/internal/bytes.d.ts.map +1 -0
  351. package/dist/esm/internal/bytes.js +70 -0
  352. package/dist/esm/internal/bytes.js.map +1 -0
  353. package/dist/esm/internal/cellPrompt.d.ts +122 -0
  354. package/dist/esm/internal/cellPrompt.d.ts.map +1 -0
  355. package/dist/esm/internal/cellPrompt.js +276 -0
  356. package/dist/esm/internal/cellPrompt.js.map +1 -0
  357. package/dist/esm/internal/compactable.d.ts +44 -0
  358. package/dist/esm/internal/compactable.d.ts.map +1 -0
  359. package/dist/esm/internal/compactable.js +71 -0
  360. package/dist/esm/internal/compactable.js.map +1 -0
  361. package/dist/esm/internal/compactionMarks.d.ts +278 -0
  362. package/dist/esm/internal/compactionMarks.d.ts.map +1 -0
  363. package/dist/esm/internal/compactionMarks.js +317 -0
  364. package/dist/esm/internal/compactionMarks.js.map +1 -0
  365. package/dist/esm/internal/demandText.d.ts +95 -0
  366. package/dist/esm/internal/demandText.d.ts.map +1 -0
  367. package/dist/esm/internal/demandText.js +128 -0
  368. package/dist/esm/internal/demandText.js.map +1 -0
  369. package/dist/esm/internal/elide.d.ts +109 -0
  370. package/dist/esm/internal/elide.d.ts.map +1 -0
  371. package/dist/esm/internal/elide.js +123 -0
  372. package/dist/esm/internal/elide.js.map +1 -0
  373. package/dist/esm/internal/frame.d.ts +463 -0
  374. package/dist/esm/internal/frame.d.ts.map +1 -0
  375. package/dist/esm/internal/frame.js +861 -0
  376. package/dist/esm/internal/frame.js.map +1 -0
  377. package/dist/esm/internal/nonNegativeSafeInt.d.ts +20 -0
  378. package/dist/esm/internal/nonNegativeSafeInt.d.ts.map +1 -0
  379. package/dist/esm/internal/nonNegativeSafeInt.js +20 -0
  380. package/dist/esm/internal/nonNegativeSafeInt.js.map +1 -0
  381. package/dist/esm/internal/paidUsage.d.ts +52 -0
  382. package/dist/esm/internal/paidUsage.d.ts.map +1 -0
  383. package/dist/esm/internal/paidUsage.js +72 -0
  384. package/dist/esm/internal/paidUsage.js.map +1 -0
  385. package/dist/esm/internal/printChannel.d.ts +233 -0
  386. package/dist/esm/internal/printChannel.d.ts.map +1 -0
  387. package/dist/esm/internal/printChannel.js +376 -0
  388. package/dist/esm/internal/printChannel.js.map +1 -0
  389. package/dist/esm/internal/printsObservation.d.ts +26 -0
  390. package/dist/esm/internal/printsObservation.d.ts.map +1 -0
  391. package/dist/esm/internal/printsObservation.js +29 -0
  392. package/dist/esm/internal/printsObservation.js.map +1 -0
  393. package/dist/esm/internal/refusal.d.ts +40 -0
  394. package/dist/esm/internal/refusal.d.ts.map +1 -0
  395. package/dist/esm/internal/refusal.js +47 -0
  396. package/dist/esm/internal/refusal.js.map +1 -0
  397. package/dist/esm/internal/supervision.d.ts +174 -0
  398. package/dist/esm/internal/supervision.d.ts.map +1 -0
  399. package/dist/esm/internal/supervision.js +485 -0
  400. package/dist/esm/internal/supervision.js.map +1 -0
  401. package/dist/esm/internal/unfinishedWork.d.ts +99 -0
  402. package/dist/esm/internal/unfinishedWork.d.ts.map +1 -0
  403. package/dist/esm/internal/unfinishedWork.js +85 -0
  404. package/dist/esm/internal/unfinishedWork.js.map +1 -0
  405. package/dist/esm/internal/unobservedCall.d.ts +112 -0
  406. package/dist/esm/internal/unobservedCall.d.ts.map +1 -0
  407. package/dist/esm/internal/unobservedCall.js +501 -0
  408. package/dist/esm/internal/unobservedCall.js.map +1 -0
  409. package/dist/esm/internal/untrustedData.d.ts +14 -0
  410. package/dist/esm/internal/untrustedData.d.ts.map +1 -0
  411. package/dist/esm/internal/untrustedData.js +15 -0
  412. package/dist/esm/internal/untrustedData.js.map +1 -0
  413. package/docs/README.md +129 -0
  414. package/docs/api.md +1869 -0
  415. package/docs/concepts.md +238 -0
  416. package/docs/external-transcripts.md +245 -0
  417. package/docs/guides/bind-flows.md +167 -0
  418. package/docs/guides/drive-the-loop.md +265 -0
  419. package/docs/guides/run-cells.md +262 -0
  420. package/docs/guides/workerd.md +144 -0
  421. package/docs/installation.md +69 -0
  422. package/docs/quickstart.md +121 -0
  423. package/docs/reference.md +954 -0
  424. package/docs/troubleshooting.md +177 -0
  425. package/package.json +463 -3
  426. package/src/AgentEvent.ts +1772 -0
  427. package/src/CallLedger.ts +560 -0
  428. package/src/Cell.ts +926 -0
  429. package/src/CellCalls.ts +198 -0
  430. package/src/CellHistory.ts +128 -0
  431. package/src/CellTurn.ts +4450 -0
  432. package/src/CellValidation.ts +382 -0
  433. package/src/Compaction.ts +330 -0
  434. package/src/CompletionClaim.ts +1013 -0
  435. package/src/ContextWindow.ts +669 -0
  436. package/src/EngineLike.ts +614 -0
  437. package/src/ExternalTranscript.ts +1143 -0
  438. package/src/FailedCall.ts +163 -0
  439. package/src/FlowBinding.ts +603 -0
  440. package/src/HarnessError.ts +98 -0
  441. package/src/Judgement.ts +526 -0
  442. package/src/Monitor.ts +579 -0
  443. package/src/NarrowedCheck.ts +694 -0
  444. package/src/Notifications.ts +262 -0
  445. package/src/Plan.ts +113 -0
  446. package/src/QuickJSSandbox.ts +1557 -0
  447. package/src/Relevance.ts +352 -0
  448. package/src/Sandbox.ts +908 -0
  449. package/src/Steering.ts +405 -0
  450. package/src/StructuredOutput.ts +484 -0
  451. package/src/Sufficiency.ts +247 -0
  452. package/src/Supervisor.ts +798 -0
  453. package/src/Tokens.ts +108 -0
  454. package/src/Transcript.ts +513 -0
  455. package/src/TruncatedOutput.ts +297 -0
  456. package/src/UnmovedTree.ts +121 -0
  457. package/src/UnresolvedFailure.ts +240 -0
  458. package/src/VacuousVerification.ts +280 -0
  459. package/src/VariablesPanel.ts +165 -0
  460. package/src/index.ts +204 -0
  461. package/src/internal/bytes.ts +70 -0
  462. package/src/internal/cellPrompt.ts +337 -0
  463. package/src/internal/compactable.ts +76 -0
  464. package/src/internal/compactionMarks.ts +454 -0
  465. package/src/internal/demandText.ts +145 -0
  466. package/src/internal/elide.ts +130 -0
  467. package/src/internal/frame.ts +1178 -0
  468. package/src/internal/nonNegativeSafeInt.ts +24 -0
  469. package/src/internal/paidUsage.ts +90 -0
  470. package/src/internal/printChannel.ts +434 -0
  471. package/src/internal/printsObservation.ts +31 -0
  472. package/src/internal/refusal.ts +53 -0
  473. package/src/internal/supervision.ts +652 -0
  474. package/src/internal/unfinishedWork.ts +123 -0
  475. package/src/internal/unobservedCall.ts +536 -0
  476. package/src/internal/untrustedData.ts +19 -0
package/src/Tokens.ts ADDED
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Deterministic token accounting for context windows.
3
+ *
4
+ * @since 0.1.0
5
+ */
6
+
7
+ import { Schema } from "effect"
8
+
9
+ /**
10
+ * A token count, and whether it was estimated locally or reported by a
11
+ * provider. The flag travels with the number so a consumer never mistakes
12
+ * an approximation for billing data.
13
+ *
14
+ * @category models
15
+ * @since 0.1.0
16
+ * @slop
17
+ */
18
+ export class Count extends Schema.Class<Count>("flows/harness/Tokens/Count")({
19
+ value: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),
20
+ estimated: Schema.Boolean
21
+ }) {}
22
+
23
+ /**
24
+ * One segment's contribution to the accounting, keyed by its content
25
+ * digest so an unchanged segment keeps its count across turns.
26
+ *
27
+ * @category models
28
+ * @since 0.1.0
29
+ * @slop
30
+ */
31
+ export class Segment extends Schema.Class<Segment>("flows/harness/Tokens/Segment")({
32
+ digest: Schema.String,
33
+ zone: Schema.Literals(["prefix", "tail"]),
34
+ tokens: Count
35
+ }) {}
36
+
37
+ /**
38
+ * The token totals of a whole context window, split by cache zone and
39
+ * broken down per segment.
40
+ *
41
+ * @category models
42
+ * @since 0.1.0
43
+ * @slop
44
+ */
45
+ export class Accounting extends Schema.Class<Accounting>("flows/harness/Tokens/Accounting")({
46
+ prefix: Count,
47
+ tail: Count,
48
+ total: Count,
49
+ bySegment: Schema.Array(Segment)
50
+ }) {}
51
+
52
+ /** A deterministic local approximation, not provider billing data.
53
+ * @category models
54
+ * @since 0.1.0
55
+ * @slop
56
+ */
57
+ export type Estimator = (text: string) => number
58
+
59
+ /**
60
+ * Estimates tokens using four characters per token, with code punctuation and
61
+ * newline density accounting for the typically shorter tokens in source text.
62
+ *
63
+ * @category constructors
64
+ * @since 0.1.0
65
+ * @slop
66
+ */
67
+ export const estimate: Estimator = (text) => {
68
+ if (text.length === 0) return 0
69
+ const codeCharacters = (text.match(/[{}()[\];=<>`]/g) ?? []).length
70
+ const newlines = (text.match(/\n/g) ?? []).length
71
+ return Math.ceil((text.length + codeCharacters * 0.75 + newlines * 1.5) / 4)
72
+ }
73
+
74
+ /**
75
+ * Counts the tokens of `text`, defaulting to {@link estimate}. The result
76
+ * is always marked estimated.
77
+ *
78
+ * @category constructors
79
+ * @since 0.1.0
80
+ * @slop
81
+ */
82
+ export const count = (text: string, estimator: Estimator = estimate): Count =>
83
+ new Count({ value: Math.max(0, Math.ceil(estimator(text))), estimated: true })
84
+
85
+ /**
86
+ * Sums per-segment counts into one {@link Accounting}.
87
+ *
88
+ * @category combinators
89
+ * @since 0.1.0
90
+ * @slop
91
+ */
92
+ export const combine = (segments: ReadonlyArray<Segment>): Accounting => {
93
+ const prefix = segments.filter((segment) => segment.zone === "prefix").reduce(
94
+ (sum, segment) => sum + segment.tokens.value,
95
+ 0
96
+ )
97
+ const tail = segments.filter((segment) => segment.zone === "tail").reduce(
98
+ (sum, segment) => sum + segment.tokens.value,
99
+ 0
100
+ )
101
+ const estimated = segments.some((segment) => segment.tokens.estimated)
102
+ return new Accounting({
103
+ prefix: new Count({ value: prefix, estimated }),
104
+ tail: new Count({ value: tail, estimated }),
105
+ total: new Count({ value: prefix + tail, estimated }),
106
+ bySegment: segments
107
+ })
108
+ }
@@ -0,0 +1,513 @@
1
+ /**
2
+ * Transcript projection from durable journal entries.
3
+ *
4
+ * The transcript grows: what the model saw is what it said plus what the
5
+ * harness answered, in journal order. A `continue` used to be able to replace
6
+ * the whole projection with a list of messages the cell had written for its
7
+ * successor, and that branch is gone with the surface that produced it — a
8
+ * journal from those waves still decodes, and its `context` entries are simply
9
+ * not read.
10
+ *
11
+ * @since 0.1.0
12
+ */
13
+
14
+ import * as Fault from "@smthrs/flow/Fault"
15
+ import type { JournalEvent } from "@smthrs/journal"
16
+ import { ModelRequest } from "@smthrs/model"
17
+ import { Result, Schema } from "effect"
18
+ import * as AgentEvent from "./AgentEvent.ts"
19
+ import type * as Cell from "./Cell.ts"
20
+ import type * as EngineLike from "./EngineLike.ts"
21
+ import * as FailedCall from "./FailedCall.ts"
22
+ import { HarnessError } from "./HarnessError.ts"
23
+ import * as DemandText from "./internal/demandText.ts"
24
+ import { printsObservation } from "./internal/printsObservation.ts"
25
+ import * as UnobservedCall from "./internal/unobservedCall.ts"
26
+
27
+ /**
28
+ * Journal and model-key format after summaries became user context.
29
+ *
30
+ * @category constants
31
+ * @since 1.0.0-rc.0
32
+ */
33
+ export const journalVersion = 2
34
+
35
+ /**
36
+ * The event-type namespace a session journals its controller events under.
37
+ *
38
+ * Resume validation reads only the entries under this prefix, and the writer
39
+ * that produces them lives in another package, so the prefix is exported here
40
+ * rather than spelled twice: a writer types its event types as
41
+ * {@link ControlEventType} and a rename fails to compile instead of silently
42
+ * emptying the set {@link validateJournal} inspects.
43
+ *
44
+ * @category constants
45
+ * @since 1.0.0-rc.0
46
+ */
47
+ export const controlEventPrefix = "control.agent."
48
+
49
+ /**
50
+ * An event type {@link validateJournal} validates.
51
+ *
52
+ * @category models
53
+ * @since 1.0.0-rc.0
54
+ */
55
+ export type ControlEventType = `${typeof controlEventPrefix}${string}`
56
+
57
+ /**
58
+ * Refuses history whose replay could address different sealed model steps.
59
+ * Historical display projection is separate from permission to resume.
60
+ *
61
+ * @category validation
62
+ * @since 1.0.0-rc.0
63
+ */
64
+ export const validateJournal = (
65
+ entries: ReadonlyArray<JournalEvent.Entry>
66
+ ): Result.Result<void, HarnessError> => {
67
+ for (const entry of entries) {
68
+ if (!entry.eventType.startsWith(controlEventPrefix)) continue
69
+ const payload = entry.payload as Record<string, unknown> | null
70
+ if (payload === null || typeof payload !== "object" || payload["journalVersion"] !== journalVersion) {
71
+ return Result.fail(
72
+ new HarnessError({
73
+ code: "incompatible_journal",
74
+ message: `Journal sequence ${entry.seq} predates harness journal format ${journalVersion}; start a new run.`
75
+ })
76
+ )
77
+ }
78
+ }
79
+ return Result.succeed(undefined)
80
+ }
81
+
82
+ /**
83
+ * Stable failures produced while projecting a durable transcript.
84
+ *
85
+ * @category models
86
+ * @since 0.1.0
87
+ * @slop
88
+ */
89
+ export const TranscriptErrorCode = Schema.Literals(["projection_failed"])
90
+
91
+ /**
92
+ * Stable failures produced while projecting a durable transcript.
93
+ *
94
+ * @category models
95
+ * @since 0.1.0
96
+ * @slop
97
+ */
98
+ export type TranscriptErrorCode = typeof TranscriptErrorCode.Type
99
+
100
+ /**
101
+ * Stable failures produced while projecting a durable transcript.
102
+ *
103
+ * @category errors
104
+ * @since 0.1.0
105
+ * @slop
106
+ */
107
+ export class TranscriptError extends Schema.TaggedError<TranscriptError>()("flows/harness/TranscriptError", {
108
+ code: TranscriptErrorCode,
109
+ message: Schema.String,
110
+ cause: Schema.optional(Schema.Defect())
111
+ }) {}
112
+ Fault.register("flows/harness/TranscriptError", { projection_failed: "bug" } satisfies Fault.Rows<TranscriptErrorCode>)
113
+
114
+ /**
115
+ * The kind and message of one projected transcript item.
116
+ *
117
+ * @category models
118
+ * @since 0.1.0
119
+ * @slop
120
+ */
121
+ export interface ProjectedMessage {
122
+ readonly kind: "transcript" | "summary" | "steering"
123
+ readonly message: ModelRequest.Message
124
+ }
125
+
126
+ /**
127
+ * A projection with the compaction replacement identity, when one was recorded.
128
+ *
129
+ * @category models
130
+ * @since 0.1.0
131
+ * @slop
132
+ */
133
+ export interface ProjectedState {
134
+ readonly messages: ReadonlyArray<ProjectedMessage>
135
+ readonly replaced?: string | undefined
136
+ readonly cell: CellEvidence
137
+ }
138
+
139
+ /**
140
+ * Schema-decoded cell evidence consumed while rebuilding a journal.
141
+ *
142
+ * @category models
143
+ * @since 0.1.0
144
+ * @slop
145
+ */
146
+ export interface CellEvidence {
147
+ readonly produced: ReadonlyArray<Cell.Source>
148
+ /**
149
+ * What each frame printed, in journal order.
150
+ *
151
+ * The print buffer is the whole of the context channel: it is what the NEXT
152
+ * model turn reads, and `AgentEvent.CellPrinted` is journaled rather than
153
+ * derived precisely so a projection can rebuild that window without
154
+ * re-running anything. It was missing from this decoder, so a transcript
155
+ * projected from a harness-native journal could not reconstruct what the
156
+ * model saw.
157
+ */
158
+ readonly printed: ReadonlyArray<AgentEvent.CellPrinted>
159
+ readonly callsStarted: ReadonlyArray<Cell.Call>
160
+ readonly callsSettled: ReadonlyArray<AgentEvent.CellCallSettled>
161
+ readonly settled: ReadonlyArray<AgentEvent.CellSettled>
162
+ readonly transitions: ReadonlyArray<Cell.Transition>
163
+ readonly suspensions: ReadonlyArray<EngineLike.SuspendReason>
164
+ readonly aborts: ReadonlyArray<string>
165
+ }
166
+
167
+ /** The one journal-event-type table; see `AgentEvent.eventType`. */
168
+ const eventType = AgentEvent.eventType
169
+
170
+ const projectionFailed = (entry: JournalEvent.Entry, cause: unknown): TranscriptError =>
171
+ new TranscriptError({
172
+ code: "projection_failed",
173
+ message: `Invalid ${entry.eventType} payload at journal sequence ${entry.seq}`,
174
+ cause
175
+ })
176
+
177
+ const decode = <A>(
178
+ decodePayload: (payload: unknown) => Result.Result<A, unknown>,
179
+ entry: JournalEvent.Entry
180
+ ): Result.Result<A, TranscriptError> =>
181
+ Result.mapError(decodePayload(entry.payload), (cause) => projectionFailed(entry, cause))
182
+
183
+ const ordered = (entries: ReadonlyArray<JournalEvent.Entry>): ReadonlyArray<JournalEvent.Entry> =>
184
+ [...entries].sort((left, right) => left.seq - right.seq)
185
+
186
+ const decodeModelSettled = Schema.decodeUnknownResult(AgentEvent.ModelSettled)
187
+ const decodeSteeringDrained = Schema.decodeUnknownResult(AgentEvent.SteeringDrained)
188
+ const decodeCompactionSettled = Schema.decodeUnknownResult(AgentEvent.CompactionSettled)
189
+ const decodeCellPrinted = Schema.decodeUnknownResult(AgentEvent.CellPrinted)
190
+ const decodeCellProduced = Schema.decodeUnknownResult(AgentEvent.CellProduced)
191
+ const decodeCellCallStarted = Schema.decodeUnknownResult(AgentEvent.CellCallStarted)
192
+ const decodeCellCallSettled = Schema.decodeUnknownResult(AgentEvent.CellCallSettled)
193
+ const decodeCellSettled = Schema.decodeUnknownResult(AgentEvent.CellSettled)
194
+ const decodeTransitionApplied = Schema.decodeUnknownResult(AgentEvent.TransitionApplied)
195
+ const decodeSuspended = Schema.decodeUnknownResult(AgentEvent.Suspended)
196
+ const decodeAborted = Schema.decodeUnknownResult(AgentEvent.Aborted)
197
+ const decodeReadOnlyDemandIssued = Schema.decodeUnknownResult(AgentEvent.ReadOnlyDemandIssued)
198
+ const decodeRepeatDemanded = Schema.decodeUnknownResult(AgentEvent.RepeatDemanded)
199
+ const decodeNarrowedDemanded = Schema.decodeUnknownResult(AgentEvent.NarrowedDemanded)
200
+ const decodeNarrowOnlyDemanded = Schema.decodeUnknownResult(AgentEvent.NarrowOnlyDemanded)
201
+ const decodeUnmovedDemanded = Schema.decodeUnknownResult(AgentEvent.UnmovedDemanded)
202
+ const decodeUnresolvedDemanded = Schema.decodeUnknownResult(AgentEvent.UnresolvedDemanded)
203
+ const decodeFailedCallDemanded = Schema.decodeUnknownResult(AgentEvent.FailedCallDemanded)
204
+ const decodeUnobservedDemanded = Schema.decodeUnknownResult(AgentEvent.UnobservedDemanded)
205
+ const decodeOutputDemanded = Schema.decodeUnknownResult(AgentEvent.OutputDemanded)
206
+ const decodeClaimDemanded = Schema.decodeUnknownResult(AgentEvent.ClaimDemanded)
207
+
208
+ const transcriptMessage = (
209
+ message: ModelRequest.AssistantMessage
210
+ ): ModelRequest.AssistantMessage =>
211
+ message.stopReason === "error" || message.stopReason === "aborted"
212
+ ? new ModelRequest.AssistantMessage({
213
+ role: "assistant",
214
+ content: message.content.map((part) =>
215
+ part.type === "thinking"
216
+ ? ModelRequest.ThinkingPart.make({ text: part.text })
217
+ : part
218
+ ),
219
+ stopReason: message.stopReason
220
+ })
221
+ : message
222
+
223
+ /**
224
+ * Projects journal events into their model-visible transcript state as typed
225
+ * data, preserving malformed payload failures instead of throwing.
226
+ *
227
+ * This rebuilds turn structure, the settlement's own message, and every
228
+ * journaled controller demand. The controller also folds frame-local
229
+ * settled-call salvage and the memory-probe alert into failure notes. A raised
230
+ * cell's `bindingPathMiss` hint is live-only, so the projection rebuilds a
231
+ * shorter note exactly where that hint would name a missed binding.
232
+ *
233
+ * A terminal frame has the opposite skew: `observe` appends no observation
234
+ * once the frame budget is spent, while this projection rebuilds its journaled
235
+ * print and settlement. On a run whose last frame was terminal, it therefore
236
+ * over-reports by one trailing user turn. `AgentEvent.TurnClosed.outcome` is the
237
+ * journaled signal a future projection would key on to drop it: `"resolved"`
238
+ * on the terminal frame and `"continue"` otherwise.
239
+ *
240
+ * @category projections
241
+ * @since 0.1.0
242
+ * @slop
243
+ */
244
+ export const projectStateResult = (
245
+ entries: ReadonlyArray<JournalEvent.Entry>
246
+ ): Result.Result<ProjectedState, TranscriptError> => {
247
+ const events = ordered(entries)
248
+ const produced: Array<Cell.Source> = []
249
+ const printed: Array<AgentEvent.CellPrinted> = []
250
+ const prints = new Map<number, AgentEvent.CellPrinted>()
251
+ const callsStarted: Array<Cell.Call> = []
252
+ const callsSettled: Array<AgentEvent.CellCallSettled> = []
253
+ const settledCells: Array<AgentEvent.CellSettled> = []
254
+ const transitions: Array<Cell.Transition> = []
255
+ const suspensions: Array<EngineLike.SuspendReason> = []
256
+ const aborts: Array<string> = []
257
+ const compactions = new Map<number, AgentEvent.CompactionSettled>()
258
+ let replaced: string | undefined
259
+ // Legacy events replaced everything before themselves. Preserve that
260
+ // behavior, including skipping obsolete model payloads, for old journals.
261
+ let legacyBoundary = Number.NEGATIVE_INFINITY
262
+
263
+ for (const entry of events) {
264
+ switch (entry.eventType) {
265
+ case eventType.cellProduced: {
266
+ const decoded = decode(decodeCellProduced, entry)
267
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
268
+ produced.push(decoded.success.cell)
269
+ break
270
+ }
271
+ case eventType.cellPrinted: {
272
+ const decoded = decode(decodeCellPrinted, entry)
273
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
274
+ printed.push(decoded.success)
275
+ // Decoded once, here, and read back by sequence below. The payload is
276
+ // retained so a failed settlement can prove the immediately preceding
277
+ // print belongs to the same cell before merging the two observations.
278
+ prints.set(entry.seq, decoded.success)
279
+ break
280
+ }
281
+ case eventType.cellCallStarted: {
282
+ const decoded = decode(decodeCellCallStarted, entry)
283
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
284
+ callsStarted.push(decoded.success.call)
285
+ break
286
+ }
287
+ case eventType.cellCallSettled: {
288
+ const decoded = decode(decodeCellCallSettled, entry)
289
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
290
+ callsSettled.push(decoded.success)
291
+ break
292
+ }
293
+ case eventType.cellSettled: {
294
+ const decoded = decode(decodeCellSettled, entry)
295
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
296
+ settledCells.push(decoded.success)
297
+ break
298
+ }
299
+ case eventType.transitionApplied: {
300
+ const decoded = decode(decodeTransitionApplied, entry)
301
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
302
+ transitions.push(decoded.success.transition)
303
+ break
304
+ }
305
+ case eventType.suspended: {
306
+ const decoded = decode(decodeSuspended, entry)
307
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
308
+ suspensions.push(decoded.success.reason)
309
+ break
310
+ }
311
+ case eventType.aborted: {
312
+ const decoded = decode(decodeAborted, entry)
313
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
314
+ aborts.push(decoded.success.reason)
315
+ break
316
+ }
317
+ case eventType.compactionSettled: {
318
+ const decoded = decode(decodeCompactionSettled, entry)
319
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
320
+ compactions.set(entry.seq, decoded.success)
321
+ replaced = decoded.success.replacedPrefixDigest
322
+ if (decoded.success.retainedMessageCount === undefined) legacyBoundary = entry.seq
323
+ break
324
+ }
325
+ }
326
+ }
327
+
328
+ const messages: Array<ProjectedMessage> = []
329
+ // Set only after emitting a print and cleared whenever another message is
330
+ // emitted, so presence means the last projected turn is exactly this print.
331
+ let precedingPrint: AgentEvent.CellPrinted | undefined
332
+ const appendDemand = (text: string): void => {
333
+ messages.push({ kind: "transcript", message: ModelRequest.Message.user(text) })
334
+ precedingPrint = undefined
335
+ }
336
+
337
+ for (const entry of events) {
338
+ if (entry.seq < legacyBoundary) continue
339
+ const compaction = compactions.get(entry.seq)
340
+ if (compaction !== undefined) {
341
+ // Apply each boundary to the already-projected messages so repeated
342
+ // compactions replace prior summaries without dropping the recent tail.
343
+ // A marked compaction carries the replaced messages it kept verbatim
344
+ // after its summary, and may carry no summary when nothing was squashed.
345
+ const summary = compaction.summary
346
+ messages.splice(
347
+ 0,
348
+ Math.max(0, messages.length - (compaction.retainedMessageCount ?? 0)),
349
+ ...(summary === undefined ? [] : [{
350
+ kind: "summary" as const,
351
+ message: summary.role === "user"
352
+ ? summary
353
+ : ModelRequest.Message.user(
354
+ summary.content.filter((part): part is ModelRequest.TextPart => part.type === "text")
355
+ )
356
+ }]),
357
+ ...(compaction.kept ?? []).map((message) => ({ kind: "transcript" as const, message }))
358
+ )
359
+ precedingPrint = undefined
360
+ continue
361
+ }
362
+ // The print buffer is the context channel: what a cell printed is what the
363
+ // next model turn read, in the place the journal put it.
364
+ const print = prints.get(entry.seq)
365
+ if (print !== undefined) {
366
+ messages.push({
367
+ kind: "transcript",
368
+ message: ModelRequest.Message.user(printsObservation(print.text))
369
+ })
370
+ precedingPrint = print
371
+ continue
372
+ }
373
+ switch (entry.eventType) {
374
+ case eventType.modelSettled: {
375
+ const decoded = decode(decodeModelSettled, entry)
376
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
377
+ if (decoded.success.message.content.length === 0) break
378
+ messages.push({ kind: "transcript", message: transcriptMessage(decoded.success.message) })
379
+ precedingPrint = undefined
380
+ break
381
+ }
382
+ case eventType.steeringDrained: {
383
+ const decoded = decode(decodeSteeringDrained, entry)
384
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
385
+ for (const message of decoded.success.messages) {
386
+ messages.push({ kind: "steering", message })
387
+ precedingPrint = undefined
388
+ }
389
+ break
390
+ }
391
+ case eventType.readOnlyDemandIssued: {
392
+ const decoded = decode(decodeReadOnlyDemandIssued, entry)
393
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
394
+ appendDemand(DemandText.readOnly(decoded.success.cap, decoded.success.streak))
395
+ break
396
+ }
397
+ case eventType.repeatDemanded: {
398
+ const decoded = decode(decodeRepeatDemanded, entry)
399
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
400
+ appendDemand(DemandText.repeat(decoded.success.frames, decoded.success.cap))
401
+ break
402
+ }
403
+ case eventType.narrowedDemanded: {
404
+ const decoded = decode(decodeNarrowedDemanded, entry)
405
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
406
+ appendDemand(DemandText.narrowed(decoded.success.flow, decoded.success.broader, decoded.success.narrower))
407
+ break
408
+ }
409
+ case eventType.narrowOnlyDemanded: {
410
+ const decoded = decode(decodeNarrowOnlyDemanded, entry)
411
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
412
+ appendDemand(DemandText.narrowOnly(decoded.success.flow, decoded.success.check, decoded.success.targets))
413
+ break
414
+ }
415
+ case eventType.unmovedDemanded: {
416
+ const decoded = decode(decodeUnmovedDemanded, entry)
417
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
418
+ appendDemand(DemandText.unmoved(decoded.success.openedDigest, decoded.success.currentDigest))
419
+ break
420
+ }
421
+ case eventType.unresolvedDemanded: {
422
+ const decoded = decode(decodeUnresolvedDemanded, entry)
423
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
424
+ appendDemand(DemandText.unresolved(decoded.success.flow, decoded.success.failed, decoded.success.instead))
425
+ break
426
+ }
427
+ case eventType.failedCallDemanded: {
428
+ const decoded = decode(decodeFailedCallDemanded, entry)
429
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
430
+ appendDemand(FailedCall.demand(decoded.success.failures))
431
+ break
432
+ }
433
+ case eventType.unobservedDemanded: {
434
+ const decoded = decode(decodeUnobservedDemanded, entry)
435
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
436
+ appendDemand(UnobservedCall.demand(decoded.success.calls))
437
+ break
438
+ }
439
+ case eventType.outputDemanded: {
440
+ const decoded = decode(decodeOutputDemanded, entry)
441
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
442
+ appendDemand(decoded.success.note)
443
+ break
444
+ }
445
+ case eventType.claimDemanded: {
446
+ const decoded = decode(decodeClaimDemanded, entry)
447
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
448
+ // The reading that let a completion through was journaled too, and it
449
+ // put nothing in front of the model, so only a firing is replayed.
450
+ if (decoded.success.demanded) {
451
+ appendDemand(DemandText.claim())
452
+ }
453
+ break
454
+ }
455
+ case eventType.cellSettled: {
456
+ const decoded = decode(decodeCellSettled, entry)
457
+ /* v8 ignore next -- the first pass ran `decodeCellSettled` over every `cellSettled` entry of this same `events` array and returned on failure, and `decode` is a pure function of `entry.payload`, so re-decoding an entry that survived that pass cannot fail; the branch exists because `Result` has no way to carry that proof */
458
+ if (Result.isFailure(decoded)) return Result.fail(decoded.failure)
459
+ const outcome = decoded.success.outcome
460
+ if (outcome._tag !== "rejected" && outcome._tag !== "raised") break
461
+ const note = outcome._tag === "rejected"
462
+ ? outcome.message
463
+ : `The cell threw ${outcome.name}: ${outcome.message}. Emit a corrected cell.`
464
+ if (precedingPrint !== undefined && precedingPrint.cell === decoded.success.cell) {
465
+ messages[messages.length - 1] = {
466
+ kind: "transcript",
467
+ message: ModelRequest.Message.user(`${printsObservation(precedingPrint.text)}\n\n${note}`)
468
+ }
469
+ } else {
470
+ messages.push({
471
+ kind: "transcript",
472
+ message: ModelRequest.Message.user(note)
473
+ })
474
+ }
475
+ precedingPrint = undefined
476
+ break
477
+ }
478
+ }
479
+ }
480
+ return Result.succeed({
481
+ messages,
482
+ replaced,
483
+ cell: {
484
+ produced,
485
+ printed,
486
+ callsStarted,
487
+ callsSettled,
488
+ settled: settledCells,
489
+ transitions,
490
+ suspensions,
491
+ aborts
492
+ }
493
+ })
494
+ }
495
+
496
+ /**
497
+ * Projects model-visible messages in canonical journal sequence order.
498
+ *
499
+ * @category projections
500
+ * @since 0.1.0
501
+ * @slop
502
+ */
503
+ export const projectResult = (
504
+ entries: ReadonlyArray<JournalEvent.Entry>
505
+ ): Result.Result<ReadonlyArray<ModelRequest.Message>, TranscriptError> =>
506
+ Result.map(projectStateResult(entries), (state) => state.messages.map((item) => item.message))
507
+
508
+ /**
509
+ * Pure external-source decoders; never create executable journal identities.
510
+ * @since 1.0.0-rc.1
511
+ */
512
+ export { decodeClaude, decodeCodex } from "./ExternalTranscript.ts"
513
+ export type { Entry as ExternalEntry, Decoded as ExternalDecoded } from "./ExternalTranscript.ts"