@inhuman.tools/turn 0.0.0-stage → 0.1.0

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 (346) hide show
  1. package/LICENSE.md +7 -0
  2. package/dist/agent-calls/acceptance.d.ts +12 -0
  3. package/dist/agent-calls/acceptance.d.ts.map +1 -0
  4. package/dist/agent-calls/acceptance.js +64 -0
  5. package/dist/agent-calls/acceptance.js.map +1 -0
  6. package/dist/agent-calls/callbacks.d.ts +14 -0
  7. package/dist/agent-calls/callbacks.d.ts.map +1 -0
  8. package/dist/agent-calls/callbacks.js +59 -0
  9. package/dist/agent-calls/callbacks.js.map +1 -0
  10. package/dist/agent-calls/delivery.d.ts +7 -0
  11. package/dist/agent-calls/delivery.d.ts.map +1 -0
  12. package/dist/agent-calls/delivery.js +16 -0
  13. package/dist/agent-calls/delivery.js.map +1 -0
  14. package/dist/agent-calls/index.d.ts +7 -0
  15. package/dist/agent-calls/index.d.ts.map +1 -0
  16. package/dist/agent-calls/index.js +6 -0
  17. package/dist/agent-calls/index.js.map +1 -0
  18. package/dist/agent-calls/operator.d.ts +21 -0
  19. package/dist/agent-calls/operator.d.ts.map +1 -0
  20. package/dist/agent-calls/operator.js +78 -0
  21. package/dist/agent-calls/operator.js.map +1 -0
  22. package/dist/agent-calls/runtime.d.ts +99 -0
  23. package/dist/agent-calls/runtime.d.ts.map +1 -0
  24. package/dist/agent-calls/runtime.js +245 -0
  25. package/dist/agent-calls/runtime.js.map +1 -0
  26. package/dist/agent-calls/types.d.ts +31 -0
  27. package/dist/agent-calls/types.d.ts.map +1 -0
  28. package/dist/agent-calls/types.js +2 -0
  29. package/dist/agent-calls/types.js.map +1 -0
  30. package/dist/context/compact-floors.d.ts +43 -0
  31. package/dist/context/compact-floors.d.ts.map +1 -0
  32. package/dist/context/compact-floors.js +52 -0
  33. package/dist/context/compact-floors.js.map +1 -0
  34. package/dist/context/compact.d.ts +42 -0
  35. package/dist/context/compact.d.ts.map +1 -0
  36. package/dist/context/compact.js +155 -0
  37. package/dist/context/compact.js.map +1 -0
  38. package/dist/context/delivery.d.ts +13 -0
  39. package/dist/context/delivery.d.ts.map +1 -0
  40. package/dist/context/delivery.js +6 -0
  41. package/dist/context/delivery.js.map +1 -0
  42. package/dist/context/history.d.ts +66 -0
  43. package/dist/context/history.d.ts.map +1 -0
  44. package/dist/context/history.js +573 -0
  45. package/dist/context/history.js.map +1 -0
  46. package/dist/context/index.d.ts +10 -0
  47. package/dist/context/index.d.ts.map +1 -0
  48. package/dist/context/index.js +10 -0
  49. package/dist/context/index.js.map +1 -0
  50. package/dist/context/observations.d.ts +7 -0
  51. package/dist/context/observations.d.ts.map +1 -0
  52. package/dist/context/observations.js +11 -0
  53. package/dist/context/observations.js.map +1 -0
  54. package/dist/context/retention/defaults.d.ts +10 -0
  55. package/dist/context/retention/defaults.d.ts.map +1 -0
  56. package/dist/context/retention/defaults.js +47 -0
  57. package/dist/context/retention/defaults.js.map +1 -0
  58. package/dist/context/retention/index.d.ts +14 -0
  59. package/dist/context/retention/index.d.ts.map +1 -0
  60. package/dist/context/retention/index.js +21 -0
  61. package/dist/context/retention/index.js.map +1 -0
  62. package/dist/context/retention/narrow.d.ts +22 -0
  63. package/dist/context/retention/narrow.d.ts.map +1 -0
  64. package/dist/context/retention/narrow.js +140 -0
  65. package/dist/context/retention/narrow.js.map +1 -0
  66. package/dist/context/retention/render.d.ts +37 -0
  67. package/dist/context/retention/render.d.ts.map +1 -0
  68. package/dist/context/retention/render.js +149 -0
  69. package/dist/context/retention/render.js.map +1 -0
  70. package/dist/context/retention/resolve.d.ts +51 -0
  71. package/dist/context/retention/resolve.d.ts.map +1 -0
  72. package/dist/context/retention/resolve.js +254 -0
  73. package/dist/context/retention/resolve.js.map +1 -0
  74. package/dist/context/retention/schema.d.ts +345 -0
  75. package/dist/context/retention/schema.d.ts.map +1 -0
  76. package/dist/context/retention/schema.js +149 -0
  77. package/dist/context/retention/schema.js.map +1 -0
  78. package/dist/context/retention/stamp.d.ts +25 -0
  79. package/dist/context/retention/stamp.d.ts.map +1 -0
  80. package/dist/context/retention/stamp.js +103 -0
  81. package/dist/context/retention/stamp.js.map +1 -0
  82. package/dist/context/retention/step.d.ts +33 -0
  83. package/dist/context/retention/step.d.ts.map +1 -0
  84. package/dist/context/retention/step.js +74 -0
  85. package/dist/context/retention/step.js.map +1 -0
  86. package/dist/context/retention/view.d.ts +57 -0
  87. package/dist/context/retention/view.d.ts.map +1 -0
  88. package/dist/context/retention/view.js +121 -0
  89. package/dist/context/retention/view.js.map +1 -0
  90. package/dist/context/squeeze.d.ts +45 -0
  91. package/dist/context/squeeze.d.ts.map +1 -0
  92. package/dist/context/squeeze.js +182 -0
  93. package/dist/context/squeeze.js.map +1 -0
  94. package/dist/context/tools.d.ts +16 -0
  95. package/dist/context/tools.d.ts.map +1 -0
  96. package/dist/context/tools.js +73 -0
  97. package/dist/context/tools.js.map +1 -0
  98. package/dist/context/transcript.d.ts +151 -0
  99. package/dist/context/transcript.d.ts.map +1 -0
  100. package/dist/context/transcript.js +659 -0
  101. package/dist/context/transcript.js.map +1 -0
  102. package/dist/policy-processor/bypass.d.ts +95 -0
  103. package/dist/policy-processor/bypass.d.ts.map +1 -0
  104. package/dist/policy-processor/bypass.js +188 -0
  105. package/dist/policy-processor/bypass.js.map +1 -0
  106. package/dist/policy-processor/classifier.d.ts +47 -0
  107. package/dist/policy-processor/classifier.d.ts.map +1 -0
  108. package/dist/policy-processor/classifier.js +671 -0
  109. package/dist/policy-processor/classifier.js.map +1 -0
  110. package/dist/policy-processor/cluster.d.ts +7 -0
  111. package/dist/policy-processor/cluster.d.ts.map +1 -0
  112. package/dist/policy-processor/cluster.js +32 -0
  113. package/dist/policy-processor/cluster.js.map +1 -0
  114. package/dist/policy-processor/evidence.d.ts +26 -0
  115. package/dist/policy-processor/evidence.d.ts.map +1 -0
  116. package/dist/policy-processor/evidence.js +204 -0
  117. package/dist/policy-processor/evidence.js.map +1 -0
  118. package/dist/policy-processor/explain.d.ts +59 -0
  119. package/dist/policy-processor/explain.d.ts.map +1 -0
  120. package/dist/policy-processor/explain.js +224 -0
  121. package/dist/policy-processor/explain.js.map +1 -0
  122. package/dist/policy-processor/index.d.ts +6 -0
  123. package/dist/policy-processor/index.d.ts.map +1 -0
  124. package/dist/policy-processor/index.js +6 -0
  125. package/dist/policy-processor/index.js.map +1 -0
  126. package/dist/policy-processor/license.d.ts +23 -0
  127. package/dist/policy-processor/license.d.ts.map +1 -0
  128. package/dist/policy-processor/license.js +47 -0
  129. package/dist/policy-processor/license.js.map +1 -0
  130. package/dist/policy-processor/peel-cwd.d.ts +2 -0
  131. package/dist/policy-processor/peel-cwd.d.ts.map +1 -0
  132. package/dist/policy-processor/peel-cwd.js +2 -0
  133. package/dist/policy-processor/peel-cwd.js.map +1 -0
  134. package/dist/policy-processor/real-path.d.ts +7 -0
  135. package/dist/policy-processor/real-path.d.ts.map +1 -0
  136. package/dist/policy-processor/real-path.js +42 -0
  137. package/dist/policy-processor/real-path.js.map +1 -0
  138. package/dist/policy-processor/scope.d.ts +111 -0
  139. package/dist/policy-processor/scope.d.ts.map +1 -0
  140. package/dist/policy-processor/scope.js +629 -0
  141. package/dist/policy-processor/scope.js.map +1 -0
  142. package/dist/policy-processor/self-protect.d.ts +10 -0
  143. package/dist/policy-processor/self-protect.d.ts.map +1 -0
  144. package/dist/policy-processor/self-protect.js +48 -0
  145. package/dist/policy-processor/self-protect.js.map +1 -0
  146. package/dist/policy-processor/soft-deny.d.ts +75 -0
  147. package/dist/policy-processor/soft-deny.d.ts.map +1 -0
  148. package/dist/policy-processor/soft-deny.js +185 -0
  149. package/dist/policy-processor/soft-deny.js.map +1 -0
  150. package/dist/policy-processor/unattended-guard.d.ts +28 -0
  151. package/dist/policy-processor/unattended-guard.d.ts.map +1 -0
  152. package/dist/policy-processor/unattended-guard.js +145 -0
  153. package/dist/policy-processor/unattended-guard.js.map +1 -0
  154. package/dist/session/cancel.d.ts +14 -0
  155. package/dist/session/cancel.d.ts.map +1 -0
  156. package/dist/session/cancel.js +32 -0
  157. package/dist/session/cancel.js.map +1 -0
  158. package/dist/session/commands.d.ts +41 -0
  159. package/dist/session/commands.d.ts.map +1 -0
  160. package/dist/session/commands.js +241 -0
  161. package/dist/session/commands.js.map +1 -0
  162. package/dist/session/compact-actor.d.ts +23 -0
  163. package/dist/session/compact-actor.d.ts.map +1 -0
  164. package/dist/session/compact-actor.js +91 -0
  165. package/dist/session/compact-actor.js.map +1 -0
  166. package/dist/session/compact-env.d.ts +54 -0
  167. package/dist/session/compact-env.d.ts.map +1 -0
  168. package/dist/session/compact-env.js +345 -0
  169. package/dist/session/compact-env.js.map +1 -0
  170. package/dist/session/compact.d.ts +42 -0
  171. package/dist/session/compact.d.ts.map +1 -0
  172. package/dist/session/compact.js +68 -0
  173. package/dist/session/compact.js.map +1 -0
  174. package/dist/session/index.d.ts +9 -0
  175. package/dist/session/index.d.ts.map +1 -0
  176. package/dist/session/index.js +8 -0
  177. package/dist/session/index.js.map +1 -0
  178. package/dist/session/park.d.ts +16 -0
  179. package/dist/session/park.d.ts.map +1 -0
  180. package/dist/session/park.js +73 -0
  181. package/dist/session/park.js.map +1 -0
  182. package/dist/session/side-channel-reminder.d.ts +41 -0
  183. package/dist/session/side-channel-reminder.d.ts.map +1 -0
  184. package/dist/session/side-channel-reminder.js +132 -0
  185. package/dist/session/side-channel-reminder.js.map +1 -0
  186. package/dist/session/types.d.ts +44 -0
  187. package/dist/session/types.d.ts.map +1 -0
  188. package/dist/session/types.js +2 -0
  189. package/dist/session/types.js.map +1 -0
  190. package/dist/tool-catalog/catalog.d.ts +77 -0
  191. package/dist/tool-catalog/catalog.d.ts.map +1 -0
  192. package/dist/tool-catalog/catalog.js +380 -0
  193. package/dist/tool-catalog/catalog.js.map +1 -0
  194. package/dist/tool-catalog/index.d.ts +4 -0
  195. package/dist/tool-catalog/index.d.ts.map +1 -0
  196. package/dist/tool-catalog/index.js +3 -0
  197. package/dist/tool-catalog/index.js.map +1 -0
  198. package/dist/tool-catalog/recipes.d.ts +36 -0
  199. package/dist/tool-catalog/recipes.d.ts.map +1 -0
  200. package/dist/tool-catalog/recipes.js +121 -0
  201. package/dist/tool-catalog/recipes.js.map +1 -0
  202. package/dist/tool-catalog/types.d.ts +103 -0
  203. package/dist/tool-catalog/types.d.ts.map +1 -0
  204. package/dist/tool-catalog/types.js +5 -0
  205. package/dist/tool-catalog/types.js.map +1 -0
  206. package/dist/tool-runtime/approval/approved.d.ts +13 -0
  207. package/dist/tool-runtime/approval/approved.d.ts.map +1 -0
  208. package/dist/tool-runtime/approval/approved.js +20 -0
  209. package/dist/tool-runtime/approval/approved.js.map +1 -0
  210. package/dist/tool-runtime/approval/dist.d.ts +6 -0
  211. package/dist/tool-runtime/approval/dist.d.ts.map +1 -0
  212. package/dist/tool-runtime/approval/dist.js +28 -0
  213. package/dist/tool-runtime/approval/dist.js.map +1 -0
  214. package/dist/tool-runtime/approval/inbound.d.ts +7 -0
  215. package/dist/tool-runtime/approval/inbound.d.ts.map +1 -0
  216. package/dist/tool-runtime/approval/inbound.js +48 -0
  217. package/dist/tool-runtime/approval/inbound.js.map +1 -0
  218. package/dist/tool-runtime/approval/unattended.d.ts +8 -0
  219. package/dist/tool-runtime/approval/unattended.d.ts.map +1 -0
  220. package/dist/tool-runtime/approval/unattended.js +23 -0
  221. package/dist/tool-runtime/approval/unattended.js.map +1 -0
  222. package/dist/tool-runtime/blob-port.d.ts +46 -0
  223. package/dist/tool-runtime/blob-port.d.ts.map +1 -0
  224. package/dist/tool-runtime/blob-port.js +47 -0
  225. package/dist/tool-runtime/blob-port.js.map +1 -0
  226. package/dist/tool-runtime/extra-root.d.ts +3 -0
  227. package/dist/tool-runtime/extra-root.d.ts.map +1 -0
  228. package/dist/tool-runtime/extra-root.js +14 -0
  229. package/dist/tool-runtime/extra-root.js.map +1 -0
  230. package/dist/tool-runtime/handler.d.ts +29 -0
  231. package/dist/tool-runtime/handler.d.ts.map +1 -0
  232. package/dist/tool-runtime/handler.js +460 -0
  233. package/dist/tool-runtime/handler.js.map +1 -0
  234. package/dist/tool-runtime/index.d.ts +14 -0
  235. package/dist/tool-runtime/index.d.ts.map +1 -0
  236. package/dist/tool-runtime/index.js +14 -0
  237. package/dist/tool-runtime/index.js.map +1 -0
  238. package/dist/tool-runtime/peel.d.ts +19 -0
  239. package/dist/tool-runtime/peel.d.ts.map +1 -0
  240. package/dist/tool-runtime/peel.js +74 -0
  241. package/dist/tool-runtime/peel.js.map +1 -0
  242. package/dist/tool-runtime/plugin-context.d.ts +13 -0
  243. package/dist/tool-runtime/plugin-context.d.ts.map +1 -0
  244. package/dist/tool-runtime/plugin-context.js +55 -0
  245. package/dist/tool-runtime/plugin-context.js.map +1 -0
  246. package/dist/tool-runtime/recall.d.ts +18 -0
  247. package/dist/tool-runtime/recall.d.ts.map +1 -0
  248. package/dist/tool-runtime/recall.js +100 -0
  249. package/dist/tool-runtime/recall.js.map +1 -0
  250. package/dist/tool-runtime/run-system-tool.d.ts +13 -0
  251. package/dist/tool-runtime/run-system-tool.d.ts.map +1 -0
  252. package/dist/tool-runtime/run-system-tool.js +230 -0
  253. package/dist/tool-runtime/run-system-tool.js.map +1 -0
  254. package/dist/tool-runtime/tool-error.d.ts +6 -0
  255. package/dist/tool-runtime/tool-error.d.ts.map +1 -0
  256. package/dist/tool-runtime/tool-error.js +6 -0
  257. package/dist/tool-runtime/tool-error.js.map +1 -0
  258. package/dist/tool-runtime/worker-tools.d.ts +8 -0
  259. package/dist/tool-runtime/worker-tools.d.ts.map +1 -0
  260. package/dist/tool-runtime/worker-tools.js +65 -0
  261. package/dist/tool-runtime/worker-tools.js.map +1 -0
  262. package/dist/tool-runtime/write-admit.d.ts +21 -0
  263. package/dist/tool-runtime/write-admit.d.ts.map +1 -0
  264. package/dist/tool-runtime/write-admit.js +89 -0
  265. package/dist/tool-runtime/write-admit.js.map +1 -0
  266. package/package.json +114 -3
  267. package/policy/auto-mode-ask.scm +201 -0
  268. package/policy/bypass-detect.prompt +55 -0
  269. package/policy/classifier-bash-incomplete.prompt +46 -0
  270. package/policy/classifier-bash.prompt +45 -0
  271. package/policy/classifier-mcp.prompt +45 -0
  272. package/policy/classifier-read.prompt +44 -0
  273. package/policy/classifier-write-outside.prompt +46 -0
  274. package/policy/classifier-write-risky.prompt +45 -0
  275. package/policy/classifier-write-workspace.prompt +46 -0
  276. package/policy/classifier-write.prompt +45 -0
  277. package/policy/soft-deny-round1.prompt +51 -0
  278. package/policy/soft-deny-round2.prompt +60 -0
  279. package/src/agent-calls/acceptance.ts +71 -0
  280. package/src/agent-calls/callbacks.ts +75 -0
  281. package/src/agent-calls/delivery.ts +15 -0
  282. package/src/agent-calls/index.ts +16 -0
  283. package/src/agent-calls/operator.ts +99 -0
  284. package/src/agent-calls/runtime.ts +310 -0
  285. package/src/agent-calls/types.ts +33 -0
  286. package/src/context/compact-floors.ts +76 -0
  287. package/src/context/compact.ts +176 -0
  288. package/src/context/delivery.ts +15 -0
  289. package/src/context/history.ts +725 -0
  290. package/src/context/index.ts +35 -0
  291. package/src/context/observations.ts +13 -0
  292. package/src/context/retention/defaults.ts +58 -0
  293. package/src/context/retention/index.ts +45 -0
  294. package/src/context/retention/narrow.ts +123 -0
  295. package/src/context/retention/render.ts +177 -0
  296. package/src/context/retention/resolve.ts +306 -0
  297. package/src/context/retention/schema.ts +173 -0
  298. package/src/context/retention/stamp.ts +121 -0
  299. package/src/context/retention/step.ts +85 -0
  300. package/src/context/retention/view.ts +161 -0
  301. package/src/context/squeeze.ts +218 -0
  302. package/src/context/tools.ts +92 -0
  303. package/src/context/transcript.ts +705 -0
  304. package/src/policy-processor/README.md +43 -0
  305. package/src/policy-processor/bypass.ts +246 -0
  306. package/src/policy-processor/classifier.ts +711 -0
  307. package/src/policy-processor/cluster.ts +31 -0
  308. package/src/policy-processor/evidence.ts +214 -0
  309. package/src/policy-processor/explain.ts +310 -0
  310. package/src/policy-processor/index.ts +6 -0
  311. package/src/policy-processor/license.ts +45 -0
  312. package/src/policy-processor/peel-cwd.ts +1 -0
  313. package/src/policy-processor/real-path.ts +41 -0
  314. package/src/policy-processor/scope.ts +655 -0
  315. package/src/policy-processor/self-protect.ts +46 -0
  316. package/src/policy-processor/soft-deny.ts +225 -0
  317. package/src/policy-processor/unattended-guard.ts +158 -0
  318. package/src/session/cancel.ts +34 -0
  319. package/src/session/commands.ts +292 -0
  320. package/src/session/compact-actor.ts +132 -0
  321. package/src/session/compact-env.ts +539 -0
  322. package/src/session/compact.ts +95 -0
  323. package/src/session/index.ts +18 -0
  324. package/src/session/park.ts +73 -0
  325. package/src/session/side-channel-reminder.ts +148 -0
  326. package/src/session/types.ts +50 -0
  327. package/src/tool-catalog/catalog.ts +282 -0
  328. package/src/tool-catalog/index.ts +26 -0
  329. package/src/tool-catalog/recipes.ts +154 -0
  330. package/src/tool-catalog/types.ts +110 -0
  331. package/src/tool-runtime/approval/approved.ts +20 -0
  332. package/src/tool-runtime/approval/dist.ts +29 -0
  333. package/src/tool-runtime/approval/inbound.ts +50 -0
  334. package/src/tool-runtime/approval/unattended.ts +24 -0
  335. package/src/tool-runtime/blob-port.ts +64 -0
  336. package/src/tool-runtime/extra-root.ts +16 -0
  337. package/src/tool-runtime/handler.ts +576 -0
  338. package/src/tool-runtime/index.ts +21 -0
  339. package/src/tool-runtime/peel.ts +91 -0
  340. package/src/tool-runtime/plugin-context.ts +68 -0
  341. package/src/tool-runtime/recall.ts +104 -0
  342. package/src/tool-runtime/run-system-tool.ts +273 -0
  343. package/src/tool-runtime/tool-error.ts +6 -0
  344. package/src/tool-runtime/worker-tools.ts +76 -0
  345. package/src/tool-runtime/write-admit.ts +90 -0
  346. package/README.md +0 -3
@@ -0,0 +1,33 @@
1
+ /**
2
+ * R3: the retention clock. Deep horizons expire against `at`, which only moves
3
+ * at a step, so between steps the projected prefix is byte-stable and only the
4
+ * tail grows. The live inputs (wall clock, prior `warmUntilMs`, estimated
5
+ * savings) are read once here and recorded; the projection reads only `at`.
6
+ */
7
+ import { CompletionExpectation } from "@inhuman.tools/harness-model";
8
+ import type { StepConfig } from "./schema.js";
9
+ import { type RetentionClock } from "./view.js";
10
+ export type StepFacts = {
11
+ readonly self: string;
12
+ readonly step: StepConfig;
13
+ /** Prior completion on the spine: its recorded clock target, and when its cache lapses. */
14
+ readonly prior: {
15
+ readonly at: string | null;
16
+ readonly warmUntilMs: number | null;
17
+ } | null;
18
+ readonly turnFirstRound: boolean;
19
+ readonly afterCutoff: boolean;
20
+ /** Rounds between the prior clock target and this completion. */
21
+ readonly roundsSinceAt: number;
22
+ readonly now: number;
23
+ /** Estimated tokens a step would free. Lazy: walks the spine. */
24
+ readonly freedTokens: () => number;
25
+ };
26
+ /** Pure: the order is compaction, turn, cold, every, freed, else hold. */
27
+ export declare function decideRetentionStep(f: StepFacts): RetentionClock;
28
+ /**
29
+ * Stamp `tip.retentionClockJson` when its round opens. Call once the
30
+ * completion is on its turn's tape (it must be reachable from its turn).
31
+ */
32
+ export declare function stampRetentionClock(tip: CompletionExpectation, now?: number): RetentionClock;
33
+ //# sourceMappingURL=step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../../src/context/retention/step.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,qBAAqB,EAAmC,MAAM,8BAA8B,CAAC;AAGtG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAA8C,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAE5F,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,2FAA2F;IAC3F,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3F,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC;CACpC,CAAC;AAEF,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,GAAG,cAAc,CAkBhE;AASD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,qBAAqB,EAAE,GAAG,GAAE,MAAmB,GAAG,cAAc,CA0BxG"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * R3: the retention clock. Deep horizons expire against `at`, which only moves
3
+ * at a step, so between steps the projected prefix is byte-stable and only the
4
+ * tail grows. The live inputs (wall clock, prior `warmUntilMs`, estimated
5
+ * savings) are read once here and recorded; the projection reads only `at`.
6
+ */
7
+ import { latestCompactCutoff, owningTurn } from "@inhuman.tools/harness-model";
8
+ import { projectHistory } from "../history.js";
9
+ import { parseClock, policyOfTurn } from "./view.js";
10
+ /** Pure: the order is compaction, turn, cold, every, freed, else hold. */
11
+ export function decideRetentionStep(f) {
12
+ const step = (reason, extra = {}) => ({
13
+ at: f.self,
14
+ reason,
15
+ ...extra,
16
+ });
17
+ if (f.afterCutoff && f.step.atCompaction)
18
+ return step("compaction");
19
+ const priorAt = f.prior?.at ?? null;
20
+ if (priorAt === null)
21
+ return step("turn");
22
+ if (f.turnFirstRound && f.step.turnBoundary)
23
+ return step("turn");
24
+ const warm = f.prior?.warmUntilMs ?? null;
25
+ if (f.step.whenCacheCold && warm !== null && f.now > warm)
26
+ return step("cold", { coldByMs: f.now - warm });
27
+ if (f.step.everyRounds !== null && f.roundsSinceAt >= f.step.everyRounds)
28
+ return step("every");
29
+ if (f.step.minFreedTokens > 0) {
30
+ const freed = f.freedTokens();
31
+ if (freed >= f.step.minFreedTokens)
32
+ return step("freed", { freedTokens: freed });
33
+ }
34
+ return { at: priorAt, reason: "hold" };
35
+ }
36
+ function tokensOf(rows) {
37
+ let chars = 0;
38
+ for (const row of rows)
39
+ chars += JSON.stringify(row, (_key, value) => (value instanceof Uint8Array ? value.length : value)).length;
40
+ return Math.ceil(chars / 4);
41
+ }
42
+ /**
43
+ * Stamp `tip.retentionClockJson` when its round opens. Call once the
44
+ * completion is on its turn's tape (it must be reachable from its turn).
45
+ */
46
+ export function stampRetentionClock(tip, now = Date.now()) {
47
+ const turn = owningTurn(tip);
48
+ const policy = policyOfTurn(turn);
49
+ const spine = tip.spine();
50
+ const index = spine.indexOf(tip);
51
+ const prior = index > 0 ? spine[index - 1] : null;
52
+ const priorAt = prior === null ? null : (parseClock(prior.retentionClockJson)?.at ?? null);
53
+ const priorPos = priorAt === null ? -1 : spine.findIndex((c) => c.uuid === priorAt);
54
+ const clock = decideRetentionStep({
55
+ self: tip.uuid,
56
+ step: policy.step,
57
+ prior: prior === null ? null : { at: priorPos < 0 ? null : priorAt, warmUntilMs: prior.warmUntilMs },
58
+ turnFirstRound: prior === null || owningTurn(prior) !== turn,
59
+ afterCutoff: prior === null && turn !== null && latestCompactCutoff(turn) !== null,
60
+ roundsSinceAt: priorPos < 0 ? 0 : index - priorPos,
61
+ now,
62
+ freedTokens: () => {
63
+ const held = spine[priorPos];
64
+ if (held === undefined)
65
+ return 0;
66
+ const before = tokensOf(projectHistory(tip, { clockAt: held }));
67
+ const after = tokensOf(projectHistory(tip, { clockAt: tip }));
68
+ return Math.max(0, before - after);
69
+ },
70
+ });
71
+ tip.retentionClockJson = JSON.stringify(clock);
72
+ return clock;
73
+ }
74
+ //# sourceMappingURL=step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step.js","sourceRoot":"","sources":["../../../src/context/retention/step.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * The positions a retention decision is made against. Everything here is read
3
+ * from recorded facts: the completion order, each turn's R1 stamp, and the
4
+ * tip's R3 clock. Nothing reads config, kv, the catalog or the wall clock, so
5
+ * a restart re-projects byte-identically.
6
+ */
7
+ import { CompletionExpectation, SessionTurn } from "@inhuman.tools/harness-model";
8
+ import { type ResolvedPolicy } from "./resolve.js";
9
+ import type { Horizon } from "./schema.js";
10
+ export type ClockReason = "turn" | "every" | "freed" | "cold" | "compaction" | "hold";
11
+ export type RetentionClock = {
12
+ /** Uuid of the completion the deep horizons are evaluated against. */
13
+ readonly at: string;
14
+ readonly reason: ClockReason;
15
+ readonly coldByMs?: number;
16
+ readonly freedTokens?: number;
17
+ };
18
+ export declare function parseClock(json: string): RetentionClock | null;
19
+ /** A turn's policy: its own R1 stamp, else the nearest tail's, else the legacy rule set. */
20
+ export declare function policyOfTurn(turn: SessionTurn | null): ResolvedPolicy;
21
+ export type RetentionView = {
22
+ readonly tip: CompletionExpectation;
23
+ readonly order: readonly CompletionExpectation[];
24
+ readonly tipPos: number;
25
+ readonly tipTurn: number;
26
+ /** Null: no recorded clock, so deep horizons never expire anything. */
27
+ readonly clockPos: number | null;
28
+ readonly clockTurn: number | null;
29
+ readonly dialect: string | undefined;
30
+ posOf(c: CompletionExpectation): number;
31
+ turnOf(c: CompletionExpectation): number;
32
+ policyOf(c: CompletionExpectation): ResolvedPolicy;
33
+ /** The completion after `c`, which consumes `c`'s tool results. */
34
+ nextOf(c: CompletionExpectation): CompletionExpectation | null;
35
+ };
36
+ export type ViewOptions = {
37
+ /** Evaluate the deep horizons here instead of at the recorded clock. Used to estimate a step. */
38
+ readonly clockAt?: CompletionExpectation | null;
39
+ readonly dialect?: string;
40
+ };
41
+ /** `order` is the lead (kept zone) completions, then the spine, ending at the tip. */
42
+ export declare function buildView(tip: CompletionExpectation, order: readonly CompletionExpectation[], options?: ViewOptions): RetentionView;
43
+ export type ItemPlace = {
44
+ /** The completion whose input first contains the item. */
45
+ readonly consumer: CompletionExpectation;
46
+ /** The completion that produced or claimed the item; its turn is the item's turn. */
47
+ readonly owner: CompletionExpectation;
48
+ /** Evaluate against the tip instead of the clock. Pictures live only within their own turn. */
49
+ readonly againstTip?: boolean;
50
+ };
51
+ /**
52
+ * Any condition met expires the item. `newest` is decided by the caller,
53
+ * which ranks items of one kind; it is not a span.
54
+ */
55
+ export declare function horizonExpired(keep: readonly Horizon[], view: RetentionView, place: ItemPlace): boolean;
56
+ export declare function newestOf(keep: readonly Horizon[]): number | null;
57
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/context/retention/view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,qBAAqB,EAAc,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE9F,OAAO,EAA8B,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC;AAEtF,MAAM,MAAM,cAAc,GAAG;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAIF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAgB9D;AAED,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,cAAc,CAQrE;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,KAAK,CAAC,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAAC;IACxC,MAAM,CAAC,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAAC;IACzC,QAAQ,CAAC,CAAC,EAAE,qBAAqB,GAAG,cAAc,CAAC;IACnD,mEAAmE;IACnE,MAAM,CAAC,CAAC,EAAE,qBAAqB,GAAG,qBAAqB,GAAG,IAAI,CAAC;CAChE,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,iGAAiG;IACjG,QAAQ,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,sFAAsF;AACtF,wBAAgB,SAAS,CACvB,GAAG,EAAE,qBAAqB,EAC1B,KAAK,EAAE,SAAS,qBAAqB,EAAE,EACvC,OAAO,GAAE,WAAgB,GACxB,aAAa,CAgCf;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IACzC,qFAAqF;IACrF,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,+FAA+F;IAC/F,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CA0BvG;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,CAMhE"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * The positions a retention decision is made against. Everything here is read
3
+ * from recorded facts: the completion order, each turn's R1 stamp, and the
4
+ * tip's R3 clock. Nothing reads config, kv, the catalog or the wall clock, so
5
+ * a restart re-projects byte-identically.
6
+ */
7
+ import { owningTurn, SessionTurn } from "@inhuman.tools/harness-model";
8
+ import { LEGACY_POLICY, parsePolicy } from "./resolve.js";
9
+ const REASONS = new Set(["turn", "every", "freed", "cold", "compaction", "hold"]);
10
+ export function parseClock(json) {
11
+ if (json === "")
12
+ return null;
13
+ try {
14
+ const raw = JSON.parse(json);
15
+ if (typeof raw.at !== "string" || raw.at === "" || typeof raw.reason !== "string" || !REASONS.has(raw.reason)) {
16
+ return null;
17
+ }
18
+ return {
19
+ at: raw.at,
20
+ reason: raw.reason,
21
+ ...(typeof raw.coldByMs === "number" ? { coldByMs: raw.coldByMs } : {}),
22
+ ...(typeof raw.freedTokens === "number" ? { freedTokens: raw.freedTokens } : {}),
23
+ };
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ /** A turn's policy: its own R1 stamp, else the nearest tail's, else the legacy rule set. */
30
+ export function policyOfTurn(turn) {
31
+ const seen = new Set();
32
+ for (let cell = turn; cell instanceof SessionTurn && !seen.has(cell); cell = cell.turnTail) {
33
+ seen.add(cell);
34
+ const parsed = parsePolicy(cell.retentionJson);
35
+ if (parsed !== null)
36
+ return parsed;
37
+ }
38
+ return LEGACY_POLICY;
39
+ }
40
+ /** `order` is the lead (kept zone) completions, then the spine, ending at the tip. */
41
+ export function buildView(tip, order, options = {}) {
42
+ const pos = new Map();
43
+ const turnOrd = new Map();
44
+ const turns = new Map();
45
+ for (const [index, c] of order.entries()) {
46
+ pos.set(c, index);
47
+ const turn = owningTurn(c);
48
+ if (!turns.has(turn))
49
+ turns.set(turn, turns.size);
50
+ turnOrd.set(c, turns.get(turn) ?? 0);
51
+ }
52
+ const posOf = (c) => pos.get(c) ?? -1;
53
+ const turnOf = (c) => turnOrd.get(c) ?? 0;
54
+ let clockCompletion;
55
+ if (options.clockAt !== undefined)
56
+ clockCompletion = options.clockAt;
57
+ else {
58
+ const clock = parseClock(tip.retentionClockJson);
59
+ clockCompletion = clock === null ? null : (order.find((c) => c.uuid === clock.at) ?? null);
60
+ }
61
+ const clockPos = clockCompletion === null ? null : posOf(clockCompletion);
62
+ return {
63
+ tip,
64
+ order,
65
+ tipPos: posOf(tip),
66
+ tipTurn: turnOf(tip),
67
+ clockPos: clockPos === null || clockPos < 0 ? null : clockPos,
68
+ clockTurn: clockPos === null || clockPos < 0 || clockCompletion === null ? null : turnOf(clockCompletion),
69
+ dialect: options.dialect,
70
+ posOf,
71
+ turnOf,
72
+ policyOf: (c) => policyOfTurn(owningTurn(c)),
73
+ nextOf: (c) => order[posOf(c) + 1] ?? null,
74
+ };
75
+ }
76
+ /**
77
+ * Any condition met expires the item. `newest` is decided by the caller,
78
+ * which ranks items of one kind; it is not a span.
79
+ */
80
+ export function horizonExpired(keep, view, place) {
81
+ const consumerPos = view.posOf(place.consumer);
82
+ const ownerTurn = view.turnOf(place.owner);
83
+ if (consumerPos < 0)
84
+ return false;
85
+ for (const h of keep) {
86
+ if (h === "round") {
87
+ if (view.tipPos - consumerPos >= 1)
88
+ return true;
89
+ continue;
90
+ }
91
+ if (h === "turn") {
92
+ const ref = place.againstTip === true ? view.tipTurn : view.clockTurn;
93
+ if (ref !== null && ref > ownerTurn)
94
+ return true;
95
+ continue;
96
+ }
97
+ if (h === "compaction" || h === "forever")
98
+ continue;
99
+ if ("rounds" in h) {
100
+ const ref = h.rounds === 1 || place.againstTip === true ? view.tipPos : view.clockPos;
101
+ if (ref !== null && ref - consumerPos >= h.rounds)
102
+ return true;
103
+ continue;
104
+ }
105
+ if ("turns" in h) {
106
+ const ref = place.againstTip === true ? view.tipTurn : view.clockTurn;
107
+ if (ref !== null && ref - ownerTurn >= h.turns)
108
+ return true;
109
+ }
110
+ }
111
+ return false;
112
+ }
113
+ export function newestOf(keep) {
114
+ let out = null;
115
+ for (const h of keep) {
116
+ if (typeof h === "object" && "newest" in h)
117
+ out = out === null ? h.newest : Math.min(out, h.newest);
118
+ }
119
+ return out;
120
+ }
121
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/context/retention/view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { ProgrammaticJob, ToolCallJob, type ToolCallRepresentation } from "@inhuman.tools/harness-model";
2
+ export type SqueezeTo = "compact" | "micro";
3
+ /** Measured optimal observation size. Chars, not tokens. */
4
+ export declare const SQUEEZE_COMPACT_CHARS = 5000;
5
+ /** Below this, micro is a no-op — replacing a short answer with a path is pointless. */
6
+ export declare const SQUEEZE_MICRO_MIN_CHARS = 100;
7
+ export type SqueezeInput = {
8
+ readonly to: SqueezeTo;
9
+ readonly payload: unknown;
10
+ readonly persistable: boolean;
11
+ /** `job:<ref>` the model passes to `context_recall`. Without it a reduced result carries no pointer. */
12
+ readonly recallRef?: string;
13
+ readonly name: string;
14
+ };
15
+ /** Source observation as a string. Top-level strings stay raw; values ride the serializer. */
16
+ export declare function paintObservation(payload: unknown): string;
17
+ export declare function squeezeObservation(input: SqueezeInput): string;
18
+ export type ToolImage = {
19
+ /** 1-based position among this result's images. */
20
+ readonly index: number;
21
+ readonly mime: string;
22
+ readonly size: number;
23
+ /** Null when the block was not valid base64 or exceeds the wire cap. */
24
+ readonly bytes: Uint8Array | null;
25
+ };
26
+ /** Dimensionless note: `[Image 1: image/png, 31.4 KB]`, or the elided form with a recall pointer. */
27
+ export declare function toolImageLine(image: ToolImage, state: "shown" | "elided", ref?: string): string;
28
+ /**
29
+ * Pull image content blocks out of a result so base64 never reaches the model
30
+ * as text. The painted payload keeps a one-line note per image.
31
+ */
32
+ export declare function liftToolImages(payload: unknown, note?: (image: ToolImage) => string): {
33
+ readonly payload: unknown;
34
+ readonly images: readonly ToolImage[];
35
+ };
36
+ /** The images a sealed tool result carries, in order. */
37
+ export declare function toolImagesOf(tool: ToolCallJob): readonly ToolImage[];
38
+ /** Compact line derived from the sealed receipt. */
39
+ export declare function compactToolLine(job: ToolCallJob | ProgrammaticJob): string;
40
+ /** scheme_repl / exam results ride the same cap and pointer as tool results. */
41
+ export declare function squeezeProgrammaticText(job: ProgrammaticJob, text: string): string;
42
+ /** Server-side compact wire paint. Not a client-document method. */
43
+ export declare function squeezeToolCall(tool: ToolCallJob, to: SqueezeTo, note?: (image: ToolImage) => string): string;
44
+ export declare function toolCallRepresentation(tool: ToolCallJob): ToolCallRepresentation;
45
+ //# sourceMappingURL=squeeze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"squeeze.d.ts","sourceRoot":"","sources":["../../src/context/squeeze.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAIzG,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5C,4DAA4D;AAC5D,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,wFAAwF;AACxF,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,wGAAwG;IACxG,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAIzD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CA4B9D;AA4BD,MAAM,MAAM,SAAS,GAAG;IACtB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CACnC,CAAC;AAsBF,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAG/F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE,CAAC,KAAK,EAAE,SAAS,KAAK,MAAiD,GAC5E;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,CAmBtE;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,SAAS,EAAE,CAEpE;AAOD,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,eAAe,GAAG,MAAM,CAO1E;AAED,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAQlF;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,MAAM,GAAG,MAAM,CAQ7G;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,sBAAsB,CAOhF"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Squeeze — tool-call observation paint. Not compact. Not settlement.
3
+ *
4
+ * Stored `outcomeJson` stays the source. This module projects it for the wire.
5
+ * Compact.scm does not inspect payload size.
6
+ *
7
+ * A reduced observation points at `context_recall`: the sealed receipt is read
8
+ * back from the graph, paged, instead of from a `/tmp` copy. There is no second
9
+ * world on disk. Regenerateable results (`read` | `net`) get no pointer:
10
+ * re-invoking is the address.
11
+ *
12
+ * Top-level strings stay raw text (a file body stays a file body). Serializer
13
+ * quoting of a top-level string is the wrong observation for read_file.
14
+ * Structured `value` payloads ride `toSExprString` caps — not a second compact
15
+ * pass in the driver.
16
+ *
17
+ * MCP image blocks never ride as base64 text: {@link liftToolImages} takes them
18
+ * out of the painted observation, and the projection decides whether the model
19
+ * sees the picture or a stub.
20
+ */
21
+ import { toSExprString, toSExprStringWithElisions } from "@here.build/arrival-serializer";
22
+ import { ToolCallJob } from "@inhuman.tools/harness-model";
23
+ import { humanSize, refOfNode } from "./retention/render.js";
24
+ /** Measured optimal observation size. Chars, not tokens. */
25
+ export const SQUEEZE_COMPACT_CHARS = 5000;
26
+ /** Below this, micro is a no-op — replacing a short answer with a path is pointless. */
27
+ export const SQUEEZE_MICRO_MIN_CHARS = 100;
28
+ /** Source observation as a string. Top-level strings stay raw; values ride the serializer. */
29
+ export function paintObservation(payload) {
30
+ if (payload === undefined)
31
+ return "";
32
+ if (typeof payload === "string")
33
+ return payload;
34
+ return toSExprString(payload);
35
+ }
36
+ export function squeezeObservation(input) {
37
+ const { to, payload, persistable, name } = input;
38
+ const pointer = persistable && input.recallRef !== undefined ? recallComment(input.recallRef) : "";
39
+ if (typeof payload === "string") {
40
+ if (to === "micro") {
41
+ if (payload.length < SQUEEZE_MICRO_MIN_CHARS)
42
+ return payload;
43
+ if (!persistable)
44
+ return clearedStub(name);
45
+ return pointer === "" ? compactBody(payload).text : pointer;
46
+ }
47
+ const { text, reduced } = compactBody(payload);
48
+ if (reduced && pointer !== "")
49
+ return `${pointer}\n${text}`;
50
+ return text;
51
+ }
52
+ if (to === "micro") {
53
+ const full = paintObservation(payload);
54
+ if (full.length < SQUEEZE_MICRO_MIN_CHARS)
55
+ return full;
56
+ if (!persistable)
57
+ return clearedStub(name);
58
+ return pointer === "" ? squeezeValue(payload) : pointer;
59
+ }
60
+ const { text, reduced } = toSExprStringWithElisions(payload, {
61
+ maxTotalChars: SQUEEZE_COMPACT_CHARS,
62
+ maxStringChars: SQUEEZE_COMPACT_CHARS,
63
+ });
64
+ if (reduced && pointer !== "")
65
+ return `${pointer}\n${text}`;
66
+ return text;
67
+ }
68
+ function squeezeValue(payload) {
69
+ return toSExprString(payload, {
70
+ maxTotalChars: SQUEEZE_COMPACT_CHARS,
71
+ maxStringChars: SQUEEZE_COMPACT_CHARS,
72
+ });
73
+ }
74
+ function compactBody(payload) {
75
+ if (payload.length <= SQUEEZE_COMPACT_CHARS)
76
+ return { text: payload, reduced: false };
77
+ const dropped = payload.length - SQUEEZE_COMPACT_CHARS;
78
+ return {
79
+ text: `${payload.slice(0, SQUEEZE_COMPACT_CHARS)}…(+${dropped} chars)`,
80
+ reduced: true,
81
+ };
82
+ }
83
+ function recallComment(ref) {
84
+ return `;;full response: context_recall ${JSON.stringify({ ref })}`;
85
+ }
86
+ function clearedStub(name) {
87
+ return name === "" ? "[Old tool result content cleared]" : `[Old ${name} result content cleared]`;
88
+ }
89
+ const MAX_TOOL_IMAGE_BYTES = 5 * 1024 * 1024;
90
+ function isImageBlock(block) {
91
+ return typeof block === "object" && block !== null && block.type === "image";
92
+ }
93
+ function decodeBase64(data) {
94
+ if (typeof data !== "string")
95
+ return null;
96
+ const compact = data.replaceAll(/\s/g, "");
97
+ if (compact === "" || compact.length % 4 !== 0 || !/^[\w+/-]+={0,2}$/.test(compact))
98
+ return null;
99
+ const decoded = Buffer.from(compact, "base64");
100
+ if (decoded.length === 0 || decoded.length > MAX_TOOL_IMAGE_BYTES)
101
+ return null;
102
+ return new Uint8Array(decoded);
103
+ }
104
+ /** Dimensionless note: `[Image 1: image/png, 31.4 KB]`, or the elided form with a recall pointer. */
105
+ export function toolImageLine(image, state, ref) {
106
+ const head = `Image ${image.index}${state === "elided" ? " elided" : ""}: ${image.mime}, ${humanSize(image.size)}`;
107
+ return state === "elided" && ref !== undefined ? `[${head} — recall ${ref}]` : `[${head}]`;
108
+ }
109
+ /**
110
+ * Pull image content blocks out of a result so base64 never reaches the model
111
+ * as text. The painted payload keeps a one-line note per image.
112
+ */
113
+ export function liftToolImages(payload, note = (image) => toolImageLine(image, "shown")) {
114
+ if (!Array.isArray(payload) || !payload.some((block) => isImageBlock(block)))
115
+ return { payload, images: [] };
116
+ const images = [];
117
+ const lifted = payload.map((block) => {
118
+ if (!isImageBlock(block))
119
+ return block;
120
+ const mimeRaw = block.mimeType ?? block.mime_type;
121
+ const bytes = decodeBase64(block.data);
122
+ const size = bytes === null ? (typeof block.data === "string" ? Math.floor((block.data.length * 3) / 4) : 0) : bytes.length;
123
+ const image = {
124
+ index: images.length + 1,
125
+ mime: typeof mimeRaw === "string" && mimeRaw !== "" ? mimeRaw : "image",
126
+ size,
127
+ bytes,
128
+ };
129
+ images.push(image);
130
+ return { type: "text", text: note(image) };
131
+ });
132
+ return { payload: lifted, images };
133
+ }
134
+ /** The images a sealed tool result carries, in order. */
135
+ export function toolImagesOf(tool) {
136
+ return liftToolImages(tool.observationPayload()).images;
137
+ }
138
+ function refField(node) {
139
+ const ref = refOfNode(node);
140
+ return ref === undefined ? {} : { recallRef: ref };
141
+ }
142
+ /** Compact line derived from the sealed receipt. */
143
+ export function compactToolLine(job) {
144
+ if (job instanceof ToolCallJob && job.regenerateable)
145
+ return "";
146
+ if (job instanceof ToolCallJob)
147
+ return squeezeToolCall(job, "compact");
148
+ const parts = job.resultParts();
149
+ if (parts !== undefined)
150
+ return parts.map((part) => squeezeProgrammaticText(job, part.text)).join("\n");
151
+ const text = job.resultText();
152
+ return squeezeProgrammaticText(job, text !== "" ? text : (job.receiptJson ?? ""));
153
+ }
154
+ /** scheme_repl / exam results ride the same cap and pointer as tool results. */
155
+ export function squeezeProgrammaticText(job, text) {
156
+ return squeezeObservation({
157
+ to: "compact",
158
+ payload: text,
159
+ persistable: true,
160
+ ...refField(job),
161
+ name: "",
162
+ });
163
+ }
164
+ /** Server-side compact wire paint. Not a client-document method. */
165
+ export function squeezeToolCall(tool, to, note) {
166
+ return squeezeObservation({
167
+ to,
168
+ payload: liftToolImages(tool.observationPayload(), note).payload,
169
+ persistable: !tool.regenerateable,
170
+ ...refField(tool),
171
+ name: tool.name,
172
+ });
173
+ }
174
+ export function toolCallRepresentation(tool) {
175
+ return {
176
+ id: tool.toolCallId,
177
+ name: tool.name,
178
+ args: tool.invocation(),
179
+ result: paintObservation(liftToolImages(tool.observationPayload()).payload),
180
+ };
181
+ }
182
+ //# sourceMappingURL=squeeze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"squeeze.js","sourceRoot":"","sources":["../../src/context/squeeze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Completion tools[] face: frozen turn.tools when present, else live catalog.
3
+ * Vendor OpenAI wrapping stays in the actor. Live-catalog scheme_repl
4
+ * description overlay is also the actor — frozen ToolSpec text is left as-is.
5
+ */
6
+ import { CompletionExpectation } from "@inhuman.tools/harness-model";
7
+ import { KernelToolCatalog } from "../tool-catalog/index.js";
8
+ export type ContextTool = {
9
+ readonly name: string;
10
+ readonly description: string;
11
+ readonly parameters: Record<string, unknown>;
12
+ };
13
+ export declare function liveCatalogOf(expectation: CompletionExpectation, catalog?: KernelToolCatalog): KernelToolCatalog | undefined;
14
+ /** Frozen turn set wins so MCP churn cannot rewrite the prefix. */
15
+ export declare function selectCompletionTools(expectation: CompletionExpectation, catalog?: KernelToolCatalog): readonly ContextTool[];
16
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/context/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAGL,qBAAqB,EAGtB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAa,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAExE,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C,CAAC;AAEF,wBAAgB,aAAa,CAC3B,WAAW,EAAE,qBAAqB,EAClC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,iBAAiB,GAAG,SAAS,CAE/B;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,qBAAqB,EAClC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,SAAS,WAAW,EAAE,CA6BxB"}