@koda-sl/baker-bridge 0.108.0-dev.fe3d33fa3 → 0.109.0-dev.3bafd569e

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 (321) hide show
  1. package/README.md +107 -51
  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 -4
  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 -3
  149. package/dist/hono/bridge-job.d.ts.map +1 -1
  150. package/dist/hono/bridge-job.js +322 -61
  151. package/dist/hono/bridge-job.js.map +1 -1
  152. package/dist/hono/bridge-job.test.js +551 -26
  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 +163 -12
  163. package/dist/hono/connection-input.d.ts.map +1 -1
  164. package/dist/hono/connection-input.js +162 -12
  165. package/dist/hono/connection-input.js.map +1 -1
  166. package/dist/hono/connection-input.test.js +112 -9
  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 +63 -14
  205. package/dist/hono/flow-input.js.map +1 -1
  206. package/dist/hono/flow-input.test.js +67 -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.integration.test.js +10 -1
  277. package/dist/hono/session-continuity.integration.test.js.map +1 -1
  278. package/dist/hono/tag-fields.d.ts.map +1 -1
  279. package/dist/hono/tag-fields.js +2 -0
  280. package/dist/hono/tag-fields.js.map +1 -1
  281. package/dist/hono/tag-input.d.ts +124 -3
  282. package/dist/hono/tag-input.d.ts.map +1 -1
  283. package/dist/hono/tag-input.js +27 -17
  284. package/dist/hono/tag-input.js.map +1 -1
  285. package/dist/hono/tag-input.test.js +19 -1
  286. package/dist/hono/tag-input.test.js.map +1 -1
  287. package/dist/hono/types.d.ts +15 -0
  288. package/dist/hono/types.d.ts.map +1 -1
  289. package/dist/hono/workspace-script.d.ts +10 -0
  290. package/dist/hono/workspace-script.d.ts.map +1 -0
  291. package/dist/hono/workspace-script.js +19 -0
  292. package/dist/hono/workspace-script.js.map +1 -0
  293. package/dist/hono/workspace-settle.d.ts +20 -0
  294. package/dist/hono/workspace-settle.d.ts.map +1 -0
  295. package/dist/hono/workspace-settle.js +50 -0
  296. package/dist/hono/workspace-settle.js.map +1 -0
  297. package/dist/review/digest.d.ts +15 -2
  298. package/dist/review/digest.d.ts.map +1 -1
  299. package/dist/review/digest.js +90 -59
  300. package/dist/review/digest.js.map +1 -1
  301. package/dist/review/digest.test.js +94 -6
  302. package/dist/review/digest.test.js.map +1 -1
  303. package/dist/review/evidence-block.js +1 -1
  304. package/dist/review/evidence-block.js.map +1 -1
  305. package/dist/review/evidence-block.test.js +0 -10
  306. package/dist/review/evidence-block.test.js.map +1 -1
  307. package/dist/review/shell-policy.d.ts +6 -0
  308. package/dist/review/shell-policy.d.ts.map +1 -1
  309. package/dist/review/shell-policy.js +240 -72
  310. package/dist/review/shell-policy.js.map +1 -1
  311. package/dist/review/shell-policy.test.js +114 -0
  312. package/dist/review/shell-policy.test.js.map +1 -1
  313. package/package.json +10 -5
  314. package/dist/hono/latitude-telemetry.d.ts +0 -17
  315. package/dist/hono/latitude-telemetry.d.ts.map +0 -1
  316. package/dist/hono/latitude-telemetry.js +0 -52
  317. package/dist/hono/latitude-telemetry.js.map +0 -1
  318. package/dist/hono/latitude-telemetry.test.d.ts +0 -2
  319. package/dist/hono/latitude-telemetry.test.d.ts.map +0 -1
  320. package/dist/hono/latitude-telemetry.test.js +0 -18
  321. package/dist/hono/latitude-telemetry.test.js.map +0 -1
@@ -84,6 +84,82 @@ describe("reviewBashPolicy", () => {
84
84
  expect(decision.allowed === false && decision.reason).toContain("read-only");
85
85
  });
86
86
  });
87
+ describe("quoted arguments, which are data rather than shell", () => {
88
+ it("allows a jq program or a grep pattern whose own `|` sits inside quotes", () => {
89
+ // The brief prescribes the jq projection to read a transcript without its
90
+ // thinking blocks; a `|` inside quotes is jq's or grep's, not the shell's.
91
+ for (const command of [
92
+ `jq -c 'del(.message.content[]?.thinking) | select(.type=="assistant")' ~/.claude/projects/p/s.jsonl`,
93
+ "grep -n -i 'inspiration\\|scrape' src/content/brief.md",
94
+ `grep -E "experiment|execFile" src/lib/run.ts | head -20`,
95
+ "grep -n '[^]]*' src/pages/index.astro",
96
+ ]) {
97
+ expect(allows(command), command).toBe(true);
98
+ }
99
+ });
100
+ it("still starts a new command at a pipe, `;` or newline outside quotes", () => {
101
+ for (const command of ["cat f | sh", "ls; git push", "jq '.a | .b' f | xargs rm", "grep 'a;b' f\ngit push"]) {
102
+ expect(allows(command), command).toBe(false);
103
+ }
104
+ });
105
+ it("reads a quoted `>` as the argument's own, and an unquoted one as a write", () => {
106
+ expect(allows(`jq -c 'select(.costUsd > 1)' s.jsonl`)).toBe(true);
107
+ expect(allows("grep -n '=> ' src/lib/a.ts 2>/dev/null")).toBe(true);
108
+ expect(allows("grep -rn foo src 2>errors.txt")).toBe(false);
109
+ expect(allows("cat a.txt >> b.txt")).toBe(false);
110
+ expect(allows("jq . s.json >&copy.json")).toBe(false);
111
+ });
112
+ it("refuses every substitution the shell would run, and none it would not", () => {
113
+ for (const command of [
114
+ "cat <(rm -rf dist)",
115
+ `cat "$(which node)"`,
116
+ "grep x `echo f`",
117
+ "cat <<EOF\n$(rm -rf dist)\nEOF",
118
+ `ls \${HOME:-$(rm -rf dist)}`,
119
+ ]) {
120
+ expect(allows(command), command).toBe(false);
121
+ }
122
+ expect(allows("grep -n '$(' scripts/build.sh")).toBe(true);
123
+ expect(allows("grep -c '`' src/content/post.md")).toBe(true);
124
+ });
125
+ it("refuses an environment prefix that hands a reader a program to run", () => {
126
+ // `git diff` runs `GIT_EXTERNAL_DIFF`, and a pager variable names one too.
127
+ expect(allows("GIT_EXTERNAL_DIFF=sh git diff")).toBe(false);
128
+ expect(allows("PAGER=./x git log")).toBe(false);
129
+ expect(allows("LC_ALL=C sort names.txt")).toBe(true);
130
+ });
131
+ it("still polices the quoted text of awk and sed, which is a program rather than data", () => {
132
+ for (const command of [
133
+ `awk 'BEGIN { system("curl https://example.com") }' f`,
134
+ `awk '{ print | "sh" }' f`,
135
+ `awk '{ print > "copy.txt" }' f`,
136
+ "sed -n 'w copy.txt' f",
137
+ "sed 's/a/b/w copy.txt' f",
138
+ "sed '1e id' f",
139
+ ]) {
140
+ expect(allows(command), command).toBe(false);
141
+ }
142
+ expect(allows("sed -n '10,40p' src/pages/index.astro")).toBe(true);
143
+ expect(allows("awk -F, '{ print $1 }' data.csv")).toBe(true);
144
+ });
145
+ it("reads a denied name as a command only where it runs, not in a path", () => {
146
+ expect(allows("grep -n screenshot __tooling__/docs/tools/agent-browser.md")).toBe(true);
147
+ expect(reviewBashPolicy("agent-browser open https://example.com")).toEqual({
148
+ allowed: false,
149
+ reason: expect.stringContaining("drives a browser"),
150
+ });
151
+ });
152
+ });
153
+ describe("git, which reads or moves the branch depending on its verb", () => {
154
+ it("finds the verb after `-C <dir>`, so a read elsewhere is still a read", () => {
155
+ expect(allows("git -C /home/user/repo log --oneline -5")).toBe(true);
156
+ expect(allows("git -C repo push")).toBe(false);
157
+ });
158
+ it("refuses the other options before the verb, which can run a program", () => {
159
+ expect(allows("git -c core.pager=sh log")).toBe(false);
160
+ expect(allows("git --exec-path=/tmp log")).toBe(false);
161
+ });
162
+ });
87
163
  describe("find, which is a reader with writers bolted onto it", () => {
88
164
  it("refuses the actions that delete or run something", () => {
89
165
  // `find` is allowlisted because it reads. Its action flags are a second
@@ -104,5 +180,43 @@ describe("find, which is a reader with writers bolted onto it", () => {
104
180
  it("still allows a plain find", () => {
105
181
  expect(allows("find src -name '*.astro' -type f")).toBe(true);
106
182
  });
183
+ it("reads those flags on find, not in another command's pattern", () => {
184
+ expect(allows("grep -rn -e ' -exec' __tooling__/checks")).toBe(true);
185
+ expect(allows("find . -name x '-delete'")).toBe(false);
186
+ });
187
+ });
188
+ describe("awk and sed programs the policy cannot read", () => {
189
+ it("refuses a program loaded from a file, whose code it never sees", () => {
190
+ // The workspace under review is the reviewed Session's own: a script file
191
+ // its agent wrote can call `system()` or `w` with nothing here to see it.
192
+ for (const command of [
193
+ "awk -f prog.awk data.txt",
194
+ "awk --file=prog.awk data.txt",
195
+ "awk -E prog.awk",
196
+ "sed -f script.sed file.md",
197
+ "sed --file=script.sed file.md",
198
+ ]) {
199
+ expect(allows(command), command).toBe(false);
200
+ }
201
+ });
202
+ it("reads an option's value as data, not as the program", () => {
203
+ // Splitting a markdown table on `|` is the ordinary way to read one.
204
+ expect(allows("awk -F'|' '{print $2}' digest/tools.md")).toBe(true);
205
+ expect(allows("awk -F '|' -v col=2 '{print $col}' digest/tools.md")).toBe(true);
206
+ expect(allows("awk -F'|' '{print $2 | \"sh\"}' digest/tools.md")).toBe(false);
207
+ });
208
+ });
209
+ describe("readers with an output flag", () => {
210
+ it("refuses the flags that write a file without a redirect", () => {
211
+ for (const command of [
212
+ "sort -o out.txt in.txt",
213
+ "sort --output=out.txt in.txt",
214
+ "git log --output=log.txt",
215
+ "git diff --output log.txt",
216
+ ]) {
217
+ expect(allows(command), command).toBe(false);
218
+ }
219
+ expect(allows("sort -u in.txt")).toBe(true);
220
+ });
107
221
  });
108
222
  //# sourceMappingURL=shell-policy.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell-policy.test.js","sourceRoot":"","sources":["../../src/review/shell-policy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,SAAS,MAAM,CAAC,OAAe;IAC7B,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;AAC3C,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,KAAK,MAAM,OAAO,IAAI;YACpB,uCAAuC;YACvC,qEAAqE;YACrE,iDAAiD;YACjD,2BAA2B;YAC3B,qCAAqC;YACrC,kCAAkC;YAClC,kCAAkC;YAClC,0DAA0D;YAC1D,wBAAwB;YACxB,mCAAmC;SACpC,EAAE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,4EAA4E;QAC5E,4DAA4D;QAC5D,KAAK,MAAM,OAAO,IAAI;YACpB,aAAa;YACb,qBAAqB;YACrB,+BAA+B;YAC/B,mCAAmC;YACnC,4BAA4B;YAC5B,sBAAsB;YACtB,mBAAmB;YACnB,UAAU;SACX,EAAE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,KAAK,MAAM,OAAO,IAAI;YACpB,gCAAgC;YAChC,mBAAmB;YACnB,eAAe;YACf,gBAAgB;YAChB,sBAAsB;SACvB,EAAE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,KAAK,MAAM,OAAO,IAAI;YACpB,2BAA2B;YAC3B,iBAAiB;YACjB,0BAA0B;YAC1B,cAAc;SACf,EAAE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,4EAA4E;QAC5E,4EAA4E;QAC5E,qEAAqE;QACrE,MAAM,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAK,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;IACnE,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,wEAAwE;QACxE,4EAA4E;QAC5E,uEAAuE;QACvE,iCAAiC;QACjC,KAAK,MAAM,OAAO,IAAI;YACpB,8BAA8B;YAC9B,gCAAgC;YAChC,oCAAoC;YACpC,4BAA4B;YAC5B,+BAA+B;YAC/B,0BAA0B;SAC3B,EAAE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"shell-policy.test.js","sourceRoot":"","sources":["../../src/review/shell-policy.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "@koda-sl/baker-bridge",
3
- "version": "0.108.0-dev.fe3d33fa3",
3
+ "version": "0.109.0-dev.3bafd569e",
4
4
  "description": "HTTP server wrapping the Claude Agent SDK. Persists chat events to Convex; the dashboard subscribes via Convex realtime",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
8
- "baker-bridge": "dist/cli.js"
8
+ "baker-bridge": "dist/cli.js",
9
+ "baker-credential-broker": "dist/broker/main.js",
10
+ "baker-credential-broker-supervisor": "dist/broker/supervisor-main.js"
9
11
  },
10
12
  "exports": {
11
13
  "./hono": {
@@ -39,19 +41,22 @@
39
41
  "unlink:local": "bash scripts/unlink-local.sh"
40
42
  },
41
43
  "dependencies": {
42
- "@anthropic-ai/claude-agent-sdk": "^0.3.280",
44
+ "@anthropic-ai/claude-agent-sdk": "^0.3.295",
43
45
  "@hono/node-server": "^1.19.14",
44
- "@latitude-data/claude-code-telemetry": "0.0.15",
45
46
  "@t3-oss/env-core": "^0.13.10",
46
47
  "hono": "^4.12.25",
48
+ "image-size": "^2.0.2",
49
+ "mockttp": "4.6.3",
50
+ "unbash": "4.0.11",
47
51
  "zod": "^4.3.6"
48
52
  },
49
53
  "devDependencies": {
50
54
  "@types/node": "25.3.0",
51
55
  "tsx": "^4.0.0",
52
56
  "typescript": "^7.0.2",
57
+ "undici": "7.29.0",
53
58
  "vite": "7.3.2",
54
- "vitest": "^4.1.8"
59
+ "vitest": "^5.0.3"
55
60
  },
56
61
  "repository": {
57
62
  "type": "git",
@@ -1,17 +0,0 @@
1
- import type { Settings } from "@anthropic-ai/claude-agent-sdk";
2
- type LatitudeHook = {
3
- readonly node: string;
4
- readonly entry: string;
5
- };
6
- type LatitudeHooks = NonNullable<Settings["hooks"]>;
7
- /**
8
- * `Stop` reports each turn without delaying it; `SessionEnd` is synchronous
9
- * because it is the one that still fires when the CLI exits right after a turn,
10
- * which is how the bridge closes a query. The hook's own offset lock keeps the
11
- * two from reporting a turn twice.
12
- */
13
- export declare function latitudeTelemetryFor(env: Record<string, string | undefined>, hook: LatitudeHook | undefined): LatitudeHooks | undefined;
14
- /** Where the installed hook lives; undefined turns tracing off rather than failing the turn. */
15
- export declare function installedLatitudeHook(): LatitudeHook | undefined;
16
- export {};
17
- //# sourceMappingURL=latitude-telemetry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"latitude-telemetry.d.ts","sourceRoot":"","sources":["../../src/hono/latitude-telemetry.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAE/D,KAAK,YAAY,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,KAAK,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAEpD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,IAAI,EAAE,YAAY,GAAG,SAAS,GAC7B,aAAa,GAAG,SAAS,CAS3B;AAED,gGAAgG;AAChG,wBAAgB,qBAAqB,IAAI,YAAY,GAAG,SAAS,CAOhE"}
@@ -1,52 +0,0 @@
1
- /**
2
- * Latitude tracing of the agent, one trace per turn, for every company.
3
- *
4
- * Latitude's Claude Code hook reads the turn's transcript when the turn ends and
5
- * uploads it as OTLP spans: the prompt, every model call with its tokens, every
6
- * tool call with its result, subagents and auto-memory. The bridge registers it
7
- * through the per-query `settings` tier rather than the scaffold's
8
- * `.claude/settings.json`, so no client repo carries it and it is on exactly
9
- * when the backend handed the sandbox a key and project (`latitudeTelemetryEnvs`).
10
- *
11
- * Every company lands in one Latitude project; the hook stamps each trace with
12
- * the workspace's git repo (the company) and branch (the chat), which is how
13
- * they are told apart there. The session id is left to the hook: it hashes it
14
- * with a turn count that restarts for every Claude session, so pinning it to a
15
- * thread — which starts a fresh Claude session after a stall or an invalid
16
- * resume — would reuse the trace ids of that thread's first turns.
17
- *
18
- * The hook is a pinned dependency run with the bridge's own node, never
19
- * `npx …@latest`: that would fetch unpinned code into every sandbox on every
20
- * turn. Its optional `BUN_OPTIONS` preload (full system prompt and tool
21
- * definitions) is deliberately not wired — if that file is ever missing, the
22
- * CLI refuses to start, which would take every turn down with it.
23
- */
24
- import { createRequire } from "node:module";
25
- import { dirname, join } from "node:path";
26
- /**
27
- * `Stop` reports each turn without delaying it; `SessionEnd` is synchronous
28
- * because it is the one that still fires when the CLI exits right after a turn,
29
- * which is how the bridge closes a query. The hook's own offset lock keeps the
30
- * two from reporting a turn twice.
31
- */
32
- export function latitudeTelemetryFor(env, hook) {
33
- if (!env.LATITUDE_API_KEY || !env.LATITUDE_PROJECT || !hook) {
34
- return undefined;
35
- }
36
- const command = `"${hook.node}" "${hook.entry}"`;
37
- return {
38
- Stop: [{ hooks: [{ type: "command", command, async: true }] }],
39
- SessionEnd: [{ hooks: [{ type: "command", command, timeout: 10 }] }],
40
- };
41
- }
42
- /** Where the installed hook lives; undefined turns tracing off rather than failing the turn. */
43
- export function installedLatitudeHook() {
44
- try {
45
- const main = createRequire(import.meta.url).resolve("@latitude-data/claude-code-telemetry");
46
- return { node: process.execPath, entry: join(dirname(main), "entry.js") };
47
- }
48
- catch {
49
- return undefined;
50
- }
51
- }
52
- //# sourceMappingURL=latitude-telemetry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"latitude-telemetry.js","sourceRoot":"","sources":["../../src/hono/latitude-telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAO1C;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAuC,EACvC,IAA8B;IAE9B,IAAI,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC;IACjD,OAAO;QACL,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;KACrE,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;QAC5F,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=latitude-telemetry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"latitude-telemetry.test.d.ts","sourceRoot":"","sources":["../../src/hono/latitude-telemetry.test.ts"],"names":[],"mappings":""}
@@ -1,18 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { latitudeTelemetryFor } from "./latitude-telemetry.js";
3
- const HOOK = { node: "/usr/bin/node", entry: "/app/node_modules/@latitude-data/claude-code-telemetry/dist/entry.js" };
4
- describe("latitudeTelemetryFor", () => {
5
- it("is off when the sandbox was not given a Latitude key and project", () => {
6
- expect(latitudeTelemetryFor({}, HOOK)).toBeUndefined();
7
- expect(latitudeTelemetryFor({ LATITUDE_API_KEY: "k" }, HOOK)).toBeUndefined();
8
- expect(latitudeTelemetryFor({ LATITUDE_PROJECT: "p" }, HOOK)).toBeUndefined();
9
- });
10
- it("runs the pinned hook at the end of every turn and at session end", () => {
11
- const command = `"/usr/bin/node" "${HOOK.entry}"`;
12
- expect(latitudeTelemetryFor({ LATITUDE_API_KEY: "k", LATITUDE_PROJECT: "p" }, HOOK)).toEqual({
13
- Stop: [{ hooks: [{ type: "command", command, async: true }] }],
14
- SessionEnd: [{ hooks: [{ type: "command", command, timeout: 10 }] }],
15
- });
16
- });
17
- });
18
- //# sourceMappingURL=latitude-telemetry.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"latitude-telemetry.test.js","sourceRoot":"","sources":["../../src/hono/latitude-telemetry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,sEAAsE,EAAE,CAAC;AAEtH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACvD,MAAM,CAAC,oBAAoB,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC9E,MAAM,CAAC,oBAAoB,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,OAAO,GAAG,oBAAoB,IAAI,CAAC,KAAK,GAAG,CAAC;QAClD,MAAM,CAAC,oBAAoB,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3F,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9D,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;SACrE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}