thursday-agent 0.15.0 → 0.16.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 (660) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/prerender-manifest.json +4 -4
  4. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  10. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  11. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +13 -13
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
  15. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +11 -11
  16. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  17. package/.next/server/app/api/artifact/route.js +8 -8
  18. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  19. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
  20. package/.next/server/app/api/bot/memory/route.js +3 -3
  21. package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
  22. package/.next/server/app/api/bot/route.js +3 -3
  23. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  24. package/.next/server/app/api/bot/thread/[id]/route.js +7 -7
  25. package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -1
  26. package/.next/server/app/api/bot/thread/route.js +6 -6
  27. package/.next/server/app/api/bot/thread/route.js.nft.json +1 -1
  28. package/.next/server/app/api/config/route.js +5 -5
  29. package/.next/server/app/api/config/route.js.nft.json +1 -1
  30. package/.next/server/app/api/events/route.js +1 -1
  31. package/.next/server/app/api/events/route.js.nft.json +1 -1
  32. package/.next/server/app/api/favicon/[host]/route.js +1 -1
  33. package/.next/server/app/api/favicon/[host]/route.js.nft.json +1 -1
  34. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  35. package/.next/server/app/api/llm-model/catalog/route.js +7 -7
  36. package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
  37. package/.next/server/app/api/llm-model/credits/route.js +7 -7
  38. package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
  39. package/.next/server/app/api/llm-model/route.js +4 -4
  40. package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
  41. package/.next/server/app/api/llm-model/subscription/route.js +4 -4
  42. package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
  43. package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
  44. package/.next/server/app/api/mcp/oauth/callback/route.js +2 -2
  45. package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
  46. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  47. package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
  48. package/.next/server/app/api/memory/edit/route.js +14 -15
  49. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
  50. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  51. package/.next/server/app/api/reach/route.js +18 -19
  52. package/.next/server/app/api/reach/route.js.nft.json +1 -1
  53. package/.next/server/app/api/routine/route.js +3 -3
  54. package/.next/server/app/api/routine/route.js.nft.json +1 -1
  55. package/.next/server/app/api/signins/route.js +1 -1
  56. package/.next/server/app/api/signins/route.js.nft.json +1 -1
  57. package/.next/server/app/api/skills/[source]/[name]/route.js +8 -5
  58. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  59. package/.next/server/app/api/skills/route.js +8 -5
  60. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  61. package/.next/server/app/api/thursday/call/route.js +7 -7
  62. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  63. package/.next/server/app/api/thursday/settings/route.js +7 -7
  64. package/.next/server/app/api/thursday/settings/route.js.nft.json +1 -1
  65. package/.next/server/app/api/thursday/text/route.js +15 -16
  66. package/.next/server/app/api/thursday/text/route.js.nft.json +1 -1
  67. package/.next/server/app/api/thursday/tool-call/route.js +12 -13
  68. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  69. package/.next/server/app/api/workspace/files/route.js +7 -7
  70. package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
  71. package/.next/server/app/api/workspace/route.js +7 -7
  72. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  73. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +3 -3
  74. package/.next/server/app/artifact/[...path]/page.js +4 -4
  75. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  76. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  77. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  78. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  79. package/.next/server/app/page/server-reference-manifest.json +60 -60
  80. package/.next/server/app/page.js +9 -9
  81. package/.next/server/app/page.js.nft.json +1 -1
  82. package/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/server/chunks/[root-of-the-server]__00qyw01._.js +3 -0
  84. package/.next/server/chunks/[root-of-the-server]__03b09q0._.js +5 -0
  85. package/.next/server/chunks/[root-of-the-server]__03vunn6._.js +1 -1
  86. package/.next/server/chunks/{[root-of-the-server]__0adz-25._.js → [root-of-the-server]__05dp5tr._.js} +2 -2
  87. package/.next/server/chunks/[root-of-the-server]__05n-hql._.js +5 -0
  88. package/.next/server/chunks/[root-of-the-server]__06nspyt._.js +3 -0
  89. package/.next/server/chunks/[root-of-the-server]__0aijj66._.js +1 -1
  90. package/.next/server/chunks/[root-of-the-server]__0g38-aj._.js +5 -0
  91. package/.next/server/chunks/[root-of-the-server]__0h656y-._.js +11 -0
  92. package/.next/server/chunks/{[root-of-the-server]__0g67-oo._.js → [root-of-the-server]__0j_nz36._.js} +1 -1
  93. package/.next/server/chunks/[root-of-the-server]__0ljizgj._.js +1 -1
  94. package/.next/server/chunks/[root-of-the-server]__0mrk2it._.js +1 -1
  95. package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +1 -1
  96. package/.next/server/chunks/[root-of-the-server]__0tsded0._.js +5 -0
  97. package/.next/server/chunks/[root-of-the-server]__0tvoct-._.js +1 -1
  98. package/.next/server/chunks/[root-of-the-server]__1-tdj60._.js +3 -0
  99. package/.next/server/chunks/{[root-of-the-server]__0132c27._.js → [root-of-the-server]__10_7vqz._.js} +2 -2
  100. package/.next/server/chunks/[root-of-the-server]__10xnb7e._.js +3 -0
  101. package/.next/server/chunks/[root-of-the-server]__118qjk_._.js +3 -3
  102. package/.next/server/chunks/[root-of-the-server]__11g20j-._.js +3 -0
  103. package/.next/server/chunks/[root-of-the-server]__13hng6h._.js +1 -1
  104. package/.next/server/chunks/{[root-of-the-server]__0o-w4t4._.js → [root-of-the-server]__16yw3mb._.js} +2 -2
  105. package/.next/server/chunks/[root-of-the-server]__18e65_-._.js +3 -0
  106. package/.next/server/chunks/[root-of-the-server]__18k8s-z._.js +3 -0
  107. package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +1 -1
  108. package/.next/server/chunks/[root-of-the-server]__1b8tp42._.js +5 -0
  109. package/.next/server/chunks/[root-of-the-server]__1c2kwku._.js +12 -0
  110. package/.next/server/chunks/[root-of-the-server]__1ceammd._.js +1 -1
  111. package/.next/server/chunks/[root-of-the-server]__1ep-pao._.js +7 -0
  112. package/.next/server/chunks/[root-of-the-server]__1gamvcz._.js +3 -0
  113. package/.next/server/chunks/[root-of-the-server]__1gzcbda._.js +1 -1
  114. package/.next/server/chunks/{[root-of-the-server]__20tvhdf._.js → [root-of-the-server]__1mbd2w_._.js} +2 -2
  115. package/.next/server/chunks/[root-of-the-server]__1ndi14y._.js +1 -1
  116. package/.next/server/chunks/[root-of-the-server]__1p47fbb._.js +1 -1
  117. package/.next/server/chunks/[root-of-the-server]__1qcn1ti._.js +3 -3
  118. package/.next/server/chunks/[root-of-the-server]__1t0jj1j._.js +5 -0
  119. package/.next/server/chunks/[root-of-the-server]__1v7x5ym._.js +3 -0
  120. package/.next/server/chunks/[root-of-the-server]__1vlxv19._.js +1 -1
  121. package/.next/server/chunks/{[root-of-the-server]__0ei2xnb._.js → [root-of-the-server]__1voqqyc._.js} +1 -1
  122. package/.next/server/chunks/[root-of-the-server]__1ygplx1._.js +1 -1
  123. package/.next/server/chunks/[root-of-the-server]__1zn039k._.js +3 -0
  124. package/.next/server/chunks/[root-of-the-server]__1zrwxis._.js +3 -0
  125. package/.next/server/chunks/_01t8da9._.js +1 -1
  126. package/.next/server/chunks/_02fn1o3._.js +3 -0
  127. package/.next/server/chunks/_05sa7xl._.js +1 -1
  128. package/.next/server/chunks/_06u9yo-._.js +1 -1
  129. package/.next/server/chunks/_07nxi75._.js +250 -0
  130. package/.next/server/chunks/_08354bn._.js +107 -0
  131. package/.next/server/chunks/_0caua_s._.js +1 -1
  132. package/.next/server/chunks/_0j0-gq6._.js +5 -0
  133. package/.next/server/chunks/_0nn99o2._.js +1 -1
  134. package/.next/server/chunks/_0p-h6xe._.js +5 -0
  135. package/.next/server/chunks/_0p6v1fr._.js +5 -0
  136. package/.next/server/chunks/_0qoush_._.js +3 -0
  137. package/.next/server/chunks/_0srlnvd._.js +1 -1
  138. package/.next/server/chunks/_0t_7gji._.js +1 -1
  139. package/.next/server/chunks/_0uir6hb._.js +9 -9
  140. package/.next/server/chunks/_0uzj57i._.js +1 -1
  141. package/.next/server/chunks/_0xm040x._.js +1 -1
  142. package/.next/server/chunks/_0xx3ryc._.js +2 -2
  143. package/.next/server/chunks/_0xygcxs._.js +250 -0
  144. package/.next/server/chunks/{_0ol42w-._.js → _1-sk_q4._.js} +2 -2
  145. package/.next/server/chunks/_146mcip._.js +1 -1
  146. package/.next/server/chunks/_19kea1l._.js +8 -8
  147. package/.next/server/chunks/_1d5zmy8._.js +1 -1
  148. package/.next/server/chunks/_1dxq827._.js +5 -0
  149. package/.next/server/chunks/{_0ejoy4d._.js → _1e54wxa._.js} +2 -2
  150. package/.next/server/chunks/_1gn2r2q._.js +12 -12
  151. package/.next/server/chunks/_1gxankq._.js +2 -2
  152. package/.next/server/chunks/_1hyvcgk._.js +5 -0
  153. package/.next/server/chunks/_1m88lkh._.js +9 -9
  154. package/.next/server/chunks/_1mfu9a3._.js +5 -0
  155. package/.next/server/chunks/_1mx9sfo._.js +1 -1
  156. package/.next/server/chunks/_1ozcb6o._.js +27 -0
  157. package/.next/server/chunks/_1q6e56i._.js +12 -12
  158. package/.next/server/chunks/_1qgix-j._.js +1 -1
  159. package/.next/server/chunks/_1w6uf9k._.js +3 -0
  160. package/.next/server/chunks/_1wl2g8_._.js +2 -2
  161. package/.next/server/chunks/_1wwl_7o._.js +1 -1
  162. package/.next/server/chunks/_1xcnogc._.js +6 -0
  163. package/.next/server/chunks/_1zfxb7j._.js +1 -1
  164. package/.next/server/chunks/_20oecmn._.js +6 -0
  165. package/.next/server/chunks/_211dn2c._.js +1 -1
  166. package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
  167. package/.next/server/chunks/features_0wm-ujw._.js +6 -0
  168. package/.next/server/chunks/features_workspace_workspace_ts_13h82gv._.js +4 -4
  169. package/.next/server/chunks/features_workspace_workspace_ts_1iyjroj._.js +3 -3
  170. package/.next/server/chunks/{node_modules_1osf6vs._.js → node_modules_0dctjy-._.js} +1 -1
  171. package/.next/server/chunks/{node_modules_1821h5r._.js → node_modules_0mquap1._.js} +1 -1
  172. package/.next/server/chunks/{node_modules_1bfhxob._.js → node_modules_1er1u8w._.js} +1 -1
  173. package/.next/server/chunks/{node_modules_1i11kg5._.js → node_modules_1rosz79._.js} +1 -1
  174. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_035jiu9._.js → node_modules_consola_dist_chunks_prompt_mjs_0_nz09c._.js} +1 -1
  175. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0736s17._.js → node_modules_consola_dist_chunks_prompt_mjs_0rx6rvb._.js} +1 -1
  176. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_07szfwb._.js → node_modules_consola_dist_chunks_prompt_mjs_128pb4i._.js} +1 -1
  177. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0rzuf5j._.js → node_modules_consola_dist_chunks_prompt_mjs_1x3bsmx._.js} +1 -1
  178. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_20s275p._.js +3 -0
  179. package/.next/server/chunks/ssr/{[root-of-the-server]__0670az2._.js → [root-of-the-server]__02jdtqa._.js} +3 -2
  180. package/.next/server/chunks/ssr/[root-of-the-server]__0rnjkw2._.js +3 -0
  181. package/.next/server/chunks/ssr/[root-of-the-server]__10eb-1x._.js +3 -0
  182. package/.next/server/chunks/ssr/[root-of-the-server]__17h1ggo._.js +1 -1
  183. package/.next/server/chunks/ssr/[root-of-the-server]__1867koj._.js +1 -1
  184. package/.next/server/chunks/ssr/[root-of-the-server]__1d7usu0._.js +2 -2
  185. package/.next/server/chunks/ssr/{[root-of-the-server]__00ro8qe._.js → [root-of-the-server]__1jyeu61._.js} +2 -2
  186. package/.next/server/chunks/ssr/[root-of-the-server]__1y5_1cv._.js +3 -0
  187. package/.next/server/chunks/ssr/[root-of-the-server]__1y8_-v1._.js +3 -0
  188. package/.next/server/chunks/ssr/{_1zdizo8._.js → _0-ou1b0._.js} +2 -2
  189. package/.next/server/chunks/ssr/{_02u485c._.js → _0afrpci._.js} +2 -2
  190. package/.next/server/chunks/ssr/_0cd6g3l._.js +5 -5
  191. package/.next/server/chunks/ssr/{_0trt3zp._.js → _0fo4552._.js} +17 -19
  192. package/.next/server/chunks/ssr/{_168tvri._.js → _0l1-xc6._.js} +2 -2
  193. package/.next/server/chunks/ssr/{_1rxpx-u._.js → _0ncuqct._.js} +2 -2
  194. package/.next/server/chunks/ssr/_0qsmpcu._.js +1 -1
  195. package/.next/server/chunks/ssr/{_0c1h0l9._.js → _0r0g9ki._.js} +3 -3
  196. package/.next/server/chunks/ssr/_0rvbegp._.js +7 -0
  197. package/.next/server/chunks/ssr/{_1_n8qpv._.js → _0w8r7o7._.js} +2 -2
  198. package/.next/server/chunks/ssr/{_074hv3s._.js → _0wupyvd._.js} +2 -2
  199. package/.next/server/chunks/ssr/_0x8ophf._.js +1 -1
  200. package/.next/server/chunks/ssr/{_0z0scn4._.js → _0y28gl3._.js} +3 -3
  201. package/.next/server/chunks/ssr/{node_modules_0vi73_6._.js → _10-_awu._.js} +2 -2
  202. package/.next/server/chunks/ssr/{_06m66w8._.js → _10fwcz_._.js} +2 -2
  203. package/.next/server/chunks/ssr/{_0ze-0vs._.js → _11pnnvd._.js} +4 -4
  204. package/.next/server/chunks/ssr/_17ble8k._.js +162 -0
  205. package/.next/server/chunks/ssr/_17qtuv7._.js +3 -0
  206. package/.next/server/chunks/ssr/{_1xq-4on._.js → _1dqaksc._.js} +2 -2
  207. package/.next/server/chunks/ssr/{_20lwjif._.js → _1f6s34p._.js} +2 -2
  208. package/.next/server/chunks/ssr/_1g48r6t._.js +3 -0
  209. package/.next/server/chunks/ssr/_1k0efi3._.js +3 -0
  210. package/.next/server/chunks/ssr/_1neoj22._.js +1 -1
  211. package/.next/server/chunks/ssr/_1u5vsy-._.js +3 -0
  212. package/.next/server/chunks/ssr/_1uij_rj._.js +3 -0
  213. package/.next/server/chunks/ssr/{_1r0tx3q._.js → _1umbr78._.js} +3 -3
  214. package/.next/server/chunks/ssr/_1w9w1ok._.js +3 -0
  215. package/.next/server/chunks/ssr/_1z586yw._.js +3 -0
  216. package/.next/server/chunks/ssr/features_0796o8r._.js +3 -0
  217. package/.next/server/chunks/ssr/features_133mpna._.js +6 -0
  218. package/.next/server/chunks/ssr/features_bot_1k25jdg._.js +3 -0
  219. package/.next/server/chunks/ssr/{features_config_13cg2cx._.js → features_config_11dpa7r._.js} +3 -3
  220. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +3 -3
  221. package/.next/server/chunks/ssr/features_memory_components_memory-setting_tsx_0oa43sw._.js +1 -1
  222. package/.next/server/chunks/ssr/features_routine_components_routine-setting_tsx_055fknz._.js +1 -1
  223. package/.next/server/chunks/ssr/features_workspace_workspace_ts_1wc7_u_._.js +4 -3
  224. package/.next/server/chunks/ssr/{node_modules_1lmv1ux._.js → node_modules_0-8r9yw._.js} +1 -1
  225. package/.next/server/chunks/ssr/{node_modules_1-20i0r._.js → node_modules_0-ew8f8._.js} +1 -1
  226. package/.next/server/chunks/ssr/{node_modules_1us2bdc._.js → node_modules_02uwbwp._.js} +1 -1
  227. package/.next/server/chunks/ssr/{node_modules_1vx7yq2._.js → node_modules_097cl9f._.js} +1 -1
  228. package/.next/server/chunks/ssr/{node_modules_16oefzh._.js → node_modules_0bas34k._.js} +1 -1
  229. package/.next/server/chunks/ssr/{node_modules_0v6s4c8._.js → node_modules_0bbwe-u._.js} +1 -1
  230. package/.next/server/chunks/ssr/{node_modules_1ngj__4._.js → node_modules_0etz1i0._.js} +1 -1
  231. package/.next/server/chunks/ssr/{node_modules_0den7sw._.js → node_modules_0ka8te1._.js} +1 -1
  232. package/.next/server/chunks/ssr/{node_modules_10t4pbm._.js → node_modules_0ld7p-1._.js} +1 -1
  233. package/.next/server/chunks/ssr/{node_modules_09eqoqr._.js → node_modules_0mark4f._.js} +1 -1
  234. package/.next/server/chunks/ssr/{node_modules_01uutx9._.js → node_modules_0n1js5k._.js} +1 -1
  235. package/.next/server/chunks/ssr/{node_modules_0t93862._.js → node_modules_0sdjzae._.js} +1 -1
  236. package/.next/server/chunks/ssr/{node_modules_1x2-bh1._.js → node_modules_0u24mg0._.js} +1 -1
  237. package/.next/server/chunks/ssr/{node_modules_15ksxpk._.js → node_modules_0uibk9z._.js} +1 -1
  238. package/.next/server/chunks/ssr/{node_modules_0r6leyg._.js → node_modules_0x_2io2._.js} +1 -1
  239. package/.next/server/chunks/ssr/{node_modules_1_gizvz._.js → node_modules_0y5uubt._.js} +1 -1
  240. package/.next/server/chunks/ssr/{node_modules_1j59xrt._.js → node_modules_138kcrz._.js} +1 -1
  241. package/.next/server/chunks/ssr/{node_modules_20d3gsv._.js → node_modules_156m1qh._.js} +1 -1
  242. package/.next/server/chunks/ssr/{node_modules_19d6gup._.js → node_modules_18yn_bs._.js} +1 -1
  243. package/.next/server/chunks/ssr/{node_modules_218nu70._.js → node_modules_1dzye0n._.js} +1 -1
  244. package/.next/server/chunks/ssr/{node_modules_1gdff1c._.js → node_modules_1o9n7_n._.js} +1 -1
  245. package/.next/server/chunks/ssr/{node_modules_0yslr-j._.js → node_modules_1ozyial._.js} +1 -1
  246. package/.next/server/chunks/ssr/{node_modules_16op-wf._.js → node_modules_1r5o-bo._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_1uil5qp._.js → node_modules_1tj7_9z._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_0h3dnyw._.js → node_modules_1xua-g1._.js} +1 -1
  249. package/.next/server/chunks/ssr/{node_modules_03hfcze._.js → node_modules_1zkzksd._.js} +1 -1
  250. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0wbgrv5._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_133hjui._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_15680yt._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1b3vwd3._.js} +1 -1
  252. package/.next/server/middleware-build-manifest.js +3 -3
  253. package/.next/server/pages/404.html +1 -1
  254. package/.next/server/pages/500.html +1 -1
  255. package/.next/server/server-reference-manifest.js +1 -1
  256. package/.next/server/server-reference-manifest.json +61 -61
  257. package/.next/static/chunks/00d54fcfm-lko.js +1 -0
  258. package/.next/static/chunks/05scfrgo_a_5_.js +58 -0
  259. package/.next/static/chunks/{1rjn_x_ty28qc.js → 0609ejkwuy4sf.js} +2 -2
  260. package/.next/static/chunks/{3w3v100tg-tun.js → 07vcuxousbmy1.js} +1 -1
  261. package/.next/static/chunks/{3r1p-za3kwq6b.js → 0cl_fgkphk1oz.js} +1 -1
  262. package/.next/static/chunks/0gjlsu6vrfzod.js +1 -0
  263. package/.next/static/chunks/0npvak0wpgagb.js +1 -0
  264. package/.next/static/chunks/{1wkrzv0y4qx48.js → 0o7o0eb7ihxi6.js} +1 -1
  265. package/.next/static/chunks/0q4ws7qd21chx.js +35 -0
  266. package/.next/static/chunks/{2q33y6q5_4yxf.js → 0unonxbajyknw.js} +1 -1
  267. package/.next/static/chunks/17yqt1p_svv13.js +1 -0
  268. package/.next/static/chunks/19l81deo_pyoc.js +1 -0
  269. package/.next/static/chunks/1ub9obhgfm4jl.js +1 -0
  270. package/.next/static/chunks/203pbwecfs3tm.js +1 -0
  271. package/.next/static/chunks/{30_2pay06oou4.js → 23tx-2paw9qa6.js} +3 -3
  272. package/.next/static/chunks/{22djpz2dakws5.js → 245_cp14iz637.js} +1 -1
  273. package/.next/static/chunks/2jbjyazqfqyoh.js +1 -0
  274. package/.next/static/chunks/2oa4gpkzjtpni.js +1 -0
  275. package/.next/static/chunks/2uraofiaoy32s.js +1 -0
  276. package/.next/static/chunks/{1ln0zczby868j.js → 2xjr5b-yk_h3o.js} +2 -2
  277. package/.next/static/chunks/314szf8yer-3n.js +2 -0
  278. package/.next/static/chunks/{38srd01ofppmn.css → 31kn4_h2rvf6k.css} +1 -1
  279. package/.next/static/chunks/39miwvg4k-b2d.js +1 -0
  280. package/.next/static/chunks/3ghvoe_mlljzs.js +15 -0
  281. package/.next/static/chunks/{2-9ybn1k9el1e.js → 3gn7dubb4-pwy.js} +1 -1
  282. package/.next/static/chunks/3j-l8un0d77v7.js +18 -0
  283. package/.next/static/chunks/{1iezy4u4v9kl7.js → 3ro66d9dc70bc.js} +1 -1
  284. package/.next/static/chunks/3vwjs5kq11417.js +1 -0
  285. package/.next/static/chunks/42m371fn687r5.js +1 -0
  286. package/README.md +3 -1
  287. package/guide/bots.md +3 -2
  288. package/guide/calls.md +16 -15
  289. package/guide/index.md +1 -1
  290. package/guide/setup.md +19 -10
  291. package/guide/trouble.md +12 -2
  292. package/package.json +2 -2
  293. package/public/sounds/NOTICE +213 -0
  294. package/public/sounds/end_voice.ogg +0 -0
  295. package/public/sounds/ring.ogg +0 -0
  296. package/public/sounds/start_voice.ogg +0 -0
  297. package/seed-skills/concierge/travel/SKILL.md +4 -4
  298. package/seed-skills/marketer/marketing/references/copywriting-copy-frameworks.md +3 -10
  299. package/seed-skills/marketer/marketing/references/copywriting.md +2 -2
  300. package/seed-skills/marketer/marketing/references/social-platforms.md +5 -5
  301. package/skills/artifact/SKILL.md +2 -1
  302. package/skills/artifact/references/book.md +2 -3
  303. package/skills/artifact/references/deck.md +4 -0
  304. package/skills/artifact/runtime/app/kit/vite.config.ts +6 -3
  305. package/skills/artifact/runtime/app/page/index.html +1 -1
  306. package/skills/artifact/runtime/book/book.html +1 -1
  307. package/skills/artifact/runtime/canvas/canvas.html +1 -1
  308. package/skills/artifact/runtime/deck/deck.html +1 -1
  309. package/skills/artifact/runtime/document/quick.html +1 -1
  310. package/skills/artifact/scripts/chart.mjs +122 -14
  311. package/skills/artifact/scripts/document.mjs +3 -2
  312. package/skills/daily-brief/scripts/story.mjs +13 -1
  313. package/skills/media-digest/SKILL.md +4 -2
  314. package/skills/media-digest/references/no-captions.md +2 -1
  315. package/skills/media-digest/scripts/audio.mjs +7 -2
  316. package/.next/server/chunks/[root-of-the-server]__0876r42._.js +0 -3
  317. package/.next/server/chunks/[root-of-the-server]__0brcw76._.js +0 -3
  318. package/.next/server/chunks/[root-of-the-server]__0c_j_qe._.js +0 -3
  319. package/.next/server/chunks/[root-of-the-server]__0grmfwp._.js +0 -5
  320. package/.next/server/chunks/[root-of-the-server]__0kv916d._.js +0 -3
  321. package/.next/server/chunks/[root-of-the-server]__0tkqhnc._.js +0 -3
  322. package/.next/server/chunks/[root-of-the-server]__0vffrja._.js +0 -5
  323. package/.next/server/chunks/[root-of-the-server]__0vn91fr._.js +0 -5
  324. package/.next/server/chunks/[root-of-the-server]__0vxvcj4._.js +0 -3
  325. package/.next/server/chunks/[root-of-the-server]__0zbo906._.js +0 -5
  326. package/.next/server/chunks/[root-of-the-server]__10ep3hy._.js +0 -3
  327. package/.next/server/chunks/[root-of-the-server]__10iry08._.js +0 -3
  328. package/.next/server/chunks/[root-of-the-server]__11d0tvc._.js +0 -5
  329. package/.next/server/chunks/[root-of-the-server]__19sv9or._.js +0 -5
  330. package/.next/server/chunks/[root-of-the-server]__1_1zysn._.js +0 -3
  331. package/.next/server/chunks/[root-of-the-server]__1e0f7he._.js +0 -7
  332. package/.next/server/chunks/[root-of-the-server]__1fdpwcm._.js +0 -3
  333. package/.next/server/chunks/[root-of-the-server]__1hgdkzg._.js +0 -11
  334. package/.next/server/chunks/[root-of-the-server]__1ksm9m-._.js +0 -12
  335. package/.next/server/chunks/[root-of-the-server]__1l_nubj._.js +0 -3
  336. package/.next/server/chunks/[root-of-the-server]__1pmsv_6._.js +0 -3
  337. package/.next/server/chunks/[root-of-the-server]__1tdudkf._.js +0 -5
  338. package/.next/server/chunks/_02lipqs._.js +0 -5
  339. package/.next/server/chunks/_034lk-r._.js +0 -3
  340. package/.next/server/chunks/_04ynt0z._.js +0 -252
  341. package/.next/server/chunks/_171rt-v._.js +0 -109
  342. package/.next/server/chunks/_17esum5._.js +0 -5
  343. package/.next/server/chunks/_1p8rzg_._.js +0 -252
  344. package/.next/server/chunks/_1v5g4kx._.js +0 -3
  345. package/.next/server/chunks/_1vxrw1q._.js +0 -5
  346. package/.next/server/chunks/features_0-cnt0l._.js +0 -4
  347. package/.next/server/chunks/features_0hdaci0._.js +0 -4
  348. package/.next/server/chunks/features_0p85gv6._.js +0 -3
  349. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0ta6hsy._.js +0 -3
  350. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0tok7g7._.js +0 -3
  351. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_187uwe9._.js +0 -3
  352. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1cu9mam._.js +0 -3
  353. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1g1et-d._.js +0 -3
  354. package/.next/server/chunks/ssr/[root-of-the-server]__099tvf0._.js +0 -3
  355. package/.next/server/chunks/ssr/[root-of-the-server]__0dxszdt._.js +0 -3
  356. package/.next/server/chunks/ssr/[root-of-the-server]__0ihvne0._.js +0 -3
  357. package/.next/server/chunks/ssr/[root-of-the-server]__11hcjwx._.js +0 -3
  358. package/.next/server/chunks/ssr/_018vrx-._.js +0 -3
  359. package/.next/server/chunks/ssr/_0afqubz._.js +0 -162
  360. package/.next/server/chunks/ssr/_0ayihi5._.js +0 -3
  361. package/.next/server/chunks/ssr/_0gv5wzb._.js +0 -3
  362. package/.next/server/chunks/ssr/_0kkdx7t._.js +0 -3
  363. package/.next/server/chunks/ssr/_0yjztzi._.js +0 -3
  364. package/.next/server/chunks/ssr/_14fdswx._.js +0 -3
  365. package/.next/server/chunks/ssr/_1ajl6hf._.js +0 -5
  366. package/.next/server/chunks/ssr/_1o_i8-d._.js +0 -7
  367. package/.next/server/chunks/ssr/_1ri-y7z._.js +0 -4
  368. package/.next/server/chunks/ssr/features_0ctqq63._.js +0 -4
  369. package/.next/server/chunks/ssr/features_bot_0v6r-lh._.js +0 -3
  370. package/.next/static/chunks/0j8_qql4enu93.js +0 -1
  371. package/.next/static/chunks/0mr03ivl4_fxd.js +0 -1
  372. package/.next/static/chunks/13qwyo9-jd5kw.js +0 -1
  373. package/.next/static/chunks/17_b97pj_av_t.js +0 -1
  374. package/.next/static/chunks/18id2dgl_39_1.js +0 -18
  375. package/.next/static/chunks/1lp02y2nmddxg.js +0 -1
  376. package/.next/static/chunks/249i2g6ele3t2.js +0 -1
  377. package/.next/static/chunks/249wisxmxrwa9.js +0 -1
  378. package/.next/static/chunks/27dovttmtqjhi.js +0 -15
  379. package/.next/static/chunks/2k1rwhz_x2lej.js +0 -1
  380. package/.next/static/chunks/2p2pqpub-48me.js +0 -58
  381. package/.next/static/chunks/34-6gj9kheq74.js +0 -2
  382. package/.next/static/chunks/3a29oqdmvp25o.js +0 -35
  383. package/.next/static/chunks/3c_bgfr_z4peu.js +0 -1
  384. package/.next/static/chunks/3gyqds2iodotb.js +0 -1
  385. package/.next/static/chunks/3hxors_gsfsut.js +0 -1
  386. package/.next/static/chunks/3q-3lu8gpr4-h.js +0 -1
  387. package/.next/static/chunks/3qkm3p4g4ajku.js +0 -3
  388. package/.next/static/chunks/3w3mgbz8nuug2.js +0 -1
  389. package/app/api/bot/memory/files/route.ts +0 -14
  390. package/app/api/bot/memory/route.ts +0 -5
  391. package/app/api/events/app-event.client.ts +0 -30
  392. package/app/api/events/app-event.server.ts +0 -47
  393. package/app/api/events/app-event.ts +0 -78
  394. package/app/api/llm-model/catalog/route.ts +0 -12
  395. package/app/api/llm-model/credits/route.ts +0 -11
  396. package/app/api/llm-model/route.ts +0 -26
  397. package/app/api/llm-model/subscription/route.ts +0 -11
  398. package/app/api/memory/edit/route.ts +0 -7
  399. package/app/api/memory/route.ts +0 -8
  400. package/app/api/query-key.ts +0 -192
  401. package/app/api/thursday/tool-call/route.ts +0 -76
  402. package/biome.json +0 -72
  403. package/components/ui/button-group.tsx +0 -45
  404. package/components/ui/custom-icon.tsx +0 -199
  405. package/components/ui/dropdown-menu.tsx +0 -271
  406. package/components/ui/folded-text.tsx +0 -68
  407. package/components/ui/input-group.tsx +0 -157
  408. package/components/ui/json-view.tsx +0 -240
  409. package/components/ui/radio-group.tsx +0 -37
  410. package/components/ui/shiny-text.tsx +0 -68
  411. package/components/ui/site-icon.tsx +0 -45
  412. package/components/ui/source-chips.tsx +0 -54
  413. package/components/ui/theme-sync.tsx +0 -9
  414. package/components.json +0 -25
  415. package/docs/how-it-works.md +0 -76
  416. package/docs/images/errands-dark.png +0 -0
  417. package/docs/images/errands-light.png +0 -0
  418. package/docs/images/hero-dark.png +0 -0
  419. package/docs/images/hero-light.png +0 -0
  420. package/docs/images/keeps-going.png +0 -0
  421. package/docs/images/more-dark.png +0 -0
  422. package/docs/images/more-light.png +0 -0
  423. package/docs/images/results-dark.png +0 -0
  424. package/docs/images/results-light.png +0 -0
  425. package/docs/images/talk-dark.png +0 -0
  426. package/docs/images/talk-light.png +0 -0
  427. package/docs/images/team-dark.png +0 -0
  428. package/docs/images/team-light.png +0 -0
  429. package/docs/images/two-minds.png +0 -0
  430. package/features/ai/chatgpt.ts +0 -638
  431. package/features/ai/components/chatgpt-sign-in.tsx +0 -66
  432. package/features/ai/components/effort-switch.tsx +0 -112
  433. package/features/ai/components/gateway-mark.tsx +0 -188
  434. package/features/ai/components/model-browser.tsx +0 -324
  435. package/features/ai/components/model-picker.tsx +0 -336
  436. package/features/ai/components/provider-icon.tsx +0 -162
  437. package/features/ai/guide.ts +0 -44
  438. package/features/ai/live.schema.ts +0 -150
  439. package/features/ai/load-tools.ts +0 -495
  440. package/features/ai/model.schema.ts +0 -985
  441. package/features/ai/model.ts +0 -662
  442. package/features/ai/prompts/bot.prompt.ts +0 -418
  443. package/features/ai/prompts/call-standing.ts +0 -43
  444. package/features/ai/prompts/live.prompt.ts +0 -197
  445. package/features/ai/prompts/memory-edit.prompt.ts +0 -33
  446. package/features/ai/prompts/persona.ts +0 -114
  447. package/features/ai/prompts/prompt-helper.ts +0 -287
  448. package/features/ai/prompts/thursday.prompt.ts +0 -281
  449. package/features/ai/tools/bot.tool.ts +0 -183
  450. package/features/ai/tools/call.tool.ts +0 -50
  451. package/features/ai/tools/connected.ts +0 -199
  452. package/features/ai/tools/deck.tool.ts +0 -518
  453. package/features/ai/tools/look.tool.ts +0 -65
  454. package/features/ai/tools/mcp.tool.ts +0 -187
  455. package/features/ai/tools/memory.tool.ts +0 -296
  456. package/features/ai/tools/routine.tool.ts +0 -214
  457. package/features/ai/tools/search.tool.ts +0 -248
  458. package/features/ai/tools/self.tool.ts +0 -58
  459. package/features/ai/tools/signin.tool.ts +0 -138
  460. package/features/ai/tools/skills.tool.ts +0 -109
  461. package/features/ai/tools/studio.tool.ts +0 -360
  462. package/features/ai/tools/tool-name.ts +0 -56
  463. package/features/ai/tools/workspace.tool.ts +0 -126
  464. package/features/ai/words.ts +0 -60
  465. package/features/artifact/artifact.action.ts +0 -12
  466. package/features/artifact/artifact.query.ts +0 -218
  467. package/features/artifact/artifact.schema.ts +0 -58
  468. package/features/artifact/components/artifact-setting.tsx +0 -513
  469. package/features/bot/bot.action.ts +0 -195
  470. package/features/bot/bot.memory.ts +0 -206
  471. package/features/bot/bot.query.ts +0 -293
  472. package/features/bot/bot.run.ts +0 -909
  473. package/features/bot/bot.runner.ts +0 -595
  474. package/features/bot/bot.schema.ts +0 -501
  475. package/features/bot/bot.seed.ts +0 -160
  476. package/features/bot/components/attachments.tsx +0 -225
  477. package/features/bot/components/bot-badge.tsx +0 -21
  478. package/features/bot/components/bot-mark.tsx +0 -1678
  479. package/features/bot/components/bot-room.tsx +0 -439
  480. package/features/bot/components/bot-roster.tsx +0 -43
  481. package/features/bot/components/bot-setting.tsx +0 -1698
  482. package/features/bot/components/bot-tip.tsx +0 -48
  483. package/features/bot/components/bot-tool.tsx +0 -644
  484. package/features/bot/components/crew-motion.ts +0 -168
  485. package/features/bot/components/mark-palette.tsx +0 -57
  486. package/features/bot/components/room-conversation.tsx +0 -1208
  487. package/features/bot/components/room-list.tsx +0 -539
  488. package/features/bot/components/room-pill.tsx +0 -1045
  489. package/features/bot/components/thread-badge.tsx +0 -37
  490. package/features/bot/components/thread-reply.tsx +0 -780
  491. package/features/bot/components/thread-setting.tsx +0 -718
  492. package/features/bot/components/write-orb.tsx +0 -298
  493. package/features/bot/mark.const.ts +0 -164
  494. package/features/bot/room.query.ts +0 -922
  495. package/features/bot/room.schema.ts +0 -78
  496. package/features/bot/seed-bots.ts +0 -44
  497. package/features/bot/thread.query.ts +0 -1175
  498. package/features/bot/thread.store.ts +0 -726
  499. package/features/config/components/config-badge.tsx +0 -28
  500. package/features/config/components/config-setting.tsx +0 -881
  501. package/features/config/components/models-badge.tsx +0 -42
  502. package/features/config/components/voice-key.tsx +0 -321
  503. package/features/config/config.action.ts +0 -67
  504. package/features/config/config.const.ts +0 -356
  505. package/features/config/config.query.ts +0 -43
  506. package/features/connectors/components/mcp-badge.tsx +0 -17
  507. package/features/connectors/components/mcp-mark.tsx +0 -4
  508. package/features/connectors/components/mcp-setting.tsx +0 -1028
  509. package/features/connectors/mcp.action.ts +0 -93
  510. package/features/connectors/mcp.const.ts +0 -336
  511. package/features/connectors/mcp.manager.ts +0 -497
  512. package/features/connectors/mcp.query.ts +0 -256
  513. package/features/connectors/mcp.schema.ts +0 -122
  514. package/features/intro/components/echoes.tsx +0 -563
  515. package/features/intro/components/intro.tsx +0 -964
  516. package/features/intro/intro-voice.ts +0 -174
  517. package/features/memory/components/memory-edit.tsx +0 -333
  518. package/features/memory/components/memory-mark.tsx +0 -4
  519. package/features/memory/components/memory-setting.tsx +0 -662
  520. package/features/memory/memory.action.ts +0 -75
  521. package/features/memory/memory.edit.ts +0 -79
  522. package/features/memory/memory.query.ts +0 -513
  523. package/features/memory/memory.schema.ts +0 -196
  524. package/features/reach/channel.ts +0 -127
  525. package/features/reach/chat-text.ts +0 -364
  526. package/features/reach/components/reach-ask.tsx +0 -94
  527. package/features/reach/components/reach-badge.tsx +0 -22
  528. package/features/reach/components/reach-guide.tsx +0 -777
  529. package/features/reach/discord.ts +0 -308
  530. package/features/reach/pictures.ts +0 -88
  531. package/features/reach/reach.action.ts +0 -30
  532. package/features/reach/reach.schema.ts +0 -80
  533. package/features/reach/reach.ts +0 -946
  534. package/features/reach/slack.ts +0 -319
  535. package/features/reach/socket.ts +0 -63
  536. package/features/reach/telegram.ts +0 -323
  537. package/features/routine/components/routine-mark.tsx +0 -7
  538. package/features/routine/components/routine-setting.tsx +0 -1078
  539. package/features/routine/routine.action.ts +0 -31
  540. package/features/routine/routine.clock.ts +0 -102
  541. package/features/routine/routine.query.ts +0 -207
  542. package/features/routine/routine.schema.ts +0 -157
  543. package/features/settings/components/install-app.tsx +0 -153
  544. package/features/settings/components/setting-ui.tsx +0 -482
  545. package/features/settings/components/settings.tsx +0 -464
  546. package/features/settings/settings.alert.ts +0 -42
  547. package/features/settings/settings.store.ts +0 -44
  548. package/features/signins/components/signin-ask.tsx +0 -51
  549. package/features/signins/components/signins-setting.tsx +0 -261
  550. package/features/signins/signins.action.ts +0 -22
  551. package/features/signins/signins.query.ts +0 -261
  552. package/features/signins/signins.schema.ts +0 -26
  553. package/features/skills/components/skills-mark.tsx +0 -4
  554. package/features/skills/components/skills-setting.tsx +0 -736
  555. package/features/skills/skills.action.ts +0 -118
  556. package/features/skills/skills.discover.ts +0 -146
  557. package/features/skills/skills.query.ts +0 -363
  558. package/features/skills/skills.schema.ts +0 -105
  559. package/features/thursday/ascii.const.ts +0 -218
  560. package/features/thursday/call-signal.ts +0 -41
  561. package/features/thursday/components/ascii-orb.tsx +0 -1523
  562. package/features/thursday/components/boot.tsx +0 -24
  563. package/features/thursday/components/call-log.tsx +0 -503
  564. package/features/thursday/components/caption-words.tsx +0 -117
  565. package/features/thursday/components/connect-wave.tsx +0 -266
  566. package/features/thursday/components/face.tsx +0 -137
  567. package/features/thursday/components/side-captions.tsx +0 -347
  568. package/features/thursday/components/tab-state.tsx +0 -108
  569. package/features/thursday/components/thursday-mark.tsx +0 -168
  570. package/features/thursday/components/thursday-setting.tsx +0 -1084
  571. package/features/thursday/components/thursday.tsx +0 -1823
  572. package/features/thursday/components/voice-picker.tsx +0 -254
  573. package/features/thursday/components/write-line.tsx +0 -714
  574. package/features/thursday/expressions.ts +0 -1278
  575. package/features/thursday/eyes.ts +0 -274
  576. package/features/thursday/face-words.ts +0 -44
  577. package/features/thursday/face.const.ts +0 -6
  578. package/features/thursday/face.store.ts +0 -62
  579. package/features/thursday/field.ts +0 -93
  580. package/features/thursday/open-work.ts +0 -180
  581. package/features/thursday/screen-act.ts +0 -15
  582. package/features/thursday/silent-voice.ts +0 -14
  583. package/features/thursday/smoke.ts +0 -510
  584. package/features/thursday/thursday.action.ts +0 -266
  585. package/features/thursday/thursday.query.ts +0 -382
  586. package/features/thursday/thursday.schema.ts +0 -251
  587. package/features/thursday/thursday.store.ts +0 -129
  588. package/features/thursday/thursday.text.ts +0 -567
  589. package/features/thursday/tool-call.ts +0 -42
  590. package/features/thursday/tool-line.ts +0 -333
  591. package/features/thursday/use-call-ring.ts +0 -194
  592. package/features/thursday/use-live-settings.ts +0 -66
  593. package/features/thursday/use-text-call.ts +0 -551
  594. package/features/thursday/use-thursday.ts +0 -1231
  595. package/features/thursday/wash.ts +0 -116
  596. package/features/thursday/work-chip.tsx +0 -64
  597. package/features/workspace/components/artifact-view.tsx +0 -510
  598. package/features/workspace/components/file-thumb.tsx +0 -253
  599. package/features/workspace/components/file-view.tsx +0 -875
  600. package/features/workspace/components/given-files.tsx +0 -195
  601. package/features/workspace/components/workspace-mark.tsx +0 -4
  602. package/features/workspace/components/workspace-setting.tsx +0 -454
  603. package/features/workspace/file-kind.ts +0 -190
  604. package/features/workspace/workspace.action.ts +0 -88
  605. package/features/workspace/workspace.query.ts +0 -220
  606. package/features/workspace/workspace.schema.ts +0 -58
  607. package/features/workspace/workspace.ts +0 -553
  608. package/hooks/use-draft.ts +0 -38
  609. package/hooks/use-hotkey.ts +0 -171
  610. package/hooks/use-object-state.ts +0 -22
  611. package/hooks/use-on-visible.ts +0 -72
  612. package/hooks/use-theme.ts +0 -120
  613. package/hooks/use-wake-word.ts +0 -262
  614. package/knip.json +0 -7
  615. package/lib/date-like.ts +0 -37
  616. package/lib/desktop-notify.ts +0 -81
  617. package/lib/favicon.ts +0 -88
  618. package/lib/json-schema.ts +0 -42
  619. package/lib/live/live.schema.ts +0 -36
  620. package/lib/live/live.server.ts +0 -188
  621. package/lib/live/live.session.ts +0 -712
  622. package/lib/live/live.tap.ts +0 -288
  623. package/lib/live/live.transport.ts +0 -152
  624. package/lib/live/ring.ts +0 -62
  625. package/lib/logger.ts +0 -14
  626. package/lib/oauth-page.ts +0 -27
  627. package/lib/protocol/events.client.ts +0 -89
  628. package/lib/protocol/events.server.ts +0 -158
  629. package/lib/protocol/events.ts +0 -53
  630. package/lib/protocol/presence.ts +0 -65
  631. package/lib/protocol/result.ts +0 -63
  632. package/lib/protocol/server-action.ts +0 -13
  633. package/lib/protocol/server-route.ts +0 -20
  634. package/lib/protocol/to-result.ts +0 -46
  635. package/lib/protocol/use-server-action.ts +0 -105
  636. package/lib/protocol/use-server-pages.ts +0 -117
  637. package/lib/protocol/use-server-route.ts +0 -165
  638. package/lib/public-error.ts +0 -19
  639. package/lib/queue.ts +0 -79
  640. package/lib/reveal-path.ts +0 -46
  641. package/lib/sandbox.ts +0 -269
  642. package/lib/theme.ts +0 -9
  643. package/lib/tokens.ts +0 -35
  644. package/lib/utils.ts +0 -163
  645. package/release-please-config.json +0 -21
  646. package/scripts/artifact-paths.test.mts +0 -56
  647. package/scripts/bot-context.test.mts +0 -2122
  648. package/scripts/intro-voice.mts +0 -65
  649. package/scripts/live-history.test.mts +0 -115
  650. package/scripts/live-session.test.mts +0 -1286
  651. package/scripts/memory-tools.test.mts +0 -177
  652. package/scripts/page-edits.test.mts +0 -319
  653. package/scripts/reach-channels.test.mts +0 -524
  654. package/scripts/skill-files.test.mts +0 -225
  655. package/scripts/text-call.test.mts +0 -540
  656. package/skills-lock.json +0 -23
  657. package/tsconfig.json +0 -44
  658. /package/.next/static/{0yrnAMu4F_o69_DY3W-ho → RtLRT9EEaGn-OqwpMFdYg}/_buildManifest.js +0 -0
  659. /package/.next/static/{0yrnAMu4F_o69_DY3W-ho → RtLRT9EEaGn-OqwpMFdYg}/_clientMiddlewareManifest.js +0 -0
  660. /package/.next/static/{0yrnAMu4F_o69_DY3W-ho → RtLRT9EEaGn-OqwpMFdYg}/_ssgManifest.js +0 -0
@@ -0,0 +1,213 @@
1
+ The sounds in this folder come from the Android Open Source Project,
2
+ platform/frameworks/base, data/sounds/effects/ogg:
3
+ https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/data/sounds/effects/ogg/
4
+
5
+ Copyright (C) The Android Open Source Project.
6
+ Licensed under the Apache License, Version 2.0; the full text follows.
7
+
8
+ start_voice.ogg NFCSuccess.ogg, 1.2 dB quieter, re-encoded as Opus
9
+ end_voice.ogg NFCTransferComplete.ogg, 4.8 dB louder, re-encoded as Opus
10
+ ring.ogg NFCInitiated.ogg, 2.2 dB quieter, re-encoded as Opus
11
+
12
+
13
+ Apache License
14
+ Version 2.0, January 2004
15
+ http://www.apache.org/licenses/
16
+
17
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
18
+
19
+ 1. Definitions.
20
+
21
+ "License" shall mean the terms and conditions for use, reproduction,
22
+ and distribution as defined by Sections 1 through 9 of this document.
23
+
24
+ "Licensor" shall mean the copyright owner or entity authorized by
25
+ the copyright owner that is granting the License.
26
+
27
+ "Legal Entity" shall mean the union of the acting entity and all
28
+ other entities that control, are controlled by, or are under common
29
+ control with that entity. For the purposes of this definition,
30
+ "control" means (i) the power, direct or indirect, to cause the
31
+ direction or management of such entity, whether by contract or
32
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
33
+ outstanding shares, or (iii) beneficial ownership of such entity.
34
+
35
+ "You" (or "Your") shall mean an individual or Legal Entity
36
+ exercising permissions granted by this License.
37
+
38
+ "Source" form shall mean the preferred form for making modifications,
39
+ including but not limited to software source code, documentation
40
+ source, and configuration files.
41
+
42
+ "Object" form shall mean any form resulting from mechanical
43
+ transformation or translation of a Source form, including but
44
+ not limited to compiled object code, generated documentation,
45
+ and conversions to other media types.
46
+
47
+ "Work" shall mean the work of authorship, whether in Source or
48
+ Object form, made available under the License, as indicated by a
49
+ copyright notice that is included in or attached to the work
50
+ (an example is provided in the Appendix below).
51
+
52
+ "Derivative Works" shall mean any work, whether in Source or Object
53
+ form, that is based on (or derived from) the Work and for which the
54
+ editorial revisions, annotations, elaborations, or other modifications
55
+ represent, as a whole, an original work of authorship. For the purposes
56
+ of this License, Derivative Works shall not include works that remain
57
+ separable from, or merely link (or bind by name) to the interfaces of,
58
+ the Work and Derivative Works thereof.
59
+
60
+ "Contribution" shall mean any work of authorship, including
61
+ the original version of the Work and any modifications or additions
62
+ to that Work or Derivative Works thereof, that is intentionally
63
+ submitted to Licensor for inclusion in the Work by the copyright owner
64
+ or by an individual or Legal Entity authorized to submit on behalf of
65
+ the copyright owner. For the purposes of this definition, "submitted"
66
+ means any form of electronic, verbal, or written communication sent
67
+ to the Licensor or its representatives, including but not limited to
68
+ communication on electronic mailing lists, source code control systems,
69
+ and issue tracking systems that are managed by, or on behalf of, the
70
+ Licensor for the purpose of discussing and improving the Work, but
71
+ excluding communication that is conspicuously marked or otherwise
72
+ designated in writing by the copyright owner as "Not a Contribution."
73
+
74
+ "Contributor" shall mean Licensor and any individual or Legal Entity
75
+ on behalf of whom a Contribution has been received by Licensor and
76
+ subsequently incorporated within the Work.
77
+
78
+ 2. Grant of Copyright License. Subject to the terms and conditions of
79
+ this License, each Contributor hereby grants to You a perpetual,
80
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
81
+ copyright license to reproduce, prepare Derivative Works of,
82
+ publicly display, publicly perform, sublicense, and distribute the
83
+ Work and such Derivative Works in Source or Object form.
84
+
85
+ 3. Grant of Patent License. Subject to the terms and conditions of
86
+ this License, each Contributor hereby grants to You a perpetual,
87
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
88
+ (except as stated in this section) patent license to make, have made,
89
+ use, offer to sell, sell, import, and otherwise transfer the Work,
90
+ where such license applies only to those patent claims licensable
91
+ by such Contributor that are necessarily infringed by their
92
+ Contribution(s) alone or by combination of their Contribution(s)
93
+ with the Work to which such Contribution(s) was submitted. If You
94
+ institute patent litigation against any entity (including a
95
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
96
+ or a Contribution incorporated within the Work constitutes direct
97
+ or contributory patent infringement, then any patent licenses
98
+ granted to You under this License for that Work shall terminate
99
+ as of the date such litigation is filed.
100
+
101
+ 4. Redistribution. You may reproduce and distribute copies of the
102
+ Work or Derivative Works thereof in any medium, with or without
103
+ modifications, and in Source or Object form, provided that You
104
+ meet the following conditions:
105
+
106
+ (a) You must give any other recipients of the Work or
107
+ Derivative Works a copy of this License; and
108
+
109
+ (b) You must cause any modified files to carry prominent notices
110
+ stating that You changed the files; and
111
+
112
+ (c) You must retain, in the Source form of any Derivative Works
113
+ that You distribute, all copyright, patent, trademark, and
114
+ attribution notices from the Source form of the Work,
115
+ excluding those notices that do not pertain to any part of
116
+ the Derivative Works; and
117
+
118
+ (d) If the Work includes a "NOTICE" text file as part of its
119
+ distribution, then any Derivative Works that You distribute must
120
+ include a readable copy of the attribution notices contained
121
+ within such NOTICE file, excluding those notices that do not
122
+ pertain to any part of the Derivative Works, in at least one
123
+ of the following places: within a NOTICE text file distributed
124
+ as part of the Derivative Works; within the Source form or
125
+ documentation, if provided along with the Derivative Works; or,
126
+ within a display generated by the Derivative Works, if and
127
+ wherever such third-party notices normally appear. The contents
128
+ of the NOTICE file are for informational purposes only and
129
+ do not modify the License. You may add Your own attribution
130
+ notices within Derivative Works that You distribute, alongside
131
+ or as an addendum to the NOTICE text from the Work, provided
132
+ that such additional attribution notices cannot be construed
133
+ as modifying the License.
134
+
135
+ You may add Your own copyright statement to Your modifications and
136
+ may provide additional or different license terms and conditions
137
+ for use, reproduction, or distribution of Your modifications, or
138
+ for any such Derivative Works as a whole, provided Your use,
139
+ reproduction, and distribution of the Work otherwise complies with
140
+ the conditions stated in this License.
141
+
142
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
143
+ any Contribution intentionally submitted for inclusion in the Work
144
+ by You to the Licensor shall be under the terms and conditions of
145
+ this License, without any additional terms or conditions.
146
+ Notwithstanding the above, nothing herein shall supersede or modify
147
+ the terms of any separate license agreement you may have executed
148
+ with Licensor regarding such Contributions.
149
+
150
+ 6. Trademarks. This License does not grant permission to use the trade
151
+ names, trademarks, service marks, or product names of the Licensor,
152
+ except as required for reasonable and customary use in describing the
153
+ origin of the Work and reproducing the content of the NOTICE file.
154
+
155
+ 7. Disclaimer of Warranty. Unless required by applicable law or
156
+ agreed to in writing, Licensor provides the Work (and each
157
+ Contributor provides its Contributions) on an "AS IS" BASIS,
158
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
159
+ implied, including, without limitation, any warranties or conditions
160
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
161
+ PARTICULAR PURPOSE. You are solely responsible for determining the
162
+ appropriateness of using or redistributing the Work and assume any
163
+ risks associated with Your exercise of permissions under this License.
164
+
165
+ 8. Limitation of Liability. In no event and under no legal theory,
166
+ whether in tort (including negligence), contract, or otherwise,
167
+ unless required by applicable law (such as deliberate and grossly
168
+ negligent acts) or agreed to in writing, shall any Contributor be
169
+ liable to You for damages, including any direct, indirect, special,
170
+ incidental, or consequential damages of any character arising as a
171
+ result of this License or out of the use or inability to use the
172
+ Work (including but not limited to damages for loss of goodwill,
173
+ work stoppage, computer failure or malfunction, or any and all
174
+ other commercial damages or losses), even if such Contributor
175
+ has been advised of the possibility of such damages.
176
+
177
+ 9. Accepting Warranty or Additional Liability. While redistributing
178
+ the Work or Derivative Works thereof, You may choose to offer,
179
+ and charge a fee for, acceptance of support, warranty, indemnity,
180
+ or other liability obligations and/or rights consistent with this
181
+ License. However, in accepting such obligations, You may act only
182
+ on Your own behalf and on Your sole responsibility, not on behalf
183
+ of any other Contributor, and only if You agree to indemnify,
184
+ defend, and hold each Contributor harmless for any liability
185
+ incurred by, or claims asserted against, such Contributor by reason
186
+ of your accepting any such warranty or additional liability.
187
+
188
+ END OF TERMS AND CONDITIONS
189
+
190
+ APPENDIX: How to apply the Apache License to your work.
191
+
192
+ To apply the Apache License to your work, attach the following
193
+ boilerplate notice, with the fields enclosed by brackets "[]"
194
+ replaced with your own identifying information. (Don't include
195
+ the brackets!) The text should be enclosed in the appropriate
196
+ comment syntax for the file format. We also recommend that a
197
+ file or class name and description of purpose be included on the
198
+ same "printed page" as the copyright notice for easier
199
+ identification within third-party archives.
200
+
201
+ Copyright [yyyy] [name of copyright owner]
202
+
203
+ Licensed under the Apache License, Version 2.0 (the "License");
204
+ you may not use this file except in compliance with the License.
205
+ You may obtain a copy of the License at
206
+
207
+ http://www.apache.org/licenses/LICENSE-2.0
208
+
209
+ Unless required by applicable law or agreed to in writing, software
210
+ distributed under the License is distributed on an "AS IS" BASIS,
211
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
212
+ See the License for the specific language governing permissions and
213
+ limitations under the License.
Binary file
Binary file
Binary file
@@ -19,9 +19,9 @@ call. `S=<this skill's dir>/scripts`, `D=$THURSDAY_SKILLS/data-report/scripts`.
19
19
  hand to another bot: a hand-off pays for a second bot's prompt, skills and browser, and for the
20
20
  messages between you, to find what one search of yours finds.
21
21
 
22
- **Flights come from a published search; the rest from a page on the user's screen.** Nothing
23
- here reads another site by script: a search page moves without notice, and a wrong price is worse
24
- than none.
22
+ **Flights come from a published search; the rest from a page on the user's screen.** You read
23
+ only what that page shows them, never a site's own endpoints behind it: a search page moves
24
+ without notice, and a wrong price is worse than none.
25
25
 
26
26
  - **With Kiwi connected** — `search-flight` on the `kiwi` server, among your own tools or under
27
27
  `## Connected tools` in your prompt — flights are that tool (`tool_search` it for the exact
@@ -30,7 +30,7 @@ than none.
30
30
  - **Without it, and for a stay**, the results are the user's to choose from, so the search opens
31
31
  on their screen — `--headed`, the `browser` skill — and you read it there. The answer then ends
32
32
  by saying that connecting Kiwi in Settings › Connectors finds flights without a window. Google's
33
- search pages take the search in their address:
33
+ public search pages take the search in their address, as it reads today:
34
34
 
35
35
  ```
36
36
  https://www.google.com/travel/flights?q=Flights to LIS from LHR on 2026-11-12 through 2026-11-15 for 2 adults&curr=USD&hl=en
@@ -7,7 +7,7 @@ Headline formulas, page section types, and structural templates.
7
7
  - Landing Page Section Types (core sections, supporting sections)
8
8
  - Page Structure Templates (feature-heavy page, varied engaging page, compact landing page, enterprise/B2B landing page, product launch page)
9
9
  - Section Writing Tips (problem section, benefits section, how it works section, testimonial selection)
10
- - Clarity & Message-Market Fit (the "Now you can" test, Human Action Model, the Perception Gap, the SavvyCal case, clarity metrics)
10
+ - Clarity & Message-Market Fit (the "Now you can" test, Human Action Model, the Perception Gap, the SavvyCal case)
11
11
 
12
12
  ## Headline Formulas
13
13
 
@@ -419,15 +419,8 @@ That one line **roughly tripled (3×) conversions**. It works because it hits al
419
419
 
420
420
  The lesson: message-market fit beats feature lists. The winning line wasn't cleverer — it named a real feeling the reader hadn't heard a scheduling tool acknowledge before. Run your own hero through "Now you can…" and the Human Action Model to find that line.
421
421
 
422
- ### Clarity Beats Cleverness (the metrics)
422
+ ### Clarity Beats Cleverness
423
423
 
424
- When teams measure it, clarity — not wit — is what moves the numbers. Clearer positioning and copy is associated with:
425
-
426
- - **+81% conversions**
427
- - **−38% sales cycle** (shorter time to close)
428
- - **−28% CAC** (lower customer acquisition cost)
429
- - **+175% referrals**
430
-
431
- The mechanism: clear copy lets the *right* buyer self-qualify fast and the wrong one bounce early, so every downstream metric improves. Clever copy that requires decoding does the opposite — it adds a comprehension tax at the exact moment attention is scarcest.
424
+ Clarity, not wit, is what moves the numbers. The mechanism: clear copy lets the *right* buyer self-qualify fast and the wrong one bounce early, so every downstream metric improves. Clever copy that requires decoding does the opposite — it adds a comprehension tax at the exact moment attention is scarcest.
432
425
 
433
426
  **Practical rule:** if a reader has to pause to figure out what you mean, you've already lost. When forced to choose between a clever line and a clear one, ship the clear one — then use the tests above ("Now you can…", the Human Action Model, the Perception Gap) to make the clear line compelling too.
@@ -45,9 +45,9 @@ Gather this context — fill it from the page as it stands, the product brief an
45
45
  ## Copywriting Principles
46
46
 
47
47
  ### Clarity Over Cleverness
48
- If you have to choose between clear and creative, choose clear. Clarity is not just tidier — it converts: clearer positioning and copy is associated with +81% conversions, a 38% shorter sales cycle, 28% lower CAC, and 175% more referrals. When a reader has to decode your line, you've lost them.
48
+ If you have to choose between clear and creative, choose clear. When a reader has to decode your line, you've lost them.
49
49
 
50
- **For message-market fit tools** — the "Now you can" test, the Human Action Model (discomfort → vision → path), the Perception Gap, and the clarity metrics: See [references/copywriting-copy-frameworks.md](copywriting-copy-frameworks.md#clarity--message-market-fit)
50
+ **For message-market fit tools** — the "Now you can" test, the Human Action Model (discomfort → vision → path), and the Perception Gap: See [references/copywriting-copy-frameworks.md](copywriting-copy-frameworks.md#clarity--message-market-fit)
51
51
 
52
52
  ### Benefits Over Features
53
53
  Features: What it does. Benefits: What that means for the customer.
@@ -14,7 +14,7 @@ Detailed strategies for each major social platform.
14
14
  **Best for:** B2B, thought leadership, professional networking, recruiting
15
15
  **Audience:** Professionals, decision-makers, job seekers
16
16
  **Posting frequency:** 3-5x per week
17
- **Best times:** Tuesday-Thursday, 7-8am, 12pm, 5-6pm
17
+ **Best times:** when their own audience is active, from the account's analytics — no hour holds for every audience or time zone
18
18
 
19
19
  **What works:**
20
20
  - Personal stories with business lessons
@@ -52,7 +52,7 @@ Detailed strategies for each major social platform.
52
52
  **Best for:** Tech, media, real-time commentary, community building
53
53
  **Audience:** Tech-savvy, news-oriented, niche communities
54
54
  **Posting frequency:** 3-10x per day (including replies)
55
- **Best times:** Varies by audience; test and measure
55
+ **Best times:** when their own audience is active, from the account's analytics — no hour holds for every audience or time zone
56
56
 
57
57
  **What works:**
58
58
  - Hot takes and opinions
@@ -88,7 +88,7 @@ Detailed strategies for each major social platform.
88
88
  **Best for:** Visual brands, lifestyle, e-commerce, younger demographics
89
89
  **Audience:** 18-44, visual-first consumers
90
90
  **Posting frequency:** 1-2 feed posts per day, 3-10 Stories per day
91
- **Best times:** 11am-1pm, 7-9pm
91
+ **Best times:** when their own audience is active, from the account's analytics — no hour holds for every audience or time zone
92
92
 
93
93
  **What works:**
94
94
  - High-quality visuals
@@ -124,7 +124,7 @@ Detailed strategies for each major social platform.
124
124
  **Best for:** Brand awareness, younger audiences, viral potential
125
125
  **Audience:** 16-34, entertainment-focused
126
126
  **Posting frequency:** 1-4x per day
127
- **Best times:** 7-9am, 12-3pm, 7-11pm
127
+ **Best times:** when their own audience is active, from the account's analytics — no hour holds for every audience or time zone
128
128
 
129
129
  **What works:**
130
130
  - Native, unpolished content
@@ -154,7 +154,7 @@ Detailed strategies for each major social platform.
154
154
  **Best for:** Communities, local businesses, older demographics, groups
155
155
  **Audience:** 25-55+, community-oriented
156
156
  **Posting frequency:** 1-2x per day
157
- **Best times:** 1-4pm weekdays
157
+ **Best times:** when their own audience is active, from the account's analytics — no hour holds for every audience or time zone
158
158
 
159
159
  **What works:**
160
160
  - Facebook Groups (community)
@@ -42,7 +42,8 @@ document.
42
42
  ## Charts
43
43
 
44
44
  Numbers they should see are a chart, drawn into the document, page or book that carries them:
45
- `node $S/chart.mjs <file.html> <figure id> <data.csv>` (no arguments lists its options). Never
45
+ `node $S/chart.mjs <file.html> <figure id> <data.csv>`; on a slide, a board or a post, it is a
46
+ picture: `node $S/chart.mjs <picture.svg> <data.csv>` (no arguments lists its options). Never
46
47
  hand-write chart SVG.
47
48
 
48
49
  A few paragraphs that answer a question stay your final text; a kind here is for what they will
@@ -70,9 +70,8 @@ Choose each page's picture in this order:
70
70
  ```
71
71
 
72
72
  It saves the page's own picture (`--all` adds the large ones in its body)
73
- through the session's browser, so a site that refuses `curl` still answers,
74
- keeps only what came back as an image, and prints each file with its size and
75
- a `Credit:` line. Every run writes `web-01.…`, so rename what you keep to the
73
+ through the session's browser, keeps only what came back as an image, and
74
+ prints each file with its size and a `Credit:` line. Every run writes `web-01.…`, so rename what you keep to the
76
75
  page's own name before fetching the next one. Put the credit in the figure:
77
76
  `<figcaption>Photo: <author>, <a href="…">source</a>, <license></figcaption>`.
78
77
  - **A structure, a flow, a relation** — parts of a whole, one thing asking
@@ -17,6 +17,10 @@ fill them well.
17
17
  source in the slide's footer.
18
18
  - **Pictures come off the pages you read** (`webimage.mjs`, SKILL.md) and go in an `image` slide
19
19
  with their credit; a picture that only decorates is left out.
20
+ - **Numbers that move are a chart**, drawn as a picture from their CSV —
21
+ `node $THURSDAY_SKILLS/artifact/scripts/chart.mjs <scratch>/<name>.svg <data.csv>` — and put in
22
+ an `image` slide with `fit` whole; the heading beside it says what it shows, and its source goes
23
+ in the slide's footer.
20
24
  - **Notes are speech**: what the presenter says over the slide, in their voice, never the slide's
21
25
  words again.
22
26
  - **Changing a deck** is sending the whole deck again with the `revision` the last call answered
@@ -3,10 +3,13 @@ import react from "@vitejs/plugin-react";
3
3
  import { defineConfig } from "vite";
4
4
  import { viteSingleFile } from "vite-plugin-singlefile";
5
5
 
6
- // One page per build, named by PAGE (scripts/page.mjs sets it). Each page keeps its
7
- // own output and cache, so two pages can build at once.
6
+ // One page per build, named by PAGE (the artifact skill's scripts/app.mjs sets it). Each
7
+ // page keeps its own output and cache, so two pages can build at once.
8
8
  const page = process.env.PAGE;
9
- if (!page) throw new Error("PAGE is not set: build with scripts/page.mjs");
9
+ if (!page)
10
+ throw new Error(
11
+ "PAGE is not set: build with the artifact skill's scripts/app.mjs build <name>",
12
+ );
10
13
  const root = path.resolve(__dirname, "pages", page);
11
14
 
12
15
  export default defineConfig({
@@ -1,5 +1,5 @@
1
1
  <!doctype html>
2
- <html lang="en">
2
+ <html>
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
@@ -1,5 +1,5 @@
1
1
  <!doctype html>
2
- <html lang="en">
2
+ <html>
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
@@ -1,5 +1,5 @@
1
1
  <!doctype html>
2
- <html lang="en">
2
+ <html>
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
@@ -1,5 +1,5 @@
1
1
  <!doctype html>
2
- <html lang="en">
2
+ <html>
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
@@ -1,5 +1,5 @@
1
1
  <!doctype html>
2
- <html lang="en">
2
+ <html>
3
3
  <head>
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -6,6 +6,10 @@
6
6
  // and the same figure is replaced.
7
7
  //
8
8
  // node chart.mjs <page.html> <id> <data.csv> [options]
9
+ // node chart.mjs <picture.svg> <data.csv> [options]
10
+ // the chart alone as a picture, its title and source on it, on a
11
+ // light card that reads on any ground: a deck's image slide (fit
12
+ // whole), a board, a post
9
13
  //
10
14
  // --kind line|bar line when the first column is dates, bar otherwise
11
15
  // --title "<text>" what the chart shows (default: the CSV's `# title:`)
@@ -26,7 +30,8 @@
26
30
  //
27
31
  // The figure carries no words of its own beyond what it is given, so it reads the same
28
32
  // in any language: the site's name, a date, "CSV".
29
- import { existsSync, readFileSync } from "node:fs";
33
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
34
+ import { dirname, resolve } from "node:path";
30
35
  import {
31
36
  END,
32
37
  editedSince,
@@ -522,13 +527,77 @@ function sourceLinks(text) {
522
527
  .replace(/(<\/a>) (<a )/g, "$1, $2");
523
528
  }
524
529
 
530
+ /**
531
+ * The chart alone as an SVG file: its title and unit above, its source below, on a light card
532
+ * of its own, since a picture does not know the ground it will sit on. The page's stylesheet
533
+ * travels inside it, with the light colours only, and without the readout, which needs a page.
534
+ */
535
+ function writePicture(path, { svg, title, sub, source }) {
536
+ const [, W, H] = svg.match(/viewBox="0 0 ([\d.]+) ([\d.]+)"/) ?? [];
537
+ const pad = 24;
538
+ const head = 22 + (sub ? 20 : 0) + 12;
539
+ const foot = source ? 30 : 8;
540
+ const width = Number(W) + pad * 2;
541
+ const height = pad + head + Number(H) + foot + pad;
542
+ const inner = svg
543
+ .replace(/ data-chart='[^']*'/, "")
544
+ .replace('<g class="hover"></g>', "")
545
+ .replace(/class="chart-svg (wide|narrow)"/, 'class="chart-svg"')
546
+ .replace(
547
+ "<svg ",
548
+ `<svg x="${pad}" y="${pad + head}" width="${W}" height="${H}" `,
549
+ );
550
+ // The drawing's own rules; the page's sizing rule (width 100%) would stretch the inner
551
+ // drawing past the card, where its size attributes are what it keeps
552
+ const style = STYLE.replace(/<\/?style[^>]*>/g, "")
553
+ .split("\n")
554
+ .filter(
555
+ (line) =>
556
+ line.startsWith(".chart-svg") &&
557
+ !line.startsWith(".chart-svg{") &&
558
+ !line.includes(".narrow") &&
559
+ !line.includes(".hover"),
560
+ )
561
+ .join("\n");
562
+ const plainSource = String(source ?? "")
563
+ .split(/\s+/)
564
+ .map((part) =>
565
+ /^https?:\/\//.test(part)
566
+ ? new URL(part).hostname.replace(/^www\./, "")
567
+ : part,
568
+ )
569
+ .join(" ");
570
+ const file = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width} ${height}" width="${width}" height="${height}" role="img" aria-label="${esc(title)}">
571
+ <style>
572
+ .pic{font:${FONT}px ui-sans-serif,system-ui,-apple-system,sans-serif;font-variant-numeric:tabular-nums}
573
+ .pic-title{font-size:16px;font-weight:600;fill:#18181b}
574
+ .pic-sub,.pic-source{font-size:12px;fill:#71717a}
575
+ ${style}
576
+ </style>
577
+ <g class="pic">
578
+ <rect width="${width}" height="${height}" rx="14" fill="#ffffff"/>
579
+ <text class="pic-title" x="${pad}" y="${pad + 16}">${esc(title)}</text>
580
+ ${sub ? `<text class="pic-sub" x="${pad}" y="${pad + 36}">${esc(sub)}</text>` : ""}
581
+ ${inner}
582
+ ${plainSource ? `<text class="pic-source" x="${pad}" y="${height - pad}">${esc(plainSource)}</text>` : ""}
583
+ </g>
584
+ </svg>
585
+ `;
586
+ mkdirSync(dirname(resolve(path)), { recursive: true });
587
+ writeFileSync(path, file);
588
+ }
589
+
525
590
  function main() {
526
591
  const { positional, flags } = parseArgs(process.argv.slice(2));
527
- const [pagePath, id, csvPath] = positional;
528
- if (!pagePath || !id || !csvPath) throw new Stop(usage());
529
- if (!/^[\w-]+$/.test(id))
592
+ // A picture takes no page and no id: the first path names what is written
593
+ const picture = /\.svg$/i.test(positional[0] ?? "") ? positional[0] : null;
594
+ const [pagePath, id, csvPath] = picture
595
+ ? [null, null, positional[1]]
596
+ : positional;
597
+ if (!csvPath || (!picture && (!pagePath || !id))) throw new Stop(usage());
598
+ if (!picture && !/^[\w-]+$/.test(id))
530
599
  throw new Stop(`"${id}" is not an id: letters, numbers, - and _ only.`);
531
- if (!existsSync(pagePath))
600
+ if (!picture && !existsSync(pagePath))
532
601
  throw new Stop(
533
602
  `No page at ${pagePath}. Put a document first (the artifact skill's document.mjs), or give any HTML file.`,
534
603
  );
@@ -608,6 +677,8 @@ function main() {
608
677
  throw new Stop(`No numbers in ${wanted.join(", ")}.`);
609
678
 
610
679
  let chart;
680
+ let lineDraw;
681
+ let barDraw;
611
682
  if (kind === "line") {
612
683
  let indexed = null;
613
684
  if (flags.index) {
@@ -640,7 +711,7 @@ function main() {
640
711
  );
641
712
  return { t, text: label.join("=") || date };
642
713
  });
643
- const draw = (size) =>
714
+ lineDraw = (size) =>
644
715
  lineChart({
645
716
  xs,
646
717
  labels: body.map((r) => r[0]),
@@ -651,7 +722,7 @@ function main() {
651
722
  locale,
652
723
  size,
653
724
  });
654
- chart = both(draw);
725
+ chart = both(lineDraw);
655
726
  } else {
656
727
  let order = body.map((_, i) => i);
657
728
  if (!flags["keep-order"])
@@ -660,7 +731,7 @@ function main() {
660
731
  (series[0].values[b] ?? -Infinity) -
661
732
  (series[0].values[a] ?? -Infinity),
662
733
  );
663
- chart = both((size) =>
734
+ barDraw = (size) =>
664
735
  barChart({
665
736
  labels: order.map((i) => body[i][0]),
666
737
  series: series.map((s) => ({
@@ -670,8 +741,8 @@ function main() {
670
741
  fmt,
671
742
  highlight: highlight ?? null,
672
743
  size,
673
- }),
674
- );
744
+ });
745
+ chart = both(barDraw);
675
746
  }
676
747
 
677
748
  const title =
@@ -702,6 +773,19 @@ function main() {
702
773
  `<tr><td>${esc(r[0])}</td>${cols.map((c) => `<td class="num">${toNumber(r[c]) === null ? "—" : esc(fmt.exact(r[c]))}</td>`).join("")}</tr>`,
703
774
  )
704
775
  .join("")}</tbody></table>`;
776
+ if (picture) {
777
+ const drawn = (kind === "line" ? lineDraw : barDraw)(SIZES.wide);
778
+ writePicture(picture, {
779
+ svg: drawn.svg,
780
+ title,
781
+ sub,
782
+ source: [source, note].filter(Boolean).join(". "),
783
+ });
784
+ console.log(
785
+ `Drew "${title}" (${kind}, ${body.length} rows) as a picture: ${picture}. On a deck, an image slide with fit "whole"; elsewhere an <img>.`,
786
+ );
787
+ return;
788
+ }
705
789
  const download = `data:text/csv;charset=utf-8,${encodeURIComponent(text)}`;
706
790
  const figure = `<figure id="${id}" class="chart">
707
791
  <p class="chart-title">${esc(title)}</p>${sub ? `\n<p class="chart-sub">${esc(sub)}</p>` : ""}
@@ -713,9 +797,7 @@ ${sourceLine}
713
797
  let html = readFileSync(pagePath, "utf8");
714
798
  // Whether the reader changed the document since the bot last put or got it (put.mjs)
715
799
  const edited = editedSince(html);
716
- const existing = new RegExp(
717
- `<(figure|div|section|p)\\b[^>]*\\bid=["']${id}["'][^>]*>[\\s\\S]*?</\\1>`,
718
- );
800
+ const span = elementSpan(html, id);
719
801
  const selfClosed = new RegExp(
720
802
  `<(figure|div|section|p)\\b[^>]*\\bid=["']${id}["'][^>]*/>`,
721
803
  );
@@ -724,7 +806,7 @@ ${sourceLine}
724
806
  const waiting = [
725
807
  ...html.matchAll(/<figure\b[^>]*\bid=["']([\w-]+)["'][^>]*>\s*<\/figure>/g),
726
808
  ].map((match) => match[1]);
727
- if (existing.test(html)) html = html.replace(existing, () => figure);
809
+ if (span) html = html.slice(0, span[0]) + figure + html.slice(span[1]);
728
810
  else if (selfClosed.test(html)) html = html.replace(selfClosed, () => figure);
729
811
  else if (waiting.length)
730
812
  throw new Stop(
@@ -759,6 +841,32 @@ ${sourceLine}
759
841
  );
760
842
  }
761
843
 
844
+ /**
845
+ * Where the element holding `id` starts and ends in the page: its opening tag, then every tag
846
+ * of its own name after it counted in and out until its own close. Stopping at the first
847
+ * close instead cut a placeholder holding one of its kind short, and left the rest of it
848
+ * after the chart.
849
+ */
850
+ function elementSpan(html, id) {
851
+ const safe = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
852
+ const found = new RegExp(
853
+ `<(figure|div|section|p)\\b[^>]*\\bid=["']${safe}["'][^>]*>`,
854
+ "i",
855
+ ).exec(html);
856
+ if (!found || found[0].endsWith("/>")) return null;
857
+ const tags = new RegExp(`<(/?)${found[1]}\\b[^>]*>`, "gi");
858
+ tags.lastIndex = found.index + found[0].length;
859
+ let depth = 1;
860
+ for (let tag = tags.exec(html); tag; tag = tags.exec(html)) {
861
+ if (tag[0].endsWith("/>")) continue;
862
+ depth += tag[1] ? -1 : 1;
863
+ if (!depth) return [found.index, tag.index + tag[0].length];
864
+ }
865
+ throw new Stop(
866
+ `The <${found[1]} id="${id}"> in the page is never closed: close it, then draw again.`,
867
+ );
868
+ }
869
+
762
870
  try {
763
871
  main();
764
872
  } catch (error) {