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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +4 -4
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +13 -13
- package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +11 -11
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/artifact/route.js +8 -8
- package/.next/server/app/api/artifact/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/route.js +3 -3
- package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/route.js +3 -3
- package/.next/server/app/api/bot/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/[id]/route.js +7 -7
- package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/route.js +6 -6
- package/.next/server/app/api/bot/thread/route.js.nft.json +1 -1
- package/.next/server/app/api/config/route.js +5 -5
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/events/route.js +1 -1
- package/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/server/app/api/favicon/[host]/route.js +1 -1
- package/.next/server/app/api/favicon/[host]/route.js.nft.json +1 -1
- package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/catalog/route.js +7 -7
- package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/credits/route.js +7 -7
- package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/route.js +4 -4
- package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/subscription/route.js +4 -4
- package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth/callback/route.js +2 -2
- package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/edit/route.js +14 -15
- package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/reach/route.js +18 -19
- package/.next/server/app/api/reach/route.js.nft.json +1 -1
- package/.next/server/app/api/routine/route.js +3 -3
- package/.next/server/app/api/routine/route.js.nft.json +1 -1
- package/.next/server/app/api/signins/route.js +1 -1
- package/.next/server/app/api/signins/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[source]/[name]/route.js +8 -5
- package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route.js +8 -5
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/call/route.js +7 -7
- package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/settings/route.js +7 -7
- package/.next/server/app/api/thursday/settings/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/text/route.js +15 -16
- package/.next/server/app/api/thursday/text/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/tool-call/route.js +12 -13
- package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/files/route.js +7 -7
- package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/route.js +7 -7
- package/.next/server/app/api/workspace/route.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +3 -3
- package/.next/server/app/artifact/[...path]/page.js +4 -4
- package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/.next/server/app/page/server-reference-manifest.json +60 -60
- package/.next/server/app/page.js +9 -9
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__00qyw01._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__03b09q0._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__03vunn6._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0adz-25._.js → [root-of-the-server]__05dp5tr._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__05n-hql._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__06nspyt._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0aijj66._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0g38-aj._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0h656y-._.js +11 -0
- package/.next/server/chunks/{[root-of-the-server]__0g67-oo._.js → [root-of-the-server]__0j_nz36._.js} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0ljizgj._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0mrk2it._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0tsded0._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0tvoct-._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1-tdj60._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__0132c27._.js → [root-of-the-server]__10_7vqz._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__10xnb7e._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__118qjk_._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__11g20j-._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__13hng6h._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0o-w4t4._.js → [root-of-the-server]__16yw3mb._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__18e65_-._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__18k8s-z._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1b8tp42._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1c2kwku._.js +12 -0
- package/.next/server/chunks/[root-of-the-server]__1ceammd._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1ep-pao._.js +7 -0
- package/.next/server/chunks/[root-of-the-server]__1gamvcz._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1gzcbda._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__20tvhdf._.js → [root-of-the-server]__1mbd2w_._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1ndi14y._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1p47fbb._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1qcn1ti._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__1t0jj1j._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1v7x5ym._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1vlxv19._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0ei2xnb._.js → [root-of-the-server]__1voqqyc._.js} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1ygplx1._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1zn039k._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1zrwxis._.js +3 -0
- package/.next/server/chunks/_01t8da9._.js +1 -1
- package/.next/server/chunks/_02fn1o3._.js +3 -0
- package/.next/server/chunks/_05sa7xl._.js +1 -1
- package/.next/server/chunks/_06u9yo-._.js +1 -1
- package/.next/server/chunks/_07nxi75._.js +250 -0
- package/.next/server/chunks/_08354bn._.js +107 -0
- package/.next/server/chunks/_0caua_s._.js +1 -1
- package/.next/server/chunks/_0j0-gq6._.js +5 -0
- package/.next/server/chunks/_0nn99o2._.js +1 -1
- package/.next/server/chunks/_0p-h6xe._.js +5 -0
- package/.next/server/chunks/_0p6v1fr._.js +5 -0
- package/.next/server/chunks/_0qoush_._.js +3 -0
- package/.next/server/chunks/_0srlnvd._.js +1 -1
- package/.next/server/chunks/_0t_7gji._.js +1 -1
- package/.next/server/chunks/_0uir6hb._.js +9 -9
- package/.next/server/chunks/_0uzj57i._.js +1 -1
- package/.next/server/chunks/_0xm040x._.js +1 -1
- package/.next/server/chunks/_0xx3ryc._.js +2 -2
- package/.next/server/chunks/_0xygcxs._.js +250 -0
- package/.next/server/chunks/{_0ol42w-._.js → _1-sk_q4._.js} +2 -2
- package/.next/server/chunks/_146mcip._.js +1 -1
- package/.next/server/chunks/_19kea1l._.js +8 -8
- package/.next/server/chunks/_1d5zmy8._.js +1 -1
- package/.next/server/chunks/_1dxq827._.js +5 -0
- package/.next/server/chunks/{_0ejoy4d._.js → _1e54wxa._.js} +2 -2
- package/.next/server/chunks/_1gn2r2q._.js +12 -12
- package/.next/server/chunks/_1gxankq._.js +2 -2
- package/.next/server/chunks/_1hyvcgk._.js +5 -0
- package/.next/server/chunks/_1m88lkh._.js +9 -9
- package/.next/server/chunks/_1mfu9a3._.js +5 -0
- package/.next/server/chunks/_1mx9sfo._.js +1 -1
- package/.next/server/chunks/_1ozcb6o._.js +27 -0
- package/.next/server/chunks/_1q6e56i._.js +12 -12
- package/.next/server/chunks/_1qgix-j._.js +1 -1
- package/.next/server/chunks/_1w6uf9k._.js +3 -0
- package/.next/server/chunks/_1wl2g8_._.js +2 -2
- package/.next/server/chunks/_1wwl_7o._.js +1 -1
- package/.next/server/chunks/_1xcnogc._.js +6 -0
- package/.next/server/chunks/_1zfxb7j._.js +1 -1
- package/.next/server/chunks/_20oecmn._.js +6 -0
- package/.next/server/chunks/_211dn2c._.js +1 -1
- package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
- package/.next/server/chunks/features_0wm-ujw._.js +6 -0
- package/.next/server/chunks/features_workspace_workspace_ts_13h82gv._.js +4 -4
- package/.next/server/chunks/features_workspace_workspace_ts_1iyjroj._.js +3 -3
- package/.next/server/chunks/{node_modules_1osf6vs._.js → node_modules_0dctjy-._.js} +1 -1
- package/.next/server/chunks/{node_modules_1821h5r._.js → node_modules_0mquap1._.js} +1 -1
- package/.next/server/chunks/{node_modules_1bfhxob._.js → node_modules_1er1u8w._.js} +1 -1
- package/.next/server/chunks/{node_modules_1i11kg5._.js → node_modules_1rosz79._.js} +1 -1
- 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
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0736s17._.js → node_modules_consola_dist_chunks_prompt_mjs_0rx6rvb._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_07szfwb._.js → node_modules_consola_dist_chunks_prompt_mjs_128pb4i._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0rzuf5j._.js → node_modules_consola_dist_chunks_prompt_mjs_1x3bsmx._.js} +1 -1
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_20s275p._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__0670az2._.js → [root-of-the-server]__02jdtqa._.js} +3 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__0rnjkw2._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__10eb-1x._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__17h1ggo._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1867koj._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1d7usu0._.js +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__00ro8qe._.js → [root-of-the-server]__1jyeu61._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__1y5_1cv._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1y8_-v1._.js +3 -0
- package/.next/server/chunks/ssr/{_1zdizo8._.js → _0-ou1b0._.js} +2 -2
- package/.next/server/chunks/ssr/{_02u485c._.js → _0afrpci._.js} +2 -2
- package/.next/server/chunks/ssr/_0cd6g3l._.js +5 -5
- package/.next/server/chunks/ssr/{_0trt3zp._.js → _0fo4552._.js} +17 -19
- package/.next/server/chunks/ssr/{_168tvri._.js → _0l1-xc6._.js} +2 -2
- package/.next/server/chunks/ssr/{_1rxpx-u._.js → _0ncuqct._.js} +2 -2
- package/.next/server/chunks/ssr/_0qsmpcu._.js +1 -1
- package/.next/server/chunks/ssr/{_0c1h0l9._.js → _0r0g9ki._.js} +3 -3
- package/.next/server/chunks/ssr/_0rvbegp._.js +7 -0
- package/.next/server/chunks/ssr/{_1_n8qpv._.js → _0w8r7o7._.js} +2 -2
- package/.next/server/chunks/ssr/{_074hv3s._.js → _0wupyvd._.js} +2 -2
- package/.next/server/chunks/ssr/_0x8ophf._.js +1 -1
- package/.next/server/chunks/ssr/{_0z0scn4._.js → _0y28gl3._.js} +3 -3
- package/.next/server/chunks/ssr/{node_modules_0vi73_6._.js → _10-_awu._.js} +2 -2
- package/.next/server/chunks/ssr/{_06m66w8._.js → _10fwcz_._.js} +2 -2
- package/.next/server/chunks/ssr/{_0ze-0vs._.js → _11pnnvd._.js} +4 -4
- package/.next/server/chunks/ssr/_17ble8k._.js +162 -0
- package/.next/server/chunks/ssr/_17qtuv7._.js +3 -0
- package/.next/server/chunks/ssr/{_1xq-4on._.js → _1dqaksc._.js} +2 -2
- package/.next/server/chunks/ssr/{_20lwjif._.js → _1f6s34p._.js} +2 -2
- package/.next/server/chunks/ssr/_1g48r6t._.js +3 -0
- package/.next/server/chunks/ssr/_1k0efi3._.js +3 -0
- package/.next/server/chunks/ssr/_1neoj22._.js +1 -1
- package/.next/server/chunks/ssr/_1u5vsy-._.js +3 -0
- package/.next/server/chunks/ssr/_1uij_rj._.js +3 -0
- package/.next/server/chunks/ssr/{_1r0tx3q._.js → _1umbr78._.js} +3 -3
- package/.next/server/chunks/ssr/_1w9w1ok._.js +3 -0
- package/.next/server/chunks/ssr/_1z586yw._.js +3 -0
- package/.next/server/chunks/ssr/features_0796o8r._.js +3 -0
- package/.next/server/chunks/ssr/features_133mpna._.js +6 -0
- package/.next/server/chunks/ssr/features_bot_1k25jdg._.js +3 -0
- package/.next/server/chunks/ssr/{features_config_13cg2cx._.js → features_config_11dpa7r._.js} +3 -3
- package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +3 -3
- package/.next/server/chunks/ssr/features_memory_components_memory-setting_tsx_0oa43sw._.js +1 -1
- package/.next/server/chunks/ssr/features_routine_components_routine-setting_tsx_055fknz._.js +1 -1
- package/.next/server/chunks/ssr/features_workspace_workspace_ts_1wc7_u_._.js +4 -3
- package/.next/server/chunks/ssr/{node_modules_1lmv1ux._.js → node_modules_0-8r9yw._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1-20i0r._.js → node_modules_0-ew8f8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1us2bdc._.js → node_modules_02uwbwp._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1vx7yq2._.js → node_modules_097cl9f._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_16oefzh._.js → node_modules_0bas34k._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0v6s4c8._.js → node_modules_0bbwe-u._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1ngj__4._.js → node_modules_0etz1i0._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0den7sw._.js → node_modules_0ka8te1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_10t4pbm._.js → node_modules_0ld7p-1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_09eqoqr._.js → node_modules_0mark4f._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_01uutx9._.js → node_modules_0n1js5k._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0t93862._.js → node_modules_0sdjzae._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1x2-bh1._.js → node_modules_0u24mg0._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_15ksxpk._.js → node_modules_0uibk9z._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0r6leyg._.js → node_modules_0x_2io2._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1_gizvz._.js → node_modules_0y5uubt._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1j59xrt._.js → node_modules_138kcrz._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_20d3gsv._.js → node_modules_156m1qh._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_19d6gup._.js → node_modules_18yn_bs._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_218nu70._.js → node_modules_1dzye0n._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1gdff1c._.js → node_modules_1o9n7_n._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0yslr-j._.js → node_modules_1ozyial._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_16op-wf._.js → node_modules_1r5o-bo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1uil5qp._.js → node_modules_1tj7_9z._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0h3dnyw._.js → node_modules_1xua-g1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_03hfcze._.js → node_modules_1zkzksd._.js} +1 -1
- 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
- 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
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +61 -61
- package/.next/static/chunks/00d54fcfm-lko.js +1 -0
- package/.next/static/chunks/05scfrgo_a_5_.js +58 -0
- package/.next/static/chunks/{1rjn_x_ty28qc.js → 0609ejkwuy4sf.js} +2 -2
- package/.next/static/chunks/{3w3v100tg-tun.js → 07vcuxousbmy1.js} +1 -1
- package/.next/static/chunks/{3r1p-za3kwq6b.js → 0cl_fgkphk1oz.js} +1 -1
- package/.next/static/chunks/0gjlsu6vrfzod.js +1 -0
- package/.next/static/chunks/0npvak0wpgagb.js +1 -0
- package/.next/static/chunks/{1wkrzv0y4qx48.js → 0o7o0eb7ihxi6.js} +1 -1
- package/.next/static/chunks/0q4ws7qd21chx.js +35 -0
- package/.next/static/chunks/{2q33y6q5_4yxf.js → 0unonxbajyknw.js} +1 -1
- package/.next/static/chunks/17yqt1p_svv13.js +1 -0
- package/.next/static/chunks/19l81deo_pyoc.js +1 -0
- package/.next/static/chunks/1ub9obhgfm4jl.js +1 -0
- package/.next/static/chunks/203pbwecfs3tm.js +1 -0
- package/.next/static/chunks/{30_2pay06oou4.js → 23tx-2paw9qa6.js} +3 -3
- package/.next/static/chunks/{22djpz2dakws5.js → 245_cp14iz637.js} +1 -1
- package/.next/static/chunks/2jbjyazqfqyoh.js +1 -0
- package/.next/static/chunks/2oa4gpkzjtpni.js +1 -0
- package/.next/static/chunks/2uraofiaoy32s.js +1 -0
- package/.next/static/chunks/{1ln0zczby868j.js → 2xjr5b-yk_h3o.js} +2 -2
- package/.next/static/chunks/314szf8yer-3n.js +2 -0
- package/.next/static/chunks/{38srd01ofppmn.css → 31kn4_h2rvf6k.css} +1 -1
- package/.next/static/chunks/39miwvg4k-b2d.js +1 -0
- package/.next/static/chunks/3ghvoe_mlljzs.js +15 -0
- package/.next/static/chunks/{2-9ybn1k9el1e.js → 3gn7dubb4-pwy.js} +1 -1
- package/.next/static/chunks/3j-l8un0d77v7.js +18 -0
- package/.next/static/chunks/{1iezy4u4v9kl7.js → 3ro66d9dc70bc.js} +1 -1
- package/.next/static/chunks/3vwjs5kq11417.js +1 -0
- package/.next/static/chunks/42m371fn687r5.js +1 -0
- package/README.md +3 -1
- package/guide/bots.md +3 -2
- package/guide/calls.md +16 -15
- package/guide/index.md +1 -1
- package/guide/setup.md +19 -10
- package/guide/trouble.md +12 -2
- package/package.json +2 -2
- package/public/sounds/NOTICE +213 -0
- package/public/sounds/end_voice.ogg +0 -0
- package/public/sounds/ring.ogg +0 -0
- package/public/sounds/start_voice.ogg +0 -0
- package/seed-skills/concierge/travel/SKILL.md +4 -4
- package/seed-skills/marketer/marketing/references/copywriting-copy-frameworks.md +3 -10
- package/seed-skills/marketer/marketing/references/copywriting.md +2 -2
- package/seed-skills/marketer/marketing/references/social-platforms.md +5 -5
- package/skills/artifact/SKILL.md +2 -1
- package/skills/artifact/references/book.md +2 -3
- package/skills/artifact/references/deck.md +4 -0
- package/skills/artifact/runtime/app/kit/vite.config.ts +6 -3
- package/skills/artifact/runtime/app/page/index.html +1 -1
- package/skills/artifact/runtime/book/book.html +1 -1
- package/skills/artifact/runtime/canvas/canvas.html +1 -1
- package/skills/artifact/runtime/deck/deck.html +1 -1
- package/skills/artifact/runtime/document/quick.html +1 -1
- package/skills/artifact/scripts/chart.mjs +122 -14
- package/skills/artifact/scripts/document.mjs +3 -2
- package/skills/daily-brief/scripts/story.mjs +13 -1
- package/skills/media-digest/SKILL.md +4 -2
- package/skills/media-digest/references/no-captions.md +2 -1
- package/skills/media-digest/scripts/audio.mjs +7 -2
- package/.next/server/chunks/[root-of-the-server]__0876r42._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0brcw76._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0c_j_qe._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0grmfwp._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0kv916d._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0tkqhnc._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0vffrja._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0vn91fr._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0vxvcj4._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0zbo906._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__10ep3hy._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__10iry08._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__11d0tvc._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__19sv9or._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1_1zysn._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1e0f7he._.js +0 -7
- package/.next/server/chunks/[root-of-the-server]__1fdpwcm._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1hgdkzg._.js +0 -11
- package/.next/server/chunks/[root-of-the-server]__1ksm9m-._.js +0 -12
- package/.next/server/chunks/[root-of-the-server]__1l_nubj._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1pmsv_6._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1tdudkf._.js +0 -5
- package/.next/server/chunks/_02lipqs._.js +0 -5
- package/.next/server/chunks/_034lk-r._.js +0 -3
- package/.next/server/chunks/_04ynt0z._.js +0 -252
- package/.next/server/chunks/_171rt-v._.js +0 -109
- package/.next/server/chunks/_17esum5._.js +0 -5
- package/.next/server/chunks/_1p8rzg_._.js +0 -252
- package/.next/server/chunks/_1v5g4kx._.js +0 -3
- package/.next/server/chunks/_1vxrw1q._.js +0 -5
- package/.next/server/chunks/features_0-cnt0l._.js +0 -4
- package/.next/server/chunks/features_0hdaci0._.js +0 -4
- package/.next/server/chunks/features_0p85gv6._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0ta6hsy._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0tok7g7._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_187uwe9._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1cu9mam._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1g1et-d._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__099tvf0._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0dxszdt._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0ihvne0._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__11hcjwx._.js +0 -3
- package/.next/server/chunks/ssr/_018vrx-._.js +0 -3
- package/.next/server/chunks/ssr/_0afqubz._.js +0 -162
- package/.next/server/chunks/ssr/_0ayihi5._.js +0 -3
- package/.next/server/chunks/ssr/_0gv5wzb._.js +0 -3
- package/.next/server/chunks/ssr/_0kkdx7t._.js +0 -3
- package/.next/server/chunks/ssr/_0yjztzi._.js +0 -3
- package/.next/server/chunks/ssr/_14fdswx._.js +0 -3
- package/.next/server/chunks/ssr/_1ajl6hf._.js +0 -5
- package/.next/server/chunks/ssr/_1o_i8-d._.js +0 -7
- package/.next/server/chunks/ssr/_1ri-y7z._.js +0 -4
- package/.next/server/chunks/ssr/features_0ctqq63._.js +0 -4
- package/.next/server/chunks/ssr/features_bot_0v6r-lh._.js +0 -3
- package/.next/static/chunks/0j8_qql4enu93.js +0 -1
- package/.next/static/chunks/0mr03ivl4_fxd.js +0 -1
- package/.next/static/chunks/13qwyo9-jd5kw.js +0 -1
- package/.next/static/chunks/17_b97pj_av_t.js +0 -1
- package/.next/static/chunks/18id2dgl_39_1.js +0 -18
- package/.next/static/chunks/1lp02y2nmddxg.js +0 -1
- package/.next/static/chunks/249i2g6ele3t2.js +0 -1
- package/.next/static/chunks/249wisxmxrwa9.js +0 -1
- package/.next/static/chunks/27dovttmtqjhi.js +0 -15
- package/.next/static/chunks/2k1rwhz_x2lej.js +0 -1
- package/.next/static/chunks/2p2pqpub-48me.js +0 -58
- package/.next/static/chunks/34-6gj9kheq74.js +0 -2
- package/.next/static/chunks/3a29oqdmvp25o.js +0 -35
- package/.next/static/chunks/3c_bgfr_z4peu.js +0 -1
- package/.next/static/chunks/3gyqds2iodotb.js +0 -1
- package/.next/static/chunks/3hxors_gsfsut.js +0 -1
- package/.next/static/chunks/3q-3lu8gpr4-h.js +0 -1
- package/.next/static/chunks/3qkm3p4g4ajku.js +0 -3
- package/.next/static/chunks/3w3mgbz8nuug2.js +0 -1
- package/app/api/bot/memory/files/route.ts +0 -14
- package/app/api/bot/memory/route.ts +0 -5
- package/app/api/events/app-event.client.ts +0 -30
- package/app/api/events/app-event.server.ts +0 -47
- package/app/api/events/app-event.ts +0 -78
- package/app/api/llm-model/catalog/route.ts +0 -12
- package/app/api/llm-model/credits/route.ts +0 -11
- package/app/api/llm-model/route.ts +0 -26
- package/app/api/llm-model/subscription/route.ts +0 -11
- package/app/api/memory/edit/route.ts +0 -7
- package/app/api/memory/route.ts +0 -8
- package/app/api/query-key.ts +0 -192
- package/app/api/thursday/tool-call/route.ts +0 -76
- package/biome.json +0 -72
- package/components/ui/button-group.tsx +0 -45
- package/components/ui/custom-icon.tsx +0 -199
- package/components/ui/dropdown-menu.tsx +0 -271
- package/components/ui/folded-text.tsx +0 -68
- package/components/ui/input-group.tsx +0 -157
- package/components/ui/json-view.tsx +0 -240
- package/components/ui/radio-group.tsx +0 -37
- package/components/ui/shiny-text.tsx +0 -68
- package/components/ui/site-icon.tsx +0 -45
- package/components/ui/source-chips.tsx +0 -54
- package/components/ui/theme-sync.tsx +0 -9
- package/components.json +0 -25
- package/docs/how-it-works.md +0 -76
- package/docs/images/errands-dark.png +0 -0
- package/docs/images/errands-light.png +0 -0
- package/docs/images/hero-dark.png +0 -0
- package/docs/images/hero-light.png +0 -0
- package/docs/images/keeps-going.png +0 -0
- package/docs/images/more-dark.png +0 -0
- package/docs/images/more-light.png +0 -0
- package/docs/images/results-dark.png +0 -0
- package/docs/images/results-light.png +0 -0
- package/docs/images/talk-dark.png +0 -0
- package/docs/images/talk-light.png +0 -0
- package/docs/images/team-dark.png +0 -0
- package/docs/images/team-light.png +0 -0
- package/docs/images/two-minds.png +0 -0
- package/features/ai/chatgpt.ts +0 -638
- package/features/ai/components/chatgpt-sign-in.tsx +0 -66
- package/features/ai/components/effort-switch.tsx +0 -112
- package/features/ai/components/gateway-mark.tsx +0 -188
- package/features/ai/components/model-browser.tsx +0 -324
- package/features/ai/components/model-picker.tsx +0 -336
- package/features/ai/components/provider-icon.tsx +0 -162
- package/features/ai/guide.ts +0 -44
- package/features/ai/live.schema.ts +0 -150
- package/features/ai/load-tools.ts +0 -495
- package/features/ai/model.schema.ts +0 -985
- package/features/ai/model.ts +0 -662
- package/features/ai/prompts/bot.prompt.ts +0 -418
- package/features/ai/prompts/call-standing.ts +0 -43
- package/features/ai/prompts/live.prompt.ts +0 -197
- package/features/ai/prompts/memory-edit.prompt.ts +0 -33
- package/features/ai/prompts/persona.ts +0 -114
- package/features/ai/prompts/prompt-helper.ts +0 -287
- package/features/ai/prompts/thursday.prompt.ts +0 -281
- package/features/ai/tools/bot.tool.ts +0 -183
- package/features/ai/tools/call.tool.ts +0 -50
- package/features/ai/tools/connected.ts +0 -199
- package/features/ai/tools/deck.tool.ts +0 -518
- package/features/ai/tools/look.tool.ts +0 -65
- package/features/ai/tools/mcp.tool.ts +0 -187
- package/features/ai/tools/memory.tool.ts +0 -296
- package/features/ai/tools/routine.tool.ts +0 -214
- package/features/ai/tools/search.tool.ts +0 -248
- package/features/ai/tools/self.tool.ts +0 -58
- package/features/ai/tools/signin.tool.ts +0 -138
- package/features/ai/tools/skills.tool.ts +0 -109
- package/features/ai/tools/studio.tool.ts +0 -360
- package/features/ai/tools/tool-name.ts +0 -56
- package/features/ai/tools/workspace.tool.ts +0 -126
- package/features/ai/words.ts +0 -60
- package/features/artifact/artifact.action.ts +0 -12
- package/features/artifact/artifact.query.ts +0 -218
- package/features/artifact/artifact.schema.ts +0 -58
- package/features/artifact/components/artifact-setting.tsx +0 -513
- package/features/bot/bot.action.ts +0 -195
- package/features/bot/bot.memory.ts +0 -206
- package/features/bot/bot.query.ts +0 -293
- package/features/bot/bot.run.ts +0 -909
- package/features/bot/bot.runner.ts +0 -595
- package/features/bot/bot.schema.ts +0 -501
- package/features/bot/bot.seed.ts +0 -160
- package/features/bot/components/attachments.tsx +0 -225
- package/features/bot/components/bot-badge.tsx +0 -21
- package/features/bot/components/bot-mark.tsx +0 -1678
- package/features/bot/components/bot-room.tsx +0 -439
- package/features/bot/components/bot-roster.tsx +0 -43
- package/features/bot/components/bot-setting.tsx +0 -1698
- package/features/bot/components/bot-tip.tsx +0 -48
- package/features/bot/components/bot-tool.tsx +0 -644
- package/features/bot/components/crew-motion.ts +0 -168
- package/features/bot/components/mark-palette.tsx +0 -57
- package/features/bot/components/room-conversation.tsx +0 -1208
- package/features/bot/components/room-list.tsx +0 -539
- package/features/bot/components/room-pill.tsx +0 -1045
- package/features/bot/components/thread-badge.tsx +0 -37
- package/features/bot/components/thread-reply.tsx +0 -780
- package/features/bot/components/thread-setting.tsx +0 -718
- package/features/bot/components/write-orb.tsx +0 -298
- package/features/bot/mark.const.ts +0 -164
- package/features/bot/room.query.ts +0 -922
- package/features/bot/room.schema.ts +0 -78
- package/features/bot/seed-bots.ts +0 -44
- package/features/bot/thread.query.ts +0 -1175
- package/features/bot/thread.store.ts +0 -726
- package/features/config/components/config-badge.tsx +0 -28
- package/features/config/components/config-setting.tsx +0 -881
- package/features/config/components/models-badge.tsx +0 -42
- package/features/config/components/voice-key.tsx +0 -321
- package/features/config/config.action.ts +0 -67
- package/features/config/config.const.ts +0 -356
- package/features/config/config.query.ts +0 -43
- package/features/connectors/components/mcp-badge.tsx +0 -17
- package/features/connectors/components/mcp-mark.tsx +0 -4
- package/features/connectors/components/mcp-setting.tsx +0 -1028
- package/features/connectors/mcp.action.ts +0 -93
- package/features/connectors/mcp.const.ts +0 -336
- package/features/connectors/mcp.manager.ts +0 -497
- package/features/connectors/mcp.query.ts +0 -256
- package/features/connectors/mcp.schema.ts +0 -122
- package/features/intro/components/echoes.tsx +0 -563
- package/features/intro/components/intro.tsx +0 -964
- package/features/intro/intro-voice.ts +0 -174
- package/features/memory/components/memory-edit.tsx +0 -333
- package/features/memory/components/memory-mark.tsx +0 -4
- package/features/memory/components/memory-setting.tsx +0 -662
- package/features/memory/memory.action.ts +0 -75
- package/features/memory/memory.edit.ts +0 -79
- package/features/memory/memory.query.ts +0 -513
- package/features/memory/memory.schema.ts +0 -196
- package/features/reach/channel.ts +0 -127
- package/features/reach/chat-text.ts +0 -364
- package/features/reach/components/reach-ask.tsx +0 -94
- package/features/reach/components/reach-badge.tsx +0 -22
- package/features/reach/components/reach-guide.tsx +0 -777
- package/features/reach/discord.ts +0 -308
- package/features/reach/pictures.ts +0 -88
- package/features/reach/reach.action.ts +0 -30
- package/features/reach/reach.schema.ts +0 -80
- package/features/reach/reach.ts +0 -946
- package/features/reach/slack.ts +0 -319
- package/features/reach/socket.ts +0 -63
- package/features/reach/telegram.ts +0 -323
- package/features/routine/components/routine-mark.tsx +0 -7
- package/features/routine/components/routine-setting.tsx +0 -1078
- package/features/routine/routine.action.ts +0 -31
- package/features/routine/routine.clock.ts +0 -102
- package/features/routine/routine.query.ts +0 -207
- package/features/routine/routine.schema.ts +0 -157
- package/features/settings/components/install-app.tsx +0 -153
- package/features/settings/components/setting-ui.tsx +0 -482
- package/features/settings/components/settings.tsx +0 -464
- package/features/settings/settings.alert.ts +0 -42
- package/features/settings/settings.store.ts +0 -44
- package/features/signins/components/signin-ask.tsx +0 -51
- package/features/signins/components/signins-setting.tsx +0 -261
- package/features/signins/signins.action.ts +0 -22
- package/features/signins/signins.query.ts +0 -261
- package/features/signins/signins.schema.ts +0 -26
- package/features/skills/components/skills-mark.tsx +0 -4
- package/features/skills/components/skills-setting.tsx +0 -736
- package/features/skills/skills.action.ts +0 -118
- package/features/skills/skills.discover.ts +0 -146
- package/features/skills/skills.query.ts +0 -363
- package/features/skills/skills.schema.ts +0 -105
- package/features/thursday/ascii.const.ts +0 -218
- package/features/thursday/call-signal.ts +0 -41
- package/features/thursday/components/ascii-orb.tsx +0 -1523
- package/features/thursday/components/boot.tsx +0 -24
- package/features/thursday/components/call-log.tsx +0 -503
- package/features/thursday/components/caption-words.tsx +0 -117
- package/features/thursday/components/connect-wave.tsx +0 -266
- package/features/thursday/components/face.tsx +0 -137
- package/features/thursday/components/side-captions.tsx +0 -347
- package/features/thursday/components/tab-state.tsx +0 -108
- package/features/thursday/components/thursday-mark.tsx +0 -168
- package/features/thursday/components/thursday-setting.tsx +0 -1084
- package/features/thursday/components/thursday.tsx +0 -1823
- package/features/thursday/components/voice-picker.tsx +0 -254
- package/features/thursday/components/write-line.tsx +0 -714
- package/features/thursday/expressions.ts +0 -1278
- package/features/thursday/eyes.ts +0 -274
- package/features/thursday/face-words.ts +0 -44
- package/features/thursday/face.const.ts +0 -6
- package/features/thursday/face.store.ts +0 -62
- package/features/thursday/field.ts +0 -93
- package/features/thursday/open-work.ts +0 -180
- package/features/thursday/screen-act.ts +0 -15
- package/features/thursday/silent-voice.ts +0 -14
- package/features/thursday/smoke.ts +0 -510
- package/features/thursday/thursday.action.ts +0 -266
- package/features/thursday/thursday.query.ts +0 -382
- package/features/thursday/thursday.schema.ts +0 -251
- package/features/thursday/thursday.store.ts +0 -129
- package/features/thursday/thursday.text.ts +0 -567
- package/features/thursday/tool-call.ts +0 -42
- package/features/thursday/tool-line.ts +0 -333
- package/features/thursday/use-call-ring.ts +0 -194
- package/features/thursday/use-live-settings.ts +0 -66
- package/features/thursday/use-text-call.ts +0 -551
- package/features/thursday/use-thursday.ts +0 -1231
- package/features/thursday/wash.ts +0 -116
- package/features/thursday/work-chip.tsx +0 -64
- package/features/workspace/components/artifact-view.tsx +0 -510
- package/features/workspace/components/file-thumb.tsx +0 -253
- package/features/workspace/components/file-view.tsx +0 -875
- package/features/workspace/components/given-files.tsx +0 -195
- package/features/workspace/components/workspace-mark.tsx +0 -4
- package/features/workspace/components/workspace-setting.tsx +0 -454
- package/features/workspace/file-kind.ts +0 -190
- package/features/workspace/workspace.action.ts +0 -88
- package/features/workspace/workspace.query.ts +0 -220
- package/features/workspace/workspace.schema.ts +0 -58
- package/features/workspace/workspace.ts +0 -553
- package/hooks/use-draft.ts +0 -38
- package/hooks/use-hotkey.ts +0 -171
- package/hooks/use-object-state.ts +0 -22
- package/hooks/use-on-visible.ts +0 -72
- package/hooks/use-theme.ts +0 -120
- package/hooks/use-wake-word.ts +0 -262
- package/knip.json +0 -7
- package/lib/date-like.ts +0 -37
- package/lib/desktop-notify.ts +0 -81
- package/lib/favicon.ts +0 -88
- package/lib/json-schema.ts +0 -42
- package/lib/live/live.schema.ts +0 -36
- package/lib/live/live.server.ts +0 -188
- package/lib/live/live.session.ts +0 -712
- package/lib/live/live.tap.ts +0 -288
- package/lib/live/live.transport.ts +0 -152
- package/lib/live/ring.ts +0 -62
- package/lib/logger.ts +0 -14
- package/lib/oauth-page.ts +0 -27
- package/lib/protocol/events.client.ts +0 -89
- package/lib/protocol/events.server.ts +0 -158
- package/lib/protocol/events.ts +0 -53
- package/lib/protocol/presence.ts +0 -65
- package/lib/protocol/result.ts +0 -63
- package/lib/protocol/server-action.ts +0 -13
- package/lib/protocol/server-route.ts +0 -20
- package/lib/protocol/to-result.ts +0 -46
- package/lib/protocol/use-server-action.ts +0 -105
- package/lib/protocol/use-server-pages.ts +0 -117
- package/lib/protocol/use-server-route.ts +0 -165
- package/lib/public-error.ts +0 -19
- package/lib/queue.ts +0 -79
- package/lib/reveal-path.ts +0 -46
- package/lib/sandbox.ts +0 -269
- package/lib/theme.ts +0 -9
- package/lib/tokens.ts +0 -35
- package/lib/utils.ts +0 -163
- package/release-please-config.json +0 -21
- package/scripts/artifact-paths.test.mts +0 -56
- package/scripts/bot-context.test.mts +0 -2122
- package/scripts/intro-voice.mts +0 -65
- package/scripts/live-history.test.mts +0 -115
- package/scripts/live-session.test.mts +0 -1286
- package/scripts/memory-tools.test.mts +0 -177
- package/scripts/page-edits.test.mts +0 -319
- package/scripts/reach-channels.test.mts +0 -524
- package/scripts/skill-files.test.mts +0 -225
- package/scripts/text-call.test.mts +0 -540
- package/skills-lock.json +0 -23
- package/tsconfig.json +0 -44
- /package/.next/static/{0yrnAMu4F_o69_DY3W-ho → RtLRT9EEaGn-OqwpMFdYg}/_buildManifest.js +0 -0
- /package/.next/static/{0yrnAMu4F_o69_DY3W-ho → RtLRT9EEaGn-OqwpMFdYg}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{0yrnAMu4F_o69_DY3W-ho → RtLRT9EEaGn-OqwpMFdYg}/_ssgManifest.js +0 -0
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
-
import { createClipTap, SPECTRUM_BANDS } from "@/lib/live/live.tap";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Her recorded voice on the first run: each of her lines there is also a clip, so she can
|
|
6
|
-
* be heard before any key exists. Everything about it is here — what she says aloud, where
|
|
7
|
-
* a clip lives, and the hook that plays one — and `scripts/intro-voice.mts` records the
|
|
8
|
-
* clips from this script. What she says aloud is its own text, not the caption's: a line
|
|
9
|
-
* on screen can be rewritten freely, and she opens by saying this is a recording, which a
|
|
10
|
-
* caption has no need to. A clip is named by a hash of its words, so a line rewritten here
|
|
11
|
-
* is silent until it is recorded again, never a clip saying the old words.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/** How the clips are made (scripts/intro-voice.mts): the default call voice, asked to sound like a call. */
|
|
15
|
-
export const INTRO_VOICE = {
|
|
16
|
-
model: "gpt-4o-mini-tts",
|
|
17
|
-
voice: "marin",
|
|
18
|
-
instructions:
|
|
19
|
-
"Warm, relaxed and conversational, like a friend on the phone who is glad you called. Natural pace, a light smile in the voice. American English.",
|
|
20
|
-
dir: "voices/intro",
|
|
21
|
-
} as const;
|
|
22
|
-
|
|
23
|
-
/** What she says aloud, by the line it goes with. Plain words: whoever hears this may never have seen an API key. */
|
|
24
|
-
export const INTRO_SPOKEN = {
|
|
25
|
-
/** Said once, ahead of whichever line comes first: she says what this is before anything else. */
|
|
26
|
-
hello:
|
|
27
|
-
"Hi, I'm Thursday. One thing first: this is a recording. You'll hear my real voice on our first call.",
|
|
28
|
-
key: "My real voice comes from OpenAI, and it needs a key — think of it as a password. Paste one in, and I wake up. Don't have one yet? No problem, skip ahead. I'll ask again later.",
|
|
29
|
-
awake:
|
|
30
|
-
"There we go — I'm awake. That key is all a call needs. The rest is quick: your microphone, who does the work for you, and what they think with.",
|
|
31
|
-
mic: "Now let me hear you. Your browser will ask before it turns the microphone on. Say yes, then say anything — and watch the line under me move. It's only on during a call, unless you ask for more.",
|
|
32
|
-
heard:
|
|
33
|
-
"I hear you — that line is your voice. If you'd rather wake me by saying my name instead of tapping, switch that on here and give it a try.",
|
|
34
|
-
bots: "Big jobs go to my helper bots, so you and I can keep talking while they work. They work right here on your computer, with a browser and your files. Signing in and paying always stay with you.",
|
|
35
|
-
models:
|
|
36
|
-
"Every bot runs on an A.I. model that you pick. Start small: a small one is fast and cheap, and you can move any bot up later. Your OpenAI key already covers it. A GPT subscription, or a Vercel key, opens up a lot more.",
|
|
37
|
-
style:
|
|
38
|
-
"One more, and it's the fun one: who I am to you. There are ten of me, and the only difference is how I talk. Pick whoever sounds like someone you'd call — you can change your mind anytime.",
|
|
39
|
-
call: "That's everything. Call me, tell me what to call you, and ask for one thing — anything you'd ask someone sitting next to you. From here on, it's my real voice. I'll show you the rest as we go.",
|
|
40
|
-
asleep:
|
|
41
|
-
"I still don't have a voice of my own, so no calls yet — but everything else works. Have a look around. When you have a key, tap me, and I'll take it from there.",
|
|
42
|
-
} as const;
|
|
43
|
-
|
|
44
|
-
export type IntroLine = keyof typeof INTRO_SPOKEN;
|
|
45
|
-
|
|
46
|
-
/** FNV-1a over the voice and the words: the same eight characters in the browser and in the script. */
|
|
47
|
-
function stamp(words: string): string {
|
|
48
|
-
let hash = 0x811c9dc5;
|
|
49
|
-
for (const char of `${INTRO_VOICE.voice}|${words}`) {
|
|
50
|
-
hash ^= char.codePointAt(0) ?? 0;
|
|
51
|
-
hash = Math.imul(hash, 0x01000193);
|
|
52
|
-
}
|
|
53
|
-
return (hash >>> 0).toString(16).padStart(8, "0");
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/** The clip's file name: the line, and the stamp of what it says. */
|
|
57
|
-
export const introClipName = (line: IntroLine) =>
|
|
58
|
-
`${line}-${stamp(INTRO_SPOKEN[line])}.ogg`;
|
|
59
|
-
|
|
60
|
-
const SILENT = new Array<number>(SPECTRUM_BANDS).fill(0);
|
|
61
|
-
|
|
62
|
-
/** Where the choice is kept: someone who muted her once is not spoken to again. */
|
|
63
|
-
const MUTED_KEY = "thursday.intro.muted";
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Plays her clips. The first one has to start inside a click (`say` from the handler): a
|
|
67
|
-
* browser lets a page make sound only from there, and an element that has played once may
|
|
68
|
-
* play again by itself, which is how the later lines follow their step. Each line is said
|
|
69
|
-
* once a visit, several in a row when asked for together, and a new ask cuts in. A clip
|
|
70
|
-
* that is missing or refused is silence, never an error.
|
|
71
|
-
*/
|
|
72
|
-
export function useIntroVoice(line: IntroLine | null) {
|
|
73
|
-
const held = useRef<{
|
|
74
|
-
audio: HTMLAudioElement;
|
|
75
|
-
clip: ReturnType<typeof createClipTap>;
|
|
76
|
-
} | null>(null);
|
|
77
|
-
const said = useRef(new Set<IntroLine>());
|
|
78
|
-
/** What follows the clip now playing. */
|
|
79
|
-
const next = useRef<IntroLine[]>([]);
|
|
80
|
-
const sounding = useRef(false);
|
|
81
|
-
const [speaking, setSpeaking] = useState(false);
|
|
82
|
-
const [muted, setMuted] = useState(false);
|
|
83
|
-
const mutedNow = useRef(false);
|
|
84
|
-
|
|
85
|
-
useEffect(() => {
|
|
86
|
-
try {
|
|
87
|
-
const was = window.localStorage.getItem(MUTED_KEY) === "1";
|
|
88
|
-
mutedNow.current = was;
|
|
89
|
-
setMuted(was);
|
|
90
|
-
} catch {
|
|
91
|
-
// storage may be blocked; she speaks
|
|
92
|
-
}
|
|
93
|
-
}, []);
|
|
94
|
-
|
|
95
|
-
const hush = useCallback(() => {
|
|
96
|
-
next.current = [];
|
|
97
|
-
held.current?.audio.pause();
|
|
98
|
-
}, []);
|
|
99
|
-
|
|
100
|
-
const play = useCallback(() => {
|
|
101
|
-
const one = next.current.shift();
|
|
102
|
-
if (!one || !held.current) return;
|
|
103
|
-
const { audio, clip } = held.current;
|
|
104
|
-
void clip.resume();
|
|
105
|
-
audio.src = `/${INTRO_VOICE.dir}/${introClipName(one)}`;
|
|
106
|
-
void audio.play().catch(() => {});
|
|
107
|
-
}, []);
|
|
108
|
-
|
|
109
|
-
const say = useCallback(
|
|
110
|
-
(...lines: IntroLine[]) => {
|
|
111
|
-
const fresh = lines.filter((one) => !said.current.has(one));
|
|
112
|
-
if (mutedNow.current || !fresh.length) return;
|
|
113
|
-
if (!held.current) {
|
|
114
|
-
const audio = new Audio();
|
|
115
|
-
const heard = (on: boolean) => () => {
|
|
116
|
-
sounding.current = on;
|
|
117
|
-
setSpeaking(on);
|
|
118
|
-
};
|
|
119
|
-
audio.addEventListener("playing", heard(true));
|
|
120
|
-
for (const over of ["pause", "ended", "error"])
|
|
121
|
-
audio.addEventListener(over, heard(false));
|
|
122
|
-
// one clip over, the next begins; a clip that will not load is skipped
|
|
123
|
-
audio.addEventListener("ended", play);
|
|
124
|
-
audio.addEventListener("error", play);
|
|
125
|
-
// An element is routed once, so the tap lasts as long as the element does
|
|
126
|
-
held.current = { audio, clip: createClipTap(audio) };
|
|
127
|
-
}
|
|
128
|
-
for (const one of fresh) said.current.add(one);
|
|
129
|
-
next.current = fresh;
|
|
130
|
-
play();
|
|
131
|
-
},
|
|
132
|
-
[play],
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
// The lines after the first follow their step by themselves
|
|
136
|
-
useEffect(() => {
|
|
137
|
-
if (line && held.current) say(line);
|
|
138
|
-
}, [line, say]);
|
|
139
|
-
|
|
140
|
-
// Gone with the intro: she must not talk over the call it ends on
|
|
141
|
-
useEffect(
|
|
142
|
-
() => () => {
|
|
143
|
-
held.current?.audio.pause();
|
|
144
|
-
void held.current?.clip.close();
|
|
145
|
-
held.current = null;
|
|
146
|
-
},
|
|
147
|
-
[],
|
|
148
|
-
);
|
|
149
|
-
|
|
150
|
-
const toggle = useCallback(() => {
|
|
151
|
-
const next = !mutedNow.current;
|
|
152
|
-
mutedNow.current = next;
|
|
153
|
-
setMuted(next);
|
|
154
|
-
try {
|
|
155
|
-
window.localStorage.setItem(MUTED_KEY, next ? "1" : "0");
|
|
156
|
-
} catch {
|
|
157
|
-
// kept for this visit only
|
|
158
|
-
}
|
|
159
|
-
if (next) return hush();
|
|
160
|
-
// Switched back on inside this click: the line on screen is said again
|
|
161
|
-
if (line) {
|
|
162
|
-
said.current.delete(line);
|
|
163
|
-
say(line);
|
|
164
|
-
}
|
|
165
|
-
}, [hush, line, say]);
|
|
166
|
-
|
|
167
|
-
const spectrum = useCallback(
|
|
168
|
-
() =>
|
|
169
|
-
held.current && sounding.current ? held.current.clip.read() : SILENT,
|
|
170
|
-
[],
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
return { say, hush, speaking, muted, toggle, spectrum };
|
|
174
|
-
}
|
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useChat } from "@ai-sdk/react";
|
|
4
|
-
import { DefaultChatTransport, getToolName, isToolUIPart } from "ai";
|
|
5
|
-
import {
|
|
6
|
-
ArrowUp,
|
|
7
|
-
BookOpen,
|
|
8
|
-
Check,
|
|
9
|
-
ChevronDown,
|
|
10
|
-
Loader2,
|
|
11
|
-
Minus,
|
|
12
|
-
Pencil,
|
|
13
|
-
Plus,
|
|
14
|
-
X,
|
|
15
|
-
} from "lucide-react";
|
|
16
|
-
import { type SubmitEvent, useEffect, useRef, useState } from "react";
|
|
17
|
-
import { queryKey } from "@/app/api/query-key";
|
|
18
|
-
import { Button } from "@/components/ui/button";
|
|
19
|
-
import { ShinyText } from "@/components/ui/shiny-text";
|
|
20
|
-
import { ModelPicker } from "@/features/ai/components/model-picker";
|
|
21
|
-
import { ProviderIcon } from "@/features/ai/components/provider-icon";
|
|
22
|
-
import type { TextModelProviderId } from "@/features/ai/model.schema";
|
|
23
|
-
import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
|
|
24
|
-
import type { MemoryNote } from "@/features/memory/memory.schema";
|
|
25
|
-
import { cn } from "@/lib/utils";
|
|
26
|
-
|
|
27
|
-
type KnownFact = { text: string; path: string };
|
|
28
|
-
|
|
29
|
-
/** How long a finished edit's lines stay up before they clear. */
|
|
30
|
-
const LINGER_MS = 4000;
|
|
31
|
-
|
|
32
|
-
/** One transport for every edit: the model rides on each request, not on the hook. */
|
|
33
|
-
const transport = new DefaultChatTransport({ api: queryKey.memoryEdit });
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Editing memory in a line, floating over the list above the rail while its rail
|
|
37
|
-
* button holds it open; closing it stops a run like leaving would. One send is
|
|
38
|
-
* one streamed run (memory.edit): the model writes with memory's own tools as it
|
|
39
|
-
* goes and each call is drawn as it arrives. Nothing about the exchange is kept —
|
|
40
|
-
* the next send starts clean — and the model is picked here, never saved.
|
|
41
|
-
*/
|
|
42
|
-
export function MemoryEdit({ notes }: { notes: MemoryNote[] }) {
|
|
43
|
-
const [draft, setDraft] = useState("");
|
|
44
|
-
const [model, setModel] = useState<{
|
|
45
|
-
provider: TextModelProviderId | null;
|
|
46
|
-
model: string;
|
|
47
|
-
}>({ provider: null, model: "" });
|
|
48
|
-
const [picking, setPicking] = useState(false);
|
|
49
|
-
const {
|
|
50
|
-
messages,
|
|
51
|
-
sendMessage,
|
|
52
|
-
setMessages,
|
|
53
|
-
status,
|
|
54
|
-
stop,
|
|
55
|
-
error,
|
|
56
|
-
clearError,
|
|
57
|
-
} = useChat({ transport });
|
|
58
|
-
|
|
59
|
-
// A run nobody is looking at has nobody to show its lines to
|
|
60
|
-
const stopRef = useRef(stop);
|
|
61
|
-
stopRef.current = stop;
|
|
62
|
-
useEffect(
|
|
63
|
-
() => () => {
|
|
64
|
-
void stopRef.current();
|
|
65
|
-
},
|
|
66
|
-
[],
|
|
67
|
-
);
|
|
68
|
-
|
|
69
|
-
// Facts seen on screen, kept after they go so a finished change still reads as what it replaced
|
|
70
|
-
const seen = useRef(new Map<number, KnownFact>());
|
|
71
|
-
for (const note of notes) {
|
|
72
|
-
for (const fact of note.facts) {
|
|
73
|
-
seen.current.set(fact.id, { text: fact.text, path: note.path });
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const running = status === "submitted" || status === "streaming";
|
|
78
|
-
const ready = Boolean(model.provider && model.model.trim());
|
|
79
|
-
const reply = [...messages]
|
|
80
|
-
.reverse()
|
|
81
|
-
.find((message) => message.role === "assistant");
|
|
82
|
-
const parts = reply?.parts ?? [];
|
|
83
|
-
const calls = parts.filter(isToolUIPart);
|
|
84
|
-
const words = parts
|
|
85
|
-
.flatMap((part) => (part.type === "text" ? [part.text] : []))
|
|
86
|
-
.join(" ")
|
|
87
|
-
.trim();
|
|
88
|
-
const failed =
|
|
89
|
-
Boolean(error) || calls.some((call) => call.state === "output-error");
|
|
90
|
-
const written = calls.filter(
|
|
91
|
-
(call) =>
|
|
92
|
-
call.state === "output-available" &&
|
|
93
|
-
getToolName(call) !== TOOL_NAMES.memory_recall,
|
|
94
|
-
).length;
|
|
95
|
-
|
|
96
|
-
useEffect(() => {
|
|
97
|
-
if (status !== "ready" || failed || messages.length === 0) return;
|
|
98
|
-
const clear = setTimeout(() => setMessages([]), LINGER_MS);
|
|
99
|
-
return () => clearTimeout(clear);
|
|
100
|
-
}, [status, failed, messages.length, setMessages]);
|
|
101
|
-
|
|
102
|
-
const submit = (event: SubmitEvent) => {
|
|
103
|
-
event.preventDefault();
|
|
104
|
-
const said = draft.trim();
|
|
105
|
-
if (!said || !ready || running) return;
|
|
106
|
-
setDraft("");
|
|
107
|
-
setPicking(false);
|
|
108
|
-
clearError();
|
|
109
|
-
// One send is one run: nothing from the last one rides along
|
|
110
|
-
setMessages([]);
|
|
111
|
-
void sendMessage({ text: said }, { body: { model } });
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
const line = running ? (
|
|
115
|
-
<ShinyText text="Working on memory" className="text-xs" />
|
|
116
|
-
) : error ? (
|
|
117
|
-
<span className="text-xs text-destructive">{error.message}</span>
|
|
118
|
-
) : reply ? (
|
|
119
|
-
<span className="text-xs text-muted-foreground">
|
|
120
|
-
{words ||
|
|
121
|
-
(written === 0
|
|
122
|
-
? "Nothing to change"
|
|
123
|
-
: written === 1
|
|
124
|
-
? "1 change saved"
|
|
125
|
-
: `${written} changes saved`)}
|
|
126
|
-
</span>
|
|
127
|
-
) : null;
|
|
128
|
-
|
|
129
|
-
return (
|
|
130
|
-
<div className="pointer-events-none absolute inset-x-0 bottom-18 z-10 flex justify-center px-8">
|
|
131
|
-
<div className="pointer-events-auto flex w-full max-w-120 flex-col items-center gap-2">
|
|
132
|
-
{picking && (
|
|
133
|
-
<div className="w-full rounded-xl bg-popover p-2 shadow-lg ring-1 ring-foreground/10">
|
|
134
|
-
<ModelPicker
|
|
135
|
-
provider={model.provider}
|
|
136
|
-
model={model.model}
|
|
137
|
-
unset="Provider"
|
|
138
|
-
onChange={setModel}
|
|
139
|
-
/>
|
|
140
|
-
</div>
|
|
141
|
-
)}
|
|
142
|
-
|
|
143
|
-
{calls.length > 0 && (
|
|
144
|
-
<ul className="w-full divide-y divide-border/60 overflow-hidden rounded-xl bg-popover shadow-lg ring-1 ring-foreground/10">
|
|
145
|
-
{calls.map((call) => (
|
|
146
|
-
<ChangeRow
|
|
147
|
-
key={call.toolCallId}
|
|
148
|
-
name={getToolName(call)}
|
|
149
|
-
input={call.input}
|
|
150
|
-
state={call.state}
|
|
151
|
-
errorText={
|
|
152
|
-
call.state === "output-error" ? call.errorText : undefined
|
|
153
|
-
}
|
|
154
|
-
known={seen.current}
|
|
155
|
-
/>
|
|
156
|
-
))}
|
|
157
|
-
</ul>
|
|
158
|
-
)}
|
|
159
|
-
|
|
160
|
-
{line && <p className="max-w-full truncate px-1">{line}</p>}
|
|
161
|
-
|
|
162
|
-
<form
|
|
163
|
-
onSubmit={submit}
|
|
164
|
-
className="flex h-10 w-full items-center gap-1.5 rounded-xl bg-popover pr-1.5 pl-3.5 shadow-lg ring-1 ring-foreground/10"
|
|
165
|
-
>
|
|
166
|
-
<input
|
|
167
|
-
autoFocus
|
|
168
|
-
value={draft}
|
|
169
|
-
onChange={(event) => setDraft(event.target.value)}
|
|
170
|
-
disabled={running}
|
|
171
|
-
aria-label="Edit memory"
|
|
172
|
-
placeholder="Tell memory what changed"
|
|
173
|
-
className="min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground disabled:opacity-60"
|
|
174
|
-
/>
|
|
175
|
-
<Button
|
|
176
|
-
type="button"
|
|
177
|
-
size="xs"
|
|
178
|
-
variant="ghost"
|
|
179
|
-
onClick={() => setPicking(!picking)}
|
|
180
|
-
className={cn("max-w-44", !ready && "text-muted-foreground")}
|
|
181
|
-
>
|
|
182
|
-
{ready && model.provider ? (
|
|
183
|
-
<>
|
|
184
|
-
<ProviderIcon provider={model.provider} className="size-3" />
|
|
185
|
-
<span className="truncate">{model.model}</span>
|
|
186
|
-
</>
|
|
187
|
-
) : (
|
|
188
|
-
"Model"
|
|
189
|
-
)}
|
|
190
|
-
<ChevronDown className="text-muted-foreground" />
|
|
191
|
-
</Button>
|
|
192
|
-
<Button
|
|
193
|
-
type="submit"
|
|
194
|
-
size="icon-sm"
|
|
195
|
-
loading={running}
|
|
196
|
-
disabled={!draft.trim() || !ready || running}
|
|
197
|
-
aria-label="Send"
|
|
198
|
-
>
|
|
199
|
-
{!running && <ArrowUp />}
|
|
200
|
-
</Button>
|
|
201
|
-
</form>
|
|
202
|
-
</div>
|
|
203
|
-
</div>
|
|
204
|
-
);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
type Change = {
|
|
208
|
-
kind: "Remember" | "Replace" | "Forget" | "Rename" | "Opened";
|
|
209
|
-
path: string;
|
|
210
|
-
lines: { before?: string; after?: string }[];
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
/** What a call does, read off its arguments — still arriving while it streams — and the facts the screen has shown. */
|
|
214
|
-
function describe(
|
|
215
|
-
name: string,
|
|
216
|
-
input: unknown,
|
|
217
|
-
known: Map<number, KnownFact>,
|
|
218
|
-
): Change {
|
|
219
|
-
const args = (input ?? {}) as {
|
|
220
|
-
path?: string;
|
|
221
|
-
factIds?: (number | null | undefined)[] | null;
|
|
222
|
-
description?: string | null;
|
|
223
|
-
facts?: ({ text?: string; replaces?: number | null } | null)[] | null;
|
|
224
|
-
};
|
|
225
|
-
const path = args.path ?? "";
|
|
226
|
-
|
|
227
|
-
if (name === TOOL_NAMES.memory_recall) {
|
|
228
|
-
return { kind: "Opened", path, lines: [] };
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
if (name === TOOL_NAMES.memory_describe) {
|
|
232
|
-
return {
|
|
233
|
-
kind: "Rename",
|
|
234
|
-
path,
|
|
235
|
-
lines: args.description ? [{ after: `“${args.description}”` }] : [],
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
if (name === TOOL_NAMES.memory_forget) {
|
|
240
|
-
const ids = (args.factIds ?? []).filter((id) => id != null);
|
|
241
|
-
const facts = ids.map((id) => known.get(id));
|
|
242
|
-
return {
|
|
243
|
-
kind: "Forget",
|
|
244
|
-
path: facts.find((fact) => fact)?.path ?? "",
|
|
245
|
-
lines: ids.map((id, index) => ({
|
|
246
|
-
before: facts[index]?.text ?? `Fact #${id}`,
|
|
247
|
-
})),
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// A new note's line leads its first facts; a fact replacing one the screen has shown reads as the change
|
|
252
|
-
const facts = (args.facts ?? []).filter((fact) => fact != null);
|
|
253
|
-
const lines: Change["lines"] = facts.map((fact) =>
|
|
254
|
-
fact.replaces != null
|
|
255
|
-
? {
|
|
256
|
-
before: known.get(fact.replaces)?.text ?? `Fact #${fact.replaces}`,
|
|
257
|
-
after: fact.text,
|
|
258
|
-
}
|
|
259
|
-
: { after: fact.text },
|
|
260
|
-
);
|
|
261
|
-
if (name === TOOL_NAMES.memory_create && args.description) {
|
|
262
|
-
lines.unshift({ after: `“${args.description}”` });
|
|
263
|
-
}
|
|
264
|
-
return {
|
|
265
|
-
kind: facts.some((fact) => fact.replaces != null) ? "Replace" : "Remember",
|
|
266
|
-
path,
|
|
267
|
-
lines,
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
const GLYPHS = {
|
|
272
|
-
Remember: Plus,
|
|
273
|
-
Replace: Pencil,
|
|
274
|
-
Forget: Minus,
|
|
275
|
-
Rename: Pencil,
|
|
276
|
-
Opened: BookOpen,
|
|
277
|
-
} as const;
|
|
278
|
-
|
|
279
|
-
function ChangeRow({
|
|
280
|
-
name,
|
|
281
|
-
input,
|
|
282
|
-
state,
|
|
283
|
-
errorText,
|
|
284
|
-
known,
|
|
285
|
-
}: {
|
|
286
|
-
name: string;
|
|
287
|
-
input: unknown;
|
|
288
|
-
state: string;
|
|
289
|
-
errorText?: string;
|
|
290
|
-
known: Map<number, KnownFact>;
|
|
291
|
-
}) {
|
|
292
|
-
const change = describe(name, input, known);
|
|
293
|
-
const Glyph = GLYPHS[change.kind];
|
|
294
|
-
const broke = state === "output-error";
|
|
295
|
-
const done = state === "output-available";
|
|
296
|
-
return (
|
|
297
|
-
<li className="flex animate-in items-start gap-2.5 px-3 py-2.5 duration-200 fade-in slide-in-from-bottom-1">
|
|
298
|
-
<Glyph className="mt-1 size-3.5 shrink-0 text-muted-foreground" />
|
|
299
|
-
<div className="min-w-0 flex-1 space-y-0.5">
|
|
300
|
-
{change.lines.map((line, at) => (
|
|
301
|
-
<div key={`${change.kind}-${at}`}>
|
|
302
|
-
{line.before && (
|
|
303
|
-
<p className="text-[13px] leading-5 text-muted-foreground/60 line-through">
|
|
304
|
-
{line.before}
|
|
305
|
-
</p>
|
|
306
|
-
)}
|
|
307
|
-
{line.after && (
|
|
308
|
-
<p className="text-sm leading-5 text-foreground/90">
|
|
309
|
-
{line.after}
|
|
310
|
-
</p>
|
|
311
|
-
)}
|
|
312
|
-
</div>
|
|
313
|
-
))}
|
|
314
|
-
<p className="pt-0.5 font-mono text-[11px] text-muted-foreground">
|
|
315
|
-
{change.kind}
|
|
316
|
-
{change.path && ` · ${change.path}`}
|
|
317
|
-
</p>
|
|
318
|
-
{broke && errorText && (
|
|
319
|
-
<p className="text-xs text-destructive">{errorText}</p>
|
|
320
|
-
)}
|
|
321
|
-
</div>
|
|
322
|
-
<span className="mt-0.5 flex size-5 shrink-0 items-center justify-center text-muted-foreground">
|
|
323
|
-
{broke ? (
|
|
324
|
-
<X className="size-3.5 text-destructive" />
|
|
325
|
-
) : done ? (
|
|
326
|
-
<Check className="size-3.5" />
|
|
327
|
-
) : (
|
|
328
|
-
<Loader2 className="size-3.5 animate-spin" />
|
|
329
|
-
)}
|
|
330
|
-
</span>
|
|
331
|
-
</li>
|
|
332
|
-
);
|
|
333
|
-
}
|