@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
@@ -0,0 +1,669 @@
1
+ /**
2
+ * The immutable, provider-neutral context assembled for one model request.
3
+ * Every value it exposes is frozen — the arrays, the segments, and the
4
+ * messages, parts and tool declarations they hold — so a runtime mutation
5
+ * throws in strict mode instead of silently invalidating the cached digest.
6
+ *
7
+ * Governing design: `../docs/concepts.md#context-window`.
8
+ *
9
+ * @since 0.1.0
10
+ */
11
+
12
+ import * as Digest from "@smthrs/core/Digest"
13
+ import * as Fault from "@smthrs/flow/Fault"
14
+ import * as CanonicalJson from "@smthrs/model/CanonicalJson"
15
+ import * as ModelRequest from "@smthrs/model/ModelRequest"
16
+ import { dual } from "effect/Function"
17
+ import { type Pipeable, pipeArguments } from "effect/Pipeable"
18
+ import * as Result from "effect/Result"
19
+ import * as Schema from "effect/Schema"
20
+ import { compactable } from "./internal/compactable.ts"
21
+ import * as Tokens from "./Tokens.ts"
22
+
23
+ /**
24
+ * The brand a {@link ContextWindow} carries so a structurally similar
25
+ * object cannot pass for one.
26
+ *
27
+ * @category type ids
28
+ * @since 0.1.0
29
+ * @slop
30
+ */
31
+ export const TypeId = "~flows/harness/ContextWindow" as const
32
+
33
+ /**
34
+ * The type of {@link TypeId}.
35
+ *
36
+ * @category type ids
37
+ * @since 0.1.0
38
+ * @slop
39
+ */
40
+ export type TypeId = typeof TypeId
41
+
42
+ /**
43
+ * What a segment holds. The kind fixes where the segment may sit and
44
+ * whether compaction is allowed to replace it.
45
+ *
46
+ * @category models
47
+ * @since 0.1.0
48
+ * @slop
49
+ */
50
+ export const SegmentKind = Schema.Literals([
51
+ "system",
52
+ "instructions",
53
+ "registry",
54
+ "tools",
55
+ "transcript",
56
+ "summary",
57
+ "steering"
58
+ ])
59
+
60
+ /**
61
+ * The decoded form of {@link SegmentKind}.
62
+ *
63
+ * @category models
64
+ * @since 0.1.0
65
+ * @slop
66
+ */
67
+ export type SegmentKind = typeof SegmentKind.Type
68
+
69
+ /**
70
+ * Where a segment sits relative to the cache breakpoint. `prefix` segments
71
+ * are stable across turns; `tail` segments change every turn.
72
+ *
73
+ * @category models
74
+ * @since 0.1.0
75
+ * @slop
76
+ */
77
+ export const SegmentZone = Schema.Literals(["prefix", "tail"])
78
+
79
+ /**
80
+ * The decoded form of {@link SegmentZone}.
81
+ *
82
+ * @category models
83
+ * @since 0.1.0
84
+ * @slop
85
+ */
86
+ export type SegmentZone = typeof SegmentZone.Type
87
+
88
+ /**
89
+ * The parts a segment may hold: system text, transcript messages, and tool
90
+ * declarations, in the provider-neutral vocabulary of `@smthrs/model`.
91
+ *
92
+ * @category models
93
+ * @since 0.1.0
94
+ * @slop
95
+ */
96
+ export const Content = Schema.Array(
97
+ Schema.Union([ModelRequest.SystemPart, ModelRequest.Message, ModelRequest.ToolDefinition])
98
+ )
99
+
100
+ /**
101
+ * The decoded form of {@link Content}.
102
+ *
103
+ * @category models
104
+ * @since 0.1.0
105
+ * @slop
106
+ */
107
+ export type Content = typeof Content.Type
108
+
109
+ /**
110
+ * What a compaction does with one prefix segment: `keep` it as it is,
111
+ * `squash` it into the summary, or `remove` it outright.
112
+ *
113
+ * @category models
114
+ * @since 1.0.0-rc.0
115
+ */
116
+ export const Mark = Schema.Literals(["keep", "squash", "remove"])
117
+
118
+ /**
119
+ * The decoded form of {@link Mark}.
120
+ *
121
+ * @category models
122
+ * @since 1.0.0-rc.0
123
+ */
124
+ export type Mark = typeof Mark.Type
125
+
126
+ /**
127
+ * The failure vocabulary of a context window operation.
128
+ *
129
+ * @category models
130
+ * @since 0.1.0
131
+ * @slop
132
+ */
133
+ export const ContextWindowErrorCode = Schema.Literals(["invalid_compaction_prefix", "invalid_compaction_marks"])
134
+
135
+ /**
136
+ * The decoded form of {@link ContextWindowErrorCode}.
137
+ *
138
+ * @category models
139
+ * @since 0.1.0
140
+ * @slop
141
+ */
142
+ export type ContextWindowErrorCode = typeof ContextWindowErrorCode.Type
143
+
144
+ /** Stable failure returned for an invalid public compaction prefix.
145
+ * @category errors
146
+ * @since 0.1.0
147
+ * @slop
148
+ */
149
+ export class ContextWindowError extends Schema.TaggedError<ContextWindowError>()(
150
+ "flows/harness/ContextWindowError",
151
+ {
152
+ code: ContextWindowErrorCode,
153
+ message: Schema.String
154
+ }
155
+ ) {}
156
+ Fault.register(
157
+ "flows/harness/ContextWindowError",
158
+ {
159
+ invalid_compaction_prefix: "bug",
160
+ invalid_compaction_marks: "bug"
161
+ } satisfies Fault.Rows<ContextWindowErrorCode>
162
+ )
163
+
164
+ /** A stable, typed slice of the model-visible context.
165
+ * @category models
166
+ * @since 0.1.0
167
+ * @slop
168
+ */
169
+ export class Segment extends Schema.Class<Segment>("flows/harness/ContextWindow/Segment")({
170
+ kind: SegmentKind,
171
+ zone: SegmentZone,
172
+ digest: Schema.String,
173
+ tokens: Tokens.Count,
174
+ content: Content
175
+ }) {}
176
+
177
+ /**
178
+ * One assembled, immutable model context: its ordered segments, the tools
179
+ * currently active, and the token accounting for both. Every combinator
180
+ * returns a new window rather than mutating this one.
181
+ *
182
+ * @category models
183
+ * @since 0.1.0
184
+ * @slop
185
+ */
186
+ export class ContextWindow extends Schema.Class<ContextWindow>("flows/harness/ContextWindow")({
187
+ modelId: Schema.String,
188
+ segments: Schema.Array(Segment),
189
+ activeTools: Schema.Array(Schema.String),
190
+ replaced: Schema.optional(Schema.String),
191
+ digest: Schema.String,
192
+ tokens: Tokens.Accounting
193
+ }) implements Pipeable {
194
+ readonly [TypeId] = TypeId
195
+
196
+ /** Threads this window through the data-last combinators of this module.
197
+ *
198
+ * `window.pipe(appendTurn(message), render)` is `render(appendTurn(window, message))`.
199
+ *
200
+ * @category combinators
201
+ * @since 0.1.0
202
+ */
203
+ pipe<A>(this: A): A
204
+ pipe<A, B>(this: A, ab: (_: A) => B): B
205
+ pipe<A, B, C>(this: A, ab: (_: A) => B, bc: (_: B) => C): C
206
+ pipe<A, B, C, D>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D
207
+ pipe<A, B, C, D, E>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E
208
+ pipe<A, B, C, D, E, F>(
209
+ this: A,
210
+ ab: (_: A) => B,
211
+ bc: (_: B) => C,
212
+ cd: (_: C) => D,
213
+ de: (_: D) => E,
214
+ ef: (_: E) => F
215
+ ): F
216
+ pipe<A, B, C, D, E, F, G>(
217
+ this: A,
218
+ ab: (_: A) => B,
219
+ bc: (_: B) => C,
220
+ cd: (_: C) => D,
221
+ de: (_: D) => E,
222
+ ef: (_: E) => F,
223
+ fg: (_: F) => G
224
+ ): G
225
+ pipe<A, B, C, D, E, F, G, H>(
226
+ this: A,
227
+ ab: (_: A) => B,
228
+ bc: (_: B) => C,
229
+ cd: (_: C) => D,
230
+ de: (_: D) => E,
231
+ ef: (_: E) => F,
232
+ fg: (_: F) => G,
233
+ gh: (_: G) => H
234
+ ): H
235
+ pipe<A, B, C, D, E, F, G, H, I>(
236
+ this: A,
237
+ ab: (_: A) => B,
238
+ bc: (_: B) => C,
239
+ cd: (_: C) => D,
240
+ de: (_: D) => E,
241
+ ef: (_: E) => F,
242
+ fg: (_: F) => G,
243
+ gh: (_: G) => H,
244
+ hi: (_: H) => I
245
+ ): I
246
+ pipe<A, B, C, D, E, F, G, H, I, J>(
247
+ this: A,
248
+ ab: (_: A) => B,
249
+ bc: (_: B) => C,
250
+ cd: (_: C) => D,
251
+ de: (_: D) => E,
252
+ ef: (_: E) => F,
253
+ fg: (_: F) => G,
254
+ gh: (_: G) => H,
255
+ hi: (_: H) => I,
256
+ ij: (_: I) => J
257
+ ): J
258
+ pipe(this: unknown, ..._operators: ReadonlyArray<(input: never) => unknown>): unknown {
259
+ // eslint-disable-next-line prefer-rest-params -- matches Effect's Pipeable implementation
260
+ return pipeArguments(this, arguments)
261
+ }
262
+
263
+ /** @category constructors @since 0.1.0 */
264
+ static override make(input: MakeOptions): ContextWindow {
265
+ return construct(input)
266
+ }
267
+
268
+ /** @category constructors @since 0.1.0 */
269
+ static empty(modelId: string): ContextWindow {
270
+ return empty(modelId)
271
+ }
272
+
273
+ /** @category combinators @since 0.1.0 */
274
+ static appendTurn(self: ContextWindow, assistantMessage: ModelRequest.AssistantMessage): ContextWindow {
275
+ return appendTurn(self, assistantMessage)
276
+ }
277
+
278
+ /** @category combinators @since 0.1.0 */
279
+ static compact(
280
+ self: ContextWindow,
281
+ summary: ModelRequest.Message | ReadonlyArray<ModelRequest.Message>
282
+ ): Result.Result<ContextWindow, ContextWindowError> {
283
+ return compact(self, summary)
284
+ }
285
+
286
+ /** @category conversions @since 0.1.0 */
287
+ static render(self: ContextWindow): ModelRequest.ModelRequest {
288
+ return render(self)
289
+ }
290
+ }
291
+
292
+ /**
293
+ * A segment before its digest and token count are computed. Supplying
294
+ * `declaredDigest` or `tokens` skips the corresponding computation.
295
+ *
296
+ * @category models
297
+ * @since 0.1.0
298
+ * @slop
299
+ */
300
+ export interface SegmentInput {
301
+ readonly kind: SegmentKind
302
+ readonly zone: SegmentZone
303
+ readonly content: Content
304
+ readonly declaredDigest?: string | undefined
305
+ readonly tokens?: Tokens.Count | undefined
306
+ }
307
+
308
+ /**
309
+ * The declaration {@link ContextWindow.make} takes.
310
+ *
311
+ * @category models
312
+ * @since 0.1.0
313
+ * @slop
314
+ */
315
+ export interface MakeOptions {
316
+ readonly modelId: string
317
+ readonly segments?: ReadonlyArray<Segment | SegmentInput> | undefined
318
+ readonly activeTools?: ReadonlyArray<string> | undefined
319
+ readonly replaced?: string | undefined
320
+ }
321
+
322
+ const isSegment = (value: Segment | SegmentInput): value is Segment => value instanceof Segment
323
+
324
+ const jsonValue = (value: unknown): unknown => {
325
+ if (Array.isArray(value)) return value.map(jsonValue)
326
+ if (value !== null && typeof value === "object") {
327
+ return Object.fromEntries(
328
+ Object.entries(value as Record<string, unknown>)
329
+ .filter(([, member]) => member !== undefined)
330
+ .map(([key, member]) => [key, jsonValue(member)])
331
+ )
332
+ }
333
+ return value
334
+ }
335
+
336
+ /**
337
+ * What a segment is estimated from: its content, less every thinking part's
338
+ * `signature`. A signature is opaque replay state, not context the provider
339
+ * bills: on the ChatGPT route it is the whole encrypted reasoning item, often
340
+ * larger than the turn's visible text, and counting it compacted a 400k-window
341
+ * run at 31k to 41k billed input tokens (Terminal-Bench 4.0,
342
+ * mp-checkpoint-consolidation, 2026-09-24). The digest still covers it.
343
+ */
344
+ const withoutSignatures = (value: unknown): unknown => {
345
+ if (Array.isArray(value)) return value.map(withoutSignatures)
346
+ if (value !== null && typeof value === "object") {
347
+ const record = value as Record<string, unknown>
348
+ return Object.fromEntries(
349
+ Object.entries(record)
350
+ .filter(([key]) => !(record.type === "thinking" && key === "signature"))
351
+ .map(([key, member]) => [key, withoutSignatures(member)])
352
+ )
353
+ }
354
+ return value
355
+ }
356
+
357
+ const segmentText = (content: Content): string => CanonicalJson.stringify(withoutSignatures(jsonValue(content)))
358
+
359
+ const digest = (value: unknown): string => Digest.digest(CanonicalJson.stringify(value))
360
+
361
+ /** Every node in every graph this module has undertaken to freeze whole. */
362
+ const frozenWhole = new WeakSet<object>()
363
+
364
+ /**
365
+ * Freezes one value and everything reachable from it.
366
+ *
367
+ * Freezing only the outer array kept the immutability promise for
368
+ * `segments.push` and left `segments[0].content[0].content[0].text = "…"`
369
+ * silent. A segment's digest is taken once, at construction, so a message or a
370
+ * part edited in place afterwards renders content the window's own identity no
371
+ * longer describes — and that identity is what the sealed step is keyed on.
372
+ *
373
+ * The module's own memo ends the walk. A value a caller froze is evidence only
374
+ * that node cannot change, not that every descendant was frozen with it; a
375
+ * segment this module already walked, on the other hand, can be reused across
376
+ * turns in O(1). Recording a node before descending also makes a cycle end at
377
+ * its first repeated edge.
378
+ *
379
+ * Members are limited to own enumerable string keys, as they were when this
380
+ * walk used `Object.values`, but each one is read through its own descriptor.
381
+ * An accessor is caller code, not data the freeze walk may execute.
382
+ */
383
+ const freezeDeep = (value: unknown): void => {
384
+ if (value === null || typeof value !== "object" || frozenWhole.has(value)) return
385
+ // Recorded before the walk, so a graph that points at itself ends it.
386
+ frozenWhole.add(value)
387
+ Object.freeze(value)
388
+ for (const key of Object.keys(value)) {
389
+ const property = Object.getOwnPropertyDescriptor(value, key)
390
+ if (property !== undefined && "value" in property) freezeDeep(property.value)
391
+ }
392
+ }
393
+
394
+ /** Creates one segment, computing its identity and estimated token count.
395
+ * @category constructors
396
+ * @since 0.1.0
397
+ * @slop
398
+ */
399
+ export const makeSegment = (input: Segment | SegmentInput): Segment => {
400
+ if (isSegment(input)) {
401
+ freezeDeep(input.content)
402
+ return input
403
+ }
404
+ const content: Content = [...input.content]
405
+ freezeDeep(content)
406
+ const segment = new Segment({
407
+ kind: input.kind,
408
+ zone: input.zone,
409
+ digest: digest({
410
+ kind: input.kind,
411
+ zone: input.zone,
412
+ content: jsonValue(content),
413
+ ...(input.declaredDigest === undefined ? {} : { declaredDigest: input.declaredDigest })
414
+ }),
415
+ tokens: input.tokens ?? Tokens.count(segmentText(content)),
416
+ content
417
+ })
418
+ freezeDeep(segment.content)
419
+ return segment
420
+ }
421
+
422
+ const unique = (values: ReadonlyArray<string>): ReadonlyArray<string> => {
423
+ const seen = new Set<string>()
424
+ return values.filter((value) => {
425
+ const normalized = value.trim().toLowerCase()
426
+ return normalized !== "" && !seen.has(normalized) && (seen.add(normalized), true)
427
+ })
428
+ }
429
+
430
+ const windowDigest = (
431
+ modelId: string,
432
+ segments: ReadonlyArray<Segment>,
433
+ activeTools: ReadonlyArray<string>,
434
+ replaced?: string
435
+ ): string =>
436
+ digest({
437
+ modelId,
438
+ segments: segments.map((segment) => segment.digest),
439
+ activeTools,
440
+ ...(replaced === undefined ? {} : { replaced })
441
+ })
442
+
443
+ const construct = (options: MakeOptions): ContextWindow => {
444
+ const segments = (options.segments ?? []).map(makeSegment)
445
+ const activeTools = unique(options.activeTools ?? [])
446
+ const window = new ContextWindow({
447
+ modelId: options.modelId,
448
+ segments,
449
+ activeTools,
450
+ replaced: options.replaced,
451
+ digest: windowDigest(options.modelId, segments, activeTools, options.replaced),
452
+ tokens: Tokens.combine(segments.map((segment) =>
453
+ new Tokens.Segment({
454
+ digest: segment.digest,
455
+ zone: segment.zone,
456
+ tokens: segment.tokens
457
+ })
458
+ ))
459
+ })
460
+ // The whole window, not its two outer arrays: a segment, a message, a part
461
+ // and the token accounting are all values a caller holds a reference to, and
462
+ // the digest above was taken over every one of them.
463
+ freezeDeep(window)
464
+ return window
465
+ }
466
+
467
+ /** Constructs a window from already-derived values.
468
+ * @category constructors
469
+ * @since 0.1.0
470
+ * @slop
471
+ */
472
+ export const make = (options: MakeOptions): ContextWindow => construct(options)
473
+
474
+ /** Constructs an empty context window for a model.
475
+ * @category constructors
476
+ * @since 0.1.0
477
+ * @slop
478
+ */
479
+ export const empty = (modelId: string): ContextWindow => make({ modelId })
480
+
481
+ /** Appends one settled assistant message.
482
+ *
483
+ * @category combinators
484
+ * @since 0.1.0
485
+ * @slop
486
+ */
487
+ export const appendTurn: {
488
+ (assistantMessage: ModelRequest.AssistantMessage): (self: ContextWindow) => ContextWindow
489
+ (self: ContextWindow, assistantMessage: ModelRequest.AssistantMessage): ContextWindow
490
+ } = dual(2, (self: ContextWindow, assistantMessage: ModelRequest.AssistantMessage) =>
491
+ construct({
492
+ modelId: self.modelId,
493
+ segments: [
494
+ ...self.segments,
495
+ makeSegment({ kind: "transcript", zone: "tail", content: [assistantMessage] })
496
+ ],
497
+ activeTools: self.activeTools,
498
+ replaced: self.replaced
499
+ }))
500
+
501
+ const summaryMessages = (summary: ModelRequest.Message | ReadonlyArray<ModelRequest.Message>): Content => {
502
+ const messages: ReadonlyArray<ModelRequest.Message> = Array.isArray(summary)
503
+ ? summary as ReadonlyArray<ModelRequest.Message>
504
+ : [summary as ModelRequest.Message]
505
+ return messages.map((message) =>
506
+ message.role === "user"
507
+ ? message
508
+ : ModelRequest.Message.user(
509
+ message.content.filter((part): part is ModelRequest.TextPart => part.type === "text")
510
+ )
511
+ )
512
+ }
513
+
514
+ const selectedPrefix = (
515
+ self: ContextWindow,
516
+ prefixLength: number
517
+ ): Result.Result<ReadonlyArray<Segment>, ContextWindowError> => {
518
+ if (!Number.isSafeInteger(prefixLength) || prefixLength < 0) {
519
+ return Result.fail(
520
+ new ContextWindowError({
521
+ code: "invalid_compaction_prefix",
522
+ message: "Compaction prefix length must be a non-negative safe integer"
523
+ })
524
+ )
525
+ }
526
+ const segments = compactable(self.segments)
527
+ if (prefixLength > segments.length) {
528
+ return Result.fail(
529
+ new ContextWindowError({
530
+ code: "invalid_compaction_prefix",
531
+ message: "Compaction prefix length exceeds the compactable context"
532
+ })
533
+ )
534
+ }
535
+ return Result.succeed(segments.slice(0, prefixLength))
536
+ }
537
+
538
+ /**
539
+ * Computes the declared identity of an exact compactable prefix.
540
+ *
541
+ * @category conversions
542
+ * @since 0.1.0
543
+ * @slop
544
+ */
545
+ export const prefixDigest = (
546
+ self: ContextWindow,
547
+ prefixLength: number
548
+ ): Result.Result<string, ContextWindowError> =>
549
+ Result.map(selectedPrefix(self, prefixLength), (segments) => digest(segments.map((segment) => segment.digest)))
550
+
551
+ const marksError = (message: string): Result.Result<never, ContextWindowError> =>
552
+ Result.fail(new ContextWindowError({ code: "invalid_compaction_marks", message }))
553
+
554
+ /**
555
+ * Compacts an exact compactable prefix by its marks, one per prefix segment.
556
+ *
557
+ * The result holds, in order: the segments before the prefix; one `summary`
558
+ * segment of `summary` when any segment is squashed; the kept segments, as
559
+ * the same objects, so their digests are stable; then the suffix. Removed
560
+ * segments are dropped. `summary` is required exactly when a segment is
561
+ * squashed.
562
+ *
563
+ * @category combinators
564
+ * @since 1.0.0-rc.0
565
+ */
566
+ export const compactMarked = (
567
+ self: ContextWindow,
568
+ prefixLength: number,
569
+ marks: ReadonlyArray<Mark>,
570
+ summary: ModelRequest.Message | ReadonlyArray<ModelRequest.Message> | undefined
571
+ ): Result.Result<ContextWindow, ContextWindowError> =>
572
+ Result.gen(function*() {
573
+ const replacedSegments = yield* selectedPrefix(self, prefixLength)
574
+ if (marks.length !== replacedSegments.length) {
575
+ return yield* marksError("Compaction marks must name every prefix segment once")
576
+ }
577
+ if (marks.includes("squash") !== (summary !== undefined)) {
578
+ return yield* marksError("A compaction summary is required exactly when a prefix segment is squashed")
579
+ }
580
+ if (replacedSegments.length === 0) return self
581
+ const replaced = digest(replacedSegments.map((segment) => segment.digest))
582
+ const positions = self.segments.flatMap((segment, index) => compactable([segment]).length === 0 ? [] : [index])
583
+ .slice(0, prefixLength)
584
+ const first = positions[0]!
585
+ const selected = new Set(positions)
586
+ const segments = [
587
+ ...self.segments.slice(0, first),
588
+ ...(summary === undefined ? [] : [
589
+ makeSegment({ kind: "summary", zone: "tail", content: summaryMessages(summary) })
590
+ ]),
591
+ ...replacedSegments.filter((_, index) => marks[index] === "keep"),
592
+ ...self.segments.slice(first).filter((_, index) => !selected.has(first + index))
593
+ ]
594
+ return construct({ modelId: self.modelId, segments, activeTools: self.activeTools, replaced })
595
+ })
596
+
597
+ /**
598
+ * Replaces an exact compactable prefix while retaining every suffix segment:
599
+ * {@link compactMarked} with every segment squashed.
600
+ *
601
+ * @category combinators
602
+ * @since 0.1.0
603
+ * @slop
604
+ */
605
+ export const compactPrefix = (
606
+ self: ContextWindow,
607
+ prefixLength: number,
608
+ summary: ModelRequest.Message | ReadonlyArray<ModelRequest.Message>
609
+ ): Result.Result<ContextWindow, ContextWindowError> =>
610
+ Result.flatMap(selectedPrefix(self, prefixLength), (replacedSegments) =>
611
+ compactMarked(
612
+ self,
613
+ prefixLength,
614
+ replacedSegments.map(() => "squash"),
615
+ replacedSegments.length === 0 ? undefined : summary
616
+ ))
617
+
618
+ /** Replaces the compactable transcript prefix with a summary segment.
619
+ *
620
+ * The most recent transcript segment remains the suffix, so a compacted
621
+ * projection renders summary first followed by the un-compacted tail.
622
+ *
623
+ * @category combinators
624
+ * @since 0.1.0
625
+ * @slop
626
+ */
627
+ export const compact: {
628
+ (
629
+ summary: ModelRequest.Message | ReadonlyArray<ModelRequest.Message>
630
+ ): (self: ContextWindow) => Result.Result<ContextWindow, ContextWindowError>
631
+ (
632
+ self: ContextWindow,
633
+ summary: ModelRequest.Message | ReadonlyArray<ModelRequest.Message>
634
+ ): Result.Result<ContextWindow, ContextWindowError>
635
+ } = dual(2, (self: ContextWindow, summary: ModelRequest.Message | ReadonlyArray<ModelRequest.Message>) => {
636
+ const segments = compactable(self.segments)
637
+ const prefixLength = segments.length > 1 ? segments.length - 1 : segments.length
638
+ return compactPrefix(self, prefixLength, summary)
639
+ })
640
+
641
+ /** Renders this provider-neutral value into a model request.
642
+ * @category conversions
643
+ * @since 0.1.0
644
+ * @slop
645
+ */
646
+ export const render = (self: ContextWindow): ModelRequest.ModelRequest => {
647
+ const system: Array<ModelRequest.SystemPart> = []
648
+ const messages: Array<ModelRequest.Message> = []
649
+ const definitions = new Map<string, ModelRequest.ToolDefinition>()
650
+ const definitionKey = (name: string): string => name.trim().toLowerCase()
651
+ for (const segment of self.segments) {
652
+ for (const item of segment.content) {
653
+ if ("role" in item) messages.push(item)
654
+ else if ("name" in item) definitions.set(definitionKey(item.name), item)
655
+ else system.push(item)
656
+ }
657
+ }
658
+ const active = new Set(self.activeTools.map(definitionKey))
659
+ const tools = [...definitions.values()].filter((definition) =>
660
+ definition.deferred === true || active.has(definitionKey(definition.name))
661
+ )
662
+ return ModelRequest.ModelRequest.make({
663
+ modelId: self.modelId,
664
+ system,
665
+ messages,
666
+ tools,
667
+ params: ModelRequest.GenerationParams.make()
668
+ })
669
+ }