thursday-agent 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +3 -2
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.json +8 -1
  6. package/.next/routes-manifest.json +18 -6
  7. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +13 -13
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/server/app/api/artifact/route.js +10 -6
  21. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  22. package/.next/server/app/api/bot/memory/files/route.js +6 -5
  23. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
  24. package/.next/server/app/api/bot/memory/route.js +8 -8
  25. package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
  26. package/.next/server/app/api/bot/route.js +8 -8
  27. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  28. package/.next/server/app/api/bot/thread/[id]/route/app-paths-manifest.json +3 -0
  29. package/.next/server/app/api/bot/thread/[id]/route.js +15 -0
  30. package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -0
  31. package/.next/server/app/api/bot/thread/[id]/route_client-reference-manifest.js +3 -0
  32. package/.next/server/app/api/bot/thread/route/app-paths-manifest.json +3 -0
  33. package/.next/server/app/api/bot/thread/route.js +15 -0
  34. package/.next/server/app/api/bot/thread/route.js.nft.json +1 -0
  35. package/.next/server/app/api/bot/thread/route_client-reference-manifest.js +3 -0
  36. package/.next/server/app/api/config/route.js +7 -7
  37. package/.next/server/app/api/config/route.js.nft.json +1 -1
  38. package/.next/server/app/api/events/route.js +3 -3
  39. package/.next/server/app/api/events/route.js.nft.json +1 -1
  40. package/.next/server/app/api/file/[...path]/route.js +5 -5
  41. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  42. package/.next/server/app/api/llm-model/catalog/route.js +8 -8
  43. package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
  44. package/.next/server/app/api/llm-model/credits/route.js +8 -8
  45. package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
  46. package/.next/server/app/api/llm-model/route.js +8 -8
  47. package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
  48. package/.next/server/app/api/llm-model/subscription/route.js +8 -8
  49. package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
  50. package/.next/server/app/api/mcp/[name]/route.js +6 -6
  51. package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/mcp/oauth/callback/route.js +4 -4
  53. package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
  54. package/.next/server/app/api/mcp/route.js +6 -6
  55. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  56. package/.next/server/app/api/mcp/tools/route.js +6 -6
  57. package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
  58. package/.next/server/app/api/memory/edit/route.js +13 -13
  59. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
  60. package/.next/server/app/api/memory/route.js +7 -6
  61. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  62. package/.next/server/app/api/skills/[source]/[name]/route.js +6 -6
  63. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/skills/route.js +6 -6
  65. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  66. package/.next/server/app/api/thursday/call/route.js +10 -11
  67. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  68. package/.next/server/app/api/thursday/skills/route.js +10 -11
  69. package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
  70. package/.next/server/app/api/thursday/tool-call/route.js +15 -15
  71. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  72. package/.next/server/app/api/workspace/missing/route/app-paths-manifest.json +3 -0
  73. package/.next/server/app/api/workspace/missing/route/build-manifest.json +12 -0
  74. package/.next/server/app/api/workspace/missing/route/server-reference-manifest.json +4 -0
  75. package/.next/server/app/api/workspace/missing/route.js +12 -0
  76. package/.next/server/app/api/workspace/missing/route.js.map +5 -0
  77. package/.next/server/app/api/workspace/missing/route.js.nft.json +1 -0
  78. package/.next/server/app/api/workspace/missing/route_client-reference-manifest.js +3 -0
  79. package/.next/server/app/api/workspace/route.js +5 -4
  80. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  81. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
  82. package/.next/server/app/artifact/[...path]/page.js +4 -3
  83. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  84. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  86. package/.next/server/app/page/server-reference-manifest.json +67 -45
  87. package/.next/server/app/page.js +10 -9
  88. package/.next/server/app/page.js.nft.json +1 -1
  89. package/.next/server/app/page_client-reference-manifest.js +1 -1
  90. package/.next/server/app-paths-manifest.json +3 -2
  91. package/.next/server/chunks/[root-of-the-server]__02846fb._.js +8 -0
  92. package/.next/server/chunks/[root-of-the-server]__049f521._.js +3 -0
  93. package/.next/server/chunks/[root-of-the-server]__05luceg._.js +3 -0
  94. package/.next/server/chunks/[root-of-the-server]__06--3q3._.js +8 -0
  95. package/.next/server/chunks/[root-of-the-server]__07bnah_._.js +3 -0
  96. package/.next/server/chunks/[root-of-the-server]__08eae20._.js +8 -0
  97. package/.next/server/chunks/[root-of-the-server]__0_ue8oe._.js +3 -0
  98. package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +5 -0
  99. package/.next/server/chunks/[root-of-the-server]__0g-ueei._.js +8 -0
  100. package/.next/server/chunks/[root-of-the-server]__0h_x6q6._.js +5 -0
  101. package/.next/server/chunks/{[root-of-the-server]__0pa2n68._.js → [root-of-the-server]__0kxrvxf._.js} +2 -2
  102. package/.next/server/chunks/{[root-of-the-server]__0q0vvt2._.js → [root-of-the-server]__0ov3iir._.js} +2 -2
  103. package/.next/server/chunks/[root-of-the-server]__0qwtlmx._.js +8 -0
  104. package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +3 -0
  105. package/.next/server/chunks/[root-of-the-server]__0ye3da2._.js +3 -0
  106. package/.next/server/chunks/[root-of-the-server]__0zp35ul._.js +5 -0
  107. package/.next/server/chunks/[root-of-the-server]__144u9d_._.js +3 -0
  108. package/.next/server/chunks/[root-of-the-server]__18-2tsq._.js +5 -0
  109. package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +3 -0
  110. package/.next/server/chunks/[root-of-the-server]__1e2365e._.js +8 -0
  111. package/.next/server/chunks/[root-of-the-server]__1fix932._.js +8 -0
  112. package/.next/server/chunks/{[root-of-the-server]__0ce8nf8._.js → [root-of-the-server]__1g3t7vn._.js} +3 -3
  113. package/.next/server/chunks/[root-of-the-server]__1kp-83u._.js +5 -0
  114. package/.next/server/chunks/[root-of-the-server]__1kv8p3e._.js +5 -0
  115. package/.next/server/chunks/[root-of-the-server]__1orn-5b._.js +2 -3
  116. package/.next/server/chunks/_02szwk8._.js +5 -0
  117. package/.next/server/chunks/_05h2cii._.js +1 -1
  118. package/.next/server/chunks/_06c9kie._.js +216 -0
  119. package/.next/server/chunks/{_1x6kd1r._.js → _07y2gj-._.js} +1 -1
  120. package/.next/server/chunks/_0a43a-0._.js +3 -0
  121. package/.next/server/chunks/_0bujjey._.js +5 -0
  122. package/.next/server/chunks/_0c9j6rb._.js +1 -1
  123. package/.next/server/chunks/_0dkd549._.js +3 -0
  124. package/.next/server/chunks/_0ej1kvv._.js +3 -0
  125. package/.next/server/chunks/_0f6ts7z._.js +3 -0
  126. package/.next/server/chunks/_0gm9hyv._.js +55 -0
  127. package/.next/server/chunks/_0i55en5._.js +25 -0
  128. package/.next/server/chunks/_0k50n27._.js +18 -0
  129. package/.next/server/chunks/_0khihjk._.js +3 -3
  130. package/.next/server/chunks/_0n74zsf._.js +5 -5
  131. package/.next/server/chunks/_0nvm9ef._.js +3 -0
  132. package/.next/server/chunks/_0p56fn0._.js +3 -0
  133. package/.next/server/chunks/_0recufk._.js +1 -1
  134. package/.next/server/chunks/_0xbkz10._.js +3 -0
  135. package/.next/server/chunks/_10tkr26._.js +3 -0
  136. package/.next/server/chunks/{_0ioz3nd._.js → _11u2kp7._.js} +1 -1
  137. package/.next/server/chunks/_11ujpya._.js +3 -0
  138. package/.next/server/chunks/_127nx_p._.js +5 -0
  139. package/.next/server/chunks/_17l5ygt._.js +1 -1
  140. package/.next/server/chunks/_19uauj6._.js +3 -0
  141. package/.next/server/chunks/_1_5mnq4._.js +5 -5
  142. package/.next/server/chunks/_1abl6t9._.js +55 -0
  143. package/.next/server/chunks/_1d0j961._.js +3 -3
  144. package/.next/server/chunks/_1dbixxz._.js +3 -0
  145. package/.next/server/chunks/_1dc_d1q._.js +98 -0
  146. package/.next/server/chunks/_1drgfx4._.js +5 -5
  147. package/.next/server/chunks/_1e48czp._.js +3 -3
  148. package/.next/server/chunks/_1f31u5x._.js +5 -0
  149. package/.next/server/chunks/_1kg70wc._.js +3 -3
  150. package/.next/server/chunks/_1klbcft._.js +5 -0
  151. package/.next/server/chunks/_1krd9rf._.js +4 -1
  152. package/.next/server/chunks/_1kwmzab._.js +3 -0
  153. package/.next/server/chunks/{_1pf4qe-._.js → _1oxj9fa._.js} +1 -1
  154. package/.next/server/chunks/{_1f46eie._.js → _1pcmdbb._.js} +1 -1
  155. package/.next/server/chunks/_1qgix-j._.js +3 -0
  156. package/.next/server/chunks/{lib_logger_ts_1exwjut._.js → _1rpchta._.js} +5 -5
  157. package/.next/server/chunks/_1vsej-s._.js +5 -0
  158. package/.next/server/chunks/_1yx0p_s._.js +5 -0
  159. package/.next/server/chunks/{_0rnf-6n._.js → _20fsr_z._.js} +6 -6
  160. package/.next/server/chunks/_2128hkj._.js +5 -0
  161. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_[id]_route_actions_1fstjn2.js +3 -0
  162. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_route_actions_003ccso.js +3 -0
  163. package/.next/server/chunks/_next-internal_server_app_api_workspace_missing_route_actions_1fidi6p.js +3 -0
  164. package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
  165. package/.next/server/chunks/features_0-cnt0l._.js +4 -0
  166. package/.next/server/chunks/features_0hdaci0._.js +4 -0
  167. package/.next/server/chunks/features_1e39j7-._.js +8 -0
  168. package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +1 -1
  169. package/.next/server/chunks/features_memory_1uqvksn._.js +1 -1
  170. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0r28-sm._.js → node_modules_consola_dist_chunks_prompt_mjs_0a7-pbw._.js} +1 -1
  171. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0v_7drq._.js → node_modules_consola_dist_chunks_prompt_mjs_0gzvgfv._.js} +1 -1
  172. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js → node_modules_consola_dist_chunks_prompt_mjs_107pxfn._.js} +1 -1
  173. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js → node_modules_consola_dist_chunks_prompt_mjs_15hbel8._.js} +1 -1
  174. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_18i-23e._.js +3 -0
  175. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1bewgf3._.js +3 -0
  176. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1kipdeo._.js +3 -0
  177. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1nlww1m._.js +3 -0
  178. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1q77nfx._.js +3 -0
  179. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xqdzx_._.js +3 -0
  180. package/.next/server/chunks/{node_modules_zod_v4_1801ax7._.js → node_modules_zod_v4_0lkux5-._.js} +2 -2
  181. package/.next/server/chunks/{node_modules_zod_v4_1cha_bw._.js → node_modules_zod_v4_1jmr9cq._.js} +2 -2
  182. package/.next/server/chunks/{node_modules_zod_v4_0ubdflj._.js → node_modules_zod_v4_1yrxmek._.js} +2 -2
  183. package/.next/server/chunks/node_modules_zod_v4_classic_errors_0tp0y-q.js +3 -0
  184. package/.next/server/chunks/ssr/[root-of-the-server]__09q9med._.js +1 -1
  185. package/.next/server/chunks/ssr/[root-of-the-server]__0bxsfyn._.js +101 -0
  186. package/.next/server/chunks/ssr/[root-of-the-server]__0lyi8i2._.js +1 -1
  187. package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
  188. package/.next/server/chunks/ssr/[root-of-the-server]__172cq4x._.js +3 -0
  189. package/.next/server/chunks/ssr/[root-of-the-server]__18dthbp._.js +3 -0
  190. package/.next/server/chunks/ssr/[root-of-the-server]__18e68w8._.js +3 -0
  191. package/.next/server/chunks/ssr/[root-of-the-server]__1fll8dc._.js +3 -0
  192. package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
  193. package/.next/server/chunks/ssr/[root-of-the-server]__1nygfik._.js +5 -0
  194. package/.next/server/chunks/ssr/[root-of-the-server]__1sdphb0._.js +8 -0
  195. package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +100 -0
  196. package/.next/server/chunks/ssr/_00rehl_._.js +3 -0
  197. package/.next/server/chunks/ssr/{_1lz_cq2._.js → _02oc_h5._.js} +76 -89
  198. package/.next/server/chunks/ssr/_03_928f._.js +3 -0
  199. package/.next/server/chunks/ssr/_05yghx6._.js +3 -0
  200. package/.next/server/chunks/ssr/_08c4z-9._.js +3 -0
  201. package/.next/server/chunks/ssr/_0_qfdlw._.js +4 -0
  202. package/.next/server/chunks/ssr/_0c9e5w6._.js +9 -0
  203. package/.next/server/chunks/ssr/{_0s99bgb._.js → _0dh2e1j._.js} +9 -3
  204. package/.next/server/chunks/ssr/_0dr-ddg._.js +3 -0
  205. package/.next/server/chunks/ssr/_0eaog6_._.js +3 -0
  206. package/.next/server/chunks/ssr/_0evkpto._.js +3 -0
  207. package/.next/server/chunks/ssr/_0g_rlog._.js +3 -0
  208. package/.next/server/chunks/ssr/_0geg212._.js +3 -0
  209. package/.next/server/chunks/ssr/{_1gd8q8l._.js → _0hxt2ul._.js} +2 -2
  210. package/.next/server/chunks/ssr/_0i_6q1w._.js +2 -2
  211. package/.next/server/chunks/ssr/_0lu1n_x._.js +1 -1
  212. package/.next/server/chunks/ssr/{_15j2_8f._.js → _0wzaht-._.js} +2 -2
  213. package/.next/server/chunks/ssr/_0z-g0uy._.js +3 -0
  214. package/.next/server/chunks/ssr/_123ttsf._.js +3 -0
  215. package/.next/server/chunks/ssr/_123y-ah._.js +3 -0
  216. package/.next/server/chunks/ssr/_12w42gi._.js +3 -0
  217. package/.next/server/chunks/ssr/_161kqav._.js +3 -0
  218. package/.next/server/chunks/ssr/{_0ap2fzn._.js → _16c6_xm._.js} +2 -2
  219. package/.next/server/chunks/ssr/_18opah7._.js +3 -0
  220. package/.next/server/chunks/ssr/_18xqmny._.js +3 -0
  221. package/.next/server/chunks/ssr/_1_krfph._.js +3 -0
  222. package/.next/server/chunks/ssr/{_1-_etts._.js → _1anqots._.js} +2 -2
  223. package/.next/server/chunks/ssr/_1ey7qn-._.js +70 -0
  224. package/.next/server/chunks/ssr/_1g9vs7q._.js +3 -0
  225. package/.next/server/chunks/ssr/_1jmz33w._.js +3 -0
  226. package/.next/server/chunks/ssr/{_0n3toaw._.js → _1k0spz7._.js} +2 -2
  227. package/.next/server/chunks/ssr/_1rgtxhr._.js +5 -0
  228. package/.next/server/chunks/ssr/_1slp25y._.js +3 -0
  229. package/.next/server/chunks/ssr/{_1fojd41._.js → _1x9pskj._.js} +3 -3
  230. package/.next/server/chunks/ssr/_1y6b5mr._.js +101 -0
  231. package/.next/server/chunks/ssr/_1ztk7p6._.js +7 -0
  232. package/.next/server/chunks/ssr/components_ui_tabs_tsx_0ej40b4._.js +3 -0
  233. package/.next/server/chunks/ssr/features_bot_thread_query_ts_023eklt._.js +4 -0
  234. package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
  235. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  236. package/.next/server/chunks/ssr/{_1-teee5._.js → lib_logger_ts_0-olsze._.js} +2 -7
  237. package/.next/server/chunks/ssr/{node_modules_0cxaxk9._.js → node_modules_00_51_v._.js} +1 -1
  238. package/.next/server/chunks/ssr/{node_modules_04jf_m8._.js → node_modules_022sipm._.js} +1 -1
  239. package/.next/server/chunks/ssr/{node_modules_0g7fzk3._.js → node_modules_0332gw4._.js} +1 -1
  240. package/.next/server/chunks/ssr/{node_modules_1cx_ql6._.js → node_modules_04vxchl._.js} +1 -1
  241. package/.next/server/chunks/ssr/{node_modules_1vh5ntv._.js → node_modules_0746rzi._.js} +1 -1
  242. package/.next/server/chunks/ssr/{node_modules_0yugy6m._.js → node_modules_0d5uzof._.js} +1 -1
  243. package/.next/server/chunks/ssr/{node_modules_09q35v_._.js → node_modules_0exkwcm._.js} +1 -1
  244. package/.next/server/chunks/ssr/{node_modules_08dhkiq._.js → node_modules_0fr-ml8._.js} +1 -1
  245. package/.next/server/chunks/ssr/{node_modules_14q6g4n._.js → node_modules_0mxvg8h._.js} +1 -1
  246. package/.next/server/chunks/ssr/{node_modules_0arus10._.js → node_modules_0qapgjr._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_1eg7m6c._.js → node_modules_0qbfyjh._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_1cz2hle._.js → node_modules_0t-9nup._.js} +1 -1
  249. package/.next/server/chunks/ssr/{node_modules_17bwo43._.js → node_modules_0tusx4d._.js} +3 -3
  250. package/.next/server/chunks/ssr/{node_modules_1efrqxi._.js → node_modules_0vsxbzp._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_0_-_a--._.js → node_modules_0vv0-fg._.js} +1 -1
  252. package/.next/server/chunks/ssr/{node_modules_1gdh31p._.js → node_modules_0wsvp00._.js} +1 -1
  253. package/.next/server/chunks/ssr/{node_modules_1hpopmo._.js → node_modules_1-urho9._.js} +1 -1
  254. package/.next/server/chunks/ssr/{node_modules_1_pc9kq._.js → node_modules_16pi_dd._.js} +1 -1
  255. package/.next/server/chunks/ssr/{node_modules_00etblx._.js → node_modules_1d53yiq._.js} +1 -1
  256. package/.next/server/chunks/ssr/{node_modules_1aaxuef._.js → node_modules_1g1eihe._.js} +1 -1
  257. package/.next/server/chunks/ssr/{node_modules_198nmll._.js → node_modules_1gpednh._.js} +1 -1
  258. package/.next/server/chunks/ssr/{node_modules_0pvd7q-._.js → node_modules_1gu1pph._.js} +1 -1
  259. package/.next/server/chunks/ssr/{node_modules_0b__sgl._.js → node_modules_1he1w8_._.js} +1 -1
  260. package/.next/server/chunks/ssr/{node_modules_1qpjvy5._.js → node_modules_1lnjapm._.js} +1 -1
  261. package/.next/server/chunks/ssr/{node_modules_0940ns5._.js → node_modules_1lynj9m._.js} +1 -1
  262. package/.next/server/chunks/ssr/{node_modules_0x3-ply._.js → node_modules_1seuurl._.js} +2 -2
  263. package/.next/server/chunks/ssr/{node_modules_14om4ar._.js → node_modules_1u6w1pb._.js} +1 -1
  264. package/.next/server/chunks/ssr/{node_modules_0had7xd._.js → node_modules_1xn6saw._.js} +1 -1
  265. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1b748ic._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_067_exa._.js} +1 -1
  266. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1z4hm5e._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0nrrdaq._.js} +1 -1
  267. package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_06mk8id._.js → node_modules_@vercel_oidc_dist_21a5haa._.js} +1 -1
  268. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_trash_mjs_0px2gzr._.js +3 -0
  269. package/.next/server/middleware-build-manifest.js +3 -3
  270. package/.next/server/pages/404.html +1 -1
  271. package/.next/server/pages/500.html +1 -1
  272. package/.next/server/server-reference-manifest.js +1 -1
  273. package/.next/server/server-reference-manifest.json +68 -46
  274. package/.next/static/chunks/0dr16v67vj4n7.js +2 -0
  275. package/.next/static/chunks/0g4b348l0pve7.js +1 -0
  276. package/.next/static/chunks/0joan-69kbspd.js +1 -0
  277. package/.next/static/chunks/0vlgzqo9ka90v.js +1 -0
  278. package/.next/static/chunks/0zrupxgci5gqc.js +1 -0
  279. package/.next/static/chunks/10k2xvap03z20.css +1 -0
  280. package/.next/static/chunks/18mkhstgiqcbt.js +1 -0
  281. package/.next/static/chunks/{15m575979un5f.js → 1i-u2wzub_to1.js} +2 -2
  282. package/.next/static/chunks/1kp5nfp06nj9h.js +5 -0
  283. package/.next/static/chunks/1ohslk4568tm3.js +1 -0
  284. package/.next/static/chunks/1sbmwswc9k2-1.js +1 -0
  285. package/.next/static/chunks/1t9qms5pwwa3n.js +1 -0
  286. package/.next/static/chunks/1vj_5bnbxx84e.js +1 -0
  287. package/.next/static/chunks/1vqezbhjm3goq.js +1 -0
  288. package/.next/static/chunks/{3akmqm77muj4-.js → 1wlo979mx-y3w.js} +1 -1
  289. package/.next/static/chunks/26ql4y-43xwhp.js +1 -0
  290. package/.next/static/chunks/{0fl3gwe4-l6tz.js → 2_pnccjp6j1ca.js} +1 -1
  291. package/.next/static/chunks/2a51-ywz9b2a3.js +1 -0
  292. package/.next/static/chunks/2fvdgxih7x7hr.js +1 -0
  293. package/.next/static/chunks/2jlz8zp4jax_m.js +18 -0
  294. package/.next/static/chunks/2nvepds1fu2ux.js +1 -0
  295. package/.next/static/chunks/3addj3i4-izma.js +1 -0
  296. package/.next/static/chunks/3bfwpww3m3x4u.js +1 -0
  297. package/.next/static/chunks/3gfh7nxwusbt0.js +1 -0
  298. package/.next/static/chunks/3gwa44cvz4qoi.js +1 -0
  299. package/.next/static/chunks/{38gweqdo4jpfj.js → 3izg0a3k87q1-.js} +5 -5
  300. package/.next/static/chunks/3zk6q3-3f9swq.js +99 -0
  301. package/.next/static/chunks/3zkg5iup3v4a2.js +12 -0
  302. package/.next/static/chunks/405m0bqtoihev.js +1 -0
  303. package/.next/static/chunks/42wcg3wfg_m_p.js +1 -0
  304. package/README.md +27 -216
  305. package/app/api/events/app-event.ts +6 -4
  306. package/app/api/query-key.ts +25 -16
  307. package/bin/database.mjs +37 -0
  308. package/bin/thursday.mjs +44 -28
  309. package/components/ui/custom-icon.tsx +0 -60
  310. package/components/ui/radio-group.tsx +37 -0
  311. package/components/ui/shiny-text.tsx +33 -6
  312. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/migration.sql +80 -24
  313. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/snapshot.json +689 -110
  314. package/database/migrations/20260916160713_thread_cancelled/migration.sql +2 -0
  315. package/database/migrations/{20260911030320_opposite_jack_power → 20260916160713_thread_cancelled}/snapshot.json +706 -84
  316. package/docs/how-it-works.md +39 -36
  317. package/docs/images/keeps-going.png +0 -0
  318. package/docs/images/two-minds.png +0 -0
  319. package/docs/live-calls.md +231 -0
  320. package/docs/thread-rooms.md +71 -0
  321. package/features/ai/chatgpt.ts +1 -2
  322. package/features/ai/live.schema.ts +128 -0
  323. package/features/ai/load-tools.ts +148 -77
  324. package/features/ai/model.schema.ts +2 -120
  325. package/features/ai/model.ts +52 -88
  326. package/features/ai/prompts/bot.prompt.ts +91 -214
  327. package/features/ai/prompts/live.prompt.ts +265 -0
  328. package/features/ai/prompts/prompt-helper.ts +91 -32
  329. package/features/ai/prompts/thursday.prompt.ts +125 -172
  330. package/features/ai/tools/bot.tool.ts +38 -145
  331. package/features/ai/tools/call.tool.ts +1 -1
  332. package/features/ai/tools/connected.ts +5 -3
  333. package/features/ai/tools/mcp.tool.ts +7 -4
  334. package/features/ai/tools/memory.tool.ts +35 -31
  335. package/features/ai/tools/skills.tool.ts +36 -14
  336. package/features/ai/tools/studio.tool.ts +26 -21
  337. package/features/ai/tools/tool-name.ts +2 -5
  338. package/features/ai/tools/workspace.tool.ts +33 -10
  339. package/features/artifact/artifact.action.ts +2 -2
  340. package/features/artifact/artifact.query.ts +112 -61
  341. package/features/artifact/artifact.schema.ts +8 -6
  342. package/features/artifact/components/artifact-setting.tsx +83 -33
  343. package/features/bot/bot.action.ts +43 -36
  344. package/features/bot/bot.memory.ts +137 -20
  345. package/features/bot/bot.query.ts +28 -11
  346. package/features/bot/bot.run.ts +299 -636
  347. package/features/bot/bot.runner.ts +468 -844
  348. package/features/bot/bot.schema.ts +93 -82
  349. package/features/bot/bot.seed.ts +141 -64
  350. package/features/bot/components/bot-mark.tsx +324 -232
  351. package/features/bot/components/bot-room.tsx +1613 -697
  352. package/features/bot/components/bot-roster.tsx +8 -13
  353. package/features/bot/components/bot-setting.tsx +58 -42
  354. package/features/bot/components/bot-tool.tsx +55 -87
  355. package/features/bot/components/mark-palette.tsx +35 -32
  356. package/features/bot/components/path-chips.tsx +33 -3
  357. package/features/bot/components/thread-badge.tsx +34 -0
  358. package/features/bot/components/thread-reply.tsx +639 -0
  359. package/features/bot/components/thread-setting.tsx +674 -0
  360. package/features/bot/mark.const.ts +79 -31
  361. package/features/bot/room.query.ts +889 -0
  362. package/features/bot/room.schema.ts +64 -0
  363. package/features/bot/seed-bots.ts +2 -1
  364. package/features/bot/thread.query.ts +971 -0
  365. package/features/bot/thread.store.ts +587 -0
  366. package/features/config/components/voice-key.tsx +113 -88
  367. package/features/config/config.const.ts +5 -9
  368. package/features/connectors/mcp.schema.ts +0 -2
  369. package/features/intro/components/intro.tsx +169 -139
  370. package/features/memory/components/memory-setting.tsx +2 -7
  371. package/features/memory/memory.schema.ts +14 -23
  372. package/features/settings/components/setting-ui.tsx +0 -44
  373. package/features/settings/components/settings.tsx +12 -12
  374. package/features/settings/settings.alert.ts +3 -3
  375. package/features/settings/settings.store.ts +1 -1
  376. package/features/skills/skills.schema.ts +0 -2
  377. package/features/thursday/components/ascii-field.tsx +24 -44
  378. package/features/thursday/components/ascii-orb.tsx +359 -358
  379. package/features/thursday/components/call-log.tsx +46 -44
  380. package/features/thursday/components/face.tsx +35 -10
  381. package/features/thursday/components/tab-state.tsx +3 -3
  382. package/features/thursday/components/thursday-mark.tsx +1 -0
  383. package/features/thursday/components/thursday-setting.tsx +631 -332
  384. package/features/thursday/components/thursday.tsx +106 -41
  385. package/features/thursday/components/voice-picker.tsx +255 -0
  386. package/features/thursday/thursday.action.ts +94 -68
  387. package/features/thursday/thursday.query.ts +49 -30
  388. package/features/thursday/thursday.schema.ts +27 -30
  389. package/features/thursday/thursday.store.ts +11 -7
  390. package/features/thursday/tool-call.ts +3 -3
  391. package/features/thursday/tool-line.ts +5 -3
  392. package/features/thursday/use-thursday.ts +725 -450
  393. package/features/workspace/workspace.query.ts +17 -0
  394. package/features/workspace/workspace.ts +103 -50
  395. package/lib/live/live.schema.ts +47 -0
  396. package/lib/live/live.server.ts +155 -0
  397. package/lib/live/live.session.ts +574 -0
  398. package/lib/{realtime/realtime.tap.ts → live/live.tap.ts} +41 -12
  399. package/lib/live/live.transport.ts +152 -0
  400. package/lib/protocol/use-server-pages.ts +9 -5
  401. package/lib/utils.ts +21 -20
  402. package/package.json +2 -2
  403. package/public/voices/alloy.ogg +0 -0
  404. package/public/voices/ash.ogg +0 -0
  405. package/public/voices/ballad.ogg +0 -0
  406. package/public/voices/beacon.ogg +0 -0
  407. package/public/voices/bossa.ogg +0 -0
  408. package/public/voices/cedar.ogg +0 -0
  409. package/public/voices/cinder.ogg +0 -0
  410. package/public/voices/coral.ogg +0 -0
  411. package/public/voices/delta.ogg +0 -0
  412. package/public/voices/echo.ogg +0 -0
  413. package/public/voices/gleam.ogg +0 -0
  414. package/public/voices/marin.ogg +0 -0
  415. package/public/voices/meridian.ogg +0 -0
  416. package/public/voices/quartz.ogg +0 -0
  417. package/public/voices/ripple.ogg +0 -0
  418. package/public/voices/sage.ogg +0 -0
  419. package/public/voices/shimmer.ogg +0 -0
  420. package/public/voices/stone.ogg +0 -0
  421. package/public/voices/tempo.ogg +0 -0
  422. package/public/voices/verse.ogg +0 -0
  423. package/public/voices/vesper.ogg +0 -0
  424. package/public/voices/willow.ogg +0 -0
  425. package/scripts/artifact-paths.test.mts +25 -0
  426. package/scripts/bot-context.test.mts +1408 -0
  427. package/scripts/live-history.test.mts +115 -0
  428. package/scripts/live-session.test.mts +948 -0
  429. package/server.js +1 -1
  430. package/skills/browser/SKILL.md +17 -6
  431. package/skills/computer/SKILL.md +1 -1
  432. package/skills/find-skills/SKILL.md +3 -8
  433. package/skills/interactive-page/SKILL.md +12 -7
  434. package/skills/interactive-page/references/diagram.md +89 -0
  435. package/skills/interactive-page/scripts/archify/LICENSE +22 -0
  436. package/skills/interactive-page/scripts/archify/README.md +25 -0
  437. package/skills/interactive-page/scripts/archify/assets/JetBrainsMono-OFL.txt +93 -0
  438. package/skills/interactive-page/scripts/archify/assets/template.html +14934 -0
  439. package/skills/interactive-page/scripts/archify/bin/archify.mjs +2126 -0
  440. package/skills/interactive-page/scripts/archify/bin/open-artifact.mjs +86 -0
  441. package/skills/interactive-page/scripts/archify/bin/preview.mjs +653 -0
  442. package/skills/interactive-page/scripts/archify/bin/visual-check.mjs +829 -0
  443. package/skills/interactive-page/scripts/archify/delta/architecture-delta.mjs +1223 -0
  444. package/skills/interactive-page/scripts/archify/examples/agent-run.lifecycle.json +60 -0
  445. package/skills/interactive-page/scripts/archify/examples/agent-tool-call.workflow.json +94 -0
  446. package/skills/interactive-page/scripts/archify/examples/async-job-roundtrip.sequence.json +61 -0
  447. package/skills/interactive-page/scripts/archify/examples/cache-miss-request.sequence.json +82 -0
  448. package/skills/interactive-page/scripts/archify/examples/checkout-platform.base.architecture.json +31 -0
  449. package/skills/interactive-page/scripts/archify/examples/checkout-platform.head.architecture.json +31 -0
  450. package/skills/interactive-page/scripts/archify/examples/deployment-release.lifecycle.json +49 -0
  451. package/skills/interactive-page/scripts/archify/examples/event-stream.dataflow.json +57 -0
  452. package/skills/interactive-page/scripts/archify/examples/incident-response.workflow.json +64 -0
  453. package/skills/interactive-page/scripts/archify/examples/product-analytics.dataflow.json +76 -0
  454. package/skills/interactive-page/scripts/archify/examples/production-deployment.architecture.json +71 -0
  455. package/skills/interactive-page/scripts/archify/examples/release-delivery.workflow.json +62 -0
  456. package/skills/interactive-page/scripts/archify/examples/web-app.architecture.json +46 -0
  457. package/skills/interactive-page/scripts/archify/migrations/workflow-v2.mjs +279 -0
  458. package/skills/interactive-page/scripts/archify/recipes/scenarios.mjs +284 -0
  459. package/skills/interactive-page/scripts/archify/references/authoring-contract.md +243 -0
  460. package/skills/interactive-page/scripts/archify/references/delivery-contract.md +120 -0
  461. package/skills/interactive-page/scripts/archify/references/viewer-runtime.md +45 -0
  462. package/skills/interactive-page/scripts/archify/renderers/architecture/grid.mjs +62 -0
  463. package/skills/interactive-page/scripts/archify/renderers/architecture/render-architecture.mjs +1078 -0
  464. package/skills/interactive-page/scripts/archify/renderers/dataflow/README.md +104 -0
  465. package/skills/interactive-page/scripts/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  466. package/skills/interactive-page/scripts/archify/renderers/lifecycle/README.md +115 -0
  467. package/skills/interactive-page/scripts/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  468. package/skills/interactive-page/scripts/archify/renderers/sequence/README.md +114 -0
  469. package/skills/interactive-page/scripts/archify/renderers/sequence/render-sequence.mjs +464 -0
  470. package/skills/interactive-page/scripts/archify/renderers/shared/brand-marks.mjs +563 -0
  471. package/skills/interactive-page/scripts/archify/renderers/shared/cli.mjs +218 -0
  472. package/skills/interactive-page/scripts/archify/renderers/shared/desktop-readability.mjs +26 -0
  473. package/skills/interactive-page/scripts/archify/renderers/shared/diagnostics.mjs +127 -0
  474. package/skills/interactive-page/scripts/archify/renderers/shared/engineering-profiles.mjs +157 -0
  475. package/skills/interactive-page/scripts/archify/renderers/shared/generated-brand-marks.mjs +3 -0
  476. package/skills/interactive-page/scripts/archify/renderers/shared/generated-validators.mjs +13 -0
  477. package/skills/interactive-page/scripts/archify/renderers/shared/geometry.mjs +1423 -0
  478. package/skills/interactive-page/scripts/archify/renderers/shared/i18n.mjs +595 -0
  479. package/skills/interactive-page/scripts/archify/renderers/shared/layout-report.mjs +40 -0
  480. package/skills/interactive-page/scripts/archify/renderers/shared/legend.mjs +217 -0
  481. package/skills/interactive-page/scripts/archify/renderers/shared/output-path.mjs +340 -0
  482. package/skills/interactive-page/scripts/archify/renderers/shared/repository-evidence.mjs +238 -0
  483. package/skills/interactive-page/scripts/archify/renderers/shared/repository-location.mjs +58 -0
  484. package/skills/interactive-page/scripts/archify/renderers/shared/text-fit.mjs +49 -0
  485. package/skills/interactive-page/scripts/archify/renderers/shared/utils.mjs +232 -0
  486. package/skills/interactive-page/scripts/archify/renderers/shared/validator.mjs +86 -0
  487. package/skills/interactive-page/scripts/archify/renderers/workflow/README.md +223 -0
  488. package/skills/interactive-page/scripts/archify/renderers/workflow/render-workflow.mjs +35 -0
  489. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  490. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  491. package/skills/interactive-page/scripts/archify/schemas/README.md +211 -0
  492. package/skills/interactive-page/scripts/archify/schemas/architecture.schema.json +178 -0
  493. package/skills/interactive-page/scripts/archify/schemas/common.schema.json +115 -0
  494. package/skills/interactive-page/scripts/archify/schemas/dataflow.schema.json +243 -0
  495. package/skills/interactive-page/scripts/archify/schemas/lifecycle.schema.json +266 -0
  496. package/skills/interactive-page/scripts/archify/schemas/sequence.schema.json +223 -0
  497. package/skills/interactive-page/scripts/archify/schemas/workflow.schema.json +428 -0
  498. package/skills/interactive-page/scripts/archify/scripts/check-render-output.mjs +916 -0
  499. package/skills/interactive-page/scripts/archify/scripts/render-examples.mjs +26 -0
  500. package/skills/interactive-page/scripts/bundle-artifact.sh +9 -8
  501. package/skills/skill-creator/SKILL.md +4 -5
  502. package/.next/server/app/api/bot/task/[id]/route/app-paths-manifest.json +0 -3
  503. package/.next/server/app/api/bot/task/[id]/route.js +0 -16
  504. package/.next/server/app/api/bot/task/[id]/route.js.nft.json +0 -1
  505. package/.next/server/app/api/bot/task/[id]/route_client-reference-manifest.js +0 -3
  506. package/.next/server/app/api/bot/task/route/app-paths-manifest.json +0 -3
  507. package/.next/server/app/api/bot/task/route.js +0 -16
  508. package/.next/server/app/api/bot/task/route.js.nft.json +0 -1
  509. package/.next/server/app/api/bot/task/route_client-reference-manifest.js +0 -3
  510. package/.next/server/chunks/[root-of-the-server]__01dkp4a._.js +0 -3
  511. package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +0 -3
  512. package/.next/server/chunks/[root-of-the-server]__02xjoto._.js +0 -3
  513. package/.next/server/chunks/[root-of-the-server]__04q--0f._.js +0 -8
  514. package/.next/server/chunks/[root-of-the-server]__0bl-e63._.js +0 -3
  515. package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +0 -3
  516. package/.next/server/chunks/[root-of-the-server]__0jq4ohy._.js +0 -8
  517. package/.next/server/chunks/[root-of-the-server]__0ls6_8y._.js +0 -8
  518. package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +0 -3
  519. package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +0 -5
  520. package/.next/server/chunks/[root-of-the-server]__11n256_._.js +0 -5
  521. package/.next/server/chunks/[root-of-the-server]__12cabg9._.js +0 -3
  522. package/.next/server/chunks/[root-of-the-server]__1339jnv._.js +0 -8
  523. package/.next/server/chunks/[root-of-the-server]__18_teo8._.js +0 -8
  524. package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +0 -5
  525. package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +0 -3
  526. package/.next/server/chunks/[root-of-the-server]__1ccon1w._.js +0 -10
  527. package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +0 -3
  528. package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +0 -3
  529. package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +0 -3
  530. package/.next/server/chunks/[root-of-the-server]__1wa1k7r._.js +0 -8
  531. package/.next/server/chunks/_0-73of8._.js +0 -55
  532. package/.next/server/chunks/_0-fjql4._.js +0 -26
  533. package/.next/server/chunks/_00xh_q0._.js +0 -25
  534. package/.next/server/chunks/_03a0897._.js +0 -3
  535. package/.next/server/chunks/_051qh8u._.js +0 -3
  536. package/.next/server/chunks/_05sovvj._.js +0 -3
  537. package/.next/server/chunks/_0fzqt2y._.js +0 -134
  538. package/.next/server/chunks/_0mecv0f._.js +0 -26
  539. package/.next/server/chunks/_0mh8j4m._.js +0 -3
  540. package/.next/server/chunks/_0obojvv._.js +0 -3
  541. package/.next/server/chunks/_0sb7tlz._.js +0 -3
  542. package/.next/server/chunks/_0sbynis._.js +0 -3
  543. package/.next/server/chunks/_0u10wmw._.js +0 -55
  544. package/.next/server/chunks/_0u4aiy2._.js +0 -3
  545. package/.next/server/chunks/_0wp4le3._.js +0 -3
  546. package/.next/server/chunks/_0y5fg-x._.js +0 -3
  547. package/.next/server/chunks/_1230wbx._.js +0 -10
  548. package/.next/server/chunks/_12nheja._.js +0 -3
  549. package/.next/server/chunks/_13510xh._.js +0 -3
  550. package/.next/server/chunks/_15hq89o._.js +0 -3
  551. package/.next/server/chunks/_18-1wcc._.js +0 -55
  552. package/.next/server/chunks/_1_9mjx-._.js +0 -3
  553. package/.next/server/chunks/_1c78vw5._.js +0 -229
  554. package/.next/server/chunks/_1h5_8sk._.js +0 -3
  555. package/.next/server/chunks/_1hdnxb7._.js +0 -3
  556. package/.next/server/chunks/_1j8k_j5._.js +0 -3
  557. package/.next/server/chunks/_1nula3v._.js +0 -3
  558. package/.next/server/chunks/_1php4eq._.js +0 -3
  559. package/.next/server/chunks/_1yuv4vp._.js +0 -3
  560. package/.next/server/chunks/_1zjrdag._.js +0 -3
  561. package/.next/server/chunks/_next-internal_server_app_api_bot_task_[id]_route_actions_1_k_8u3.js +0 -3
  562. package/.next/server/chunks/_next-internal_server_app_api_bot_task_route_actions_0xln6ra.js +0 -3
  563. package/.next/server/chunks/features_0rpfxbk._.js +0 -3
  564. package/.next/server/chunks/features_1qf3cei._.js +0 -3
  565. package/.next/server/chunks/features_bot_0zt92oh._.js +0 -3
  566. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xoq2rl._.js +0 -3
  567. package/.next/server/chunks/ssr/[externals]__0dizgek._.js +0 -3
  568. package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +0 -3
  569. package/.next/server/chunks/ssr/[root-of-the-server]__0mz33a7._.js +0 -3
  570. package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +0 -3
  571. package/.next/server/chunks/ssr/[root-of-the-server]__0s9l2sv._.js +0 -3
  572. package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +0 -3
  573. package/.next/server/chunks/ssr/[root-of-the-server]__0xsog8n._.js +0 -3
  574. package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +0 -61
  575. package/.next/server/chunks/ssr/[root-of-the-server]__1gtlw6v._.js +0 -43
  576. package/.next/server/chunks/ssr/[root-of-the-server]__1ox7hbk._.js +0 -4
  577. package/.next/server/chunks/ssr/[root-of-the-server]__202p40z._.js +0 -3
  578. package/.next/server/chunks/ssr/_001_ms1._.js +0 -28
  579. package/.next/server/chunks/ssr/_01n3o0m._.js +0 -3
  580. package/.next/server/chunks/ssr/_0fz4mf_._.js +0 -3
  581. package/.next/server/chunks/ssr/_0gb4gmf._.js +0 -3
  582. package/.next/server/chunks/ssr/_0h42fze._.js +0 -3
  583. package/.next/server/chunks/ssr/_0h7zdni._.js +0 -3
  584. package/.next/server/chunks/ssr/_0ilna52._.js +0 -42
  585. package/.next/server/chunks/ssr/_0q0zan6._.js +0 -70
  586. package/.next/server/chunks/ssr/_0zcjrbg._.js +0 -3
  587. package/.next/server/chunks/ssr/_0zhoc3r._.js +0 -3
  588. package/.next/server/chunks/ssr/_13fke0x._.js +0 -3
  589. package/.next/server/chunks/ssr/_18cymkq._.js +0 -3
  590. package/.next/server/chunks/ssr/_1b2mjwr._.js +0 -3
  591. package/.next/server/chunks/ssr/_1f-dg-6._.js +0 -3
  592. package/.next/server/chunks/ssr/_1h0rw11._.js +0 -3
  593. package/.next/server/chunks/ssr/_1jhd09t._.js +0 -3
  594. package/.next/server/chunks/ssr/_1nnsk7z._.js +0 -3
  595. package/.next/server/chunks/ssr/_1ov37if._.js +0 -3
  596. package/.next/server/chunks/ssr/_1sji22n._.js +0 -3
  597. package/.next/server/chunks/ssr/_1vi_uo7._.js +0 -3
  598. package/.next/server/chunks/ssr/_1vyd1ji._.js +0 -3
  599. package/.next/server/chunks/ssr/_1xx4zlb._.js +0 -3
  600. package/.next/server/chunks/ssr/components_ui_1y1l7yj._.js +0 -3
  601. package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +0 -3
  602. package/.next/server/chunks/ssr/lib_realtime_12wg_dd._.js +0 -27
  603. package/.next/server/chunks/ssr/lib_realtime_15h_v1v._.js +0 -27
  604. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0npjf8-._.js +0 -3
  605. package/.next/static/chunks/00rd4-v8r7axp.js +0 -1
  606. package/.next/static/chunks/08qe4as2q428z.js +0 -3
  607. package/.next/static/chunks/0gnqdjn2lvdad.js +0 -2
  608. package/.next/static/chunks/0hwap1-p0m5sa.js +0 -1
  609. package/.next/static/chunks/0r5qcctujhxli.js +0 -1
  610. package/.next/static/chunks/0w52rrrmuj9r9.js +0 -1
  611. package/.next/static/chunks/0wcprt5ot5she.js +0 -1
  612. package/.next/static/chunks/10teww7wt-f6h.js +0 -1
  613. package/.next/static/chunks/17p6tk6k88dq6.js +0 -1
  614. package/.next/static/chunks/18a96rkhi4_yd.js +0 -1
  615. package/.next/static/chunks/1dkjg87pxk0n9.js +0 -28
  616. package/.next/static/chunks/1jd09sxcjddu1.js +0 -1
  617. package/.next/static/chunks/1w73ece_6bheu.js +0 -18
  618. package/.next/static/chunks/214ya3n5gxeih.js +0 -1
  619. package/.next/static/chunks/22_zkas21rpna.js +0 -1
  620. package/.next/static/chunks/2fh4-3z_q8b_w.js +0 -1
  621. package/.next/static/chunks/2h0sd2vumhb15.js +0 -1
  622. package/.next/static/chunks/2t4vhi3m8ahya.js +0 -1
  623. package/.next/static/chunks/2tigdtz3dpcy8.js +0 -1
  624. package/.next/static/chunks/2u7xt6mxg44lf.js +0 -1
  625. package/.next/static/chunks/3786h5vayt80-.js +0 -28
  626. package/.next/static/chunks/39j0fvpybzabl.js +0 -40
  627. package/.next/static/chunks/3cq5g494yuke8.css +0 -1
  628. package/.next/static/chunks/3hibbjnt85-k6.js +0 -1
  629. package/.next/static/chunks/3woj-xd7ki5_i.js +0 -1
  630. package/.next/static/chunks/3xk7yqgomx7yq.js +0 -1
  631. package/.next/static/chunks/3zmcsnuo25zvq.js +0 -1
  632. package/database/migrations/20260911030320_opposite_jack_power/migration.sql +0 -1
  633. package/docs/images/task-thread.png +0 -0
  634. package/features/bot/components/task-badge.tsx +0 -42
  635. package/features/bot/components/task-reply.tsx +0 -328
  636. package/features/bot/components/task-setting.tsx +0 -524
  637. package/features/bot/task.query.ts +0 -976
  638. package/features/bot/task.store.ts +0 -489
  639. package/lib/realtime/client-secret.ts +0 -86
  640. package/lib/realtime/open-session.ts +0 -31
  641. package/lib/realtime/openai.ts +0 -35
  642. package/lib/realtime/realtime.audio.ts +0 -196
  643. package/lib/realtime/realtime.driver.ts +0 -489
  644. package/lib/realtime/realtime.protocol.ts +0 -393
  645. package/lib/realtime/realtime.schema.ts +0 -37
  646. package/lib/realtime/realtime.session.ts +0 -106
  647. package/lib/realtime/realtime.transport.ts +0 -384
  648. package/lib/realtime/xai.ts +0 -39
  649. /package/.next/server/app/api/bot/{task → thread}/[id]/route/build-manifest.json +0 -0
  650. /package/.next/server/app/api/bot/{task → thread}/[id]/route/server-reference-manifest.json +0 -0
  651. /package/.next/server/app/api/bot/{task → thread}/[id]/route.js.map +0 -0
  652. /package/.next/server/app/api/bot/{task → thread}/route/build-manifest.json +0 -0
  653. /package/.next/server/app/api/bot/{task → thread}/route/server-reference-manifest.json +0 -0
  654. /package/.next/server/app/api/bot/{task → thread}/route.js.map +0 -0
  655. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_buildManifest.js +0 -0
  656. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_clientMiddlewareManifest.js +0 -0
  657. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_ssgManifest.js +0 -0
@@ -0,0 +1,829 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { createHash } from 'node:crypto';
3
+ import fs from 'node:fs';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { pathToFileURL } from 'node:url';
7
+ import {
8
+ DESKTOP_READABILITY_VIEWPORT,
9
+ MIN_PROJECTED_NODE_TEXT_PX,
10
+ } from '../renderers/shared/desktop-readability.mjs';
11
+
12
+ export const VISUAL_CHECK_VIEWPORTS = Object.freeze([
13
+ DESKTOP_READABILITY_VIEWPORT,
14
+ Object.freeze({ width: 1600, height: 1000 }),
15
+ Object.freeze({ width: 1920, height: 1080 }),
16
+ Object.freeze({ width: 2048, height: 1320 }),
17
+ ]);
18
+
19
+ const CAPTURE_VIEWPORTS = Object.freeze([
20
+ VISUAL_CHECK_VIEWPORTS[0],
21
+ VISUAL_CHECK_VIEWPORTS[VISUAL_CHECK_VIEWPORTS.length - 1],
22
+ ]);
23
+ const THEMES = Object.freeze(['light', 'dark']);
24
+ const EXIT = Object.freeze({ pass: 0, fail: 1, skipped: 2 });
25
+ export const CHROME_NO_SANDBOX_ENV = 'ARCHIFY_CHROME_NO_SANDBOX';
26
+
27
+ function sha256(buffer) {
28
+ return createHash('sha256').update(buffer).digest('hex');
29
+ }
30
+
31
+ function htmlEscape(value) {
32
+ return String(value).replace(/[&<>"']/g, (char) => ({
33
+ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;',
34
+ })[char]);
35
+ }
36
+
37
+ function safeUnlink(file) {
38
+ try {
39
+ fs.rmSync(file, { force: true });
40
+ } catch {
41
+ // A stale optional sidecar must never make the delivered HTML mutable.
42
+ }
43
+ }
44
+
45
+ function writeAtomic(file, contents) {
46
+ const temporary = `${file}.tmp-${process.pid}`;
47
+ try {
48
+ fs.writeFileSync(temporary, contents, { flag: 'w' });
49
+ fs.renameSync(temporary, file);
50
+ } finally {
51
+ safeUnlink(temporary);
52
+ }
53
+ }
54
+
55
+ function screenshotKey(width, height, theme) {
56
+ return `${width}x${height}:${theme}`;
57
+ }
58
+
59
+ export function sidecarPaths(artifactPath) {
60
+ const artifact = path.resolve(artifactPath);
61
+ const stem = artifact.replace(/\.html?$/i, '');
62
+ const base = `${stem}.visual-check`;
63
+ const screenshots = CAPTURE_VIEWPORTS.flatMap(({ width, height }) => THEMES.map((theme) => ({
64
+ width,
65
+ height,
66
+ theme,
67
+ path: `${base}.${width}x${height}.${theme}.png`,
68
+ })));
69
+ return {
70
+ base,
71
+ receipt: `${base}.json`,
72
+ contactSheet: `${base}.html`,
73
+ screenshots,
74
+ };
75
+ }
76
+
77
+ function cleanupCaptureSidecars(paths) {
78
+ safeUnlink(paths.contactSheet);
79
+ for (const screenshot of paths.screenshots) safeUnlink(screenshot.path);
80
+ }
81
+
82
+ function executable(file, platform = process.platform) {
83
+ if (!file) return null;
84
+ try {
85
+ fs.accessSync(file, platform === 'win32' ? fs.constants.F_OK : fs.constants.X_OK);
86
+ return path.resolve(file);
87
+ } catch {
88
+ return null;
89
+ }
90
+ }
91
+
92
+ function findOnPath(command, env, platform) {
93
+ const directories = String(env.PATH || '').split(path.delimiter).filter(Boolean);
94
+ const extensions = platform === 'win32'
95
+ ? String(env.PATHEXT || '.EXE;.CMD;.BAT;.COM').split(';').filter(Boolean)
96
+ : [''];
97
+ for (const directory of directories) {
98
+ for (const extension of extensions) {
99
+ const candidate = path.join(directory, `${command}${extension}`);
100
+ const resolved = executable(candidate, platform);
101
+ if (resolved) return resolved;
102
+ }
103
+ }
104
+ return null;
105
+ }
106
+
107
+ export function findChrome({ env = process.env, platform = process.platform } = {}) {
108
+ if (Object.prototype.hasOwnProperty.call(env, 'ARCHIFY_CHROME')) {
109
+ return executable(env.ARCHIFY_CHROME, platform);
110
+ }
111
+
112
+ const fixed = [];
113
+ const commands = [];
114
+ if (platform === 'darwin') {
115
+ fixed.push(
116
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
117
+ '/Applications/Chromium.app/Contents/MacOS/Chromium',
118
+ );
119
+ } else if (platform === 'win32') {
120
+ for (const root of [env.PROGRAMFILES, env['PROGRAMFILES(X86)'], env.LOCALAPPDATA].filter(Boolean)) {
121
+ fixed.push(
122
+ path.join(root, 'Google', 'Chrome', 'Application', 'chrome.exe'),
123
+ path.join(root, 'Chromium', 'Application', 'chrome.exe'),
124
+ );
125
+ }
126
+ } else {
127
+ commands.push('google-chrome', 'google-chrome-stable', 'chromium', 'chromium-browser');
128
+ }
129
+
130
+ for (const candidate of fixed) {
131
+ const resolved = executable(candidate, platform);
132
+ if (resolved) return resolved;
133
+ }
134
+ for (const command of commands) {
135
+ const resolved = findOnPath(command, env, platform);
136
+ if (resolved) return resolved;
137
+ }
138
+ return null;
139
+ }
140
+
141
+ class PipeCdp {
142
+ constructor(child, { failureDetails = () => '' } = {}) {
143
+ this.child = child;
144
+ this.failureDetails = failureDetails;
145
+ this.nextId = 1;
146
+ this.buffer = '';
147
+ this.pending = new Map();
148
+ this.waiters = [];
149
+ this.writePipe = child.stdio[3];
150
+ this.readPipe = child.stdio[4];
151
+ this.readPipe.setEncoding('utf8');
152
+ this.readPipe.on('data', (chunk) => this.consume(chunk));
153
+ this.writePipe.on('error', (error) => this.failAll(this.failure('write pipe', error)));
154
+ this.readPipe.on('error', (error) => this.failAll(this.failure('read pipe', error)));
155
+ child.once('error', (error) => this.failAll(this.failure('process launch', error)));
156
+ child.once('close', (code, signal) => {
157
+ const ending = signal ? `signal ${signal}` : `exit code ${code}`;
158
+ this.failAll(this.failure('process exit', new Error(`Chrome closed with ${ending}`)));
159
+ });
160
+ }
161
+
162
+ failure(stage, error) {
163
+ const code = error?.code ? ` [${error.code}]` : '';
164
+ const details = this.failureDetails();
165
+ return new Error([
166
+ `Chrome DevTools ${stage} failed: ${error?.message || String(error)}${code}`,
167
+ details,
168
+ ].filter(Boolean).join('\n'));
169
+ }
170
+
171
+ consume(chunk) {
172
+ this.buffer += chunk;
173
+ let boundary;
174
+ while ((boundary = this.buffer.indexOf('\0')) >= 0) {
175
+ const raw = this.buffer.slice(0, boundary);
176
+ this.buffer = this.buffer.slice(boundary + 1);
177
+ if (!raw) continue;
178
+ let message;
179
+ try {
180
+ message = JSON.parse(raw);
181
+ } catch (error) {
182
+ this.failAll(new Error(`Chrome DevTools returned invalid JSON: ${error.message}`));
183
+ continue;
184
+ }
185
+ if (message.id) {
186
+ const pending = this.pending.get(message.id);
187
+ if (!pending) continue;
188
+ clearTimeout(pending.timer);
189
+ this.pending.delete(message.id);
190
+ if (message.error) pending.reject(new Error(`${pending.method}: ${message.error.message}`));
191
+ else pending.resolve(message.result || {});
192
+ continue;
193
+ }
194
+ for (const waiter of [...this.waiters]) {
195
+ if (waiter.method !== message.method) continue;
196
+ if (waiter.sessionId && waiter.sessionId !== message.sessionId) continue;
197
+ clearTimeout(waiter.timer);
198
+ this.waiters.splice(this.waiters.indexOf(waiter), 1);
199
+ waiter.resolve(message.params || {});
200
+ }
201
+ }
202
+ }
203
+
204
+ send(method, params = {}, sessionId = undefined, timeoutMs = 15000) {
205
+ const id = this.nextId++;
206
+ const message = { id, method, params };
207
+ if (sessionId) message.sessionId = sessionId;
208
+ return new Promise((resolve, reject) => {
209
+ const timer = setTimeout(() => {
210
+ this.pending.delete(id);
211
+ reject(new Error(`${method}: timed out after ${timeoutMs}ms`));
212
+ }, timeoutMs);
213
+ this.pending.set(id, { method, resolve, reject, timer });
214
+ try {
215
+ this.writePipe.write(`${JSON.stringify(message)}\0`, (error) => {
216
+ if (error) this.failAll(this.failure('write pipe', error));
217
+ });
218
+ } catch (error) {
219
+ this.failAll(this.failure('write pipe', error));
220
+ }
221
+ });
222
+ }
223
+
224
+ waitFor(method, sessionId, timeoutMs = 15000) {
225
+ return new Promise((resolve, reject) => {
226
+ const waiter = { method, sessionId, resolve, reject, timer: null };
227
+ waiter.timer = setTimeout(() => {
228
+ this.waiters.splice(this.waiters.indexOf(waiter), 1);
229
+ reject(new Error(`${method}: event timed out after ${timeoutMs}ms`));
230
+ }, timeoutMs);
231
+ this.waiters.push(waiter);
232
+ });
233
+ }
234
+
235
+ failAll(error) {
236
+ for (const pending of this.pending.values()) {
237
+ clearTimeout(pending.timer);
238
+ pending.reject(error);
239
+ }
240
+ for (const waiter of this.waiters) {
241
+ clearTimeout(waiter.timer);
242
+ waiter.reject(error);
243
+ }
244
+ this.pending.clear();
245
+ this.waiters = [];
246
+ }
247
+ }
248
+
249
+ export function chromeVisualBrowserArgs(profileRoot, {
250
+ env = process.env,
251
+ getuid = typeof process.getuid === 'function' ? () => process.getuid() : null,
252
+ } = {}) {
253
+ const args = [
254
+ '--headless=new',
255
+ '--remote-debugging-pipe',
256
+ '--disable-gpu',
257
+ '--hide-scrollbars',
258
+ '--disable-background-networking',
259
+ '--disable-component-update',
260
+ '--disable-default-apps',
261
+ '--disable-sync',
262
+ '--metrics-recording-only',
263
+ '--no-first-run',
264
+ '--no-default-browser-check',
265
+ '--disable-background-timer-throttling',
266
+ '--disable-backgrounding-occluded-windows',
267
+ '--disable-renderer-backgrounding',
268
+ '--force-device-scale-factor=1',
269
+ `--user-data-dir=${profileRoot}`,
270
+ 'about:blank',
271
+ ];
272
+ const rootUser = typeof getuid === 'function' && getuid() === 0;
273
+ const sandboxOptOut = env?.[CHROME_NO_SANDBOX_ENV] === '1';
274
+ if (rootUser || sandboxOptOut) args.unshift('--no-sandbox');
275
+ return args;
276
+ }
277
+
278
+ async function evaluate(cdp, sessionId, expression, awaitPromise = false) {
279
+ const response = await cdp.send('Runtime.evaluate', {
280
+ expression,
281
+ awaitPromise,
282
+ returnByValue: true,
283
+ }, sessionId);
284
+ if (response.exceptionDetails) {
285
+ throw new Error(response.exceptionDetails.exception?.description
286
+ || response.exceptionDetails.text
287
+ || 'Runtime.evaluate failed');
288
+ }
289
+ return response.result?.value;
290
+ }
291
+
292
+ export class ChromeVisualBrowser {
293
+ constructor(chromePath, {
294
+ env = process.env,
295
+ getuid = typeof process.getuid === 'function' ? () => process.getuid() : null,
296
+ spawnImpl = spawn,
297
+ } = {}) {
298
+ this.profileRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'archify-visual-check-profile-'));
299
+ this.stderr = '';
300
+ const args = chromeVisualBrowserArgs(this.profileRoot, { env, getuid });
301
+ this.child = spawnImpl(chromePath, args, { stdio: ['ignore', 'ignore', 'pipe', 'pipe', 'pipe'] });
302
+ this.child.stderr.setEncoding('utf8');
303
+ this.child.stderr.on('data', (chunk) => {
304
+ this.stderr = `${this.stderr}${chunk}`.slice(-8000);
305
+ });
306
+ this.child.stderr.on('error', (error) => {
307
+ this.stderr = `${this.stderr}\nChrome stderr stream failed: ${error.message}`.trim().slice(-8000);
308
+ });
309
+ this.cdp = new PipeCdp(this.child, {
310
+ failureDetails: () => {
311
+ const exit = this.child.signalCode
312
+ ? `signal ${this.child.signalCode}`
313
+ : this.child.exitCode == null ? 'still running' : `exit code ${this.child.exitCode}`;
314
+ const stderr = this.stderr.trim();
315
+ return [
316
+ `Chrome process: ${exit}.`,
317
+ stderr ? `Chrome stderr:\n${stderr}` : '',
318
+ ].filter(Boolean).join('\n');
319
+ },
320
+ });
321
+ this.sessionPromise = this.attach();
322
+ }
323
+
324
+ async attach() {
325
+ const targets = await this.cdp.send('Target.getTargets');
326
+ let target = targets.targetInfos?.find((item) => item.type === 'page');
327
+ if (!target) {
328
+ const created = await this.cdp.send('Target.createTarget', { url: 'about:blank' });
329
+ target = { targetId: created.targetId };
330
+ }
331
+ const attached = await this.cdp.send('Target.attachToTarget', {
332
+ targetId: target.targetId,
333
+ flatten: true,
334
+ });
335
+ await this.cdp.send('Page.enable', {}, attached.sessionId);
336
+ await this.cdp.send('Runtime.enable', {}, attached.sessionId);
337
+ return attached.sessionId;
338
+ }
339
+
340
+ async inspect({ artifactPath, width, height, theme, screenshotPath }) {
341
+ const sessionId = await this.sessionPromise;
342
+ await this.cdp.send('Emulation.setDeviceMetricsOverride', {
343
+ width,
344
+ height,
345
+ deviceScaleFactor: 1,
346
+ mobile: false,
347
+ }, sessionId);
348
+
349
+ const url = new URL(pathToFileURL(artifactPath).href);
350
+ url.searchParams.set('theme', theme);
351
+ const loaded = this.cdp.waitFor('Page.loadEventFired', sessionId);
352
+ const navigation = await this.cdp.send('Page.navigate', { url: url.href }, sessionId);
353
+ if (navigation.errorText) throw new Error(`Chrome navigation failed: ${navigation.errorText}`);
354
+ await loaded;
355
+ await evaluate(this.cdp, sessionId, `(function () {
356
+ document.documentElement.setAttribute('data-motion', 'still');
357
+ var panel = document.querySelector('.diagram-container');
358
+ if (panel) panel.setAttribute('data-detail-level', 'read');
359
+ var fontsReady = document.fonts && document.fonts.ready
360
+ ? document.fonts.ready.catch(function () {})
361
+ : Promise.resolve();
362
+ return fontsReady.then(function () {
363
+ if (window.Archify && Archify.readerLayout && typeof Archify.readerLayout.whenStable === 'function') {
364
+ return Archify.readerLayout.whenStable();
365
+ }
366
+ }).then(function () {
367
+ if (window.Archify && Archify.viewerChromeLayout && typeof Archify.viewerChromeLayout.whenStable === 'function') {
368
+ return Archify.viewerChromeLayout.whenStable();
369
+ }
370
+ }).then(function () {
371
+ if (window.Archify && Archify.readerLayout && typeof Archify.readerLayout.whenStable === 'function') {
372
+ return Archify.readerLayout.whenStable();
373
+ }
374
+ }).then(function () {
375
+ if (window.Archify && Archify.viewerChromeLayout && typeof Archify.viewerChromeLayout.whenStable === 'function') {
376
+ return Archify.viewerChromeLayout.whenStable();
377
+ }
378
+ return new Promise(function (resolve) {
379
+ requestAnimationFrame(function () { requestAnimationFrame(resolve); });
380
+ });
381
+ });
382
+ })()`, true);
383
+
384
+ const metrics = await evaluate(this.cdp, sessionId, `(function () {
385
+ var reader = document.querySelector('.container');
386
+ var diagram = document.querySelector('.diagram-container');
387
+ var svg = diagram && (
388
+ diagram.querySelector(':scope > svg') ||
389
+ diagram.querySelector(':scope > .diagram-stage > svg')
390
+ );
391
+ var stage = diagram && (diagram.querySelector(':scope > .diagram-stage') || svg);
392
+ var legend = svg && svg.querySelector('[data-legend]');
393
+ var navigationDock = diagram && diagram.querySelector('.diagram-nav');
394
+ var viewBox = svg && svg.viewBox && svg.viewBox.baseVal;
395
+ var diagramWidth = svg ? svg.getBoundingClientRect().width : 0;
396
+ var viewBoxWidth = viewBox ? viewBox.width : 0;
397
+ var scale = viewBoxWidth > 0 ? Math.min(1, diagramWidth / viewBoxWidth) : 0;
398
+ var minimum = null;
399
+ if (svg && scale > 0) {
400
+ Array.from(svg.querySelectorAll('text[data-node-label], text[data-boundary-label], text[data-detail="context"]')).forEach(function (text) {
401
+ var detail = text.hasAttribute('data-node-label')
402
+ ? 'primary'
403
+ : text.hasAttribute('data-boundary-label') ? 'boundary' : 'context';
404
+ if (detail === 'context' && !text.closest('[data-node-id]')) return;
405
+ var sourceFontPx = parseFloat(text.getAttribute('font-size') || '');
406
+ if (!Number.isFinite(sourceFontPx)) return;
407
+ var projectedFontPx = sourceFontPx * scale;
408
+ if (!minimum || projectedFontPx < minimum.projectedFontPx) {
409
+ minimum = {
410
+ text: (text.textContent || '').trim(),
411
+ detail: detail,
412
+ sourceFontPx: sourceFontPx,
413
+ projectedFontPx: projectedFontPx
414
+ };
415
+ }
416
+ });
417
+ }
418
+ function intersectionArea(a, b) {
419
+ if (!a || !b || !a.width || !a.height || !b.width || !b.height) return 0;
420
+ var width = Math.max(0, Math.min(a.right, b.right) - Math.max(a.left, b.left));
421
+ var height = Math.max(0, Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top));
422
+ return width * height;
423
+ }
424
+ var legendRect = legend ? legend.getBoundingClientRect() : null;
425
+ var stageRect = window.Archify && Archify.viewerChromeLayout
426
+ && typeof Archify.viewerChromeLayout.stageRect === 'function'
427
+ ? Archify.viewerChromeLayout.stageRect()
428
+ : (stage ? stage.getBoundingClientRect() : null);
429
+ var navigationDockRect = navigationDock ? navigationDock.getBoundingClientRect() : null;
430
+ var stageDockIntersectionArea = intersectionArea(stageRect, navigationDockRect);
431
+ var viewerChromeReceipt = window.Archify && Archify.viewerChromeLayout
432
+ && typeof Archify.viewerChromeLayout.receipt === 'function'
433
+ ? Archify.viewerChromeLayout.receipt()
434
+ : null;
435
+ return {
436
+ innerWidth: window.innerWidth,
437
+ innerHeight: window.innerHeight,
438
+ scrollWidth: Math.ceil(document.documentElement.scrollWidth),
439
+ scrollHeight: Math.ceil(document.documentElement.scrollHeight),
440
+ resolvedTheme: document.documentElement.getAttribute('data-theme') || '',
441
+ readerWidth: reader ? reader.getBoundingClientRect().width : 0,
442
+ diagramWidth: diagramWidth,
443
+ viewBoxWidth: viewBoxWidth,
444
+ minimumProjectedNodeTextPx: minimum ? minimum.projectedFontPx : null,
445
+ minimumProjectedNodeText: minimum ? minimum.text : null,
446
+ minimumProjectedNodeTextDetail: minimum ? minimum.detail : null,
447
+ hasLegend: Boolean(legendRect && legendRect.width && legendRect.height),
448
+ hasNavigationDock: Boolean(navigationDockRect && navigationDockRect.width && navigationDockRect.height),
449
+ legendDockIntersectionArea: stageDockIntersectionArea > 0
450
+ ? intersectionArea(legendRect, navigationDockRect)
451
+ : 0,
452
+ dockStageIntersectionArea: stageDockIntersectionArea,
453
+ dockStageGap: stageRect && navigationDockRect ? navigationDockRect.top - stageRect.bottom : null,
454
+ viewerChromeRequiredGap: viewerChromeReceipt ? viewerChromeReceipt.gap : null,
455
+ viewerChromeReserve: viewerChromeReceipt ? viewerChromeReceipt.reserve : 0,
456
+ viewerChromeActive: viewerChromeReceipt ? viewerChromeReceipt.active : false
457
+ };
458
+ })()`);
459
+ if (!metrics || !Number.isFinite(metrics.scrollWidth) || !Number.isFinite(metrics.scrollHeight)) {
460
+ throw new Error('Chrome returned incomplete containment metrics.');
461
+ }
462
+
463
+ if (screenshotPath) {
464
+ const capture = await this.cdp.send('Page.captureScreenshot', {
465
+ format: 'png',
466
+ fromSurface: true,
467
+ captureBeyondViewport: false,
468
+ }, sessionId, 20000);
469
+ if (!capture.data) throw new Error('Chrome returned an empty screenshot.');
470
+ fs.writeFileSync(screenshotPath, Buffer.from(capture.data, 'base64'));
471
+ }
472
+ return metrics;
473
+ }
474
+
475
+ async close() {
476
+ this.cdp.failAll(new Error('visual-check finished'));
477
+ if (this.child.exitCode === null && this.child.signalCode === null) {
478
+ this.child.kill('SIGTERM');
479
+ await new Promise((resolve) => {
480
+ const timer = setTimeout(() => {
481
+ if (this.child.exitCode === null && this.child.signalCode === null) this.child.kill('SIGKILL');
482
+ resolve();
483
+ }, 1500);
484
+ this.child.once('exit', () => {
485
+ clearTimeout(timer);
486
+ resolve();
487
+ });
488
+ });
489
+ }
490
+ try {
491
+ fs.rmSync(this.profileRoot, { recursive: true, force: true });
492
+ } catch {
493
+ // Chrome may briefly retain profile files on Windows; evidence is done.
494
+ }
495
+ }
496
+ }
497
+
498
+ function observation({ width, height, theme, metrics }) {
499
+ const innerWidth = Number(metrics.innerWidth);
500
+ const innerHeight = Number(metrics.innerHeight);
501
+ const scrollWidth = Number(metrics.scrollWidth);
502
+ const scrollHeight = Number(metrics.scrollHeight);
503
+ const overflowX = scrollWidth > innerWidth;
504
+ const overflowY = scrollHeight > innerHeight;
505
+ const minimumProjectedNodeTextPx = metrics.minimumProjectedNodeTextPx == null
506
+ ? null
507
+ : Number(metrics.minimumProjectedNodeTextPx);
508
+ const readabilityOk = minimumProjectedNodeTextPx == null
509
+ || minimumProjectedNodeTextPx >= MIN_PROJECTED_NODE_TEXT_PX;
510
+ const legendDockIntersectionArea = Number(metrics.legendDockIntersectionArea) || 0;
511
+ const dockStageIntersectionArea = Number(metrics.dockStageIntersectionArea) || 0;
512
+ const dockStageGap = metrics.dockStageGap == null ? null : Number(metrics.dockStageGap);
513
+ const receiptDockStageGap = metrics.viewerChromeRequiredGap == null
514
+ ? null
515
+ : Number(metrics.viewerChromeRequiredGap);
516
+ const requiredDockStageGap = Number.isFinite(receiptDockStageGap) ? receiptDockStageGap : 0;
517
+ const viewerChromeStageOk = !metrics.hasNavigationDock || (
518
+ Number.isFinite(dockStageGap)
519
+ && dockStageIntersectionArea <= 0.5
520
+ && dockStageGap >= requiredDockStageGap - 1
521
+ );
522
+ const viewerChromeOk = legendDockIntersectionArea <= 0.5 && viewerChromeStageOk;
523
+ return {
524
+ width,
525
+ height,
526
+ theme,
527
+ innerWidth,
528
+ innerHeight,
529
+ scrollWidth,
530
+ scrollHeight,
531
+ overflowX,
532
+ overflowY,
533
+ ok: !overflowX && !overflowY,
534
+ readerWidth: Number(metrics.readerWidth) || null,
535
+ diagramWidth: Number(metrics.diagramWidth) || null,
536
+ viewBoxWidth: Number(metrics.viewBoxWidth) || null,
537
+ minimumProjectedNodeTextPx,
538
+ minimumProjectedNodeText: metrics.minimumProjectedNodeText || null,
539
+ minimumProjectedNodeTextDetail: metrics.minimumProjectedNodeTextDetail || null,
540
+ minimumRequiredNodeTextPx: MIN_PROJECTED_NODE_TEXT_PX,
541
+ readabilityOk,
542
+ hasLegend: Boolean(metrics.hasLegend),
543
+ hasNavigationDock: Boolean(metrics.hasNavigationDock),
544
+ legendDockIntersectionArea,
545
+ dockStageIntersectionArea,
546
+ dockStageGap,
547
+ requiredDockStageGap,
548
+ viewerChromeStageOk,
549
+ viewerChromeReserve: Number(metrics.viewerChromeReserve) || 0,
550
+ viewerChromeActive: Boolean(metrics.viewerChromeActive),
551
+ viewerChromeOk,
552
+ resolvedTheme: metrics.resolvedTheme || theme,
553
+ };
554
+ }
555
+
556
+ function contactSheetHtml({ artifactPath, receipt, screenshots }) {
557
+ const cards = screenshots.map((entry) => `
558
+ <figure>
559
+ <img src="${htmlEscape(entry.file)}" alt="${htmlEscape(`${entry.theme} ${entry.width} by ${entry.height}`)}">
560
+ <figcaption><strong>${htmlEscape(entry.theme.toUpperCase())}</strong> · ${entry.width}×${entry.height} · containment ${entry.ok ? 'pass' : 'fail'}</figcaption>
561
+ </figure>`).join('');
562
+ return `<!doctype html>
563
+ <html lang="en">
564
+ <head>
565
+ <meta charset="utf-8">
566
+ <meta name="viewport" content="width=device-width,initial-scale=1">
567
+ <title>Archify automated browser evidence · ${htmlEscape(path.basename(artifactPath))}</title>
568
+ <style>
569
+ *{box-sizing:border-box}body{margin:0;padding:24px;background:#e9eef5;color:#172033;font:14px/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}header{max-width:1500px;margin:0 auto 18px}h1{margin:0 0 6px;font-size:20px}p{margin:0;color:#526176}.grid{max-width:1500px;margin:auto;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}figure{margin:0;padding:10px;background:white;border:1px solid #c9d4e3;border-radius:12px;box-shadow:0 10px 30px rgba(15,23,42,.08)}img{display:block;width:100%;height:auto;border:1px solid #e2e8f0}figcaption{padding:9px 4px 2px;color:#526176}@media(max-width:900px){.grid{grid-template-columns:1fr}}
570
+ </style>
571
+ </head>
572
+ <body>
573
+ <header><h1>Automated browser evidence</h1><p>${htmlEscape(path.basename(artifactPath))} · visual-check containment ${htmlEscape(receipt.containment.status)} · perceptual visual review pending</p></header>
574
+ <main class="grid">${cards}
575
+ </main>
576
+ </body>
577
+ </html>
578
+ `;
579
+ }
580
+
581
+ function viewportSubject(artifact, entry) {
582
+ return {
583
+ artifact,
584
+ viewport: { width: entry.width, height: entry.height, theme: entry.theme },
585
+ };
586
+ }
587
+
588
+ function failureDiagnostic({ code, message, subject, evidence, supportedFixes, severity = 'error' }) {
589
+ return { code, severity, message, subject, evidence, supportedFixes };
590
+ }
591
+
592
+ function observationDiagnostics({ artifact, allObservations, readabilityObservations }) {
593
+ const diagnostics = [];
594
+ for (const entry of allObservations) {
595
+ if (!entry.ok) {
596
+ diagnostics.push(failureDiagnostic({
597
+ code: 'viewer/viewport-overflow',
598
+ message: `The rendered artifact overflows the ${entry.width}x${entry.height} ${entry.theme} viewport.`,
599
+ subject: viewportSubject(artifact, entry),
600
+ evidence: {
601
+ innerWidth: entry.innerWidth,
602
+ innerHeight: entry.innerHeight,
603
+ scrollWidth: entry.scrollWidth,
604
+ scrollHeight: entry.scrollHeight,
605
+ overflowX: entry.overflowX,
606
+ overflowY: entry.overflowY,
607
+ },
608
+ supportedFixes: [
609
+ `contain the rendered layout within ${entry.width}x${entry.height}, then rerun visual-check`,
610
+ ],
611
+ }));
612
+ }
613
+ if (entry.legendDockIntersectionArea > 0.5) {
614
+ diagnostics.push(failureDiagnostic({
615
+ code: 'viewer/chrome-legend-clearance',
616
+ message: `The navigation Dock obscures the SVG Legend at ${entry.width}x${entry.height} (${entry.theme}).`,
617
+ subject: viewportSubject(artifact, entry),
618
+ evidence: { legendDockIntersectionArea: entry.legendDockIntersectionArea },
619
+ supportedFixes: [
620
+ 'move the SVG Legend or Viewer Dock until legendDockIntersectionArea is 0, then rerun visual-check',
621
+ ],
622
+ }));
623
+ }
624
+ if (!entry.viewerChromeStageOk) {
625
+ const stageOverlapsDock = entry.dockStageIntersectionArea > 0.5;
626
+ diagnostics.push(failureDiagnostic({
627
+ code: 'viewer/chrome-stage-clearance',
628
+ message: stageOverlapsDock
629
+ ? `Navigation Dock enters the protected SVG stage at ${entry.width}x${entry.height} (${entry.theme}).`
630
+ : `Navigation Dock clearance from the protected SVG stage is below the required gap at ${entry.width}x${entry.height} (${entry.theme}).`,
631
+ subject: viewportSubject(artifact, entry),
632
+ evidence: {
633
+ dockStageIntersectionArea: entry.dockStageIntersectionArea,
634
+ dockStageGap: entry.dockStageGap,
635
+ requiredDockStageGap: entry.requiredDockStageGap,
636
+ },
637
+ supportedFixes: [
638
+ `adjust Viewer stage reservation or clipping until dockStageGap is at least ${entry.requiredDockStageGap} and dockStageIntersectionArea is 0, then rerun visual-check`,
639
+ ],
640
+ }));
641
+ }
642
+ }
643
+ for (const entry of readabilityObservations) {
644
+ if (entry.readabilityOk) continue;
645
+ diagnostics.push(failureDiagnostic({
646
+ code: 'viewer/projected-text-readability',
647
+ message: `Projected ${entry.minimumProjectedNodeTextDetail || 'node'} text is below the readability floor at ${entry.width}x${entry.height}.`,
648
+ subject: viewportSubject(artifact, entry),
649
+ evidence: {
650
+ text: entry.minimumProjectedNodeText,
651
+ detail: entry.minimumProjectedNodeTextDetail,
652
+ minimumProjectedNodeTextPx: entry.minimumProjectedNodeTextPx,
653
+ minimumRequiredNodeTextPx: entry.minimumRequiredNodeTextPx,
654
+ },
655
+ supportedFixes: [
656
+ `increase projected node text to at least ${entry.minimumRequiredNodeTextPx}px at ${entry.width}x${entry.height}, then rerun visual-check`,
657
+ ],
658
+ }));
659
+ }
660
+ return diagnostics;
661
+ }
662
+
663
+ function baseReceipt({ artifactPath, artifact, outputs, chrome }) {
664
+ return {
665
+ schemaVersion: 1,
666
+ ok: false,
667
+ command: 'visual-check',
668
+ evidenceKind: 'automated-browser',
669
+ status: 'fail',
670
+ visualReview: 'pending',
671
+ artifact: {
672
+ path: artifactPath,
673
+ sha256: sha256(artifact),
674
+ bytes: artifact.byteLength,
675
+ },
676
+ state: { detail: 'read', motion: 'still' },
677
+ chrome,
678
+ diagnostics: [],
679
+ containment: { status: 'fail', viewports: [] },
680
+ readability: { status: 'fail', minimumProjectedNodeTextPx: MIN_PROJECTED_NODE_TEXT_PX, viewports: [] },
681
+ viewerChrome: { status: 'fail', viewports: [] },
682
+ captures: { status: 'fail', screenshots: [], contactSheet: null },
683
+ sidecars: {
684
+ receipt: path.basename(outputs.receipt),
685
+ contactSheet: path.basename(outputs.contactSheet),
686
+ },
687
+ };
688
+ }
689
+
690
+ function persistReceipt(outputs, receipt) {
691
+ writeAtomic(outputs.receipt, `${JSON.stringify(receipt, null, 2)}\n`);
692
+ }
693
+
694
+ export async function runVisualCheck({
695
+ artifactPath,
696
+ chromePath,
697
+ resolveChrome = findChrome,
698
+ browserFactory = async (resolvedChrome) => new ChromeVisualBrowser(resolvedChrome),
699
+ } = {}) {
700
+ if (!artifactPath) throw new Error('visual-check requires one delivered HTML artifact.');
701
+ const artifact = path.resolve(artifactPath);
702
+ if (!/\.html?$/i.test(artifact)) throw new Error('visual-check requires an .html artifact.');
703
+ const artifactBytes = fs.readFileSync(artifact);
704
+ const outputs = sidecarPaths(artifact);
705
+ cleanupCaptureSidecars(outputs);
706
+ safeUnlink(outputs.receipt);
707
+
708
+ const resolvedChrome = chromePath || resolveChrome();
709
+ const receipt = baseReceipt({
710
+ artifactPath: artifact,
711
+ artifact: artifactBytes,
712
+ outputs,
713
+ chrome: resolvedChrome
714
+ ? { status: 'available', executable: resolvedChrome }
715
+ : { status: 'unavailable', executable: null },
716
+ });
717
+
718
+ if (!resolvedChrome) {
719
+ receipt.status = 'skipped';
720
+ receipt.containment.status = 'skipped';
721
+ receipt.readability.status = 'skipped';
722
+ receipt.viewerChrome.status = 'skipped';
723
+ receipt.captures.status = 'skipped';
724
+ receipt.error = 'Chrome or Chromium is unavailable. Set ARCHIFY_CHROME to its executable path.';
725
+ receipt.diagnostics = [failureDiagnostic({
726
+ code: 'viewer/chrome-unavailable',
727
+ severity: 'warning',
728
+ message: receipt.error,
729
+ subject: { artifact },
730
+ evidence: { executable: null },
731
+ supportedFixes: ['set ARCHIFY_CHROME to a Chrome or Chromium executable and rerun visual-check'],
732
+ })];
733
+ persistReceipt(outputs, receipt);
734
+ return { exitCode: EXIT.skipped, receipt };
735
+ }
736
+
737
+ let browser;
738
+ try {
739
+ browser = await browserFactory(resolvedChrome);
740
+ const observations = new Map();
741
+ const screenshotsByKey = new Map(outputs.screenshots.map((entry) => [
742
+ screenshotKey(entry.width, entry.height, entry.theme),
743
+ entry,
744
+ ]));
745
+
746
+ for (const viewport of VISUAL_CHECK_VIEWPORTS) {
747
+ const key = screenshotKey(viewport.width, viewport.height, 'light');
748
+ const screenshot = screenshotsByKey.get(key);
749
+ const metrics = await browser.inspect({
750
+ artifactPath: artifact,
751
+ ...viewport,
752
+ theme: 'light',
753
+ ...(screenshot ? { screenshotPath: screenshot.path } : {}),
754
+ });
755
+ observations.set(key, observation({ ...viewport, theme: 'light', metrics }));
756
+ }
757
+ for (const viewport of CAPTURE_VIEWPORTS) {
758
+ const key = screenshotKey(viewport.width, viewport.height, 'dark');
759
+ const screenshot = screenshotsByKey.get(key);
760
+ const metrics = await browser.inspect({
761
+ artifactPath: artifact,
762
+ ...viewport,
763
+ theme: 'dark',
764
+ screenshotPath: screenshot.path,
765
+ });
766
+ observations.set(key, observation({ ...viewport, theme: 'dark', metrics }));
767
+ }
768
+
769
+ const afterBytes = fs.readFileSync(artifact);
770
+ if (sha256(afterBytes) !== receipt.artifact.sha256 || afterBytes.byteLength !== receipt.artifact.bytes) {
771
+ throw new Error('The delivered artifact changed while visual-check was running.');
772
+ }
773
+
774
+ receipt.containment.viewports = VISUAL_CHECK_VIEWPORTS.map(({ width, height }) => (
775
+ observations.get(screenshotKey(width, height, 'light'))
776
+ ));
777
+ receipt.readability.viewports = receipt.containment.viewports.map((entry) => ({ ...entry }));
778
+ receipt.viewerChrome.viewports = receipt.containment.viewports.map((entry) => ({ ...entry }));
779
+ receipt.captures.screenshots = outputs.screenshots.map((entry) => ({
780
+ ...observations.get(screenshotKey(entry.width, entry.height, entry.theme)),
781
+ file: path.basename(entry.path),
782
+ }));
783
+ const allObservations = [...observations.values()];
784
+ const containmentPass = allObservations.every((entry) => entry.ok);
785
+ const readabilityPass = receipt.readability.viewports.every((entry) => entry.readabilityOk);
786
+ const viewerChromePass = allObservations.every((entry) => entry.viewerChromeOk);
787
+ receipt.diagnostics = observationDiagnostics({
788
+ artifact,
789
+ allObservations,
790
+ readabilityObservations: receipt.readability.viewports,
791
+ });
792
+ receipt.containment.status = containmentPass ? 'pass' : 'fail';
793
+ receipt.readability.status = readabilityPass ? 'pass' : 'fail';
794
+ receipt.viewerChrome.status = viewerChromePass ? 'pass' : 'fail';
795
+ receipt.captures.status = 'pass';
796
+ receipt.captures.contactSheet = path.basename(outputs.contactSheet);
797
+ receipt.status = containmentPass && readabilityPass && viewerChromePass ? 'pass' : 'fail';
798
+ receipt.ok = containmentPass && readabilityPass && viewerChromePass;
799
+ writeAtomic(outputs.contactSheet, contactSheetHtml({
800
+ artifactPath: artifact,
801
+ receipt,
802
+ screenshots: receipt.captures.screenshots,
803
+ }));
804
+ persistReceipt(outputs, receipt);
805
+ return { exitCode: receipt.ok ? EXIT.pass : EXIT.fail, receipt };
806
+ } catch (error) {
807
+ cleanupCaptureSidecars(outputs);
808
+ receipt.status = 'fail';
809
+ receipt.ok = false;
810
+ receipt.error = error.message;
811
+ receipt.containment.status = 'fail';
812
+ receipt.readability.status = 'fail';
813
+ receipt.viewerChrome.status = 'fail';
814
+ receipt.captures.status = 'fail';
815
+ receipt.captures.screenshots = [];
816
+ receipt.captures.contactSheet = null;
817
+ receipt.diagnostics = [failureDiagnostic({
818
+ code: 'viewer/visual-check-runtime',
819
+ message: 'visual-check could not complete its Chrome inspection.',
820
+ subject: { artifact },
821
+ evidence: { reason: error.message },
822
+ supportedFixes: ['resolve the reported Chrome inspection error, then rerun visual-check'],
823
+ })];
824
+ persistReceipt(outputs, receipt);
825
+ return { exitCode: EXIT.fail, receipt };
826
+ } finally {
827
+ if (browser?.close) await browser.close();
828
+ }
829
+ }