thursday-agent 0.16.0 → 0.17.1
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 +3 -3
- 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.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/artifact/route.js +9 -9
- package/.next/server/app/api/artifact/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/files/route.js +3 -3
- package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/route.js +8 -8
- package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/route.js +8 -8
- package/.next/server/app/api/bot/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/[id]/route.js +3 -3
- package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/route.js +3 -3
- package/.next/server/app/api/bot/thread/route.js.nft.json +1 -1
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/server/app/api/favicon/[host]/route.js.nft.json +1 -1
- package/.next/server/app/api/file/[...path]/route.js +4 -4
- package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
- 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.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 +11 -11
- 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 +11 -11
- package/.next/server/app/api/reach/route.js.nft.json +1 -1
- package/.next/server/app/api/routine/route.js +7 -7
- package/.next/server/app/api/routine/route.js.nft.json +1 -1
- package/.next/server/app/api/signins/route.js +5 -5
- package/.next/server/app/api/signins/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[source]/[name]/route.js +7 -7
- package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route.js +7 -7
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/call/route.js +5 -5
- package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/settings/route.js +5 -5
- package/.next/server/app/api/thursday/settings/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/text/route.js +13 -13
- package/.next/server/app/api/thursday/text/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/tool-call/route.js +12 -12
- package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/files/route.js +8 -8
- package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/route.js +9 -9
- 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 +5 -5
- 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 +1 -1
- package/.next/server/chunks/[root-of-the-server]__01ypm_z._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__021dkui._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__18e65_-._.js → [root-of-the-server]__03xamry._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__05dp5tr._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__09gdscj._.js +7 -0
- package/.next/server/chunks/{[root-of-the-server]__10_7vqz._.js → [root-of-the-server]__0b36yfw._.js} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__1gamvcz._.js → [root-of-the-server]__0jzwdg-._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0mrk2it._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0nmust6._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0svzjwa._.js +7 -0
- package/.next/server/chunks/{[root-of-the-server]__16yw3mb._.js → [root-of-the-server]__12m24xl._.js} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__1zrwxis._.js → [root-of-the-server]__12tahb4._.js} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__1ep-pao._.js → [root-of-the-server]__1_h4hf9._.js} +4 -4
- package/.next/server/chunks/{[root-of-the-server]__1-tdj60._.js → [root-of-the-server]__1de1o6m._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__1voqqyc._.js → [root-of-the-server]__1ignh6-._.js} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1t02-1p._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1ygplx1._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__11g20j-._.js → [root-of-the-server]__1yl5l25._.js} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__1mbd2w_._.js → [root-of-the-server]__208vmyf._.js} +1 -1
- package/.next/server/chunks/{_1mfu9a3._.js → _02lipqs._.js} +1 -1
- package/.next/server/chunks/_05sa7xl._.js +1 -1
- package/.next/server/chunks/{_1rg5bfd._.js → _074f2ts._.js} +1 -1
- package/.next/server/chunks/_07nxi75._.js +37 -37
- package/.next/server/chunks/_08354bn._.js +12 -12
- package/.next/server/chunks/_08btiir._.js +7 -0
- package/.next/server/chunks/_0caua_s._.js +1 -1
- package/.next/server/chunks/{_0qoush_._.js → _0gt6cbj._.js} +1 -1
- package/.next/server/chunks/_0xygcxs._.js +37 -37
- package/.next/server/chunks/{_09c4we8._.js → _17i1lt2._.js} +1 -1
- package/.next/server/chunks/_19kea1l._.js +9 -9
- package/.next/server/chunks/_1gn2r2q._.js +3 -3
- package/.next/server/chunks/{_03niwml._.js → _1ntwp1s._.js} +1 -1
- package/.next/server/chunks/_1q6e56i._.js +3 -3
- package/.next/server/chunks/{_02fn1o3._.js → _1tkzgtm._.js} +1 -1
- package/.next/server/chunks/_1wl2g8_._.js +2 -2
- package/.next/server/chunks/{_1w6uf9k._.js → _1y3mnz4._.js} +1 -1
- package/.next/server/chunks/features_workspace_workspace_ts_13h82gv._.js +4 -4
- package/.next/server/chunks/features_workspace_workspace_ts_1iyjroj._.js +4 -4
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0cux6zt._.js → node_modules_consola_dist_chunks_prompt_mjs_04oxl25._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0w32bqh._.js → node_modules_consola_dist_chunks_prompt_mjs_0g87zst._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_1clmnaj._.js → node_modules_consola_dist_chunks_prompt_mjs_1341cnf._.js} +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__02jdtqa._.js → [root-of-the-server]__07660xu._.js} +3 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__07iyl1_._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__0rnjkw2._.js → [root-of-the-server]__0g__u45._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__17h1ggo._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1jyeu61._.js +1 -1
- package/.next/server/chunks/ssr/_0-i6wdi._.js +3 -0
- package/.next/server/chunks/ssr/{_1k0efi3._.js → _00g5sq-._.js} +2 -2
- package/.next/server/chunks/ssr/{_0ncuqct._.js → _03akcjz._.js} +2 -2
- package/.next/server/chunks/ssr/{_0l1-xc6._.js → _06xy39t._.js} +2 -2
- package/.next/server/chunks/ssr/_088vzgn._.js +3 -0
- package/.next/server/chunks/ssr/_0fo4552._.js +7 -7
- package/.next/server/chunks/ssr/_0r0g9ki._.js +1 -1
- package/.next/server/chunks/ssr/{_1dqaksc._.js → _0sefgiu._.js} +2 -2
- package/.next/server/chunks/ssr/_0v9r8g2._.js +3 -0
- package/.next/server/chunks/ssr/_0x8ophf._.js +1 -1
- package/.next/server/chunks/ssr/{_0w8r7o7._.js → _1-41lck._.js} +2 -2
- package/.next/server/chunks/ssr/{_11pnnvd._.js → _113ukfo._.js} +3 -3
- package/.next/server/chunks/ssr/_12p8f9_._.js +3 -0
- package/.next/server/chunks/ssr/{_10fwcz_._.js → _14dfh7a._.js} +2 -2
- package/.next/server/chunks/ssr/{_1f6s34p._.js → _1_gwau0._.js} +2 -2
- package/.next/server/chunks/ssr/{_0wupyvd._.js → _1hn3szq._.js} +2 -2
- package/.next/server/chunks/ssr/_1neoj22._.js +1 -1
- package/.next/server/chunks/ssr/{_17ble8k._.js → _1o7a11b._.js} +3 -3
- package/.next/server/chunks/ssr/{_0y28gl3._.js → _1swhm5m._.js} +3 -3
- package/.next/server/chunks/ssr/_1uij_rj._.js +1 -1
- package/.next/server/chunks/ssr/_1umbr78._.js +1 -1
- package/.next/server/chunks/ssr/_1w9w1ok._.js +1 -1
- package/.next/server/chunks/ssr/_1wac78_._.js +3 -0
- package/.next/server/chunks/ssr/{_1z586yw._.js → _20ywznt._.js} +2 -2
- package/.next/server/chunks/ssr/features_0796o8r._.js +1 -1
- package/.next/server/chunks/ssr/{features_bot_1k25jdg._.js → features_bot_0j4h9qu._.js} +2 -2
- package/.next/server/chunks/ssr/features_bot_1knyan7._.js +3 -0
- package/.next/server/chunks/ssr/{features_config_11dpa7r._.js → features_config_1xrlh3l._.js} +3 -3
- package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
- 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 -4
- package/.next/server/chunks/ssr/{node_modules_1r5o-bo._.js → node_modules_00kqq8n._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0u24mg0._.js → node_modules_04o9dd2._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0mark4f._.js → node_modules_05jatne._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0bas34k._.js → node_modules_06rkzq5._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0y5uubt._.js → node_modules_07w6r9n._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0ka8te1._.js → node_modules_08ld3lm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0n1js5k._.js → node_modules_0ft86sp._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_156m1qh._.js → node_modules_0g0lr19._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0bbwe-u._.js → node_modules_0kg-vd-._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0x_2io2._.js → node_modules_0nl9i29._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_18yn_bs._.js → node_modules_0p0xf5f._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0-8r9yw._.js → node_modules_0pyepmf._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1dzye0n._.js → node_modules_0vg-4fo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1xua-g1._.js → node_modules_0y5upun._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1o9n7_n._.js → node_modules_13seln7._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1ozyial._.js → node_modules_15vsfpv._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0sdjzae._.js → node_modules_17azpeb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1zkzksd._.js → node_modules_1_il5l7._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0-ew8f8._.js → node_modules_1aeg65a._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0etz1i0._.js → node_modules_1d73q89._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0ld7p-1._.js → node_modules_1iq8zjs._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_138kcrz._.js → node_modules_1mcsva4._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0uibk9z._.js → node_modules_1mhg5br._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1tj7_9z._.js → node_modules_1mqisle._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_02uwbwp._.js → node_modules_1va4lz9._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_097cl9f._.js → node_modules_207ay1p._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_133hjui._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0hefprb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1b3vwd3._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1uuvrfp._.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/04toe_3nqfjqt.js +1 -0
- package/.next/static/chunks/{245_cp14iz637.js → 0780wmy0_rva8.js} +1 -1
- package/.next/static/chunks/{314szf8yer-3n.js → 09opsnra7k4k0.js} +2 -2
- package/.next/static/chunks/{42m371fn687r5.js → 0if7xqoj3ysfj.js} +1 -1
- package/.next/static/chunks/{0609ejkwuy4sf.js → 1-q6so9vze75d.js} +2 -2
- package/.next/static/chunks/{23tx-2paw9qa6.js → 106jbz6qd0c5l.js} +1 -1
- package/.next/static/chunks/19wkcgzetkh6-.js +1 -0
- package/.next/static/chunks/{39miwvg4k-b2d.js → 1_me_-lnpwdfd.js} +1 -1
- package/.next/static/chunks/{2oa4gpkzjtpni.js → 1mkw_05uc8_ft.js} +1 -1
- package/.next/static/chunks/1njjf8bfkg4_v.js +1 -0
- package/.next/static/chunks/{1ub9obhgfm4jl.js → 25ciqm-ee14nf.js} +1 -1
- package/.next/static/chunks/{2xjr5b-yk_h3o.js → 29laj9_xhx0d1.js} +1 -1
- package/.next/static/chunks/{2jbjyazqfqyoh.js → 2b306ek_blfp1.js} +1 -1
- package/.next/static/chunks/2mpqmpf8wcst1.js +15 -0
- package/.next/static/chunks/{3ro66d9dc70bc.js → 2rpyc6mevfhu6.js} +1 -1
- package/.next/static/chunks/{0cl_fgkphk1oz.js → 2wj77vx62ng3n.js} +1 -1
- package/.next/static/chunks/{3j-l8un0d77v7.js → 2y2v3bk65fdle.js} +3 -3
- package/.next/static/chunks/{3vwjs5kq11417.js → 32oho7re_n3dq.js} +1 -1
- package/.next/static/chunks/388l-zszwa_jf.js +1 -0
- package/.next/static/chunks/{0q4ws7qd21chx.js → 3_s5svfgu9kl_.js} +3 -3
- package/.next/static/chunks/3bwrvpjk95_x4.js +1 -0
- package/.next/static/chunks/{07vcuxousbmy1.js → 3suz18umxycuk.js} +1 -1
- package/.next/static/chunks/{0unonxbajyknw.js → 44n-w1bs83ejz.js} +1 -1
- package/README.md +12 -12
- package/guide/bots.md +48 -8
- package/guide/calls.md +13 -12
- package/guide/setup.md +4 -2
- package/package.json +1 -1
- package/public/sounds/NOTICE +3 -0
- package/public/sounds/opening-land.ogg +0 -0
- package/public/sounds/opening-rise.ogg +0 -0
- package/public/sounds/opening-step-1.ogg +0 -0
- package/public/sounds/opening-step-2.ogg +0 -0
- package/public/sounds/opening-step-3.ogg +0 -0
- package/skills/README.md +3 -0
- package/skills/artifact/SKILL.md +6 -5
- package/skills/artifact/references/book.md +23 -8
- package/skills/artifact/references/deck.md +4 -2
- package/skills/artifact/references/document.md +9 -0
- package/skills/artifact/references/sheet.md +113 -0
- package/skills/artifact/runtime/book/book.css +75 -0
- package/skills/artifact/runtime/book/book.html +6 -3
- package/skills/artifact/runtime/book/book.js +21 -0
- package/skills/artifact/runtime/canvas/canvas.css +1 -1
- package/skills/artifact/runtime/canvas/canvas.js +11 -1
- package/skills/artifact/runtime/deck/deck.css +164 -1
- package/skills/artifact/runtime/deck/deck.js +76 -1
- package/skills/artifact/runtime/document/docx.js +631 -0
- package/skills/artifact/runtime/document/markdown.mjs +58 -2
- package/skills/artifact/runtime/document/quick.css +66 -0
- package/skills/artifact/runtime/document/quick.html +1 -0
- package/skills/artifact/runtime/document/quick.js +154 -0
- package/skills/artifact/runtime/document/word.mjs +65 -0
- package/skills/artifact/runtime/sheet/format.mjs +392 -0
- package/skills/artifact/runtime/sheet/formula.mjs +755 -0
- package/skills/artifact/runtime/sheet/sheet.css +499 -0
- package/skills/artifact/runtime/sheet/sheet.html +102 -0
- package/skills/artifact/runtime/sheet/sheet.js +1361 -0
- package/skills/artifact/runtime/sheet/xlsx.mjs +320 -0
- package/skills/artifact/runtime/shell/head.html +1 -1
- package/skills/artifact/runtime/shell/shell.css +3 -0
- package/skills/artifact/runtime/shell/wear.mjs +47 -1
- package/skills/artifact/runtime/vendor/fflate.LICENSE.md +23 -0
- package/skills/artifact/runtime/vendor/fflate.mjs +2710 -0
- package/skills/artifact/scripts/book.mjs +160 -11
- package/skills/artifact/scripts/chart.mjs +229 -11
- package/skills/artifact/scripts/document.mjs +29 -2
- package/skills/artifact/scripts/spreadsheet.mjs +1165 -0
- package/skills/data-report/SKILL.md +8 -1
- package/.next/server/chunks/[root-of-the-server]__0aijj66._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0tvoct-._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__118qjk_._.js +0 -7
- package/.next/server/chunks/[root-of-the-server]__1b8tp42._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1gzcbda._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1qcn1ti._.js +0 -7
- package/.next/server/chunks/_0xx3ryc._.js +0 -7
- package/.next/server/chunks/ssr/[root-of-the-server]__1y5_1cv._.js +0 -3
- package/.next/server/chunks/ssr/_0-ou1b0._.js +0 -3
- package/.next/server/chunks/ssr/_1g48r6t._.js +0 -3
- package/.next/server/chunks/ssr/_1u5vsy-._.js +0 -3
- package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +0 -3
- package/.next/server/chunks/ssr/lib_utils_ts_0_f1xvm._.js +0 -3
- package/.next/static/chunks/00d54fcfm-lko.js +0 -1
- package/.next/static/chunks/0gjlsu6vrfzod.js +0 -1
- package/.next/static/chunks/17yqt1p_svv13.js +0 -1
- package/.next/static/chunks/203pbwecfs3tm.js +0 -1
- package/.next/static/chunks/3ghvoe_mlljzs.js +0 -15
- package/.next/static/chunks/3gn7dubb4-pwy.js +0 -1
- /package/.next/static/{RtLRT9EEaGn-OqwpMFdYg → SNCDmWKeIrXB6yqnwzClS}/_buildManifest.js +0 -0
- /package/.next/static/{RtLRT9EEaGn-OqwpMFdYg → SNCDmWKeIrXB6yqnwzClS}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{RtLRT9EEaGn-OqwpMFdYg → SNCDmWKeIrXB6yqnwzClS}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
// How a column's values read: Excel's own format codes, the ones a sheet needs — grouping,
|
|
2
|
+
// decimals, a percent, words or a currency sign before or after, another way for negatives and
|
|
3
|
+
// zero after a `;` (in [Red] too), and dates and times. The same code goes into the .xlsx, so
|
|
4
|
+
// Excel shows what the page shows. The page's script carries this file too (spreadsheet.mjs
|
|
5
|
+
// inlines it), so a total worked out in the page reads the same way.
|
|
6
|
+
//
|
|
7
|
+
// A date is Excel's: a number of days, 1 being 1900-01-01 (the 1900 date system; before
|
|
8
|
+
// 1900-03-01 Excel counts a 29 February that never was, which this does not).
|
|
9
|
+
|
|
10
|
+
const quote = (text) => (text ? `"${text.replaceAll('"', "")}"` : "");
|
|
11
|
+
|
|
12
|
+
/** The colours a section may name, as Excel spells them. */
|
|
13
|
+
const FORMAT_COLORS = ["Red", "Blue", "Green", "Black"];
|
|
14
|
+
const MONTH_NAMES = [
|
|
15
|
+
"January",
|
|
16
|
+
"February",
|
|
17
|
+
"March",
|
|
18
|
+
"April",
|
|
19
|
+
"May",
|
|
20
|
+
"June",
|
|
21
|
+
"July",
|
|
22
|
+
"August",
|
|
23
|
+
"September",
|
|
24
|
+
"October",
|
|
25
|
+
"November",
|
|
26
|
+
"December",
|
|
27
|
+
];
|
|
28
|
+
const DAY_NAMES = [
|
|
29
|
+
"Sunday",
|
|
30
|
+
"Monday",
|
|
31
|
+
"Tuesday",
|
|
32
|
+
"Wednesday",
|
|
33
|
+
"Thursday",
|
|
34
|
+
"Friday",
|
|
35
|
+
"Saturday",
|
|
36
|
+
];
|
|
37
|
+
/** Days from 1970-01-01 to Excel's day 0. */
|
|
38
|
+
const EPOCH = 25569;
|
|
39
|
+
|
|
40
|
+
/** The parts of a code outside quotes, split on `;`. */
|
|
41
|
+
function sectionsOf(code) {
|
|
42
|
+
const out = [""];
|
|
43
|
+
let quoted = false;
|
|
44
|
+
for (let i = 0; i < code.length; i++) {
|
|
45
|
+
const ch = code[i];
|
|
46
|
+
if (ch === '"') quoted = !quoted;
|
|
47
|
+
if (ch === "\\" && !quoted) {
|
|
48
|
+
out[out.length - 1] += ch + (code[i + 1] ?? "");
|
|
49
|
+
i++;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (ch === ";" && !quoted) out.push("");
|
|
53
|
+
else out[out.length - 1] += ch;
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Words and signs as a section writes them — "quoted", \x, a locale's [$sign-409], _x as a
|
|
60
|
+
* space — and as the .xlsx keeps them (`raw`), in a form Excel reads whole.
|
|
61
|
+
*/
|
|
62
|
+
function literal(text) {
|
|
63
|
+
let out = "";
|
|
64
|
+
let raw = "";
|
|
65
|
+
const re =
|
|
66
|
+
/"([^"]*)"|\\(.)|\[\$([^\]-]*)(?:-[0-9A-Fa-f]+)?\]|_(.)|\*(.)|([^"\\[_*])/gsy;
|
|
67
|
+
let m;
|
|
68
|
+
let at = 0;
|
|
69
|
+
while (at < text.length) {
|
|
70
|
+
re.lastIndex = at;
|
|
71
|
+
m = re.exec(text);
|
|
72
|
+
if (!m) return null;
|
|
73
|
+
at = re.lastIndex;
|
|
74
|
+
if (m[1] !== undefined) {
|
|
75
|
+
out += m[1];
|
|
76
|
+
raw += quote(m[1]);
|
|
77
|
+
} else if (m[2] !== undefined) {
|
|
78
|
+
out += m[2];
|
|
79
|
+
raw += `\\${m[2]}`;
|
|
80
|
+
} else if (m[3] !== undefined) {
|
|
81
|
+
out += m[3];
|
|
82
|
+
raw += quote(m[3]);
|
|
83
|
+
} else if (m[4] !== undefined) {
|
|
84
|
+
out += " ";
|
|
85
|
+
raw += `_${m[4]}`;
|
|
86
|
+
} else if (m[5] !== undefined) {
|
|
87
|
+
// A fill: nothing to fill in a cell drawn to fit, and Excel keeps it
|
|
88
|
+
raw += `*${m[5]}`;
|
|
89
|
+
} else if (/[#0?@]/.test(m[6])) return null;
|
|
90
|
+
else {
|
|
91
|
+
out += m[6];
|
|
92
|
+
raw += /[-$+/():!^&'~{}<>= ]/.test(m[6]) ? m[6] : quote(m[6]);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return { text: out, raw };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** A date or time section as its tokens, or null when it is not one this draws. */
|
|
99
|
+
function dateTokens(text) {
|
|
100
|
+
const tokens = [];
|
|
101
|
+
const re =
|
|
102
|
+
/"([^"]*)"|\\(.)|(yyyy|yy|mmmm|mmm|mm|m|dddd|ddd|dd|d|hh|h|ss|s|AM\/PM|A\/P)|([-/.,: ])/iy;
|
|
103
|
+
let at = 0;
|
|
104
|
+
while (at < text.length) {
|
|
105
|
+
re.lastIndex = at;
|
|
106
|
+
const m = re.exec(text);
|
|
107
|
+
if (!m) return null;
|
|
108
|
+
at = re.lastIndex;
|
|
109
|
+
if (m[3]) tokens.push({ t: m[3].toLowerCase() });
|
|
110
|
+
else tokens.push({ lit: m[1] ?? m[2] ?? m[4] });
|
|
111
|
+
}
|
|
112
|
+
if (!tokens.some((one) => one.t)) return null;
|
|
113
|
+
// m or mm is the minute when it follows an hour or comes before seconds
|
|
114
|
+
const parts = tokens.filter((one) => one.t);
|
|
115
|
+
parts.forEach((one, i) => {
|
|
116
|
+
if (one.t !== "m" && one.t !== "mm") return;
|
|
117
|
+
if (/^h/.test(parts[i - 1]?.t ?? "") || /^s/.test(parts[i + 1]?.t ?? ""))
|
|
118
|
+
one.t = one.t === "m" ? "n" : "nn";
|
|
119
|
+
});
|
|
120
|
+
return tokens;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** One section read: `{ color, date }` or `{ color, prefix, core, group, decimals, percent, suffix }`. */
|
|
124
|
+
function parseSection(text) {
|
|
125
|
+
let rest = text;
|
|
126
|
+
let color = null;
|
|
127
|
+
const tag = /^\[(\w+)\]/.exec(rest);
|
|
128
|
+
if (tag) {
|
|
129
|
+
color = FORMAT_COLORS.find(
|
|
130
|
+
(one) => one.toLowerCase() === tag[1].toLowerCase(),
|
|
131
|
+
);
|
|
132
|
+
if (!color) return null;
|
|
133
|
+
rest = rest.slice(tag[0].length);
|
|
134
|
+
}
|
|
135
|
+
if (rest === "General") return { color, general: true };
|
|
136
|
+
const m =
|
|
137
|
+
/^((?:"[^"]*"|\\.|\[\$[^\]]*\]|[^#0"\\[])*)(#,##0|0)(?:\.(0+))?(%?)((?:"[^"]*"|\\.|[^#0"\\%])*)$/s.exec(
|
|
138
|
+
rest,
|
|
139
|
+
);
|
|
140
|
+
if (m) {
|
|
141
|
+
const prefix = literal(m[1]);
|
|
142
|
+
const suffix = literal(m[5]);
|
|
143
|
+
if (prefix === null || suffix === null) return null;
|
|
144
|
+
return {
|
|
145
|
+
color,
|
|
146
|
+
prefix: prefix.text,
|
|
147
|
+
rawPrefix: prefix.raw,
|
|
148
|
+
rawSuffix: suffix.raw,
|
|
149
|
+
core: true,
|
|
150
|
+
group: m[2] === "#,##0",
|
|
151
|
+
decimals: m[3]?.length ?? 0,
|
|
152
|
+
percent: m[4] === "%",
|
|
153
|
+
suffix: suffix.text,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const date = dateTokens(rest);
|
|
157
|
+
if (date) return { color, date };
|
|
158
|
+
// Words alone, as a zero or a negative may read ("-", "none")
|
|
159
|
+
const words = literal(rest);
|
|
160
|
+
return words === null
|
|
161
|
+
? null
|
|
162
|
+
: { color, prefix: words.text, rawPrefix: words.raw, core: false };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** A format code read into its sections, or null for one this sheet does not draw. */
|
|
166
|
+
function parseFormat(code) {
|
|
167
|
+
if (!code || code === "General") return { general: true };
|
|
168
|
+
const sections = sectionsOf(String(code));
|
|
169
|
+
if (sections.length > 3) return null;
|
|
170
|
+
const parsed = sections.map(parseSection);
|
|
171
|
+
if (parsed.some((one) => one === null)) return null;
|
|
172
|
+
if (!parsed[0].core && !parsed[0].date && !parsed[0].general) return null;
|
|
173
|
+
if (parsed.length > 1 && parsed.some((one) => one.date)) return null;
|
|
174
|
+
return { sections: parsed };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** Whether a sheet can draw `code`; the message says what it can. */
|
|
178
|
+
export function checkFormat(code) {
|
|
179
|
+
if (parseFormat(code)) return null;
|
|
180
|
+
return `"${code}" is not a format this sheet draws: use #,##0, #,##0.00, 0, 0.0%, words or a sign before or after in quotes ("₩"#,##0, #,##0"원", "$"#,##0.00), another way for negatives and zero after ; ("#,##0;[Red](#,##0);"-""), or a date or time (yyyy-mm-dd, yyyy"년" m"월" d"일", d mmm yyyy, hh:mm)`;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** Whether values in `code` are dates or times. */
|
|
184
|
+
export function isDateFormat(code) {
|
|
185
|
+
return Boolean(parseFormat(code)?.sections?.[0]?.date);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** The format code as the .xlsx keeps it: words and signs in quotes, so Excel reads it whole. */
|
|
189
|
+
export function xlsxFormat(code) {
|
|
190
|
+
const parts = parseFormat(code);
|
|
191
|
+
if (!parts || parts.general) return "General";
|
|
192
|
+
return parts.sections
|
|
193
|
+
.map((one) => {
|
|
194
|
+
const color = one.color ? `[${one.color}]` : "";
|
|
195
|
+
if (one.general) return `${color}General`;
|
|
196
|
+
if (one.date)
|
|
197
|
+
return (
|
|
198
|
+
color +
|
|
199
|
+
one.date
|
|
200
|
+
.map((token) =>
|
|
201
|
+
token.t
|
|
202
|
+
? token.t
|
|
203
|
+
.replace(/n/g, "m")
|
|
204
|
+
.replace("am/pm", "AM/PM")
|
|
205
|
+
.replace("a/p", "A/P")
|
|
206
|
+
: /^[-/.,: ]$/.test(token.lit)
|
|
207
|
+
? token.lit
|
|
208
|
+
: quote(token.lit),
|
|
209
|
+
)
|
|
210
|
+
.join("")
|
|
211
|
+
);
|
|
212
|
+
if (!one.core) return color + one.rawPrefix;
|
|
213
|
+
const core = `${one.group ? "#,##0" : "0"}${one.decimals ? `.${"0".repeat(one.decimals)}` : ""}${one.percent ? "%" : ""}`;
|
|
214
|
+
return `${color}${one.rawPrefix}${core}${one.rawSuffix}`;
|
|
215
|
+
})
|
|
216
|
+
.join(";");
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** The section a number is drawn with, and whether its own minus sign is dropped. */
|
|
220
|
+
function sectionFor(parts, value) {
|
|
221
|
+
const [first, second, third] = parts.sections;
|
|
222
|
+
if (typeof value !== "number") return { section: first, signless: false };
|
|
223
|
+
if (value === 0 && third) return { section: third, signless: true };
|
|
224
|
+
if (value < 0 && second) return { section: second, signless: true };
|
|
225
|
+
return { section: first, signless: false };
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/** An Excel date number as the text a date section writes. */
|
|
229
|
+
function dateText(serial, tokens) {
|
|
230
|
+
const whole = new Date(Math.round((serial - EPOCH) * 86400) * 1000);
|
|
231
|
+
const [y, mo, d, day] = [
|
|
232
|
+
whole.getUTCFullYear(),
|
|
233
|
+
whole.getUTCMonth(),
|
|
234
|
+
whole.getUTCDate(),
|
|
235
|
+
whole.getUTCDay(),
|
|
236
|
+
];
|
|
237
|
+
const [h, mi, s] = [
|
|
238
|
+
whole.getUTCHours(),
|
|
239
|
+
whole.getUTCMinutes(),
|
|
240
|
+
whole.getUTCSeconds(),
|
|
241
|
+
];
|
|
242
|
+
const half = tokens.some((one) => one.t === "am/pm" || one.t === "a/p");
|
|
243
|
+
const hour = half ? h % 12 || 12 : h;
|
|
244
|
+
const two = (n) => String(n).padStart(2, "0");
|
|
245
|
+
return tokens
|
|
246
|
+
.map((one) => {
|
|
247
|
+
if (!one.t) return one.lit;
|
|
248
|
+
return {
|
|
249
|
+
yyyy: String(y),
|
|
250
|
+
yy: two(y % 100),
|
|
251
|
+
mmmm: MONTH_NAMES[mo],
|
|
252
|
+
mmm: MONTH_NAMES[mo].slice(0, 3),
|
|
253
|
+
mm: two(mo + 1),
|
|
254
|
+
m: String(mo + 1),
|
|
255
|
+
dddd: DAY_NAMES[day],
|
|
256
|
+
ddd: DAY_NAMES[day].slice(0, 3),
|
|
257
|
+
dd: two(d),
|
|
258
|
+
d: String(d),
|
|
259
|
+
hh: two(hour),
|
|
260
|
+
h: String(hour),
|
|
261
|
+
nn: two(mi),
|
|
262
|
+
n: String(mi),
|
|
263
|
+
ss: two(s),
|
|
264
|
+
s: String(s),
|
|
265
|
+
"am/pm": h < 12 ? "AM" : "PM",
|
|
266
|
+
"a/p": h < 12 ? "A" : "P",
|
|
267
|
+
}[one.t];
|
|
268
|
+
})
|
|
269
|
+
.join("");
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** A cell's value as the page shows it. */
|
|
273
|
+
export function formatValue(value, code) {
|
|
274
|
+
if (value === null || value === undefined || value === "") return "";
|
|
275
|
+
if (typeof value === "object" && "error" in value) return value.error;
|
|
276
|
+
if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
|
|
277
|
+
if (typeof value !== "number") return String(value);
|
|
278
|
+
const parts = parseFormat(code) ?? { general: true };
|
|
279
|
+
const { section, signless } = parts.general
|
|
280
|
+
? { section: { general: true }, signless: false }
|
|
281
|
+
: sectionFor(parts, value);
|
|
282
|
+
if (section.general)
|
|
283
|
+
return Number.isInteger(value)
|
|
284
|
+
? String(value)
|
|
285
|
+
: String(Number(value.toPrecision(10)));
|
|
286
|
+
if (section.date) return value < 0 ? "#NUM!" : dateText(value, section.date);
|
|
287
|
+
if (!section.core) return section.prefix;
|
|
288
|
+
const n = section.percent ? value * 100 : value;
|
|
289
|
+
const text = Math.abs(n).toLocaleString("en-US", {
|
|
290
|
+
minimumFractionDigits: section.decimals,
|
|
291
|
+
maximumFractionDigits: section.decimals,
|
|
292
|
+
useGrouping: section.group,
|
|
293
|
+
});
|
|
294
|
+
const shown = `${section.prefix}${text}${section.percent ? "%" : ""}${section.suffix}`;
|
|
295
|
+
return n < 0 && !signless && Number(text.replace(/,/g, "")) !== 0
|
|
296
|
+
? `-${shown}`
|
|
297
|
+
: shown;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/** The colour a section gives a value (`Red`, `Blue`, `Green`, `Black`), or null. */
|
|
301
|
+
export function formatColor(value, code) {
|
|
302
|
+
if (typeof value !== "number") return null;
|
|
303
|
+
const parts = parseFormat(code);
|
|
304
|
+
if (!parts || parts.general) return null;
|
|
305
|
+
return sectionFor(parts, value).section.color ?? null;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* A date as Excel's day number, or null. Written year first (2026-07-03, 2026.07.03,
|
|
310
|
+
* 2026/07/03) unless `order` says the day or the month comes first (`dmy`: 03.07.2026,
|
|
311
|
+
* `mdy`: 07/03/2026) — which of those a file means is for whoever knows the file to say,
|
|
312
|
+
* never guessed here. A time may follow: hh:mm or hh:mm:ss.
|
|
313
|
+
*/
|
|
314
|
+
export function serialOf(text, order = "ymd") {
|
|
315
|
+
const time = String.raw`(?:[ T](\d{1,2}):(\d{2})(?::(\d{2}))?)?$`;
|
|
316
|
+
const m = new RegExp(
|
|
317
|
+
order === "ymd"
|
|
318
|
+
? String.raw`^(\d{4})[-/.](\d{1,2})[-/.](\d{1,2})` + time
|
|
319
|
+
: String.raw`^(\d{1,2})[-/.](\d{1,2})[-/.](\d{4})` + time,
|
|
320
|
+
).exec(String(text).trim());
|
|
321
|
+
if (!m) return null;
|
|
322
|
+
const [a, b, c, h = 0, mi = 0, s = 0] = m.slice(1).map((x) => Number(x ?? 0));
|
|
323
|
+
const [y, mo, d] =
|
|
324
|
+
order === "ymd" ? [a, b, c] : order === "dmy" ? [c, b, a] : [c, a, b];
|
|
325
|
+
const at = Date.UTC(y, mo - 1, d, h, mi, s);
|
|
326
|
+
const check = new Date(at);
|
|
327
|
+
if (check.getUTCMonth() !== mo - 1 || check.getUTCDate() !== d || h > 23)
|
|
328
|
+
return null;
|
|
329
|
+
return Number((at / 86400000 + EPOCH).toPrecision(15));
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/** An Excel day number written YYYY-MM-DD, and hh:mm or hh:mm:ss when it has a time of day. */
|
|
333
|
+
export function isoOf(serial) {
|
|
334
|
+
const at = new Date(Math.round((serial - EPOCH) * 86400) * 1000);
|
|
335
|
+
const iso = at.toISOString();
|
|
336
|
+
if (at.getUTCHours() || at.getUTCMinutes() || at.getUTCSeconds())
|
|
337
|
+
return `${iso.slice(0, 10)} ${at.getUTCSeconds() ? iso.slice(11, 19) : iso.slice(11, 16)}`;
|
|
338
|
+
return iso.slice(0, 10);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* What someone typed into a cell of a column written in `code`: a date in a date column when
|
|
343
|
+
* it is written YYYY-MM-DD; a number when it reads as one — with the format's words or sign
|
|
344
|
+
* around it, grouping commas, a minus or a % — TRUE or FALSE, empty for nothing, and otherwise
|
|
345
|
+
* the text as typed.
|
|
346
|
+
*/
|
|
347
|
+
export function valueOf(text, code) {
|
|
348
|
+
const typed = String(text).trim();
|
|
349
|
+
if (typed === "") return null;
|
|
350
|
+
if (/^(TRUE|FALSE)$/i.test(typed)) return typed.toUpperCase() === "TRUE";
|
|
351
|
+
const parts = parseFormat(code) ?? { general: true };
|
|
352
|
+
const first = parts.general ? { general: true } : parts.sections[0];
|
|
353
|
+
if (first.date) return serialOf(typed) ?? plainNumber(typed, {}) ?? typed;
|
|
354
|
+
const words = parts.general ? [{}] : parts.sections.filter((one) => one.core);
|
|
355
|
+
for (const one of words) {
|
|
356
|
+
const n = plainNumber(typed, one);
|
|
357
|
+
if (n !== null) return n;
|
|
358
|
+
}
|
|
359
|
+
return typed;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/** `typed` as a number with a section's words around it, or null. */
|
|
363
|
+
function plainNumber(typed, section) {
|
|
364
|
+
let rest = typed;
|
|
365
|
+
let negative = false;
|
|
366
|
+
const minus = () => {
|
|
367
|
+
if (!negative && rest.startsWith("-")) {
|
|
368
|
+
negative = true;
|
|
369
|
+
rest = rest.slice(1).trim();
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
// (1,234) is how accounting writes a negative
|
|
373
|
+
if (/^\(.*\)$/.test(rest)) {
|
|
374
|
+
negative = true;
|
|
375
|
+
rest = rest.slice(1, -1).trim();
|
|
376
|
+
}
|
|
377
|
+
minus();
|
|
378
|
+
if (section.prefix && rest.startsWith(section.prefix.trim()))
|
|
379
|
+
rest = rest.slice(section.prefix.trim().length).trim();
|
|
380
|
+
minus();
|
|
381
|
+
if (section.suffix && rest.endsWith(section.suffix.trim()))
|
|
382
|
+
rest = rest.slice(0, -section.suffix.trim().length).trim();
|
|
383
|
+
const percent = rest.endsWith("%");
|
|
384
|
+
if (percent) rest = rest.slice(0, -1).trim();
|
|
385
|
+
if (
|
|
386
|
+
!/\d/.test(rest) ||
|
|
387
|
+
!/^(?:\d{1,3}(?:,\d{3})+|\d+)?(?:\.\d*)?(?:[eE][+-]?\d+)?$/.test(rest)
|
|
388
|
+
)
|
|
389
|
+
return null;
|
|
390
|
+
const n = Number(rest.replaceAll(",", "")) * (negative ? -1 : 1);
|
|
391
|
+
return percent ? Number((n / 100).toPrecision(15)) : n;
|
|
392
|
+
}
|