@koda-sl/baker-bridge 0.108.0 → 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 (320) 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 +19 -2
  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/avatar-accent.d.ts +23 -5
  119. package/dist/hono/avatar-accent.d.ts.map +1 -1
  120. package/dist/hono/avatar-accent.js +54 -63
  121. package/dist/hono/avatar-accent.js.map +1 -1
  122. package/dist/hono/avatar-accent.test.js +64 -35
  123. package/dist/hono/avatar-accent.test.js.map +1 -1
  124. package/dist/hono/avatar-casting.d.ts +1 -0
  125. package/dist/hono/avatar-casting.d.ts.map +1 -1
  126. package/dist/hono/avatar-casting.js +18 -4
  127. package/dist/hono/avatar-casting.js.map +1 -1
  128. package/dist/hono/avatar-casting.test.js +5 -0
  129. package/dist/hono/avatar-casting.test.js.map +1 -1
  130. package/dist/hono/avatar-face-question.d.ts +23 -6
  131. package/dist/hono/avatar-face-question.d.ts.map +1 -1
  132. package/dist/hono/avatar-face-question.js +48 -59
  133. package/dist/hono/avatar-face-question.js.map +1 -1
  134. package/dist/hono/avatar-face-question.test.js +46 -101
  135. package/dist/hono/avatar-face-question.test.js.map +1 -1
  136. package/dist/hono/baker-ui-tool-schemas.test.js +30 -4
  137. package/dist/hono/baker-ui-tool-schemas.test.js.map +1 -1
  138. package/dist/hono/blocking-card.d.ts +12 -0
  139. package/dist/hono/blocking-card.d.ts.map +1 -0
  140. package/dist/hono/blocking-card.js +12 -0
  141. package/dist/hono/blocking-card.js.map +1 -0
  142. package/dist/hono/bridge-job.d.ts +68 -2
  143. package/dist/hono/bridge-job.d.ts.map +1 -1
  144. package/dist/hono/bridge-job.js +301 -56
  145. package/dist/hono/bridge-job.js.map +1 -1
  146. package/dist/hono/bridge-job.test.js +489 -26
  147. package/dist/hono/bridge-job.test.js.map +1 -1
  148. package/dist/hono/check-content.d.ts +49 -0
  149. package/dist/hono/check-content.d.ts.map +1 -0
  150. package/dist/hono/check-content.js +182 -0
  151. package/dist/hono/check-content.js.map +1 -0
  152. package/dist/hono/check-content.test.d.ts +2 -0
  153. package/dist/hono/check-content.test.d.ts.map +1 -0
  154. package/dist/hono/check-content.test.js +87 -0
  155. package/dist/hono/check-content.test.js.map +1 -0
  156. package/dist/hono/connection-input.d.ts +170 -12
  157. package/dist/hono/connection-input.d.ts.map +1 -1
  158. package/dist/hono/connection-input.js +166 -14
  159. package/dist/hono/connection-input.js.map +1 -1
  160. package/dist/hono/connection-input.test.js +112 -9
  161. package/dist/hono/connection-input.test.js.map +1 -1
  162. package/dist/hono/convex.d.ts +8 -0
  163. package/dist/hono/convex.d.ts.map +1 -1
  164. package/dist/hono/convex.js +8 -0
  165. package/dist/hono/convex.js.map +1 -1
  166. package/dist/hono/convex.test.js +4 -1
  167. package/dist/hono/convex.test.js.map +1 -1
  168. package/dist/hono/credential-input.d.ts +39 -0
  169. package/dist/hono/credential-input.d.ts.map +1 -0
  170. package/dist/hono/credential-input.js +78 -0
  171. package/dist/hono/credential-input.js.map +1 -0
  172. package/dist/hono/credential-scrub.d.ts +42 -0
  173. package/dist/hono/credential-scrub.d.ts.map +1 -0
  174. package/dist/hono/credential-scrub.js +173 -0
  175. package/dist/hono/credential-scrub.js.map +1 -0
  176. package/dist/hono/credential-scrub.test.d.ts +2 -0
  177. package/dist/hono/credential-scrub.test.d.ts.map +1 -0
  178. package/dist/hono/credential-scrub.test.js +130 -0
  179. package/dist/hono/credential-scrub.test.js.map +1 -0
  180. package/dist/hono/env.d.ts +1 -0
  181. package/dist/hono/env.d.ts.map +1 -1
  182. package/dist/hono/env.js +2 -0
  183. package/dist/hono/env.js.map +1 -1
  184. package/dist/hono/flow-crypto.d.ts +2 -1
  185. package/dist/hono/flow-crypto.d.ts.map +1 -1
  186. package/dist/hono/flow-crypto.js +50 -26
  187. package/dist/hono/flow-crypto.js.map +1 -1
  188. package/dist/hono/flow-crypto.test.js +32 -0
  189. package/dist/hono/flow-crypto.test.js.map +1 -1
  190. package/dist/hono/flow-input-card-fields.test.d.ts +10 -0
  191. package/dist/hono/flow-input-card-fields.test.d.ts.map +1 -0
  192. package/dist/hono/flow-input-card-fields.test.js +26 -0
  193. package/dist/hono/flow-input-card-fields.test.js.map +1 -0
  194. package/dist/hono/flow-input-fields.test.js +1 -1
  195. package/dist/hono/flow-input-fields.test.js.map +1 -1
  196. package/dist/hono/flow-input.d.ts +23 -2
  197. package/dist/hono/flow-input.d.ts.map +1 -1
  198. package/dist/hono/flow-input.js +63 -14
  199. package/dist/hono/flow-input.js.map +1 -1
  200. package/dist/hono/flow-input.test.js +67 -11
  201. package/dist/hono/flow-input.test.js.map +1 -1
  202. package/dist/hono/jev.d.ts +16 -0
  203. package/dist/hono/jev.d.ts.map +1 -0
  204. package/dist/hono/jev.js +60 -0
  205. package/dist/hono/jev.js.map +1 -0
  206. package/dist/hono/jev.test.d.ts +2 -0
  207. package/dist/hono/jev.test.d.ts.map +1 -0
  208. package/dist/hono/jev.test.js +15 -0
  209. package/dist/hono/jev.test.js.map +1 -0
  210. package/dist/hono/knowledge-content.d.ts.map +1 -1
  211. package/dist/hono/knowledge-content.js +4 -2
  212. package/dist/hono/knowledge-content.js.map +1 -1
  213. package/dist/hono/knowledge-content.test.js +6 -5
  214. package/dist/hono/knowledge-content.test.js.map +1 -1
  215. package/dist/hono/mcp-servers.d.ts +8 -1
  216. package/dist/hono/mcp-servers.d.ts.map +1 -1
  217. package/dist/hono/mcp-servers.js +17 -6
  218. package/dist/hono/mcp-servers.js.map +1 -1
  219. package/dist/hono/mcp-servers.test.js +25 -0
  220. package/dist/hono/mcp-servers.test.js.map +1 -1
  221. package/dist/hono/model-capabilities.d.ts.map +1 -1
  222. package/dist/hono/model-capabilities.js +20 -9
  223. package/dist/hono/model-capabilities.js.map +1 -1
  224. package/dist/hono/model-capabilities.test.js +16 -8
  225. package/dist/hono/model-capabilities.test.js.map +1 -1
  226. package/dist/hono/oom-priority.agent.test.d.ts +2 -0
  227. package/dist/hono/oom-priority.agent.test.d.ts.map +1 -0
  228. package/dist/hono/oom-priority.agent.test.js +138 -0
  229. package/dist/hono/oom-priority.agent.test.js.map +1 -0
  230. package/dist/hono/oom-priority.d.ts +39 -0
  231. package/dist/hono/oom-priority.d.ts.map +1 -0
  232. package/dist/hono/oom-priority.js +138 -0
  233. package/dist/hono/oom-priority.js.map +1 -0
  234. package/dist/hono/oom-priority.test.d.ts +2 -0
  235. package/dist/hono/oom-priority.test.d.ts.map +1 -0
  236. package/dist/hono/oom-priority.test.js +52 -0
  237. package/dist/hono/oom-priority.test.js.map +1 -0
  238. package/dist/hono/openrouter-session.d.ts.map +1 -1
  239. package/dist/hono/openrouter-session.js +12 -1
  240. package/dist/hono/openrouter-session.js.map +1 -1
  241. package/dist/hono/openrouter-session.test.js +9 -3
  242. package/dist/hono/openrouter-session.test.js.map +1 -1
  243. package/dist/hono/prompt-context.d.ts +8 -1
  244. package/dist/hono/prompt-context.d.ts.map +1 -1
  245. package/dist/hono/prompt-context.js +45 -7
  246. package/dist/hono/prompt-context.js.map +1 -1
  247. package/dist/hono/prompt-context.test.js +32 -1
  248. package/dist/hono/prompt-context.test.js.map +1 -1
  249. package/dist/hono/publish-recovery.d.ts +1 -1
  250. package/dist/hono/publish-recovery.d.ts.map +1 -1
  251. package/dist/hono/publish-recovery.js +9 -6
  252. package/dist/hono/publish-recovery.js.map +1 -1
  253. package/dist/hono/publish-recovery.test.js +11 -2
  254. package/dist/hono/publish-recovery.test.js.map +1 -1
  255. package/dist/hono/relay.d.ts +10 -1
  256. package/dist/hono/relay.d.ts.map +1 -1
  257. package/dist/hono/relay.js +6 -0
  258. package/dist/hono/relay.js.map +1 -1
  259. package/dist/hono/sandbox-content.d.ts +2 -0
  260. package/dist/hono/sandbox-content.d.ts.map +1 -1
  261. package/dist/hono/sandbox-content.js +8 -4
  262. package/dist/hono/sandbox-content.js.map +1 -1
  263. package/dist/hono/sandbox-content.test.js +20 -1
  264. package/dist/hono/sandbox-content.test.js.map +1 -1
  265. package/dist/hono/server.d.ts.map +1 -1
  266. package/dist/hono/server.js +32 -0
  267. package/dist/hono/server.js.map +1 -1
  268. package/dist/hono/server.test.js +21 -1
  269. package/dist/hono/server.test.js.map +1 -1
  270. package/dist/hono/session-continuity.integration.test.js +10 -1
  271. package/dist/hono/session-continuity.integration.test.js.map +1 -1
  272. package/dist/hono/tag-fields.d.ts.map +1 -1
  273. package/dist/hono/tag-fields.js +2 -0
  274. package/dist/hono/tag-fields.js.map +1 -1
  275. package/dist/hono/tag-input.d.ts +124 -3
  276. package/dist/hono/tag-input.d.ts.map +1 -1
  277. package/dist/hono/tag-input.js +27 -17
  278. package/dist/hono/tag-input.js.map +1 -1
  279. package/dist/hono/tag-input.test.js +19 -1
  280. package/dist/hono/tag-input.test.js.map +1 -1
  281. package/dist/hono/tool-mentions.d.ts.map +1 -1
  282. package/dist/hono/tool-mentions.js +1 -0
  283. package/dist/hono/tool-mentions.js.map +1 -1
  284. package/dist/hono/tool-mentions.test.js +5 -0
  285. package/dist/hono/tool-mentions.test.js.map +1 -1
  286. package/dist/hono/types.d.ts +8 -0
  287. package/dist/hono/types.d.ts.map +1 -1
  288. package/dist/hono/workspace-script.d.ts +10 -0
  289. package/dist/hono/workspace-script.d.ts.map +1 -0
  290. package/dist/hono/workspace-script.js +19 -0
  291. package/dist/hono/workspace-script.js.map +1 -0
  292. package/dist/hono/workspace-settle.d.ts +20 -0
  293. package/dist/hono/workspace-settle.d.ts.map +1 -0
  294. package/dist/hono/workspace-settle.js +50 -0
  295. package/dist/hono/workspace-settle.js.map +1 -0
  296. package/dist/review/digest.d.ts +8 -1
  297. package/dist/review/digest.d.ts.map +1 -1
  298. package/dist/review/digest.js +10 -43
  299. package/dist/review/digest.js.map +1 -1
  300. package/dist/review/digest.test.js +11 -6
  301. package/dist/review/digest.test.js.map +1 -1
  302. package/dist/review/evidence-block.js +1 -1
  303. package/dist/review/evidence-block.js.map +1 -1
  304. package/dist/review/evidence-block.test.js +0 -10
  305. package/dist/review/evidence-block.test.js.map +1 -1
  306. package/dist/review/shell-policy.d.ts +6 -0
  307. package/dist/review/shell-policy.d.ts.map +1 -1
  308. package/dist/review/shell-policy.js +240 -72
  309. package/dist/review/shell-policy.js.map +1 -1
  310. package/dist/review/shell-policy.test.js +114 -0
  311. package/dist/review/shell-policy.test.js.map +1 -1
  312. package/package.json +9 -5
  313. package/dist/hono/latitude-telemetry.d.ts +0 -17
  314. package/dist/hono/latitude-telemetry.d.ts.map +0 -1
  315. package/dist/hono/latitude-telemetry.js +0 -52
  316. package/dist/hono/latitude-telemetry.js.map +0 -1
  317. package/dist/hono/latitude-telemetry.test.d.ts +0 -2
  318. package/dist/hono/latitude-telemetry.test.d.ts.map +0 -1
  319. package/dist/hono/latitude-telemetry.test.js +0 -18
  320. package/dist/hono/latitude-telemetry.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"avatar-accent.js","sourceRoot":"","sources":["../../src/hono/avatar-accent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,mFAAmF;AACnF,MAAM,eAAe,GACnB,iKAAiK,CAAC;AAEpK,sFAAsF;AACtF,MAAM,iBAAiB,GAA8D;IACnF;QACE,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,kEAAkE;QAC1E,aAAa,EAAE,oGAAoG;KACpH;IACD;QACE,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,gCAAgC;QACxC,aAAa,EAAE,2CAA2C;KAC3D;IACD,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,wBAAwB,EAAE,aAAa,EAAE,oCAAoC,EAAE;IACzG;QACE,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,kCAAkC;QAC1C,aAAa,EAAE,qEAAqE;KACrF;IACD,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,iCAAiC,EAAE;IAC/F,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,6BAA6B,EAAE,aAAa,EAAE,qCAAqC,EAAE;CACpH,CAAC;AAEF,8EAA8E;AAC9E,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,kBAAkB,CAAC;AAC1E,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,IAAI,CAAC,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACxE,MAAM,KAAK,GAAG,8CAA8C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,qBAAqB,CACnC,OAA2B,EAC3B,QAA4B;AAC5B;;;;;;;GAOG;AACH,aAAsB;IAEtB,MAAM,IAAI,GAAG,CAAC,aAAa,IAAI,EAAE,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,SAAS;QAC5C,IAAI,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnD,OAAO,CACL,sBAAsB,MAAM,6BAA6B,QAAQ,CAAC,IAAI,sCAAsC;YAC5G,8BAA8B,QAAQ,CAAC,IAAI,+DAA+D;YAC1G,4GAA4G;YAC5G,6GAA6G;YAC7G,GAAG,QAAQ,CAAC,IAAI,+DAA+D,CAChF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"avatar-accent.js","sourceRoot":"","sources":["../../src/hono/avatar-accent.ts"],"names":[],"mappings":"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"}
@@ -1,48 +1,77 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { accentContradictsUser, accentFrom } from "./avatar-accent.js";
3
- const ASK = "Crea un avatar para un anuncio de TikTok en el que vendamos la instalación de placas solares para ahorrar dinero, con aspecto europeo.";
4
- describe("accentContradictsUser", () => {
5
- it("refuses each of the three accents that shipped from this exact sentence", () => {
6
- for (const accent of [
7
- "Dutch, neutral European accent",
8
- "German, clear and authoritative",
9
- "English from UK, Southern England accent",
10
- ]) {
11
- const refusal = accentContradictsUser(`baker avatars create --name "X" --accent "${accent}"`, ASK);
12
- expect(refusal).toContain("--accent sets the LANGUAGE");
2
+ import { ACCENT_ASKED_FOR_QUESTION, ACCENT_NAMES_LANGUAGE_QUESTION, accentContradictsUser, accentFrom, } from "./avatar-accent.js";
3
+ const CREATE = (accent) => `baker avatars create --name "X" --accent "${accent}"`;
4
+ /** A company whose Knowledge `fitsWhen` never reads as written in the accent's language. */
5
+ const COMPANY = async () => "# Słoneczne Panele\n\nMontujemy panele słoneczne w Polsce.";
6
+ /**
7
+ * A judge that reads every accent as naming a language unless it mentions `noLanguage`, and
8
+ * holds it asked for only when the conversation mentions `marker`. The user never writes in it.
9
+ */
10
+ function fitsWhen(marker, noLanguage = "warm") {
11
+ return async (questions) => questions.map(({ instructions }) => {
12
+ if (instructions.question === ACCENT_NAMES_LANGUAGE_QUESTION) {
13
+ return instructions.accent?.includes(noLanguage) ? 0.02 : 0.9;
14
+ }
15
+ if (instructions.question === ACCENT_ASKED_FOR_QUESTION) {
16
+ return instructions.conversation?.includes(marker) ? 0.9 : 0.1;
13
17
  }
18
+ return 0.05;
14
19
  });
15
- it("allows the user's own language", () => {
16
- expect(accentContradictsUser('baker avatars create --name "X" --accent "Spanish from Spain, Madrid accent"', ASK)).toBeNull();
20
+ }
21
+ describe("accentContradictsUser", () => {
22
+ it("refuses an accent the judge reads as a language nobody asked for, in any language the user writes", async () => {
23
+ const refusal = await accentContradictsUser(CREATE("Swedish, neutral"), "Zrób awatara do reklamy na TikToka o panelach słonecznych, ma wyglądać skandynawsko.", undefined, fitsWhen("po szwedzku"), COMPANY);
24
+ expect(refusal).toContain("--accent sets the LANGUAGE");
25
+ expect(refusal).toContain("the market the ad is for");
17
26
  });
18
- it("allows a foreign language the user actually asked for", () => {
19
- // A Spanish speaker selling into the UK is a real case and must not be blocked.
20
- expect(accentContradictsUser('baker avatars create --name "X" --accent "English from UK"', "Quiero un anuncio para el mercado de UK, en inglés, sobre placas solares")).toBeNull();
27
+ it("lets the command through when the company's Knowledge cannot be read, rather than refuse on a guess", async () => {
28
+ const refusal = await accentContradictsUser(CREATE("Swedish, neutral"), "Zrób awatara do reklamy na TikToka o panelach słonecznych.", undefined, fitsWhen("po szwedzku"), async () => undefined);
29
+ expect(refusal).toBeNull();
21
30
  });
22
- it("stays out of the way when the user is not writing Spanish", () => {
23
- expect(accentContradictsUser('baker avatars create --name "X" --accent "German"', "Create an avatar for a TikTok ad about solar panels")).toBeNull();
31
+ it("allows the language the company's own Knowledge is written in, when the conversation is in another", async () => {
32
+ // An agency member writing in English for a Spanish-market client: the ad is for the
33
+ // client's market, so its presenter speaks the client's language.
34
+ const companyWritesIt = async (questions) => questions.map(({ instructions }) => {
35
+ if (instructions.question === ACCENT_NAMES_LANGUAGE_QUESTION)
36
+ return 0.9;
37
+ return instructions.company?.includes("Clínica dental en Valencia") ? 0.95 : 0.05;
38
+ });
39
+ const refusal = await accentContradictsUser(CREATE("Spanish from Spain"), "UGC ad for our summer promo", undefined, companyWritesIt, async () => "# Sonrisa\n\nClínica dental en Valencia con tres sedes.");
40
+ expect(refusal).toBeNull();
24
41
  });
25
- it("ignores commands that are not creating an avatar", () => {
26
- expect(accentContradictsUser("grep -rn -- --accent docs/", ASK)).toBeNull();
27
- expect(accentContradictsUser(undefined, ASK)).toBeNull();
42
+ it("allows an accent the judge reads as asked for", async () => {
43
+ const refusal = await accentContradictsUser(CREATE("German, standard"), "Reklama jest na rynek niemiecki, awatar ma mówić po niemiecku.", undefined, fitsWhen("po niemiecku"), COMPANY);
44
+ expect(refusal).toBeNull();
28
45
  });
29
- it("reads the accent however it was quoted", () => {
30
- expect(accentFrom('baker avatars create --accent "German, firm"')).toBe("German, firm");
31
- expect(accentFrom("baker avatars update marta --accent='British English'")).toBe("British English");
46
+ it("reads what the user said in an earlier turn on the same footing as this one", async () => {
47
+ // A user who settles the market in one turn and writes the next in Spanish had their
48
+ // own decision refused, with nothing they could type short of repeating it every time.
49
+ const refusal = await accentContradictsUser(CREATE("English from UK, Southern England accent"), "Crea el avatar y empieza con el primer clip.", "La campaña es para UK y el anuncio va en inglés.", fitsWhen("para UK"), COMPANY);
50
+ expect(refusal).toBeNull();
32
51
  });
33
- });
34
- describe("what the user said in an earlier turn", () => {
35
- it("accepts a foreign accent the conversation already established", () => {
36
- // The gate reads the turn in front of it. A user who settles the market in one turn —
37
- // "the campaign is for the UK, in English" — and then writes the next one in Spanish
38
- // got their own decision refused, with nothing they could type to get past it short of
39
- // repeating themselves in every message.
40
- const refusal = accentContradictsUser('baker avatars create --name "X" --accent "English from UK, Southern England accent"', "Crea el avatar y empieza con el primer clip.", "La campaña es para UK y el anuncio va en inglés.");
52
+ it("allows the language the user writes in, which nobody has to ask for", async () => {
53
+ const writesIt = async (questions) => questions.map(({ instructions }) => (instructions.question === ACCENT_ASKED_FOR_QUESTION ? 0.1 : 0.95));
54
+ const refusal = await accentContradictsUser(CREATE("Polish, Warsaw"), "Zrób awatara do reklamy.", undefined, writesIt, COMPANY);
41
55
  expect(refusal).toBeNull();
42
56
  });
43
- it("still refuses when nothing in the conversation asked for it", () => {
44
- const refusal = accentContradictsUser('baker avatars create --name "X" --accent "English from UK, Southern England accent"', "Crea el avatar y empieza con el primer clip.", "Quiero un anuncio de placas solares para el mercado local.");
45
- expect(refusal).toContain("--accent sets the LANGUAGE");
57
+ it("lets an accent that names no language through: it cannot contradict anything", async () => {
58
+ const refusal = await accentContradictsUser(CREATE("warm and friendly"), "Crea un avatar para la clínica dental.", undefined, fitsWhen("nothing asked"), COMPANY);
59
+ expect(refusal).toBeNull();
60
+ });
61
+ it("lets the command through when the judge cannot answer, rather than refuse on a guess", async () => {
62
+ expect(await accentContradictsUser(CREATE("German"), "Hazme un avatar", undefined, async () => null, COMPANY)).toBeNull();
63
+ });
64
+ it("ignores commands that set no accent, without asking the judge", async () => {
65
+ const unreachable = () => Promise.reject(new Error("the judge should not be asked"));
66
+ expect(await accentContradictsUser("grep -rn -- --accent docs/", "Hazme un avatar", undefined, unreachable)).toBeNull();
67
+ expect(await accentContradictsUser('baker avatars create --name "X"', "Hazme un avatar", undefined, unreachable)).toBeNull();
68
+ expect(await accentContradictsUser(undefined, "Hazme un avatar", undefined, unreachable)).toBeNull();
69
+ });
70
+ });
71
+ describe("accentFrom", () => {
72
+ it("reads the accent however it was quoted", () => {
73
+ expect(accentFrom('baker avatars create --accent "German, firm"')).toBe("German, firm");
74
+ expect(accentFrom("baker avatars update marta --accent='British English'")).toBe("British English");
46
75
  });
47
76
  });
48
77
  //# sourceMappingURL=avatar-accent.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"avatar-accent.test.js","sourceRoot":"","sources":["../../src/hono/avatar-accent.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,GAAG,GACP,wIAAwI,CAAC;AAE3I,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,KAAK,MAAM,MAAM,IAAI;YACnB,gCAAgC;YAChC,iCAAiC;YACjC,0CAA0C;SAC3C,EAAE,CAAC;YACF,MAAM,OAAO,GAAG,qBAAqB,CAAC,6CAA6C,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;YACnG,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CACJ,qBAAqB,CAAC,8EAA8E,EAAE,GAAG,CAAC,CAC3G,CAAC,QAAQ,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,gFAAgF;QAChF,MAAM,CACJ,qBAAqB,CACnB,4DAA4D,EAC5D,0EAA0E,CAC3E,CACF,CAAC,QAAQ,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CACJ,qBAAqB,CACnB,mDAAmD,EACnD,qDAAqD,CACtD,CACF,CAAC,QAAQ,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,qBAAqB,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5E,MAAM,CAAC,qBAAqB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,UAAU,CAAC,8CAA8C,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxF,MAAM,CAAC,UAAU,CAAC,uDAAuD,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,sFAAsF;QACtF,qFAAqF;QACrF,uFAAuF;QACvF,yCAAyC;QACzC,MAAM,OAAO,GAAG,qBAAqB,CACnC,qFAAqF,EACrF,8CAA8C,EAC9C,kDAAkD,CACnD,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,OAAO,GAAG,qBAAqB,CACnC,qFAAqF,EACrF,8CAA8C,EAC9C,4DAA4D,CAC7D,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"avatar-accent.test.js","sourceRoot":"","sources":["../../src/hono/avatar-accent.test.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ export declare const avatarCastingResultSchema: z.ZodDiscriminatedUnion<[z.ZodOb
8
8
  status: z.ZodLiteral<"cast">;
9
9
  avatarHandle: z.ZodString;
10
10
  imageId: z.ZodString;
11
+ chosenBy: z.ZodOptional<z.ZodLiteral<"auto">>;
11
12
  }, z.core.$strip>, z.ZodObject<{
12
13
  status: z.ZodLiteral<"declined">;
13
14
  avatarHandle: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"avatar-casting.d.ts","sourceRoot":"","sources":["../../src/hono/avatar-casting.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,wBAAwB,0CAA0C,CAAC;AAEhF,eAAO,MAAM,sBAAsB;IACjC,YAAY;IAMZ,UAAU;CAKX,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;6BAGpC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,sFAAsF;AACtF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAGnF;AAED,MAAM,MAAM,oBAAoB,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,0GAA0G;AAC1G,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAU3F;AAUD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAgBjE;AAED,wBAAgB,uBAAuB;;;GAUtC"}
1
+ {"version":3,"file":"avatar-casting.d.ts","sourceRoot":"","sources":["../../src/hono/avatar-casting.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,wBAAwB,0CAA0C,CAAC;AAEhF,eAAO,MAAM,sBAAsB;IACjC,YAAY;IAMZ,UAAU;CAKX,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;;6BASpC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,sFAAsF;AACtF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAGnF;AAED,MAAM,MAAM,oBAAoB,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,0GAA0G;AAC1G,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAU3F;AAUD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAuBjE;AAED,wBAAgB,uBAAuB;;;GAYtC"}
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import { tool } from "@anthropic-ai/claude-agent-sdk";
13
13
  import { z } from "zod";
14
+ import { answeredInTheCard } from "./blocking-card.js";
14
15
  export const AVATAR_CASTING_TOOL_NAME = "mcp__baker_ui__request_avatar_casting";
15
16
  export const avatarCastingToolShape = {
16
17
  avatarHandle: z
@@ -26,7 +27,13 @@ export const avatarCastingToolShape = {
26
27
  .describe("Internal — injected by the bridge after the user picks. Never set this yourself."),
27
28
  };
28
29
  export const avatarCastingResultSchema = z.discriminatedUnion("status", [
29
- z.object({ status: z.literal("cast"), avatarHandle: z.string(), imageId: z.string() }),
30
+ z.object({
31
+ status: z.literal("cast"),
32
+ avatarHandle: z.string(),
33
+ imageId: z.string(),
34
+ // "auto" when nobody picked within the countdown and the first face was kept.
35
+ chosenBy: z.literal("auto").optional(),
36
+ }),
30
37
  z.object({ status: z.literal("declined"), avatarHandle: z.string(), reason: z.string().optional() }),
31
38
  ]);
32
39
  /** Parse-at-boundary for the resolution posted to `POST /avatar-casting-decision`. */
@@ -47,7 +54,7 @@ export function normalizeAvatarCastingToolInput(input) {
47
54
  return handle ? { avatarHandle: handle } : null;
48
55
  }
49
56
  const AVATAR_CASTING_TOOL_DESCRIPTION = [
50
- "Let the user choose the avatar's face. Renders a few casting portraits from the description you wrote, shows them in the dashboard, and builds the identity sheet from the one they pick. BLOCKS until they choose.",
57
+ "Let the user choose the avatar's face. Renders a few casting portraits from the description you wrote, shows them in the dashboard, and builds the identity sheet from the one they pick. BLOCKS until they choose — or, if they have not picked within 30 seconds of the faces appearing, until the first face is kept for them.",
51
58
  "For an avatar invented from a description (`--face ask`, the default), the picker opens by itself right after `baker avatars create` — don't call this for a fresh avatar. Call it to ask again after the user declined every portrait and you sharpened the description with `baker avatars update`.",
52
59
  "Never sleep or poll for the avatar to be `ready`: calling this while it is still building is correct.",
53
60
  "Not for an avatar built from photographs of a real person: that face already exists and there is nothing to choose between.",
@@ -71,6 +78,13 @@ const AVATAR_CASTING_TOOL_DESCRIPTION = [
71
78
  export function avatarCastingToolText(resolution) {
72
79
  const payload = JSON.stringify(resolution);
73
80
  const parsed = avatarCastingResultSchema.safeParse(resolution);
81
+ if (parsed.success && parsed.data.status === "cast" && parsed.data.chosenBy === "auto") {
82
+ return [
83
+ payload,
84
+ "",
85
+ `Nobody picked a face for @${parsed.data.avatarHandle} within 30 seconds, so the first one was kept and their reference sheet is building from it. Carry on with the work — never say the user chose this face, and mention once that they can ask for a different one.`,
86
+ ].join("\n");
87
+ }
74
88
  if (!parsed.success || parsed.data.status !== "declined") {
75
89
  return payload;
76
90
  }
@@ -85,9 +99,9 @@ export function avatarCastingToolText(resolution) {
85
99
  ].join("\n");
86
100
  }
87
101
  export function createAvatarCastingTool() {
88
- return tool("request_avatar_casting", AVATAR_CASTING_TOOL_DESCRIPTION, avatarCastingToolShape, (args) => {
102
+ return answeredInTheCard(tool("request_avatar_casting", AVATAR_CASTING_TOOL_DESCRIPTION, avatarCastingToolShape, (args) => {
89
103
  const resolution = args.resolution ?? { status: "declined" };
90
104
  return Promise.resolve({ content: [{ type: "text", text: avatarCastingToolText(resolution) }] });
91
- });
105
+ }));
92
106
  }
93
107
  //# sourceMappingURL=avatar-casting.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"avatar-casting.js","sourceRoot":"","sources":["../../src/hono/avatar-casting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,wBAAwB,GAAG,uCAAuC,CAAC;AAEhF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,8FAA8F,CAAC;IAC3G,4EAA4E;IAC5E,kEAAkE;IAClE,UAAU,EAAE,CAAC;SACV,MAAM,CAAC,EAAE,CAAC;SACV,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACrB,QAAQ,EAAE;SACV,QAAQ,CAAC,kFAAkF,CAAC;CAChG,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE;IACtE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACtF,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;CACrG,CAAC,CAAC;AAGH,sFAAsF;AACtF,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAID,0GAA0G;AAC1G,MAAM,UAAU,+BAA+B,CAAC,KAAc;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,KAAmC,CAAC;IAChD,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACvE,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,+BAA+B,GAAG;IACtC,qNAAqN;IACrN,uSAAuS;IACvS,uGAAuG;IACvG,6HAA6H;IAC7H,0KAA0K;CAC3K,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAmB;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACzD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7C,OAAO;QACL,OAAO;QACP,EAAE;QACF,oDAAoD,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;QACjG,8IAA8I;QAC9I,yDAAyD,YAAY,oHAAoH;QACzL,yGAAyG;KAC1G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,CACT,wBAAwB,EACxB,+BAA+B,EAC/B,sBAAsB,EACtB,CAAC,IAAI,EAA+D,EAAE;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC7D,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"avatar-casting.js","sourceRoot":"","sources":["../../src/hono/avatar-casting.ts"],"names":[],"mappings":"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"}
@@ -20,5 +20,10 @@ describe("avatarCastingToolText", () => {
20
20
  const text = avatarCastingToolText({ status: "cast", avatarHandle: "marcos", imageId: "img_1" });
21
21
  expect(text).toBe(JSON.stringify({ status: "cast", avatarHandle: "marcos", imageId: "img_1" }));
22
22
  });
23
+ it("tells the agent a face the countdown kept was nobody's choice", () => {
24
+ const text = avatarCastingToolText({ status: "cast", avatarHandle: "marcos", imageId: "img_1", chosenBy: "auto" });
25
+ expect(text).toContain("Nobody picked");
26
+ expect(text).toContain("never say the user chose");
27
+ });
23
28
  });
24
29
  //# sourceMappingURL=avatar-casting.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"avatar-casting.test.js","sourceRoot":"","sources":["../../src/hono/avatar-casting.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,IAAI,GAAG,qBAAqB,CAAC;YACjC,MAAM,EAAE,UAAU;YAClB,YAAY,EAAE,QAAQ;YACtB,MAAM,EAAE,2BAA2B;SACpC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEjG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"avatar-casting.test.js","sourceRoot":"","sources":["../../src/hono/avatar-casting.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,IAAI,GAAG,qBAAqB,CAAC;YACjC,MAAM,EAAE,UAAU;YAClB,YAAY,EAAE,QAAQ;YACtB,MAAM,EAAE,2BAA2B;SACpC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEjG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAEnH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -11,15 +11,32 @@
11
11
  * before asking anyway — three times, in both casting modes. A rule that survives being
12
12
  * read needs a gate, and `routeToolUse` is the one path every question travels.
13
13
  *
14
- * Its own module so it can be tested as the pure function it is, without the bridge's
15
- * environment having to exist.
14
+ * Read by Jev, so a face asked for in any language or wording is caught, with no list of
15
+ * face words to fall out of date. Its own module, with the judge as a parameter, so it can be
16
+ * tested without the network or the bridge's environment.
16
17
  */
18
+ import type { Judge } from "./jev.ts";
19
+ /**
20
+ * The two questions Jev answers about each question the agent asks, as the user would read
21
+ * it: is it a face pick, and is it about a page. A presenter section on a landing is a photo
22
+ * the user already has, which the casting picker cannot offer, and asked in one question it
23
+ * read as a face pick (0.81). Kept word for word in step with the scaffold's
24
+ * guard-avatar-face-question hook, the same rule one layer in. Re-run
25
+ * `scripts/avatar-guard-evals` after changing either.
26
+ */
27
+ export declare const FACE_PICK_QUESTION: string;
28
+ export declare const ON_A_PAGE_QUESTION = "Does `asked` mention a website, a landing page or a section of a web page?";
29
+ /** At or above, a face pick; below, not about a page. Measured in `scripts/avatar-guard-evals`. */
30
+ export declare const FACE_PICK_HELD = 0.5;
31
+ export declare const ON_A_PAGE_HELD = 0.5;
17
32
  /** What the agent is told when this is refused — names both ways out. */
18
33
  export declare const FACE_QUESTION_MESSAGE: string;
34
+ /** One question as the user would read it: header, question, then each option. Pure. */
35
+ export declare function questionText(question: unknown): string;
19
36
  /**
20
- * Deliberately narrow, because a wrong refusal costs the user a real question: it fires
21
- * only when the text is about a face AND about an avatar or a casting. An avatar's
22
- * accent, its wardrobe, whether to use one at all — all still askable.
37
+ * Whether any question asks the user to pick a face. Each question is put to the judge as
38
+ * two Nouls, all in one request. A wrong refusal costs the user a real question, so a judge that
39
+ * cannot answer lets every question through.
23
40
  */
24
- export declare function asksForAvatarFace(input: Record<string, unknown> | undefined): boolean;
41
+ export declare function asksForAvatarFace(input: Record<string, unknown> | undefined, judge: Judge): Promise<boolean>;
25
42
  //# sourceMappingURL=avatar-face-question.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"avatar-face-question.d.ts","sourceRoot":"","sources":["../../src/hono/avatar-face-question.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAwCH,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,QAK4B,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO,CAqBrF"}
1
+ {"version":3,"file":"avatar-face-question.d.ts","sourceRoot":"","sources":["../../src/hono/avatar-face-question.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,QAKpB,CAAC;AACZ,eAAO,MAAM,kBAAkB,+EAA+E,CAAC;AAC/G,mGAAmG;AACnG,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,QAK4B,CAAC;AAE/D,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAWtD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAalH"}
@@ -11,78 +11,67 @@
11
11
  * before asking anyway — three times, in both casting modes. A rule that survives being
12
12
  * read needs a gate, and `routeToolUse` is the one path every question travels.
13
13
  *
14
- * Its own module so it can be tested as the pure function it is, without the bridge's
15
- * environment having to exist.
14
+ * Read by Jev, so a face asked for in any language or wording is caught, with no list of
15
+ * face words to fall out of date. Its own module, with the judge as a parameter, so it can be
16
+ * tested without the network or the bridge's environment.
16
17
  */
17
- /** A face, in the languages the product is used in. `typeface` must not match. */
18
- const FACE_WORD = /(?<!type)\b(faces?|rostros?|caras?|retratos?|portraits?)\b/i;
19
18
  /**
20
- * `face` the VERB, which describes what the avatar does rather than whose it is.
21
- * "Should Marta face the camera or look away?" is a direction, not a casting call.
19
+ * The two questions Jev answers about each question the agent asks, as the user would read
20
+ * it: is it a face pick, and is it about a page. A presenter section on a landing is a photo
21
+ * the user already has, which the casting picker cannot offer, and asked in one question it
22
+ * read as a face pick (0.81). Kept word for word in step with the scaffold's
23
+ * guard-avatar-face-question hook, the same rule one layer in. Re-run
24
+ * `scripts/avatar-guard-evals` after changing either.
22
25
  */
23
- const FACE_VERB = /\bfaces?\s+(?:the\s+|el\s+|la\s+|a\s+la\s+)?(?:camera|c[áa]mara|lens|viewer|audience|forward|away|left|right|towards?|hacia)\b/gi;
24
- /**
25
- * What makes a face an avatar's face rather than anything else.
26
- *
27
- * Two tiers, because they are not equally certain. `avatar` and `casting` name the
28
- * thing the picker exists for and nothing else. `presenter`/`presentadora` names a
29
- * ROLE, and a client's landing page has one of those too — a real person, in a photo
30
- * they already own, that `request_avatar_casting` cannot offer and cannot replace.
31
- */
32
- const CASTING_WORD = /\b(avatars?|casting)\b/i;
33
- const ROLE_WORD = /\b(presentador[ao]s?|presenters?)\b/i;
34
- /**
35
- * An asset the user ALREADY has, which is never a face waiting to be cast. Only
36
- * consulted for the weak `ROLE_WORD` tier: under an explicit avatar or casting
37
- * header the picker is still the answer however the question is worded.
38
- */
39
- const EXISTING_ASSET_WORD = /\b(landings?|p[áa]ginas?|pages?|secci[óo]n|seccion|sections?|hero|fotos?|photos?|im[áa]genes|imagen|images?)\b/i;
40
- /**
41
- * "Portrait" the ORIENTATION, which is not a face at all.
42
- *
43
- * An aspect ratio beside it, or a sibling that names a frame shape, says the question
44
- * is about the shape of the frame. Under an "Avatar" header that question read as a
45
- * face picker and was refused — and a wrong refusal costs the user a real question
46
- * this tool is exactly right for. `vertical` is in the list because it is the
47
- * commonest phrasing of it and the only one Spanish uses; without it the exemption
48
- * only ever fired on a question that happened to offer landscape as the alternative.
49
- */
50
- const ORIENTATION_WORD = /\b(\d{1,2}:\d{1,2}|landscape|square|horizontal|vertical|apaisado|cuadrado|aspect ratio|relaci[óo]n de aspecto)\b/i;
26
+ export const FACE_PICK_QUESTION = "`asked` is a question an AI assistant puts to a marketer while making a video ad with a generated presenter " +
27
+ "(an avatar), shown as text with options. Does it ask the marketer to pick which person the presenter is, by " +
28
+ "their face, age, hair or general appearance? Not when it asks about the video format or orientation, where " +
29
+ "the presenter looks or how they move, their accent, language, voice or clothes, or whether to use a presenter " +
30
+ "at all.";
31
+ export const ON_A_PAGE_QUESTION = "Does `asked` mention a website, a landing page or a section of a web page?";
32
+ /** At or above, a face pick; below, not about a page. Measured in `scripts/avatar-guard-evals`. */
33
+ export const FACE_PICK_HELD = 0.5;
34
+ export const ON_A_PAGE_HELD = 0.5;
51
35
  /** What the agent is told when this is refused — names both ways out. */
52
36
  export const FACE_QUESTION_MESSAGE = "Blocked: this tool renders text, so it cannot show a face — the user would be choosing between descriptions of " +
53
37
  "people they cannot see. If they should choose, invoke the request_avatar_casting TOOL instead — as a tool call with " +
54
38
  "avatarHandle, never as a shell command — it renders " +
55
39
  "the real portraits and blocks until they pick. If nobody is there to ask, create the avatar with --face auto, ask " +
56
40
  "nothing, and do not describe the resulting face as chosen.";
41
+ /** One question as the user would read it: header, question, then each option. Pure. */
42
+ export function questionText(question) {
43
+ if (typeof question !== "object" || question === null)
44
+ return "";
45
+ const { header, question: asked, options } = question;
46
+ const lines = [[header, asked].filter((part) => typeof part === "string" && part.trim()).join(" — ")];
47
+ for (const option of Array.isArray(options) ? options : []) {
48
+ if (typeof option !== "object" || option === null)
49
+ continue;
50
+ const { label, description } = option;
51
+ const parts = [label, description].filter((part) => typeof part === "string" && part.trim());
52
+ if (parts.length > 0)
53
+ lines.push(`- ${parts.join(": ")}`);
54
+ }
55
+ return lines.join("\n").trim();
56
+ }
57
57
  /**
58
- * Deliberately narrow, because a wrong refusal costs the user a real question: it fires
59
- * only when the text is about a face AND about an avatar or a casting. An avatar's
60
- * accent, its wardrobe, whether to use one at all — all still askable.
58
+ * Whether any question asks the user to pick a face. Each question is put to the judge as
59
+ * two Nouls, all in one request. A wrong refusal costs the user a real question, so a judge that
60
+ * cannot answer lets every question through.
61
61
  */
62
- export function asksForAvatarFace(input) {
62
+ export async function asksForAvatarFace(input, judge) {
63
63
  const questions = input?.questions;
64
64
  if (!Array.isArray(questions))
65
65
  return false;
66
- return questions.some((question) => {
67
- const q = question;
68
- const options = Array.isArray(q.options)
69
- ? q.options
70
- .map((option) => {
71
- const o = option;
72
- return `${String(o?.label ?? "")} ${String(o?.description ?? "")}`;
73
- })
74
- .join(" ")
75
- : "";
76
- // The verb is dropped before anything else looks for a face, so a question that
77
- // only ever used `face` that way has no face in it at all.
78
- const text = `${String(q.header ?? "")} ${String(q.question ?? "")} ${options}`.replace(FACE_VERB, " ");
79
- if (ORIENTATION_WORD.test(text) && !/(faces?|rostros?|caras?)\b/i.test(text))
80
- return false;
81
- if (!FACE_WORD.test(text))
82
- return false;
83
- if (CASTING_WORD.test(text))
84
- return true;
85
- return ROLE_WORD.test(text) && !EXISTING_ASSET_WORD.test(text);
86
- });
66
+ const asked = questions.map(questionText).filter(Boolean);
67
+ if (asked.length === 0)
68
+ return false;
69
+ const answers = await judge(asked.flatMap((text) => [
70
+ { instructions: { asked: text, question: FACE_PICK_QUESTION } },
71
+ { instructions: { asked: text, question: ON_A_PAGE_QUESTION } },
72
+ ]));
73
+ if (!answers)
74
+ return false;
75
+ return asked.some((_, i) => (answers[2 * i] ?? 0) >= FACE_PICK_HELD && (answers[2 * i + 1] ?? 1) < ON_A_PAGE_HELD);
87
76
  }
88
77
  //# sourceMappingURL=avatar-face-question.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"avatar-face-question.js","sourceRoot":"","sources":["../../src/hono/avatar-face-question.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,kFAAkF;AAClF,MAAM,SAAS,GAAG,6DAA6D,CAAC;AAChF;;;GAGG;AACH,MAAM,SAAS,GACb,kIAAkI,CAAC;AACrI;;;;;;;GAOG;AACH,MAAM,YAAY,GAAG,yBAAyB,CAAC;AAC/C,MAAM,SAAS,GAAG,sCAAsC,CAAC;AACzD;;;;GAIG;AACH,MAAM,mBAAmB,GACvB,iHAAiH,CAAC;AACpH;;;;;;;;;GASG;AACH,MAAM,gBAAgB,GACpB,mHAAmH,CAAC;AAEtH,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAChC,iHAAiH;IACjH,sHAAsH;IACtH,sDAAsD;IACtD,oHAAoH;IACpH,4DAA4D,CAAC;AAE/D;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAA0C;IAC1E,MAAM,SAAS,GAAG,KAAK,EAAE,SAAS,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QACjC,MAAM,CAAC,GAAG,QAAuE,CAAC;QAClF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YACtC,CAAC,CAAC,CAAC,CAAC,OAAO;iBACN,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACd,MAAM,CAAC,GAAG,MAAoD,CAAC;gBAC/D,OAAO,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC;YACrE,CAAC,CAAC;iBACD,IAAI,CAAC,GAAG,CAAC;YACd,CAAC,CAAC,EAAE,CAAC;QACP,gFAAgF;QAChF,2DAA2D;QAC3D,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACxG,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3F,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"avatar-face-question.js","sourceRoot":"","sources":["../../src/hono/avatar-face-question.ts"],"names":[],"mappings":"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"}