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,595 @@
1
+ export const SUPPORTED_LOCALES = ['en'];
2
+ export const DEFAULT_LOCALE = 'en';
3
+
4
+ const ESCAPE_MAP = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' };
5
+
6
+ export function escapeHtml(value) {
7
+ return String(value ?? '').replace(/[&<>"']/g, (character) => ESCAPE_MAP[character]);
8
+ }
9
+
10
+ // One catalog feeds renderer-time SVG/HTML copy and the selected runtime
11
+ // catalog embedded in each standalone artifact. Keeping every locale in one
12
+ // tuple makes missing translations impossible to hide behind an English
13
+ // fallback during development.
14
+ const MESSAGE_PAIRS = {
15
+ 'page.title': ['{title} Diagram'],
16
+ 'diagram.description.architecture': ['An architecture diagram generated by Archify.'],
17
+ 'diagram.description.workflow': ['A workflow diagram generated by Archify.'],
18
+ 'diagram.description.sequence': ['A sequence diagram generated by Archify.'],
19
+ 'diagram.description.dataflow': ['A data-flow diagram generated by Archify.'],
20
+ 'diagram.description.lifecycle': ['A lifecycle diagram generated by Archify.'],
21
+ 'node.focus': ['Focus {label}'],
22
+ 'node.focus.detail': ['Focus {label}, {detail}'],
23
+ 'node.context.architecture': ['Architecture component'],
24
+ 'node.context.workflow': ['Workflow node'],
25
+ 'node.context.sequence': ['Sequence participant'],
26
+ 'node.context.dataflow': ['Data-flow node'],
27
+ 'node.context.lifecycle': ['Lifecycle state'],
28
+ 'legend.title': ['Legend'],
29
+
30
+ 'legend.architecture.frontend': ['Frontend'],
31
+ 'legend.architecture.backend': ['Backend'],
32
+ 'legend.architecture.database': ['Database'],
33
+ 'legend.architecture.cloud': ['Cloud'],
34
+ 'legend.architecture.security': ['Security'],
35
+ 'legend.architecture.messagebus': ['Message bus'],
36
+ 'legend.architecture.external': ['External'],
37
+ 'legend.workflow.frontend': ['User UI'],
38
+ 'legend.workflow.backend': ['Agent logic'],
39
+ 'legend.workflow.security': ['Policy'],
40
+ 'legend.workflow.messagebus': ['Tool action'],
41
+ 'legend.workflow.database': ['Context / trace'],
42
+ 'legend.workflow.cloud': ['Cloud service'],
43
+ 'legend.workflow.external': ['External system'],
44
+ 'legend.sequence.emphasis': ['request'],
45
+ 'legend.sequence.return': ['return'],
46
+ 'legend.sequence.security': ['security'],
47
+ 'legend.sequence.dashed': ['async trace'],
48
+ 'legend.sequence.default': ['default message'],
49
+ 'legend.dataflow.emphasis': ['primary data'],
50
+ 'legend.dataflow.security': ['policy / PII'],
51
+ 'legend.dataflow.dashed': ['async batch'],
52
+ 'legend.dataflow.database': ['data store'],
53
+ 'legend.dataflow.default': ['data flow'],
54
+ 'legend.lifecycle.start': ['start'],
55
+ 'legend.lifecycle.active': ['active state'],
56
+ 'legend.lifecycle.waiting': ['waiting'],
57
+ 'legend.lifecycle.decision': ['decision'],
58
+ 'legend.lifecycle.success': ['terminal success'],
59
+ 'legend.lifecycle.failure': ['failure / exit'],
60
+ 'legend.lifecycle.neutral': ['neutral'],
61
+ 'legend.lifecycle.external': ['external'],
62
+
63
+ 'viewer.kind.frontend': ['Frontend'],
64
+ 'viewer.kind.backend': ['Backend'],
65
+ 'viewer.kind.database': ['Database'],
66
+ 'viewer.kind.cloud': ['Cloud'],
67
+ 'viewer.kind.security': ['Security'],
68
+ 'viewer.kind.messagebus': ['Message bus'],
69
+ 'viewer.kind.external': ['External'],
70
+ 'viewer.kind.neutral': ['Neutral'],
71
+ 'viewer.kind.node': ['Node'],
72
+ 'viewer.kind.start': ['Start'],
73
+ 'viewer.kind.active': ['Active'],
74
+ 'viewer.kind.waiting': ['Waiting'],
75
+ 'viewer.kind.decision': ['Decision'],
76
+ 'viewer.kind.success': ['Success'],
77
+ 'viewer.kind.failure': ['Failure'],
78
+
79
+ 'viewer.toolbar.actions': ['Diagram actions'],
80
+ 'viewer.theme.toggle.title': ['Toggle theme (T)'],
81
+ 'viewer.theme.toggle': ['Toggle color theme'],
82
+ 'viewer.theme.dark': ['Dark'],
83
+ 'viewer.theme.light': ['Light'],
84
+ 'viewer.preset.choose.title': ['Choose visual style (S cycles)'],
85
+ 'viewer.preset.choose': ['Choose visual style'],
86
+ 'viewer.preset.style': ['Style'],
87
+ 'viewer.preset.menu': ['Visual style'],
88
+ 'viewer.preset.identity': ['Visual identity'],
89
+ 'viewer.preset.cycles': ['S cycles'],
90
+ 'viewer.preset.classic': ['Classic'],
91
+ 'viewer.preset.classic.short': ['Classic'],
92
+ 'viewer.preset.classic.hint': ['Stable technical default'],
93
+ 'viewer.preset.flow': ['Signal Flow'],
94
+ 'viewer.preset.flow.short': ['Flow'],
95
+ 'viewer.preset.flow.hint': ['Motion-forward presentation'],
96
+ 'viewer.preset.blueprint': ['Blueprint'],
97
+ 'viewer.preset.blueprint.hint': ['Engineering review'],
98
+ 'viewer.preset.editorial': ['Editorial'],
99
+ 'viewer.preset.editorial.hint': ['Publication and launch notes'],
100
+ 'viewer.preset.badge.signalFlow': ['SIGNAL FLOW'],
101
+ 'viewer.preset.badge.blueprint': ['BLUEPRINT / REV 01'],
102
+ 'viewer.preset.badge.editorial': ['EDITORIAL / FIELD NOTE'],
103
+ 'viewer.preset.badge.editorialPlate': ['ARCHIFY / PLATE 04'],
104
+ 'viewer.preset.current': ['Visual style: {style}. Choose visual style'],
105
+ 'viewer.motion.live': ['Live'],
106
+ 'viewer.motion.still': ['Still'],
107
+ 'viewer.motion.pause': ['Pause motion'],
108
+ 'viewer.motion.resume': ['Resume motion'],
109
+ 'viewer.motion.reduced': ['Motion paused by reduced-motion preference'],
110
+ 'viewer.motion.hidden': ['Motion paused while this page is hidden'],
111
+ 'viewer.motion.yielding': ['Pause motion; currently yielding to {owner}'],
112
+ 'viewer.motion.yielding.title': ['Live preview enabled · yielding to {owner}'],
113
+ 'viewer.owner.story': ['the guided story'],
114
+ 'viewer.owner.chapter': ['the active chapter'],
115
+ 'viewer.owner.chapterPreview': ['the chapter delta preview'],
116
+ 'viewer.owner.handoff': ['the chapter handoff'],
117
+ 'viewer.owner.route': ['Route Probe'],
118
+ 'viewer.owner.lens': ['Semantic Lens'],
119
+ 'viewer.owner.relationship': ['Relationship Preview'],
120
+ 'viewer.owner.intent': ['Intent Trace'],
121
+ 'viewer.owner.focus': ['semantic focus'],
122
+ 'viewer.owner.legend': ['legend preview'],
123
+ 'viewer.owner.reader': ['reader interaction'],
124
+ 'viewer.present.enter': ['Enter presentation stage'],
125
+ 'viewer.present.enter.title': ['Presentation stage (F)'],
126
+ 'viewer.present.exit': ['Exit presentation stage'],
127
+ 'viewer.present.exit.title': ['Exit presentation stage (F or Escape)'],
128
+ 'viewer.present.present': ['Present'],
129
+ 'viewer.present.exit.label': ['Exit'],
130
+
131
+ 'viewer.export.button': ['Export'],
132
+ 'viewer.export.button.title': ['Export diagram (E)'],
133
+ 'viewer.export.diagram': ['Export diagram'],
134
+ 'viewer.export.menu': ['Export'],
135
+ 'viewer.export.subtitle': ['Portable, clean outputs'],
136
+ 'viewer.export.share': ['Share'],
137
+ 'viewer.export.shareCard': ['Share Card'],
138
+ 'viewer.export.routeShareCard': ['Route Share Card'],
139
+ 'viewer.export.reachShareCard': ['Reach Share Card'],
140
+ 'viewer.export.copyShareCard': ['Copy Share Card'],
141
+ 'viewer.export.copyDiagram': ['Copy diagram'],
142
+ 'viewer.export.clipboardPng': ['PNG to clipboard'],
143
+ 'viewer.export.raster': ['Raster images'],
144
+ 'viewer.export.image': ['Image'],
145
+ 'viewer.export.lossless': ['Lossless image'],
146
+ 'viewer.export.compact': ['Compact image'],
147
+ 'viewer.export.modern': ['Modern image'],
148
+ 'viewer.export.vectorMotion': ['Vector and motion'],
149
+ 'viewer.export.vectorMotion.heading': ['Vector & motion'],
150
+ 'viewer.export.editable': ['Editable vector'],
151
+ 'viewer.export.motion6s': ['6s motion'],
152
+ 'viewer.export.unsupported': ['Not supported by this browser'],
153
+ 'viewer.export.clipboardUnsupported': ['Clipboard image write not supported by this browser'],
154
+ 'viewer.export.clipboardUnsupported.period': ['Clipboard image write not supported by this browser.'],
155
+ 'viewer.export.clipboardUnsupported.short': ['Clipboard image write not supported in this browser.'],
156
+ 'viewer.export.motionUnavailable': ['Motion capture unavailable in this browser'],
157
+ 'viewer.export.webmUnavailable': ['WebM unavailable in this browser'],
158
+ 'viewer.export.failed': ['Export failed: {message}'],
159
+ 'viewer.export.unknownVariant': ['Unknown Share Card variant: {variant}'],
160
+ 'viewer.export.routeRequired': ['Trace a route before exporting a Route Share Card'],
161
+ 'viewer.export.reachRequired': ['Trace authored reach before exporting a Reach Share Card'],
162
+ 'viewer.export.unknown': ['unknown'],
163
+ 'viewer.export.routeFailed': ['Route Share Card export failed: {message}'],
164
+ 'viewer.export.reachFailed': ['Reach Share Card export failed: {message}'],
165
+ 'viewer.export.copyFailed': ['Copy failed: {message}'],
166
+ 'viewer.export.copiedPng': ['Copied PNG to clipboard'],
167
+ 'viewer.export.copiedShare': ['Copied Share Card'],
168
+ 'viewer.export.downloadedShare': ['Downloaded Share Card'],
169
+ 'viewer.export.downloadedRoute': ['Downloaded Route Share Card'],
170
+ 'viewer.export.downloadedReach': ['Downloaded Reach Share Card'],
171
+ 'viewer.export.downloadedWebm': ['Downloaded WebM'],
172
+ 'viewer.export.recording': ['Recording 6 seconds of motion…'],
173
+ 'viewer.export.card.routeSummary.one': ['Route: {source} → {target} · {count} directed hop'],
174
+ 'viewer.export.card.routeSummary.other': ['Route: {source} → {target} · {count} directed hops'],
175
+ 'viewer.export.card.reachSummary': ['Authored {direction} from {origin} · {nodes} · {links} · max {hops}'],
176
+ 'viewer.export.card.node.one': ['{count} node'],
177
+ 'viewer.export.card.node.other': ['{count} nodes'],
178
+ 'viewer.export.card.link.one': ['{count} link'],
179
+ 'viewer.export.card.link.other': ['{count} links'],
180
+ 'viewer.export.card.hop.one': ['{count} hop'],
181
+ 'viewer.export.card.hop.other': ['{count} hops'],
182
+ 'viewer.export.card.routeBadge': ['ARCHIFY · ROUTE · {hops}'],
183
+ 'viewer.export.card.reachBadge': ['ARCHIFY · {direction} REACH'],
184
+ 'viewer.export.card.defaultBadge': ['ARCHIFY · {preset} · {theme}'],
185
+ 'viewer.export.direction.upstream': ['Upstream'],
186
+ 'viewer.export.direction.downstream': ['Downstream'],
187
+ 'viewer.export.error.canvasUnavailable': ['Canvas unavailable for {label}'],
188
+ 'viewer.export.error.contextUnavailable': ['2D canvas context unavailable for {label}'],
189
+ 'viewer.export.error.toBlobUnavailable': ['canvas.toBlob unavailable for {label}'],
190
+ 'viewer.export.error.toBlobNull': ['canvas.toBlob returned no data for {label}'],
191
+ 'viewer.export.error.variantsCombined': ['Share Card variants cannot be combined'],
192
+ 'viewer.export.error.viewerState': ['Share Card export could not remove temporary viewer state'],
193
+ 'viewer.export.error.routeState': ['Route Card export could not preserve the resolved route safely'],
194
+ 'viewer.export.error.reachState': ['Reach Card export could not preserve authored reach safely'],
195
+ 'viewer.export.error.webmRequirements': ['WebM motion export requires a trace animation and browser MediaRecorder support'],
196
+ 'viewer.export.error.mediaRecorder': ['MediaRecorder failed'],
197
+ 'viewer.export.error.emptyWebm': ['MediaRecorder produced an empty WebM'],
198
+ 'viewer.export.error.webmBackground': ['SVG background could not be loaded for WebM export'],
199
+
200
+ 'viewer.guided.region': ['Guided diagram views'],
201
+ 'viewer.guided.previous': ['Previous guided view'],
202
+ 'viewer.guided.previous.title': ['Previous guided view ([)'],
203
+ 'viewer.guided.next': ['Next guided view'],
204
+ 'viewer.guided.next.title': ['Next guided view (])'],
205
+ 'viewer.guided.views': ['Guided views'],
206
+ 'viewer.guided.explore': ['Explore this system'],
207
+ 'viewer.guided.intro': ['Step through curated paths without changing the source diagram.'],
208
+ 'viewer.guided.trail': ['Story trail'],
209
+ 'viewer.guided.beat': ['Beat'],
210
+ 'viewer.guided.nextBeat': ['Next'],
211
+ 'viewer.guided.play': ['Play guided story'],
212
+ 'viewer.guided.play.title': ['Play guided story (P)'],
213
+ 'viewer.guided.pause': ['Pause guided story'],
214
+ 'viewer.guided.pause.title': ['Pause guided story (P)'],
215
+ 'viewer.guided.replay': ['Replay guided story'],
216
+ 'viewer.guided.replay.title': ['Replay guided story (P)'],
217
+ 'viewer.guided.playStory': ['Play story'],
218
+ 'viewer.guided.pauseStory': ['Pause'],
219
+ 'viewer.guided.replayStory': ['Replay story'],
220
+ 'viewer.guided.motionUnavailable': ['Story playback unavailable while motion is Still'],
221
+ 'viewer.guided.enableMotion': ['Switch motion to Live to play the guided story'],
222
+ 'viewer.guided.selectBeatLink': ['Select a Story Beat to copy its exact link'],
223
+ 'viewer.guided.copyMoment': ['Copy moment'],
224
+ 'viewer.guided.momentCopied': ['Moment link copied'],
225
+ 'viewer.guided.momentCopyFailed': ['Could not copy story moment link'],
226
+ 'viewer.guided.copied': ['Copied'],
227
+ 'viewer.guided.copyFailed': ['Copy failed'],
228
+ 'viewer.guided.showAll': ['Show all'],
229
+ 'viewer.guided.showAll.aria': ['Show entire diagram'],
230
+ 'viewer.guided.chapters': ['Story chapters'],
231
+ 'viewer.guided.storyTrail': ['Story trail for {label}: {count} beats'],
232
+ 'viewer.guided.chapter.open': ['Open chapter {index} of {total}: {label}, {count} stops'],
233
+ 'viewer.guided.chapter.current': ['Current chapter {index} of {total}: {label}, {count} stops'],
234
+ 'viewer.guided.chapter.selectedNodes': ['{count} selected nodes'],
235
+ 'viewer.guided.chapter.stops': ['{count} stops'],
236
+ 'viewer.guided.chapter.stop.one': ['{count} stop'],
237
+ 'viewer.guided.chapter.stop.other': ['{count} stops'],
238
+ 'viewer.guided.chapter.current.title': ['{label} — current chapter, {count} stops'],
239
+ 'viewer.guided.chapter.delta.expanded': ['{stay} stay, {enter} enter, {leave} leave'],
240
+ 'viewer.guided.chapter.delta.aria': ['Open chapter {index} of {total}: {label}. Chapter focus delta: {delta}'],
241
+ 'viewer.guided.chapter.delta.title': ['{label} — {delta} chapter focus'],
242
+ 'viewer.guided.handoff': ['{from} → {to} · via {label}'],
243
+ 'viewer.guided.share.chapter': ['Chapter {index} / {total}'],
244
+ 'viewer.guided.share.initial': ['Chapter 01 / 01'],
245
+ 'viewer.guided.share.default': ['Guided chapter'],
246
+ 'viewer.guided.state.ready': ['Ready'],
247
+ 'viewer.guided.state.playing': ['Playing'],
248
+ 'viewer.guided.state.settled': ['Settled'],
249
+ 'viewer.guided.state.paused': ['Paused'],
250
+ 'viewer.guided.state.pinned': ['Pinned'],
251
+ 'viewer.guided.state.still': ['Still'],
252
+ 'viewer.guided.share.step': ['Step {index} / {total} · {label}'],
253
+ 'viewer.guided.share.staticMoment': ['{step} · Static moment'],
254
+ 'viewer.guided.share.complete': ['{count} steps complete · {note}'],
255
+ 'viewer.guided.share.settled': ['Path settled for reading.'],
256
+ 'viewer.guided.share.staticPath': ['{count} steps · Static path'],
257
+ 'viewer.guided.share.ready': ['{count} steps · Ready'],
258
+ 'viewer.guided.share.aria': ['{state} chapter {index} of {total}: {label}. {beat}. {route}'],
259
+ 'viewer.guided.beat.start': ['Beat {index} / {total} · {label} · starting point'],
260
+ 'viewer.guided.beat.forward': ['Beat {index} / {total} · {from} → {to}'],
261
+ 'viewer.guided.beat.reverse': ['Beat {index} / {total} · {from} → {to} · reverse authored link'],
262
+ 'viewer.guided.beat.multiple': ['Beat {index} / {total} · {from} ⇄ {to} · {count} authored links'],
263
+ 'viewer.guided.beat.group': ['Beat {index} / {total} · {from} · {to} · grouped · no direct link'],
264
+ 'viewer.guided.beat.aria.prefix': ['Story beat {index} of {total}: {label}. '],
265
+ 'viewer.guided.beat.aria.start': ['Starting point.'],
266
+ 'viewer.guided.beat.aria.forward': ['From {from} through one authored forward relationship.'],
267
+ 'viewer.guided.beat.aria.reverse': ['From {from}; the authored relationship points from {to} to {from}.'],
268
+ 'viewer.guided.beat.aria.multiple': ['From {from} through {count} authored relationships; shown without arbitrary motion.'],
269
+ 'viewer.guided.beat.aria.group': ['Grouped from {from} with no direct authored relationship.'],
270
+ 'viewer.guided.caption.start': ['Starting point'],
271
+ 'viewer.guided.caption.grouped': ['Grouped transition · no direct authored link'],
272
+ 'viewer.guided.caption.more': [' +{count} more'],
273
+ 'viewer.guided.caption.reverse': ['Reverse authored relationship'],
274
+ 'viewer.guided.caption.relationships': ['{count} authored relationships'],
275
+ 'viewer.guided.caption.relationship': ['Authored relationship'],
276
+ 'viewer.guided.caption.direction': ['authored direction: {from} → {to}'],
277
+ 'viewer.guided.caption.starting': ['Authored starting point'],
278
+ 'viewer.guided.beatLink': ['Copy link to current story moment: Beat {index} of {total}: {label}'],
279
+ 'viewer.guided.noStory': ['This diagram has no authored guided story.'],
280
+
281
+ 'viewer.guide.eyebrow': ['Diagram guide'],
282
+ 'viewer.guide.close': ['Close diagram guide'],
283
+ 'viewer.guide.inspecting': ['Inspecting compiled semantics'],
284
+ 'viewer.guide.actions': ['Diagram exploration actions'],
285
+ 'viewer.guide.find': ['Find any node'],
286
+ 'viewer.guide.find.hint': ['Search labels, responsibilities, kinds, and stable IDs.'],
287
+ 'viewer.guide.route': ['Trace a route'],
288
+ 'viewer.guide.route.aria': ['Trace a directed route'],
289
+ 'viewer.guide.route.hint': ['Ask how two semantic nodes connect in authored direction.'],
290
+ 'viewer.guide.map': ['See the whole system'],
291
+ 'viewer.guide.map.hint': ['Open Semantic Radar with a live viewport and stable nodes.'],
292
+ 'viewer.guide.lens': ['Compare semantic kinds'],
293
+ 'viewer.guide.lens.hint': ['Count roles, reveal their traffic, and compare direct authored links.'],
294
+ 'viewer.guide.story': ['Play the guided story'],
295
+ 'viewer.guide.story.hint': ['Walk the authored chapters and real relationships.'],
296
+ 'viewer.guide.present': ['Enter Presentation Stage'],
297
+ 'viewer.guide.present.hint': ['Give the live diagram the viewport without changing export.'],
298
+ 'viewer.guide.shortcuts': ['Additional keyboard shortcuts'],
299
+ 'viewer.guide.shortcut.export': ['Export'],
300
+ 'viewer.guide.shortcut.theme': ['Theme'],
301
+ 'viewer.guide.shortcut.style': ['Style'],
302
+ 'viewer.guide.shortcut.reset': ['Reset'],
303
+ 'viewer.guide.shortcut.zoomIn': ['Zoom in'],
304
+ 'viewer.guide.shortcut.zoomOut': ['Zoom out'],
305
+ 'viewer.guide.shortcut.close': ['Close'],
306
+ 'viewer.guide.facts': ['{nodes} · {relationships} · {views}'],
307
+ 'viewer.guide.fact.node.one': ['{count} semantic node'],
308
+ 'viewer.guide.fact.node.other': ['{count} semantic nodes'],
309
+ 'viewer.guide.fact.relationship.one': ['{count} relationship'],
310
+ 'viewer.guide.fact.relationship.other': ['{count} relationships'],
311
+ 'viewer.guide.fact.view.one': ['{count} guided view'],
312
+ 'viewer.guide.fact.view.other': ['{count} guided views'],
313
+ 'viewer.guide.story.available.one': ['Walk {count} authored chapter and its real relationships.'],
314
+ 'viewer.guide.story.available.other': ['Walk {count} authored chapters and their real relationships.'],
315
+ 'viewer.guide.story.unavailable': ['No authored guided story in this diagram.'],
316
+ 'viewer.guide.open': ['Open diagram guide'],
317
+ 'viewer.guide.noStory': ['This diagram has no authored guided story.'],
318
+
319
+ 'viewer.finder.title': ['Find a node'],
320
+ 'viewer.finder.close': ['Close node finder'],
321
+ 'viewer.finder.placeholder': ['Search labels or IDs'],
322
+ 'viewer.finder.search': ['Search diagram nodes'],
323
+ 'viewer.finder.results': ['Diagram nodes'],
324
+ 'viewer.finder.empty': ['No matching nodes'],
325
+ 'viewer.finder.result.focus': ['Focus {label}'],
326
+ 'viewer.finder.result.routeStart': ['Choose {label} as route start'],
327
+ 'viewer.finder.result.routeTarget': ['Choose {label} as route destination, {links}'],
328
+ 'viewer.finder.status.empty': ['No matching nodes'],
329
+ 'viewer.finder.status.count.one': ['{count} matching node'],
330
+ 'viewer.finder.status.count.other': ['{count} matching nodes'],
331
+ 'viewer.finder.noun.nodes': ['nodes'],
332
+ 'viewer.finder.link.one': ['{count} link'],
333
+ 'viewer.finder.link.other': ['{count} links'],
334
+ 'viewer.finder.result.focus.one': ['Focus {label}, {count} related connection'],
335
+ 'viewer.finder.result.focus.other': ['Focus {label}, {count} related connections'],
336
+ 'viewer.finder.status.filtered': ['{visible} of {available} {noun}'],
337
+ 'viewer.finder.status.all': ['{available} {noun}'],
338
+
339
+ 'viewer.passport.eyebrow': ['Semantic passport'],
340
+ 'viewer.passport.metadata': ['Node metadata'],
341
+ 'viewer.passport.evidence': ['Verified source evidence'],
342
+ 'viewer.passport.verified': ['Verified source'],
343
+ 'viewer.passport.verificationScope': ['Verified against local Git at the pinned revision. Remote access has not been checked.'],
344
+ 'viewer.passport.reach': ['Authored reach'],
345
+ 'viewer.passport.reach.trace': ['Trace authored reachability'],
346
+ 'viewer.passport.upstream': ['Upstream'],
347
+ 'viewer.passport.downstream': ['Downstream'],
348
+ 'viewer.passport.upstream.trace': ['Trace upstream authored reachability'],
349
+ 'viewer.passport.downstream.trace': ['Trace downstream authored reachability'],
350
+ 'viewer.passport.close': ['Close semantic passport'],
351
+ 'viewer.passport.copy': ['Copy link'],
352
+ 'viewer.passport.copy.focus': ['Copy link to focused node'],
353
+ 'viewer.passport.relations': ['Relations'],
354
+ 'viewer.passport.relations.show': ['Show connected relationships'],
355
+ 'viewer.passport.relations.hide': ['Hide connected relationships'],
356
+ 'viewer.passport.relations.list': ['Connected relationships'],
357
+ 'viewer.passport.copyRelation': ['Copy relation'],
358
+ 'viewer.passport.copyNode': ['Copy node'],
359
+ 'viewer.passport.copyPinned': ['Copy link to pinned relationship'],
360
+ 'viewer.passport.copySource': ['Copy link to source node'],
361
+ 'viewer.passport.copy.focused.success': ['Focused node link copied'],
362
+ 'viewer.passport.copy.pinned.success': ['Pinned relationship link copied'],
363
+ 'viewer.passport.copy.focused.failed': ['Could not copy focused node link'],
364
+ 'viewer.passport.copy.pinned.failed': ['Could not copy pinned relationship link'],
365
+ 'viewer.passport.relationship.none': ['No connected relationships'],
366
+ 'viewer.passport.relationship.count.one': ['{count} relation'],
367
+ 'viewer.passport.relationship.count.other': ['{count} relations'],
368
+ 'viewer.passport.relationship.show.one': ['Show {count} connected relationship'],
369
+ 'viewer.passport.relationship.show.other': ['Show {count} connected relationships'],
370
+ 'viewer.passport.relationship.summary': ['{out} outgoing · {in} incoming{loops}'],
371
+ 'viewer.passport.relationship.loops': [' · {count} loop'],
372
+ 'viewer.passport.relationship.explorer': ['Direct relationship explorer'],
373
+ 'viewer.passport.relationship.help': ['Use arrow keys to explore relationships. Press Enter or Space to pin details; Escape clears.'],
374
+ 'viewer.passport.relationship.loopsBack': ['loops back'],
375
+ 'viewer.passport.relationship.connectsTo': ['connects to'],
376
+ 'viewer.passport.relationship.connectsFrom': ['connects from'],
377
+ 'viewer.passport.relationship.pinned': ['Pinned relationship · {from} → {to} · {label}'],
378
+ 'viewer.passport.relationship.inspect': ['Inspect relationship {index} of {total}: {from} to {to}, {label}. Press Enter for details.'],
379
+ 'viewer.passport.relationship.group.out': ['Outgoing'],
380
+ 'viewer.passport.relationship.group.in': ['Incoming'],
381
+ 'viewer.passport.relationship.group.loop': ['Self loops'],
382
+ 'viewer.passport.relationship.row': ['{group}: {relationship}, {neighbor}'],
383
+ 'viewer.passport.relationship.direction.out': ['OUT →'],
384
+ 'viewer.passport.relationship.direction.in': ['← IN'],
385
+ 'viewer.passport.relationship.direction.loop': ['LOOP'],
386
+ 'viewer.passport.sourceCount.one': ['{count} verified source reference'],
387
+ 'viewer.passport.sourceCount.other': ['{count} verified source references'],
388
+ 'viewer.passport.sourceMarker': ['SRC'],
389
+ 'viewer.passport.beacon.one': ['{count} verified source; focus this node to inspect'],
390
+ 'viewer.passport.beacon.other': ['{count} verified sources; focus this node to inspect'],
391
+ 'viewer.passport.repository.open': ['Open verified repository revision {revision}'],
392
+ 'viewer.passport.source.open': ['Open verified source {path} at revision {revision}'],
393
+ 'viewer.passport.source.openLink': ['Open ↗'],
394
+ 'viewer.passport.reach.upstream.one': ['Trace {count} upstream authored node'],
395
+ 'viewer.passport.reach.upstream.other': ['Trace {count} upstream authored nodes'],
396
+ 'viewer.passport.reach.downstream.one': ['Trace {count} downstream authored node'],
397
+ 'viewer.passport.reach.downstream.other': ['Trace {count} downstream authored nodes'],
398
+ 'viewer.passport.reach.noUpstream': ['No upstream authored nodes'],
399
+ 'viewer.passport.reach.noDownstream': ['No downstream authored nodes'],
400
+ 'viewer.passport.reach.status': ['{direction} · {nodes} nodes · {links} links · max {hops} hops'],
401
+
402
+ 'viewer.route.eyebrow': ['Route probe'],
403
+ 'viewer.route.start': ['Choose a start node'],
404
+ 'viewer.route.start.find': ['Find start'],
405
+ 'viewer.route.start.find.aria': ['Find a route start'],
406
+ 'viewer.route.copy': ['Copy link'],
407
+ 'viewer.route.copy.aria': ['Copy link to traced route'],
408
+ 'viewer.route.clear': ['Clear'],
409
+ 'viewer.route.clear.aria': ['Clear route probe'],
410
+ 'viewer.route.traced': ['Traced route'],
411
+ 'viewer.route.pickTwo': ['Pick two semantic nodes on the diagram'],
412
+ 'viewer.route.pickOne': ['Pick a semantic node on the diagram'],
413
+ 'viewer.route.controls': ['Route journey controls'],
414
+ 'viewer.route.previous': ['Previous route position'],
415
+ 'viewer.route.play': ['Play route journey'],
416
+ 'viewer.route.pause': ['Pause route journey'],
417
+ 'viewer.route.replay': ['Replay route journey'],
418
+ 'viewer.route.next': ['Next route position'],
419
+ 'viewer.route.journey': ['Journey'],
420
+ 'viewer.route.pause.label': ['Pause'],
421
+ 'viewer.route.replay.label': ['Replay'],
422
+ 'viewer.route.overview': ['Overview'],
423
+ 'viewer.route.overview.aria': ['Show complete route overview'],
424
+ 'viewer.route.instructions': ['Choose the source, then the destination. Direction matters.'],
425
+ 'viewer.route.destination': ['Choose a destination from {label}'],
426
+ 'viewer.route.destination.find': ['Find target'],
427
+ 'viewer.route.destination.find.aria': ['Find a reachable route destination'],
428
+ 'viewer.route.differentDestination': ['Choose a different destination'],
429
+ 'viewer.route.distinct': ['A route needs two distinct semantic nodes.'],
430
+ 'viewer.route.unreachable': ['No directed route to {label}'],
431
+ 'viewer.route.unreachable.detail': ['{target} is not reachable from {source}. Pick a highlighted destination.'],
432
+ 'viewer.route.start.instructions': ['Select the source. The next step will reveal only directed destinations.'],
433
+ 'viewer.route.copy.success': ['Traced route link copied'],
434
+ 'viewer.route.copy.failed': ['Could not copy traced route link'],
435
+ 'viewer.route.position': ['Route position {index} of {total}: {label}'],
436
+ 'viewer.route.step': ['Step {index} of {total} · {phase} · {label}'],
437
+ 'viewer.route.motionRequired': ['Automatic journey requires Live motion'],
438
+ 'viewer.route.trigger.clear': ['Clear traced route'],
439
+ 'viewer.route.overview.status': ['{nodes} · {hops} · shortest authored route'],
440
+ 'viewer.route.overview.node.one': ['{count} node'],
441
+ 'viewer.route.overview.node.other': ['{count} nodes'],
442
+ 'viewer.route.overview.hop.one': ['{count} directed hop'],
443
+ 'viewer.route.overview.hop.other': ['{count} directed hops'],
444
+ 'viewer.route.phase.playing': ['Playing'],
445
+ 'viewer.route.phase.complete': ['Complete'],
446
+ 'viewer.route.phase.inspecting': ['Inspecting'],
447
+ 'viewer.route.destination.count.one': ['{count} directed destination available. Pick a highlighted node.'],
448
+ 'viewer.route.destination.count.other': ['{count} directed destinations available. Pick a highlighted node.'],
449
+ 'viewer.route.noOutgoing': ['No outgoing route starts here. Clear and choose another source.'],
450
+ 'viewer.route.result.title': ['{source} to {target}'],
451
+ 'viewer.route.finder.source.title': ['Choose route start'],
452
+ 'viewer.route.finder.source.placeholder': ['Search route sources'],
453
+ 'viewer.route.finder.source.empty': ['No matching route sources'],
454
+ 'viewer.route.finder.source.results': ['Nodes that can start a route'],
455
+ 'viewer.route.finder.source.noun': ['route sources'],
456
+ 'viewer.route.finder.source.badge': ['start'],
457
+ 'viewer.route.finder.target.title': ['Destination from {label}'],
458
+ 'viewer.route.finder.target.placeholder': ['Search reachable destinations'],
459
+ 'viewer.route.finder.target.empty': ['No matching reachable destinations'],
460
+ 'viewer.route.finder.target.results': ['Reachable route destinations'],
461
+ 'viewer.route.finder.target.noun': ['reachable destinations'],
462
+ 'viewer.route.hop.one': ['{count} hop'],
463
+ 'viewer.route.hop.other': ['{count} hops'],
464
+
465
+ 'viewer.lens.eyebrow': ['Semantic lens'],
466
+ 'viewer.lens.title': ['Compare system roles'],
467
+ 'viewer.lens.close': ['Close semantic lens'],
468
+ 'viewer.lens.instruction': ['Choose up to two semantic kinds. One reveals its real traffic; two compare only direct authored relationships.'],
469
+ 'viewer.lens.kinds': ['Semantic kinds'],
470
+ 'viewer.lens.choose': ['Choose a kind to inspect its nodes and touching relationships.'],
471
+ 'viewer.lens.copy': ['Copy link to semantic lens'],
472
+ 'viewer.lens.clear': ['Clear semantic lens'],
473
+ 'viewer.lens.open': ['Open semantic lens'],
474
+ 'viewer.lens.openActive': ['Open active semantic lens'],
475
+ 'viewer.lens.legend': ['Semantic legend'],
476
+ 'viewer.lens.legend.inspect.one': ['Inspect {label}, {count} node'],
477
+ 'viewer.lens.legend.inspect.other': ['Inspect {label}, {count} nodes'],
478
+ 'viewer.lens.kind.count.one': ['{label}, {count} node'],
479
+ 'viewer.lens.kind.count.other': ['{label}, {count} nodes'],
480
+ 'viewer.lens.compare.one': ['{first} → {second}: {forward} · {second} → {first}: {reverse} · {count} direct relationship'],
481
+ 'viewer.lens.compare.other': ['{first} → {second}: {forward} · {second} → {first}: {reverse} · {count} direct relationships'],
482
+ 'viewer.lens.single': ['{nodes} · {relationships} · connected peers remain visible'],
483
+ 'viewer.lens.node.one': ['{count} {label} node'],
484
+ 'viewer.lens.node.other': ['{count} {label} nodes'],
485
+ 'viewer.lens.relationship.one': ['{count} touching relationship'],
486
+ 'viewer.lens.relationship.other': ['{count} touching relationships'],
487
+
488
+ 'viewer.radar.title': ['Semantic radar'],
489
+ 'viewer.radar.building': ['Building overview'],
490
+ 'viewer.radar.openFull': ['Open full semantic radar'],
491
+ 'viewer.radar.open': ['Open radar'],
492
+ 'viewer.radar.close': ['Close semantic radar'],
493
+ 'viewer.radar.surface': ['Diagram overview. Click a node to focus it, or use arrow keys to pan.'],
494
+ 'viewer.radar.click': ['Click node'],
495
+ 'viewer.radar.drag': ['Drag to pan'],
496
+ 'viewer.radar.space': ['Semantic radar needs more MAP space.'],
497
+ 'viewer.radar.nodes': ['Semantic diagram radar nodes'],
498
+ 'viewer.radar.focus': ['Focus {label} from Semantic Radar'],
499
+ 'viewer.radar.status': ['{count} nodes · {viewport}'],
500
+ 'viewer.radar.fullMap': ['{count} nodes · full map'],
501
+ 'viewer.radar.compacted': ['Radar compacted to avoid covering the Semantic Passport or MAP controls.'],
502
+ 'viewer.radar.cancelWaiting': ['Cancel semantic radar waiting for more MAP space'],
503
+ 'viewer.radar.needsSpace': ['Semantic radar needs more visible MAP space'],
504
+ 'viewer.radar.viewport.full': ['full map'],
505
+ 'viewer.radar.viewport.width': ['{percent}% width'],
506
+ 'viewer.radar.viewport.scale': ['{percent}% viewport'],
507
+
508
+ 'viewer.nav.controls': ['Diagram view controls'],
509
+ 'viewer.nav.route': ['Trace a directed route'],
510
+ 'viewer.nav.route.title': ['Trace route (R)'],
511
+ 'viewer.nav.route.short': ['PATH'],
512
+ 'viewer.nav.radar': ['Open semantic radar'],
513
+ 'viewer.nav.radar.title': ['Semantic radar (M)'],
514
+ 'viewer.nav.radar.short': ['MAP'],
515
+ 'viewer.nav.lens': ['Open semantic lens'],
516
+ 'viewer.nav.lens.title': ['Semantic lens (L)'],
517
+ 'viewer.nav.lens.short': ['LENS'],
518
+ 'viewer.nav.find': ['Find a node'],
519
+ 'viewer.nav.find.title': ['Find a node (/)'],
520
+ 'viewer.nav.guide': ['Open diagram guide'],
521
+ 'viewer.nav.guide.title': ['Diagram guide (?)'],
522
+ 'viewer.nav.zoomOut': ['Zoom out'],
523
+ 'viewer.nav.zoomOut.title': ['Zoom out (-)'],
524
+ 'viewer.nav.reset': ['Reset diagram view'],
525
+ 'viewer.nav.reset.title': ['Reset view (0)'],
526
+ 'viewer.nav.read': ['READ'],
527
+ 'viewer.nav.zoomIn': ['Zoom in'],
528
+ 'viewer.nav.zoomIn.title': ['Zoom in (+)'],
529
+ 'viewer.nav.camera': ['{hint}. Reset diagram view'],
530
+ 'viewer.nav.camera.title': ['{semantic}{hint} · reset view (0)'],
531
+ 'viewer.nav.camera.semantic': ['Semantic camera active · '],
532
+ 'viewer.nav.level.map': ['MAP'],
533
+ 'viewer.nav.level.read': ['READ'],
534
+ 'viewer.nav.level.full': ['FULL'],
535
+ 'viewer.nav.level.auto': ['AUTO'],
536
+ 'viewer.nav.detail.map': ['Zoom in to reveal relationship labels and node context'],
537
+ 'viewer.nav.detail.read': ['Zoom in again to reveal tags and annotations'],
538
+ 'viewer.nav.detail.full': ['Full diagram detail'],
539
+
540
+ 'viewer.intent.summary': ['{label}. {out} outgoing, {in} incoming{loops}. {total} connections. Press Enter for details.'],
541
+ 'viewer.intent.loops': [', {count} self loop'],
542
+
543
+ 'viewer.common.copied': ['Copied'],
544
+ 'viewer.common.copyFailed': ['Copy failed'],
545
+ 'viewer.common.copyLink': ['Copy link'],
546
+ 'viewer.common.clear': ['Clear'],
547
+ 'viewer.common.close': ['Close'],
548
+ };
549
+
550
+ for (const [key, messages] of Object.entries(MESSAGE_PAIRS)) {
551
+ if (messages.length !== SUPPORTED_LOCALES.length || messages.some((message) => typeof message !== 'string')) {
552
+ throw new Error(`Incomplete Archify i18n tuple ${JSON.stringify(key)}`);
553
+ }
554
+ }
555
+
556
+ const CATALOGS = Object.fromEntries(SUPPORTED_LOCALES.map((locale, index) => [
557
+ locale,
558
+ Object.fromEntries(Object.entries(MESSAGE_PAIRS).map(([key, pair]) => [key, pair[index]])),
559
+ ]));
560
+
561
+ export function resolveLocale(locale) {
562
+ return SUPPORTED_LOCALES.includes(locale) ? locale : DEFAULT_LOCALE;
563
+ }
564
+
565
+ export function formatMessage(template, values = {}) {
566
+ return String(template).replace(/\{([a-zA-Z0-9_]+)\}/g, (match, key) => (
567
+ Object.hasOwn(values, key) ? String(values[key]) : match
568
+ ));
569
+ }
570
+
571
+ export function translateMessage(locale, key, values = {}) {
572
+ const resolved = resolveLocale(locale);
573
+ if (!Object.hasOwn(CATALOGS[resolved], key)) {
574
+ throw new Error(`Missing Archify i18n message ${JSON.stringify(key)} for ${resolved}`);
575
+ }
576
+ return formatMessage(CATALOGS[resolved][key], values);
577
+ }
578
+
579
+ export function translateCount(locale, key, count, values = {}) {
580
+ const suffix = count === 1 ? 'one' : 'other';
581
+ return translateMessage(locale, `${key}.${suffix}`, { ...values, count });
582
+ }
583
+
584
+ export function viewerCatalog(locale) {
585
+ const resolved = resolveLocale(locale);
586
+ return Object.fromEntries(Object.entries(CATALOGS[resolved]).filter(([key]) => key.startsWith('viewer.')));
587
+ }
588
+
589
+ export function localizeTemplate(template, locale) {
590
+ return template.replace(/\{\{i18n:([a-zA-Z0-9_.-]+)\}\}/g, (_match, key) => escapeHtml(translateMessage(locale, key)));
591
+ }
592
+
593
+ export function catalogKeys() {
594
+ return Object.keys(MESSAGE_PAIRS);
595
+ }
@@ -0,0 +1,40 @@
1
+ /** Serialize computed layout for dry-run / inspect (#9). */
2
+
3
+ export function componentBox(c) {
4
+ return {
5
+ id: c.id,
6
+ type: c.type,
7
+ label: c.label,
8
+ x: Math.round(c.x),
9
+ y: Math.round(c.y),
10
+ width: c.width,
11
+ height: c.height,
12
+ ...(Number.isInteger(c.row) ? { row: c.row } : {}),
13
+ ...(Number.isInteger(c.col) ? { col: c.col } : {}),
14
+ ...(Array.isArray(c.pos) ? { pos: c.pos.map(Math.round) } : {}),
15
+ };
16
+ }
17
+
18
+ export function boundaryBox(b) {
19
+ return {
20
+ kind: b.kind,
21
+ label: b.label,
22
+ x: Math.round(b.x),
23
+ y: Math.round(b.y),
24
+ width: Math.round(b.width),
25
+ height: Math.round(b.height),
26
+ wraps: b.wraps,
27
+ };
28
+ }
29
+
30
+ export function connectionPath(conn, routed, labelAt) {
31
+ return {
32
+ from: conn.from,
33
+ to: conn.to,
34
+ label: conn.label ?? null,
35
+ variant: conn.variant ?? 'default',
36
+ route: conn.route ?? 'auto',
37
+ points: routed.points.map(([x, y]) => [Math.round(x), Math.round(y)]),
38
+ ...(labelAt ? { labelAt: labelAt.map(Math.round) } : {}),
39
+ };
40
+ }