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
|
@@ -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.**
|
|
23
|
-
|
|
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
|
|
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
|
|
422
|
+
### Clarity Beats Cleverness
|
|
423
423
|
|
|
424
|
-
|
|
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.
|
|
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
|
|
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:**
|
|
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:**
|
|
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:**
|
|
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:**
|
|
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:**
|
|
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)
|
package/skills/artifact/SKILL.md
CHANGED
|
@@ -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
|
|
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,
|
|
74
|
-
|
|
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/
|
|
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)
|
|
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({
|
|
@@ -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
|
-
|
|
528
|
-
|
|
529
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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) {
|