@koda-sl/baker-bridge 0.110.0-dev.6a86a7961 → 0.110.0-dev.6beff6a4b

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 (338) hide show
  1. package/README.md +108 -65
  2. package/dist/broker/baker-api.d.ts +23 -0
  3. package/dist/broker/baker-api.d.ts.map +1 -0
  4. package/dist/broker/baker-api.js +55 -0
  5. package/dist/broker/baker-api.js.map +1 -0
  6. package/dist/broker/broker-client.d.ts +10 -0
  7. package/dist/broker/broker-client.d.ts.map +1 -0
  8. package/dist/broker/broker-client.js +60 -0
  9. package/dist/broker/broker-client.js.map +1 -0
  10. package/dist/broker/broker-process.d.ts +10 -0
  11. package/dist/broker/broker-process.d.ts.map +1 -0
  12. package/dist/broker/broker-process.js +20 -0
  13. package/dist/broker/broker-process.js.map +1 -0
  14. package/dist/broker/broker-process.test.d.ts +2 -0
  15. package/dist/broker/broker-process.test.d.ts.map +1 -0
  16. package/dist/broker/broker-process.test.js +13 -0
  17. package/dist/broker/broker-process.test.js.map +1 -0
  18. package/dist/broker/ca.d.ts +38 -0
  19. package/dist/broker/ca.d.ts.map +1 -0
  20. package/dist/broker/ca.js +80 -0
  21. package/dist/broker/ca.js.map +1 -0
  22. package/dist/broker/ca.test.d.ts +2 -0
  23. package/dist/broker/ca.test.d.ts.map +1 -0
  24. package/dist/broker/ca.test.js +58 -0
  25. package/dist/broker/ca.test.js.map +1 -0
  26. package/dist/broker/credential-cache.d.ts +24 -0
  27. package/dist/broker/credential-cache.d.ts.map +1 -0
  28. package/dist/broker/credential-cache.js +76 -0
  29. package/dist/broker/credential-cache.js.map +1 -0
  30. package/dist/broker/credential-cache.test.d.ts +2 -0
  31. package/dist/broker/credential-cache.test.d.ts.map +1 -0
  32. package/dist/broker/credential-cache.test.js +136 -0
  33. package/dist/broker/credential-cache.test.js.map +1 -0
  34. package/dist/broker/credential-text.d.ts +45 -0
  35. package/dist/broker/credential-text.d.ts.map +1 -0
  36. package/dist/broker/credential-text.js +103 -0
  37. package/dist/broker/credential-text.js.map +1 -0
  38. package/dist/broker/credential-text.test.d.ts +2 -0
  39. package/dist/broker/credential-text.test.d.ts.map +1 -0
  40. package/dist/broker/credential-text.test.js +54 -0
  41. package/dist/broker/credential-text.test.js.map +1 -0
  42. package/dist/broker/env.d.ts +21 -0
  43. package/dist/broker/env.d.ts.map +1 -0
  44. package/dist/broker/env.js +20 -0
  45. package/dist/broker/env.js.map +1 -0
  46. package/dist/broker/main.d.ts +3 -0
  47. package/dist/broker/main.d.ts.map +1 -0
  48. package/dist/broker/main.js +57 -0
  49. package/dist/broker/main.js.map +1 -0
  50. package/dist/broker/proxy.d.ts +24 -0
  51. package/dist/broker/proxy.d.ts.map +1 -0
  52. package/dist/broker/proxy.integration.test.d.ts +2 -0
  53. package/dist/broker/proxy.integration.test.d.ts.map +1 -0
  54. package/dist/broker/proxy.integration.test.js +197 -0
  55. package/dist/broker/proxy.integration.test.js.map +1 -0
  56. package/dist/broker/proxy.js +147 -0
  57. package/dist/broker/proxy.js.map +1 -0
  58. package/dist/broker/rewrite.d.ts +44 -0
  59. package/dist/broker/rewrite.d.ts.map +1 -0
  60. package/dist/broker/rewrite.js +291 -0
  61. package/dist/broker/rewrite.js.map +1 -0
  62. package/dist/broker/rewrite.test.d.ts +2 -0
  63. package/dist/broker/rewrite.test.d.ts.map +1 -0
  64. package/dist/broker/rewrite.test.js +171 -0
  65. package/dist/broker/rewrite.test.js.map +1 -0
  66. package/dist/broker/socket-service.d.ts +18 -0
  67. package/dist/broker/socket-service.d.ts.map +1 -0
  68. package/dist/broker/socket-service.js +113 -0
  69. package/dist/broker/socket-service.js.map +1 -0
  70. package/dist/broker/socket-service.test.d.ts +2 -0
  71. package/dist/broker/socket-service.test.d.ts.map +1 -0
  72. package/dist/broker/socket-service.test.js +80 -0
  73. package/dist/broker/socket-service.test.js.map +1 -0
  74. package/dist/broker/supervisor-main.d.ts +3 -0
  75. package/dist/broker/supervisor-main.d.ts.map +1 -0
  76. package/dist/broker/supervisor-main.js +70 -0
  77. package/dist/broker/supervisor-main.js.map +1 -0
  78. package/dist/broker/supervisor.d.ts +25 -0
  79. package/dist/broker/supervisor.d.ts.map +1 -0
  80. package/dist/broker/supervisor.js +88 -0
  81. package/dist/broker/supervisor.js.map +1 -0
  82. package/dist/broker/supervisor.test.d.ts +2 -0
  83. package/dist/broker/supervisor.test.d.ts.map +1 -0
  84. package/dist/broker/supervisor.test.js +161 -0
  85. package/dist/broker/supervisor.test.js.map +1 -0
  86. package/dist/broker/token-bucket.d.ts +9 -0
  87. package/dist/broker/token-bucket.d.ts.map +1 -0
  88. package/dist/broker/token-bucket.js +18 -0
  89. package/dist/broker/token-bucket.js.map +1 -0
  90. package/dist/broker/usage-reporter.d.ts +18 -0
  91. package/dist/broker/usage-reporter.d.ts.map +1 -0
  92. package/dist/broker/usage-reporter.js +31 -0
  93. package/dist/broker/usage-reporter.js.map +1 -0
  94. package/dist/broker/usage-reporter.test.d.ts +2 -0
  95. package/dist/broker/usage-reporter.test.d.ts.map +1 -0
  96. package/dist/broker/usage-reporter.test.js +20 -0
  97. package/dist/broker/usage-reporter.test.js.map +1 -0
  98. package/dist/cli.d.ts.map +1 -1
  99. package/dist/cli.js +2 -0
  100. package/dist/cli.js.map +1 -1
  101. package/dist/hono/agent-session.d.ts +4 -0
  102. package/dist/hono/agent-session.d.ts.map +1 -1
  103. package/dist/hono/agent-session.js +28 -2
  104. package/dist/hono/agent-session.js.map +1 -1
  105. package/dist/hono/agent-session.test.js +37 -0
  106. package/dist/hono/agent-session.test.js.map +1 -1
  107. package/dist/hono/agent-tasks.d.ts.map +1 -1
  108. package/dist/hono/agent-tasks.js +11 -7
  109. package/dist/hono/agent-tasks.js.map +1 -1
  110. package/dist/hono/agent-tasks.test.js +15 -0
  111. package/dist/hono/agent-tasks.test.js.map +1 -1
  112. package/dist/hono/agent.d.ts +2 -0
  113. package/dist/hono/agent.d.ts.map +1 -1
  114. package/dist/hono/agent.js +22 -10
  115. package/dist/hono/agent.js.map +1 -1
  116. package/dist/hono/agent.test.js +8 -2
  117. package/dist/hono/agent.test.js.map +1 -1
  118. package/dist/hono/attachments.d.ts +6 -1
  119. package/dist/hono/attachments.d.ts.map +1 -1
  120. package/dist/hono/attachments.js +9 -4
  121. package/dist/hono/attachments.js.map +1 -1
  122. package/dist/hono/attachments.test.js +5 -0
  123. package/dist/hono/attachments.test.js.map +1 -1
  124. package/dist/hono/avatar-accent.d.ts +23 -5
  125. package/dist/hono/avatar-accent.d.ts.map +1 -1
  126. package/dist/hono/avatar-accent.js +54 -63
  127. package/dist/hono/avatar-accent.js.map +1 -1
  128. package/dist/hono/avatar-accent.test.js +64 -35
  129. package/dist/hono/avatar-accent.test.js.map +1 -1
  130. package/dist/hono/avatar-casting.d.ts +1 -0
  131. package/dist/hono/avatar-casting.d.ts.map +1 -1
  132. package/dist/hono/avatar-casting.js +18 -4
  133. package/dist/hono/avatar-casting.js.map +1 -1
  134. package/dist/hono/avatar-casting.test.js +5 -0
  135. package/dist/hono/avatar-casting.test.js.map +1 -1
  136. package/dist/hono/avatar-face-question.d.ts +23 -6
  137. package/dist/hono/avatar-face-question.d.ts.map +1 -1
  138. package/dist/hono/avatar-face-question.js +48 -59
  139. package/dist/hono/avatar-face-question.js.map +1 -1
  140. package/dist/hono/avatar-face-question.test.js +46 -101
  141. package/dist/hono/avatar-face-question.test.js.map +1 -1
  142. package/dist/hono/baker-ui-tool-schemas.test.js +30 -4
  143. package/dist/hono/baker-ui-tool-schemas.test.js.map +1 -1
  144. package/dist/hono/blocking-card.d.ts +12 -0
  145. package/dist/hono/blocking-card.d.ts.map +1 -0
  146. package/dist/hono/blocking-card.js +12 -0
  147. package/dist/hono/blocking-card.js.map +1 -0
  148. package/dist/hono/bridge-job.d.ts +78 -13
  149. package/dist/hono/bridge-job.d.ts.map +1 -1
  150. package/dist/hono/bridge-job.js +333 -103
  151. package/dist/hono/bridge-job.js.map +1 -1
  152. package/dist/hono/bridge-job.test.js +571 -190
  153. package/dist/hono/bridge-job.test.js.map +1 -1
  154. package/dist/hono/check-content.d.ts +49 -0
  155. package/dist/hono/check-content.d.ts.map +1 -0
  156. package/dist/hono/check-content.js +182 -0
  157. package/dist/hono/check-content.js.map +1 -0
  158. package/dist/hono/check-content.test.d.ts +2 -0
  159. package/dist/hono/check-content.test.d.ts.map +1 -0
  160. package/dist/hono/check-content.test.js +87 -0
  161. package/dist/hono/check-content.test.js.map +1 -0
  162. package/dist/hono/connection-input.d.ts +177 -12
  163. package/dist/hono/connection-input.d.ts.map +1 -1
  164. package/dist/hono/connection-input.js +167 -14
  165. package/dist/hono/connection-input.js.map +1 -1
  166. package/dist/hono/connection-input.test.js +112 -10
  167. package/dist/hono/connection-input.test.js.map +1 -1
  168. package/dist/hono/convex.d.ts +8 -0
  169. package/dist/hono/convex.d.ts.map +1 -1
  170. package/dist/hono/convex.js +8 -0
  171. package/dist/hono/convex.js.map +1 -1
  172. package/dist/hono/convex.test.js +4 -1
  173. package/dist/hono/convex.test.js.map +1 -1
  174. package/dist/hono/credential-input.d.ts +39 -0
  175. package/dist/hono/credential-input.d.ts.map +1 -0
  176. package/dist/hono/credential-input.js +78 -0
  177. package/dist/hono/credential-input.js.map +1 -0
  178. package/dist/hono/credential-scrub.d.ts +42 -0
  179. package/dist/hono/credential-scrub.d.ts.map +1 -0
  180. package/dist/hono/credential-scrub.js +173 -0
  181. package/dist/hono/credential-scrub.js.map +1 -0
  182. package/dist/hono/credential-scrub.test.d.ts +2 -0
  183. package/dist/hono/credential-scrub.test.d.ts.map +1 -0
  184. package/dist/hono/credential-scrub.test.js +130 -0
  185. package/dist/hono/credential-scrub.test.js.map +1 -0
  186. package/dist/hono/env.d.ts +1 -0
  187. package/dist/hono/env.d.ts.map +1 -1
  188. package/dist/hono/env.js +2 -0
  189. package/dist/hono/env.js.map +1 -1
  190. package/dist/hono/flow-crypto.d.ts +2 -1
  191. package/dist/hono/flow-crypto.d.ts.map +1 -1
  192. package/dist/hono/flow-crypto.js +50 -26
  193. package/dist/hono/flow-crypto.js.map +1 -1
  194. package/dist/hono/flow-crypto.test.js +32 -0
  195. package/dist/hono/flow-crypto.test.js.map +1 -1
  196. package/dist/hono/flow-input-card-fields.test.d.ts +10 -0
  197. package/dist/hono/flow-input-card-fields.test.d.ts.map +1 -0
  198. package/dist/hono/flow-input-card-fields.test.js +26 -0
  199. package/dist/hono/flow-input-card-fields.test.js.map +1 -0
  200. package/dist/hono/flow-input-fields.test.js +1 -1
  201. package/dist/hono/flow-input-fields.test.js.map +1 -1
  202. package/dist/hono/flow-input.d.ts +23 -2
  203. package/dist/hono/flow-input.d.ts.map +1 -1
  204. package/dist/hono/flow-input.js +64 -14
  205. package/dist/hono/flow-input.js.map +1 -1
  206. package/dist/hono/flow-input.test.js +86 -11
  207. package/dist/hono/flow-input.test.js.map +1 -1
  208. package/dist/hono/jev.d.ts +16 -0
  209. package/dist/hono/jev.d.ts.map +1 -0
  210. package/dist/hono/jev.js +60 -0
  211. package/dist/hono/jev.js.map +1 -0
  212. package/dist/hono/jev.test.d.ts +2 -0
  213. package/dist/hono/jev.test.d.ts.map +1 -0
  214. package/dist/hono/jev.test.js +15 -0
  215. package/dist/hono/jev.test.js.map +1 -0
  216. package/dist/hono/knowledge-content.d.ts.map +1 -1
  217. package/dist/hono/knowledge-content.js +4 -2
  218. package/dist/hono/knowledge-content.js.map +1 -1
  219. package/dist/hono/knowledge-content.test.js +6 -5
  220. package/dist/hono/knowledge-content.test.js.map +1 -1
  221. package/dist/hono/mcp-servers.d.ts +8 -1
  222. package/dist/hono/mcp-servers.d.ts.map +1 -1
  223. package/dist/hono/mcp-servers.js +17 -6
  224. package/dist/hono/mcp-servers.js.map +1 -1
  225. package/dist/hono/mcp-servers.test.js +25 -0
  226. package/dist/hono/mcp-servers.test.js.map +1 -1
  227. package/dist/hono/model-capabilities.d.ts.map +1 -1
  228. package/dist/hono/model-capabilities.js +20 -9
  229. package/dist/hono/model-capabilities.js.map +1 -1
  230. package/dist/hono/model-capabilities.test.js +16 -8
  231. package/dist/hono/model-capabilities.test.js.map +1 -1
  232. package/dist/hono/oom-priority.agent.test.d.ts +2 -0
  233. package/dist/hono/oom-priority.agent.test.d.ts.map +1 -0
  234. package/dist/hono/oom-priority.agent.test.js +138 -0
  235. package/dist/hono/oom-priority.agent.test.js.map +1 -0
  236. package/dist/hono/oom-priority.d.ts +39 -0
  237. package/dist/hono/oom-priority.d.ts.map +1 -0
  238. package/dist/hono/oom-priority.js +138 -0
  239. package/dist/hono/oom-priority.js.map +1 -0
  240. package/dist/hono/oom-priority.test.d.ts +2 -0
  241. package/dist/hono/oom-priority.test.d.ts.map +1 -0
  242. package/dist/hono/oom-priority.test.js +52 -0
  243. package/dist/hono/oom-priority.test.js.map +1 -0
  244. package/dist/hono/openrouter-session.d.ts.map +1 -1
  245. package/dist/hono/openrouter-session.js +12 -1
  246. package/dist/hono/openrouter-session.js.map +1 -1
  247. package/dist/hono/openrouter-session.test.js +9 -3
  248. package/dist/hono/openrouter-session.test.js.map +1 -1
  249. package/dist/hono/prompt-context.d.ts +8 -1
  250. package/dist/hono/prompt-context.d.ts.map +1 -1
  251. package/dist/hono/prompt-context.js +45 -7
  252. package/dist/hono/prompt-context.js.map +1 -1
  253. package/dist/hono/prompt-context.test.js +32 -1
  254. package/dist/hono/prompt-context.test.js.map +1 -1
  255. package/dist/hono/publish-recovery.d.ts +1 -1
  256. package/dist/hono/publish-recovery.d.ts.map +1 -1
  257. package/dist/hono/publish-recovery.js +9 -6
  258. package/dist/hono/publish-recovery.js.map +1 -1
  259. package/dist/hono/publish-recovery.test.js +11 -2
  260. package/dist/hono/publish-recovery.test.js.map +1 -1
  261. package/dist/hono/relay.d.ts +10 -1
  262. package/dist/hono/relay.d.ts.map +1 -1
  263. package/dist/hono/relay.js +6 -0
  264. package/dist/hono/relay.js.map +1 -1
  265. package/dist/hono/sandbox-content.d.ts +2 -0
  266. package/dist/hono/sandbox-content.d.ts.map +1 -1
  267. package/dist/hono/sandbox-content.js +8 -4
  268. package/dist/hono/sandbox-content.js.map +1 -1
  269. package/dist/hono/sandbox-content.test.js +20 -1
  270. package/dist/hono/sandbox-content.test.js.map +1 -1
  271. package/dist/hono/server.d.ts.map +1 -1
  272. package/dist/hono/server.js +32 -0
  273. package/dist/hono/server.js.map +1 -1
  274. package/dist/hono/server.test.js +21 -1
  275. package/dist/hono/server.test.js.map +1 -1
  276. package/dist/hono/session-continuity.d.ts +0 -1
  277. package/dist/hono/session-continuity.d.ts.map +1 -1
  278. package/dist/hono/session-continuity.integration.test.js +10 -1
  279. package/dist/hono/session-continuity.integration.test.js.map +1 -1
  280. package/dist/hono/session-continuity.js +2 -5
  281. package/dist/hono/session-continuity.js.map +1 -1
  282. package/dist/hono/tag-fields.d.ts.map +1 -1
  283. package/dist/hono/tag-fields.js +4 -0
  284. package/dist/hono/tag-fields.js.map +1 -1
  285. package/dist/hono/tag-input.d.ts +125 -3
  286. package/dist/hono/tag-input.d.ts.map +1 -1
  287. package/dist/hono/tag-input.js +27 -17
  288. package/dist/hono/tag-input.js.map +1 -1
  289. package/dist/hono/tag-input.test.js +19 -1
  290. package/dist/hono/tag-input.test.js.map +1 -1
  291. package/dist/hono/tool-mentions.d.ts.map +1 -1
  292. package/dist/hono/tool-mentions.js +1 -0
  293. package/dist/hono/tool-mentions.js.map +1 -1
  294. package/dist/hono/tool-mentions.test.js +6 -2
  295. package/dist/hono/tool-mentions.test.js.map +1 -1
  296. package/dist/hono/types.d.ts +15 -6
  297. package/dist/hono/types.d.ts.map +1 -1
  298. package/dist/hono/workspace-script.d.ts +10 -0
  299. package/dist/hono/workspace-script.d.ts.map +1 -0
  300. package/dist/hono/workspace-script.js +19 -0
  301. package/dist/hono/workspace-script.js.map +1 -0
  302. package/dist/hono/workspace-settle.d.ts +20 -0
  303. package/dist/hono/workspace-settle.d.ts.map +1 -0
  304. package/dist/hono/workspace-settle.js +50 -0
  305. package/dist/hono/workspace-settle.js.map +1 -0
  306. package/dist/review/digest.d.ts +15 -2
  307. package/dist/review/digest.d.ts.map +1 -1
  308. package/dist/review/digest.js +90 -59
  309. package/dist/review/digest.js.map +1 -1
  310. package/dist/review/digest.test.js +94 -6
  311. package/dist/review/digest.test.js.map +1 -1
  312. package/dist/review/evidence-block.js +1 -1
  313. package/dist/review/evidence-block.js.map +1 -1
  314. package/dist/review/evidence-block.test.js +0 -10
  315. package/dist/review/evidence-block.test.js.map +1 -1
  316. package/dist/review/shell-policy.d.ts +6 -0
  317. package/dist/review/shell-policy.d.ts.map +1 -1
  318. package/dist/review/shell-policy.js +240 -72
  319. package/dist/review/shell-policy.js.map +1 -1
  320. package/dist/review/shell-policy.test.js +114 -0
  321. package/dist/review/shell-policy.test.js.map +1 -1
  322. package/package.json +10 -5
  323. package/dist/hono/latitude-telemetry.d.ts +0 -17
  324. package/dist/hono/latitude-telemetry.d.ts.map +0 -1
  325. package/dist/hono/latitude-telemetry.js +0 -52
  326. package/dist/hono/latitude-telemetry.js.map +0 -1
  327. package/dist/hono/latitude-telemetry.test.d.ts +0 -2
  328. package/dist/hono/latitude-telemetry.test.d.ts.map +0 -1
  329. package/dist/hono/latitude-telemetry.test.js +0 -18
  330. package/dist/hono/latitude-telemetry.test.js.map +0 -1
  331. package/dist/hono/main-sync.d.ts +0 -46
  332. package/dist/hono/main-sync.d.ts.map +0 -1
  333. package/dist/hono/main-sync.js +0 -422
  334. package/dist/hono/main-sync.js.map +0 -1
  335. package/dist/hono/main-sync.test.d.ts +0 -2
  336. package/dist/hono/main-sync.test.d.ts.map +0 -1
  337. package/dist/hono/main-sync.test.js +0 -288
  338. package/dist/hono/main-sync.test.js.map +0 -1
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The end-of-turn steps the scaffold's Stop hooks take, run by the bridge.
3
+ *
4
+ * Those hooks skip a Stop given while background work still runs and act on
5
+ * the turn's last Stop instead. A background task can settle without waking the
6
+ * model, and then the turn ends with no further Stop: the markdown edit lock
7
+ * stays held and a stalled background publish is never reported. So once a turn
8
+ * that ran tasks has really ended, the bridge runs the same scripts itself —
9
+ * with no background work in their input, which is now true. Each is
10
+ * idempotent, so a last Stop that did fire costs nothing extra.
11
+ *
12
+ * Not the autorender hook: it asks the model to re-render, and there is no
13
+ * model left to ask. Its marker survives to the next turn's Stop, and the
14
+ * workspace's verify refuses to publish a stale render.
15
+ *
16
+ * Source of truth: __tooling__/checks/base/markdown-format/flush-format-on-stop.mjs, and
17
+ * recover-stalled-publish.mjs through `recoverStalledPublish`.
18
+ */
19
+ export declare function settleWorkspaceAfterTasks(cwd?: string): Promise<void>;
20
+ //# sourceMappingURL=workspace-settle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-settle.d.ts","sourceRoot":"","sources":["../../src/hono/workspace-settle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAaH,wBAAsB,yBAAyB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlF"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The end-of-turn steps the scaffold's Stop hooks take, run by the bridge.
3
+ *
4
+ * Those hooks skip a Stop given while background work still runs and act on
5
+ * the turn's last Stop instead. A background task can settle without waking the
6
+ * model, and then the turn ends with no further Stop: the markdown edit lock
7
+ * stays held and a stalled background publish is never reported. So once a turn
8
+ * that ran tasks has really ended, the bridge runs the same scripts itself —
9
+ * with no background work in their input, which is now true. Each is
10
+ * idempotent, so a last Stop that did fire costs nothing extra.
11
+ *
12
+ * Not the autorender hook: it asks the model to re-render, and there is no
13
+ * model left to ask. Its marker survives to the next turn's Stop, and the
14
+ * workspace's verify refuses to publish a stale render.
15
+ *
16
+ * Source of truth: __tooling__/checks/base/markdown-format/flush-format-on-stop.mjs, and
17
+ * recover-stalled-publish.mjs through `recoverStalledPublish`.
18
+ */
19
+ import { execFile } from "node:child_process";
20
+ import { recoverStalledPublish } from "./publish-recovery.js";
21
+ import { workspaceScript } from "./workspace-script.js";
22
+ // Newest layout first; the flat one is kept for company repos not yet synced.
23
+ const FLUSH_FORMAT_SCRIPTS = [
24
+ "__tooling__/checks/base/markdown-format/flush-format-on-stop.mjs",
25
+ "__tooling__/hooks/base/flush-format-on-stop.mjs",
26
+ ];
27
+ const SCRIPT_TIMEOUT_MS = 35_000;
28
+ export async function settleWorkspaceAfterTasks(cwd = process.cwd()) {
29
+ await runStopScript(cwd, FLUSH_FORMAT_SCRIPTS);
30
+ await recoverStalledPublish(cwd);
31
+ }
32
+ async function runStopScript(cwd, candidates) {
33
+ const path = workspaceScript(cwd, candidates);
34
+ if (!path) {
35
+ return;
36
+ }
37
+ const script = path.slice(cwd.length + 1);
38
+ await new Promise((resolve) => {
39
+ const child = execFile("node", [path], { cwd, timeout: SCRIPT_TIMEOUT_MS }, (err) => {
40
+ if (err) {
41
+ console.error(`[workspace-settle] ${script} failed:`, err.message);
42
+ }
43
+ resolve();
44
+ });
45
+ child.stdin?.end(JSON.stringify({ hook_event_name: "Stop", background_tasks: [] }));
46
+ child.stdout?.resume();
47
+ child.stderr?.resume();
48
+ });
49
+ }
50
+ //# sourceMappingURL=workspace-settle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-settle.js","sourceRoot":"","sources":["../../src/hono/workspace-settle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,8EAA8E;AAC9E,MAAM,oBAAoB,GAAG;IAC3B,kEAAkE;IAClE,iDAAiD;CAClD,CAAC;AACF,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACjE,MAAM,aAAa,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAC/C,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,UAA6B;IACrE,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,CAAC,GAAiB,EAAE,EAAE;YAChG,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,CAAC,KAAK,CAAC,sBAAsB,MAAM,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACpF,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -97,7 +97,7 @@ export type ToolCall = {
97
97
  /** `baker <family> <verb>` when the call was a CLI invocation. */
98
98
  bakerVerb?: string;
99
99
  resultBytes: number;
100
- /** bytes/4, the usual rule of thumb. Labelled an estimate wherever it is shown. */
100
+ /** Text at bytes/4, images at width × height / 750. Labelled an estimate wherever it is shown. */
101
101
  resultTokens: number;
102
102
  isError: boolean;
103
103
  /** The thread the call was made in. */
@@ -206,6 +206,8 @@ export type VerbAggregate = {
206
206
  verb: string;
207
207
  calls: number;
208
208
  totalBytes: number;
209
+ /** Summed `resultTokens`: the only total that carries an image's cost. */
210
+ totalTokens: number;
209
211
  maxBytes: number;
210
212
  meanBytes: number;
211
213
  postFiltered: number;
@@ -214,13 +216,15 @@ export type ToolAggregate = {
214
216
  tool: string;
215
217
  calls: number;
216
218
  totalBytes: number;
219
+ /** Summed `resultTokens`: the only total that carries an image's cost. */
220
+ totalTokens: number;
217
221
  maxBytes: number;
218
222
  errors: number;
219
223
  };
220
224
  export type UserFacingMessage = {
221
225
  turn: number;
222
226
  text: string;
223
- /** Banned-vocabulary hits, pre-flagged. The digest points; the model judges. */
227
+ /** What is plumbing by its shape (a file path), pre-flagged. The digest points; the model judges the words. */
224
228
  plumbing: string[];
225
229
  };
226
230
  export type RequestUsage = {
@@ -237,6 +241,7 @@ export type ThreadAggregate = {
237
241
  turns: number;
238
242
  toolCalls: number;
239
243
  resultBytes: number;
244
+ resultTokens: number;
240
245
  errors: number;
241
246
  denials: number;
242
247
  /** Time inside this thread's own turns, summed — never its spanned hours. */
@@ -275,6 +280,7 @@ export type TranscriptDigest = {
275
280
  turns: number;
276
281
  toolCalls: number;
277
282
  resultBytes: number;
283
+ resultTokens: number;
278
284
  inputTokens: number;
279
285
  outputTokens: number;
280
286
  cacheReadTokens: number;
@@ -331,6 +337,13 @@ export type FailureAggregate = {
331
337
  /** The turns it happened on, so a reader can find the moments. */
332
338
  turns: number[];
333
339
  };
340
+ /**
341
+ * What in a message the marketer read is plumbing by its shape alone: a file
342
+ * path, which reads the same in any language. Vocabulary is not pre-flagged:
343
+ * the agent writes in the marketer's language, so an English word list flagged
344
+ * "the build failed" and passed "la compilación falló", and the reviewer reads
345
+ * every message against "Talking to the User" anyway.
346
+ */
334
347
  export declare function flagPlumbing(text: string): string[];
335
348
  /**
336
349
  * The guard a refusal names, when it names one.
@@ -1 +1 @@
1
- {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/review/digest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/review/digest.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@
15
15
  * it could NOT find, so missing evidence is a fact before the model starts
16
16
  * rather than a silence it fills in.
17
17
  */
18
+ import { imageSize } from "image-size";
18
19
  /** Parse a `.jsonl` body, dropping lines that are not JSON rather than failing. */
19
20
  export function parseTranscript(body) {
20
21
  const out = [];
@@ -46,15 +47,56 @@ function textOf(line) {
46
47
  .map((block) => block.text ?? "")
47
48
  .join("\n");
48
49
  }
49
- function resultBytes(value) {
50
- if (value === undefined || value === null) {
50
+ /**
51
+ * What one tool result cost the model, measured on the block it received.
52
+ *
53
+ * Never on the line's `toolUseResult`: that is the CLI's own record of the call
54
+ * and carries what the model never saw — an Edit's whole pre-edit file, a Read
55
+ * image at its original size. Text is counted in bytes (tokens ≈ bytes/4); an
56
+ * image is priced by its pixels, `width × height / 750`, the formula Anthropic
57
+ * documents, because its base64 length says nothing about what it costs.
58
+ */
59
+ function measureToolResult(content) {
60
+ if (content === undefined || content === null) {
61
+ return { bytes: 0, tokens: 0 };
62
+ }
63
+ if (typeof content === "string") {
64
+ const bytes = Buffer.byteLength(content);
65
+ return { bytes, tokens: Math.round(bytes / 4) };
66
+ }
67
+ const parts = Array.isArray(content) ? content : [content];
68
+ let bytes = 0;
69
+ let imageTokens = 0;
70
+ for (const part of parts) {
71
+ const block = part;
72
+ if (block.type === "text" && typeof block.text === "string") {
73
+ bytes += Buffer.byteLength(block.text);
74
+ }
75
+ else if (block.type === "image") {
76
+ imageTokens += imageTokensOf(block.source?.data);
77
+ }
78
+ else {
79
+ bytes += jsonBytes(part);
80
+ }
81
+ }
82
+ return { bytes, tokens: Math.round(bytes / 4) + imageTokens };
83
+ }
84
+ /** Tokens for a base64 image the model was shown, from the pixels it decodes to. */
85
+ function imageTokensOf(data) {
86
+ if (typeof data !== "string") {
51
87
  return 0;
52
88
  }
53
- if (typeof value === "string") {
54
- return Buffer.byteLength(value);
89
+ try {
90
+ const { width, height } = imageSize(Buffer.from(data, "base64"));
91
+ return Math.round((width * height) / 750);
92
+ }
93
+ catch {
94
+ return 0;
55
95
  }
96
+ }
97
+ function jsonBytes(value) {
56
98
  try {
57
- return Buffer.byteLength(JSON.stringify(value));
99
+ return Buffer.byteLength(JSON.stringify(value) ?? "");
58
100
  }
59
101
  catch {
60
102
  return 0;
@@ -161,49 +203,16 @@ function summarizeInput(tool, input) {
161
203
  return tool;
162
204
  }
163
205
  }
206
+ const PATH_LIKE = /(^|\s)(?:\.{0,2}\/)?(?:src|__tooling__|\.claude|dist|node_modules)\/[\w./-]+/;
164
207
  /**
165
- * The scaffold's "Hide the plumbing" list, as a matcher.
166
- *
167
- * Deterministic pre-flagging, never a verdict: "build" is plumbing in "the build
168
- * failed" and not in "we build the page around one offer". The digest points at
169
- * the message and the model decides, which is why this errs towards flagging.
208
+ * What in a message the marketer read is plumbing by its shape alone: a file
209
+ * path, which reads the same in any language. Vocabulary is not pre-flagged:
210
+ * the agent writes in the marketer's language, so an English word list flagged
211
+ * "the build failed" and passed "la compilación falló", and the reviewer reads
212
+ * every message against "Talking to the User" anyway.
170
213
  */
171
- const PLUMBING_TERMS = [
172
- "git",
173
- "branch",
174
- "commit",
175
- "push",
176
- "merge",
177
- "build",
178
- "test",
179
- "typecheck",
180
- "sandbox",
181
- "runtime",
182
- "repository",
183
- "repo",
184
- "astro",
185
- "tailwind",
186
- "vitest",
187
- "biome",
188
- "frontmatter",
189
- "schema",
190
- "json",
191
- "cli",
192
- "environment variable",
193
- "exit code",
194
- "stack trace",
195
- "baker",
196
- "pnpm",
197
- "npm",
198
- ];
199
- const PATH_LIKE = /(^|\s)(?:\.{0,2}\/)?(?:src|__tooling__|\.claude|dist|node_modules)\/[\w./-]+/;
200
214
  export function flagPlumbing(text) {
201
- const lower = text.toLowerCase();
202
- const hits = PLUMBING_TERMS.filter((term) => new RegExp(`\\b${term.replace(/ /g, "\\s+")}\\b`).test(lower));
203
- if (PATH_LIKE.test(text)) {
204
- hits.push("file path");
205
- }
206
- return hits;
215
+ return PATH_LIKE.test(text) ? ["file path"] : [];
207
216
  }
208
217
  const SYSTEM_REMINDER = /<system-reminder>([\s\S]*?)<\/system-reminder>/g;
209
218
  function reminderLabel(body) {
@@ -376,8 +385,9 @@ function absorbToolResults(acc, line) {
376
385
  continue;
377
386
  }
378
387
  acc.pending.delete(block.tool_use_id);
379
- call.resultBytes = resultBytes(line.toolUseResult ?? block.content);
380
- call.resultTokens = Math.round(call.resultBytes / 4);
388
+ const seen = measureToolResult(block.content);
389
+ call.resultBytes = seen.bytes;
390
+ call.resultTokens = seen.tokens;
381
391
  call.isError = block.is_error === true;
382
392
  const took = elapsed(call.requestedAt, line.timestamp);
383
393
  if (took !== undefined) {
@@ -613,7 +623,7 @@ export function buildTranscriptDigest(lines) {
613
623
  byTool: aggregateByTool(acc.toolCalls),
614
624
  byBakerVerb: aggregateByVerb(acc.toolCalls),
615
625
  repeats: findRepeats(acc.toolCalls),
616
- largestResults: [...acc.toolCalls].sort((a, b) => b.resultBytes - a.resultBytes).slice(0, 10),
626
+ largestResults: [...acc.toolCalls].sort((a, b) => b.resultTokens - a.resultTokens).slice(0, 10),
617
627
  slowest: [...acc.toolCalls]
618
628
  .filter((call) => call.durationMs !== undefined)
619
629
  .sort((a, b) => (b.durationMs ?? 0) - (a.durationMs ?? 0))
@@ -706,7 +716,7 @@ function findFlakyCalls(calls) {
706
716
  * and this is what says where in the Session to look.
707
717
  */
708
718
  function emptyThread(threadId) {
709
- return { threadId, turns: 0, toolCalls: 0, resultBytes: 0, errors: 0, denials: 0, workingMs: 0 };
719
+ return { threadId, turns: 0, toolCalls: 0, resultBytes: 0, resultTokens: 0, errors: 0, denials: 0, workingMs: 0 };
710
720
  }
711
721
  /** Milliseconds parsed off an ISO timestamp, or nothing. */
712
722
  function stampOf(value) {
@@ -742,6 +752,7 @@ function aggregateByThread(turns, calls, stamps) {
742
752
  const entry = ensureThread(build, call.threadId);
743
753
  entry.toolCalls += 1;
744
754
  entry.resultBytes += call.resultBytes;
755
+ entry.resultTokens += call.resultTokens;
745
756
  entry.errors += call.isError ? 1 : 0;
746
757
  }
747
758
  for (const [threadId, values] of stamps) {
@@ -755,14 +766,22 @@ function aggregateByThread(turns, calls, stamps) {
755
766
  function aggregateByTool(calls) {
756
767
  const map = new Map();
757
768
  for (const call of calls) {
758
- const entry = map.get(call.tool) ?? { tool: call.tool, calls: 0, totalBytes: 0, maxBytes: 0, errors: 0 };
769
+ const entry = map.get(call.tool) ?? {
770
+ tool: call.tool,
771
+ calls: 0,
772
+ totalBytes: 0,
773
+ totalTokens: 0,
774
+ maxBytes: 0,
775
+ errors: 0,
776
+ };
759
777
  entry.calls += 1;
760
778
  entry.totalBytes += call.resultBytes;
779
+ entry.totalTokens += call.resultTokens;
761
780
  entry.maxBytes = Math.max(entry.maxBytes, call.resultBytes);
762
781
  entry.errors += call.isError ? 1 : 0;
763
782
  map.set(call.tool, entry);
764
783
  }
765
- return [...map.values()].sort((a, b) => b.totalBytes - a.totalBytes);
784
+ return [...map.values()].sort((a, b) => b.totalTokens - a.totalTokens);
766
785
  }
767
786
  function aggregateByVerb(calls) {
768
787
  const map = new Map();
@@ -774,12 +793,14 @@ function aggregateByVerb(calls) {
774
793
  verb: call.bakerVerb,
775
794
  calls: 0,
776
795
  totalBytes: 0,
796
+ totalTokens: 0,
777
797
  maxBytes: 0,
778
798
  meanBytes: 0,
779
799
  postFiltered: 0,
780
800
  };
781
801
  entry.calls += 1;
782
802
  entry.totalBytes += call.resultBytes;
803
+ entry.totalTokens += call.resultTokens;
783
804
  entry.maxBytes = Math.max(entry.maxBytes, call.resultBytes);
784
805
  entry.postFiltered += call.postFiltered ? 1 : 0;
785
806
  map.set(call.bakerVerb, entry);
@@ -787,7 +808,7 @@ function aggregateByVerb(calls) {
787
808
  for (const entry of map.values()) {
788
809
  entry.meanBytes = entry.calls === 0 ? 0 : Math.round(entry.totalBytes / entry.calls);
789
810
  }
790
- return [...map.values()].sort((a, b) => b.totalBytes - a.totalBytes);
811
+ return [...map.values()].sort((a, b) => b.totalTokens - a.totalTokens);
791
812
  }
792
813
  function findRepeats(calls) {
793
814
  const seen = new Map();
@@ -812,6 +833,7 @@ function computeTotals(turns, calls, requests, preambleBytes, clock) {
812
833
  turns: turns.length,
813
834
  toolCalls: calls.length,
814
835
  resultBytes: calls.reduce((sum, call) => sum + call.resultBytes, 0),
836
+ resultTokens: calls.reduce((sum, call) => sum + call.resultTokens, 0),
815
837
  inputTokens,
816
838
  outputTokens: requests.reduce((sum, request) => sum + request.outputTokens, 0),
817
839
  cacheReadTokens,
@@ -958,11 +980,12 @@ export function renderTurns(digest) {
958
980
  "",
959
981
  digest.threads.length === 0
960
982
  ? "No thread could be attributed — the transcripts carried no thread id."
961
- : table(["thread", "turns", "tool calls", "result bytes", "errors", "denials", "running"], digest.threads.map((thread) => [
983
+ : table(["thread", "turns", "tool calls", "result bytes", "~result tokens", "errors", "denials", "running"], digest.threads.map((thread) => [
962
984
  thread.threadId,
963
985
  thread.turns,
964
986
  thread.toolCalls,
965
987
  thread.resultBytes,
988
+ thread.resultTokens,
966
989
  thread.errors,
967
990
  thread.denials,
968
991
  `${Math.round(thread.workingMs / 1000)}s`,
@@ -992,17 +1015,25 @@ export function renderTools(digest) {
992
1015
  "",
993
1016
  "## Per tool",
994
1017
  "",
995
- table(["tool", "calls", "total bytes", "max bytes", "errors"], digest.byTool.map((entry) => [entry.tool, entry.calls, entry.totalBytes, entry.maxBytes, entry.errors])),
1018
+ table(["tool", "calls", "total bytes", "~total tokens", "max bytes", "errors"], digest.byTool.map((entry) => [
1019
+ entry.tool,
1020
+ entry.calls,
1021
+ entry.totalBytes,
1022
+ entry.totalTokens,
1023
+ entry.maxBytes,
1024
+ entry.errors,
1025
+ ])),
996
1026
  "",
997
1027
  "## Per `baker` verb",
998
1028
  "",
999
1029
  "`post-filtered` counts calls whose output was piped straight into jq/grep/head —",
1000
1030
  "the agent asking for a projection the command did not offer.",
1001
1031
  "",
1002
- table(["verb", "calls", "total bytes", "mean bytes", "max bytes", "post-filtered"], digest.byBakerVerb.map((entry) => [
1032
+ table(["verb", "calls", "total bytes", "~total tokens", "mean bytes", "max bytes", "post-filtered"], digest.byBakerVerb.map((entry) => [
1003
1033
  entry.verb,
1004
1034
  entry.calls,
1005
1035
  entry.totalBytes,
1036
+ entry.totalTokens,
1006
1037
  entry.meanBytes,
1007
1038
  entry.maxBytes,
1008
1039
  entry.postFiltered,
@@ -1014,7 +1045,7 @@ export function renderTools(digest) {
1014
1045
  ? "None."
1015
1046
  : table(["tool", "input", "extra calls"], digest.repeats.map((entry) => [entry.tool, entry.summary, entry.extra])),
1016
1047
  "",
1017
- "## Ten largest single results",
1048
+ "## Ten largest single results (by what the model received)",
1018
1049
  "",
1019
1050
  table(["turn", "tool", "input", "bytes", "~tokens"], digest.largestResults.map((call) => [call.turn, call.tool, call.summary, call.resultBytes, call.resultTokens])),
1020
1051
  "",
@@ -1173,10 +1204,10 @@ export function renderUserFacing(digest) {
1173
1204
  return [
1174
1205
  "# What the marketer read",
1175
1206
  "",
1176
- `${digest.userFacing.length} messages, ${flagged.length} carrying flagged vocabulary.`,
1207
+ `${digest.userFacing.length} messages, ${flagged.length} showing a file path.`,
1177
1208
  "",
1178
- "The flags below are a deterministic word match against the scaffold's",
1179
- '"Hide the plumbing" list. They point; they do not judge. "We build the page',
1209
+ "Only file paths are pre-flagged. Read every message, in whatever language it",
1210
+ 'is written, against the scaffold\'s "Talking to the User": "We build the page',
1180
1211
  'around one offer" is not a leak and "the build failed" is.',
1181
1212
  "",
1182
1213
  digest.userFacing