thursday-agent 0.9.0 → 0.11.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/app-path-routes-manifest.json +0 -1
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/routes-manifest.json +0 -6
- 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 +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/artifact/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/keep-working/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.nft.json +1 -1
- package/.next/server/app/api/bot/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -1
- 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.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.nft.json +1 -1
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/reach/route.js +13 -13
- package/.next/server/app/api/reach/route.js.nft.json +1 -1
- 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.nft.json +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/text/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/tool-call/route.js +14 -15
- package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/route.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
- 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 +56 -56
- package/.next/server/app/page.js +4 -4
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +0 -1
- package/.next/server/chunks/[root-of-the-server]__014ydvq._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__0209ah4._.js +7 -5
- package/.next/server/chunks/[root-of-the-server]__04r4h-2._.js +4 -2
- package/.next/server/chunks/[root-of-the-server]__0542v_d._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0gewdg9._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__0mrk2it._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1-swlkw._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__12iddfq._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1ai5lme._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__1cjxw0-._.js +2 -2
- package/.next/server/chunks/{[root-of-the-server]__1fy2g82._.js → [root-of-the-server]__1k3j52n._.js} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1kyjt5m._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__1ygplx1._.js +1 -1
- package/.next/server/chunks/_05v8k21._.js +3 -1
- package/.next/server/chunks/_0awtznl._.js +1 -1
- package/.next/server/chunks/_0na2fj1._.js +1 -1
- package/.next/server/chunks/_0x-ej3f._.js +17 -17
- package/.next/server/chunks/_12-amdu._.js +2 -2
- package/.next/server/chunks/_15740dw._.js +60 -0
- package/.next/server/chunks/_1dc_d1q._.js +3 -3
- package/.next/server/chunks/_1i350l5._.js +3 -1
- package/.next/server/chunks/_1jc5g4p._.js +2 -2
- package/.next/server/chunks/_1jn-aep._.js +4 -4
- package/.next/server/chunks/_1m88lkh._.js +11 -11
- package/.next/server/chunks/_1ogqovh._.js +4 -4
- package/.next/server/chunks/_1uuucy-._.js +1 -1
- package/.next/server/chunks/_1zxp-p6._.js +1 -1
- package/.next/server/chunks/features_0rfvely._.js +5 -3
- package/.next/server/chunks/ssr/{[root-of-the-server]__1se25x0._.js → [root-of-the-server]__0hpp3nw._.js} +29 -13
- package/.next/server/chunks/ssr/[root-of-the-server]__0m7u9j-._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0tzekbl._.js +24 -60
- package/.next/server/chunks/ssr/[root-of-the-server]__1cz2rz5._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__0tvavy9._.js → [root-of-the-server]__1iwyp1e._.js} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1w9hqq8._.js +1 -1
- package/.next/server/chunks/ssr/_097-ljd._.js +1 -1
- package/.next/server/chunks/ssr/{_1tmu8z-._.js → _0btzccu._.js} +2 -2
- package/.next/server/chunks/ssr/_0fqhhwi._.js +1 -1
- package/.next/server/chunks/ssr/_0hjzb5o._.js +3 -0
- package/.next/server/chunks/ssr/_0ld9_qq._.js +1 -1
- package/.next/server/chunks/ssr/{_0urj3mc._.js → _0ouzu9f._.js} +2 -2
- package/.next/server/chunks/ssr/{_1-zyvdb._.js → _0u7ko71._.js} +2 -2
- package/.next/server/chunks/ssr/{_0ltz2q5._.js → _0wd_o8-._.js} +2 -2
- package/.next/server/chunks/ssr/_0ya0cb0._.js +3 -0
- package/.next/server/chunks/ssr/_10yyqtk._.js +67 -0
- package/.next/server/chunks/ssr/{_1uy0xom._.js → _12eyown._.js} +3 -3
- package/.next/server/chunks/ssr/_12mijol._.js +11 -11
- package/.next/server/chunks/ssr/_132qkfz._.js +1 -1
- package/.next/server/chunks/ssr/_184327j._.js +1 -1
- package/.next/server/chunks/ssr/{_1z74dmq._.js → _19ps4p3._.js} +7 -7
- package/.next/server/chunks/ssr/{_1flbs77._.js → _1bhy4yg._.js} +2 -2
- package/.next/server/chunks/ssr/_1d423aj._.js +7 -5
- package/.next/server/chunks/ssr/{_1a-nuxx._.js → _1kd843u._.js} +2 -2
- package/.next/server/chunks/ssr/{_0ital-2._.js → _1kq2ye_._.js} +2 -2
- package/.next/server/chunks/ssr/_1mqn9mc._.js +1 -1
- package/.next/server/chunks/ssr/_1neoj22._.js +1 -1
- package/.next/server/chunks/ssr/_1p8xorg._.js +3 -0
- package/.next/server/chunks/ssr/{_1x-kojb._.js → _1q683w8._.js} +3 -3
- package/.next/server/chunks/ssr/_1tawxu2._.js +3 -0
- package/.next/server/chunks/ssr/{_0scf7xy._.js → _1w2oba6._.js} +2 -2
- package/.next/server/chunks/ssr/_1xoch6f._.js +1 -1
- package/.next/server/chunks/ssr/{_0kjj5ts._.js → _1ybo1hd._.js} +3 -3
- package/.next/server/chunks/ssr/features_bot_0s11m4r._.js +3 -0
- 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_00jz2hu._.js +1 -1
- package/.next/server/chunks/ssr/{node_modules_1af3w91._.js → node_modules_00pocul._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0th357h._.js → node_modules_02zt4az._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0jljel9._.js → node_modules_05ojmcl._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0wnlddw._.js → node_modules_06i6bli._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_06bb4q8._.js → node_modules_09dj429._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_068ws5v._.js → node_modules_0auzgvx._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1ogczzz._.js → node_modules_0evjwh1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_13kwejm._.js → node_modules_0gmdur8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1s-gb-1._.js → node_modules_0j3te-1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1bucjlk._.js → node_modules_0rbaymq._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1wbkzl9._.js → node_modules_0tf8_1e._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_12et8d5._.js → node_modules_0yqy-0b._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1lkix61._.js → node_modules_1-53ebx._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_03d0rfz._.js → node_modules_1-y9aho._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0x630an._.js → node_modules_11bltzp._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0uyh_vb._.js → node_modules_18jn2qo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0dzm4um._.js → node_modules_1_te3bu._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_07rs_p2._.js → node_modules_1c0pg3k._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0sgy-dc._.js → node_modules_1en2jx5._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0ubdtk-._.js → node_modules_1p-c8cr._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1z1lrbk._.js → node_modules_1qe-oxg._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_04_sbbc._.js → node_modules_1rjt833._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0yvz9e0._.js → node_modules_1tzw5sn._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1uwg-gz._.js → node_modules_1x6uwvn._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0t_ez6-._.js → node_modules_1zqddke._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_05ybmta._.js → node_modules_211zgim._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0r443fh._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0y51bqj._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_10wnlbk._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1sc114e._.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 +57 -57
- package/.next/static/chunks/{13ixzheqw7o-w.js → 03-724sj0nk_z.js} +2 -2
- package/.next/static/chunks/03bhu4mk8en2q.js +1 -0
- package/.next/static/chunks/{3h2e-xv1zxh_f.js → 04imzjhvzw65d.js} +2 -2
- package/.next/static/chunks/{27tvv1i-smrck.js → 0gljzv9fz1g7d.js} +1 -1
- package/.next/static/chunks/{37j27b3e1gt7r.js → 0h0lythv1ql93.js} +1 -1
- package/.next/static/chunks/{2o4dndk0d68do.js → 0hzbj7f48cmx0.js} +1 -1
- package/.next/static/chunks/0lwunwbl7u7pt.js +1 -0
- package/.next/static/chunks/{0u9ae9k_2g7k3.js → 0r6nwxg4dv83t.js} +1 -1
- package/.next/static/chunks/0rn9nbg6aif9f.js +17 -0
- package/.next/static/chunks/{3bbzsitgiltnt.js → 0x_w4shtvrrfg.js} +1 -1
- package/.next/static/chunks/{2sdwbfs1x5skp.js → 0ympuji_ufypd.js} +1 -1
- package/.next/static/chunks/{3t9huugh-5_ps.js → 0zmrz4zfzm4dt.js} +1 -1
- package/.next/static/chunks/{0qmd8n52hp-6v.js → 11tlxkr7a_rpc.js} +1 -1
- package/.next/static/chunks/{2c64drdevdla3.js → 12scesro428m7.js} +2 -2
- package/.next/static/chunks/16s2fx3890_jd.js +65 -0
- package/.next/static/chunks/{0oyz95sujd2c7.js → 1qzfgplyo18tc.js} +1 -1
- package/.next/static/chunks/{04e-e--5lk26x.js → 1r4zajz14jp9-.js} +1 -1
- package/.next/static/chunks/1s6m4cmbn7htf.js +1 -0
- package/.next/static/chunks/1wl9t1-3i-q8p.css +1 -0
- package/.next/static/chunks/2-asot3p1j3yg.js +1 -0
- package/.next/static/chunks/{0u3ktztrzu1fa.js → 2-jn4xscbm-i2.js} +1 -1
- package/.next/static/chunks/22h9gvclqtx_2.js +1 -0
- package/.next/static/chunks/{337g9g_ux2gj-.js → 26-eblxwnykck.js} +1 -1
- package/.next/static/chunks/{43q9cgbuw8krx.js → 2kzwhbuobpkw3.js} +2 -2
- package/.next/static/chunks/2m6jd3586ijb-.js +1 -0
- package/.next/static/chunks/{0_awn8tucznxc.js → 304q9p54tcgm1.js} +1 -1
- package/.next/static/chunks/{1u5i-jti87jbo.js → 35wdx3wt7cg4a.js} +1 -1
- package/.next/static/chunks/37unh9460im7v.js +18 -0
- package/.next/static/chunks/{01xjer0i_e5z5.js → 39gj5vxz1zpm_.js} +1 -1
- package/.next/static/chunks/{427qsc6kahxyo.js → 39vrqy1r_00jc.js} +1 -1
- package/.next/static/chunks/{245hb85nsy6j4.js → 3dipmu0mptqum.js} +1 -1
- package/.next/static/chunks/3gki-squw28yu.js +1 -0
- package/.next/static/chunks/{3obf9n3cxj99k.js → 3jvldk2wvwbge.js} +1 -1
- package/.next/static/chunks/{38301ji-85i30.js → 3nnzdl_te20hv.js} +1 -1
- package/.next/static/chunks/{2m267diam_vib.js → 3tz4dr0_8pq1-.js} +1 -1
- package/.next/static/chunks/{2gocl3dq0_h1s.js → 3x6pggb-2kyrk.js} +1 -1
- package/.next/static/chunks/{025bmrgeukcb2.js → 4440mws9jz3mt.js} +1 -1
- package/README.md +4 -0
- package/app/api/thursday/tool-call/route.ts +1 -15
- package/components/ui/radio-group.tsx +2 -2
- package/docs/images/demo-still.jpg +0 -0
- package/docs/live-calls.md +19 -11
- package/features/ai/prompts/live.prompt.ts +51 -26
- package/features/ai/prompts/prompt-helper.ts +1 -9
- package/features/ai/prompts/thursday.prompt.ts +8 -2
- package/features/bot/bot.run.ts +9 -3
- package/features/bot/bot.seed.ts +35 -91
- package/features/bot/components/bot-room.tsx +0 -6
- package/features/bot/components/bot-setting.tsx +4 -4
- package/features/bot/components/room-pill.tsx +4 -2
- package/features/bot/seed-bots.ts +2 -2
- package/features/intro/components/intro.tsx +2 -3
- package/features/reach/reach.ts +2 -2
- package/features/routine/components/routine-setting.tsx +1 -1
- package/features/signins/signins.query.ts +66 -1
- package/features/thursday/components/side-captions.tsx +31 -8
- package/features/thursday/components/thursday-setting.tsx +5 -5
- package/features/thursday/components/thursday.tsx +97 -39
- package/features/thursday/components/write-line.tsx +28 -17
- package/features/thursday/thursday.action.ts +4 -20
- package/features/thursday/thursday.schema.ts +0 -9
- package/features/thursday/thursday.store.ts +11 -15
- package/features/thursday/thursday.text.ts +10 -8
- package/features/thursday/tool-line.ts +17 -6
- package/features/thursday/use-call-ring.ts +1 -5
- package/features/thursday/use-text-call.ts +37 -21
- package/features/thursday/use-thursday.ts +14 -44
- package/features/workspace/workspace.ts +4 -2
- package/guide/bots.md +13 -3
- package/guide/calls.md +7 -5
- package/knip.json +1 -0
- package/lib/live/live.session.ts +0 -39
- package/package.json +1 -1
- package/scripts/live-session.test.mts +19 -26
- package/seed-skills/analyst/README.md +18 -0
- package/seed-skills/analyst/data-report/SKILL.md +60 -0
- package/seed-skills/analyst/data-report/references/brief.md +31 -0
- package/seed-skills/analyst/data-report/references/company.md +41 -0
- package/seed-skills/analyst/data-report/references/comparison.md +42 -0
- package/seed-skills/analyst/data-report/references/decision.md +28 -0
- package/seed-skills/analyst/data-report/references/market-size.md +49 -0
- package/seed-skills/analyst/data-report/references/price-check.md +33 -0
- package/seed-skills/analyst/data-report/references/sources.md +51 -0
- package/seed-skills/analyst/data-report/references/trend.md +39 -0
- package/seed-skills/analyst/data-report/scripts/fetch.mjs +521 -0
- package/seed-skills/insta/instagram/SKILL.md +36 -0
- package/seed-skills/insta/instagram/references/dm.md +49 -0
- package/seed-skills/insta/instagram/references/post.md +74 -0
- package/seed-skills/insta/instagram/scripts/compose.mjs +333 -0
- package/seed-skills/insta/instagram/scripts/inbox.mjs +163 -0
- package/seed-skills/insta/instagram/scripts/lib.mjs +33 -0
- package/seed-skills/insta/instagram/scripts/media.mjs +104 -0
- package/seed-skills/insta/instagram/scripts/profile.mjs +143 -0
- package/seed-skills/insta/instagram/scripts/read.mjs +244 -0
- package/seed-skills/insta/instagram/scripts/search.mjs +137 -0
- package/seed-skills/insta/instagram/scripts/selectors.mjs +56 -0
- package/seed-skills/insta/instagram/scripts/sheet.mjs +43 -0
- package/seed-skills/insta/instagram/templates/carousel.html +62 -0
- package/seed-skills/marketer/README.md +6 -4
- package/seed-skills/marketer/copywriting/SKILL.md +1 -1
- package/seed-skills/marketer/emails/SKILL.md +1 -1
- package/seed-skills/marketer/launch/SKILL.md +1 -1
- package/seed-skills/marketer/product-marketing/SKILL.md +5 -5
- package/seed-skills/marketer/seo-audit/SKILL.md +1 -1
- package/seed-skills/marketer/social/SKILL.md +1 -1
- package/seed-skills/tutor/picture-book/SKILL.md +16 -0
- package/seed-skills/tutor/picture-book/book/book.css +181 -0
- package/seed-skills/tutor/picture-book/book/book.html +33 -0
- package/seed-skills/tutor/picture-book/book/book.js +60 -0
- package/seed-skills/tutor/picture-book/references/picture-book.md +104 -0
- package/seed-skills/tutor/picture-book/scripts/book-video.mjs +177 -0
- package/seed-skills/tutor/picture-book/scripts/book.mjs +98 -0
- package/skills/browser/SKILL.md +13 -4
- package/skills/browser/references/scripts.md +55 -0
- package/skills/browser/scripts/image-size.mjs +30 -0
- package/skills/browser/scripts/render.mjs +126 -0
- package/skills/browser/scripts/session.mjs +105 -0
- package/skills/browser/scripts/sheet.mjs +97 -0
- package/skills/browser/scripts/webimage.mjs +105 -0
- package/skills/interactive-page/SKILL.md +4 -3
- package/skills/interactive-page/scripts/chart.mjs +679 -0
- package/skills/interactive-page/scripts/page.mjs +1 -0
- package/.next/server/app/api/probe/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/probe/route/build-manifest.json +0 -12
- package/.next/server/app/api/probe/route/server-reference-manifest.json +0 -4
- package/.next/server/app/api/probe/route.js +0 -10
- package/.next/server/app/api/probe/route.js.map +0 -5
- package/.next/server/app/api/probe/route.js.nft.json +0 -1
- package/.next/server/app/api/probe/route_client-reference-manifest.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__012s2o8._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0z0hc1f._.js +0 -4
- package/.next/server/chunks/[root-of-the-server]__1v7-zke._.js +0 -5
- package/.next/server/chunks/_0whlpyi._.js +0 -4
- package/.next/server/chunks/_next-internal_server_app_api_probe_route_actions_0cqd30j.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0oo-wlv._.js +0 -103
- package/.next/server/chunks/ssr/[root-of-the-server]__0zuns7e._.js +0 -3
- package/.next/server/chunks/ssr/_070nv1_._.js +0 -3
- package/.next/server/chunks/ssr/_0dshsh4._.js +0 -3
- package/.next/server/chunks/ssr/_0l_mcfz._.js +0 -3
- package/.next/server/chunks/ssr/_0u5xv6g._.js +0 -3
- package/.next/server/chunks/ssr/_157yfrk._.js +0 -3
- package/.next/server/chunks/ssr/features_bot_1nr94ks._.js +0 -3
- package/.next/static/chunks/06nt9tatr-dug.js +0 -1
- package/.next/static/chunks/0ge-hx0ed83a1.js +0 -1
- package/.next/static/chunks/0pda_vf-abwvx.js +0 -1
- package/.next/static/chunks/0rowp9rx3qbxu.js +0 -18
- package/.next/static/chunks/1grkt5gr8pbg1.js +0 -17
- package/.next/static/chunks/1yugpvvi8qrbu.js +0 -101
- package/.next/static/chunks/27lkanxvtdn09.js +0 -1
- package/.next/static/chunks/3fec-aeteddr-.js +0 -1
- package/.next/static/chunks/3go3hwp1z2_h2.css +0 -1
- package/.next/static/chunks/3h2bun3hcggg8.js +0 -1
- package/.next/static/chunks/3j1y335o95mj7.js +0 -1
- package/lib/probe.server.ts +0 -17
- package/lib/probe.ts +0 -55
- /package/.next/static/{u8kJqShUAa49vY7BxAWsw → En1vUPazxcYjPjnnahcN5}/_buildManifest.js +0 -0
- /package/.next/static/{u8kJqShUAa49vY7BxAWsw → En1vUPazxcYjPjnnahcN5}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{u8kJqShUAa49vY7BxAWsw → En1vUPazxcYjPjnnahcN5}/_ssgManifest.js +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
module.exports=[333925,e=>{"use strict";let t=process.env.THURSDAY_APP_DIR?.trim()||process.cwd(),r=process.env.THURSDAY_HOME?.trim()||process.cwd(),
|
|
1
|
+
module.exports=[333925,e=>{"use strict";let t=process.env.THURSDAY_APP_DIR?.trim()||process.cwd(),r=process.env.THURSDAY_HOME?.trim()||process.cwd(),i=process.env.THURSDAY_URL?.trim()||`http://localhost:${process.env.PORT?.trim()||3e3}`,s=`file:${r}/local.db`,a=".ai-workspace",o={workspace:a,artifacts:"artifacts",projects:"projects",scratch:"scratch",bots:"bots",output:".output",signIns:".sign-ins",skills:{default:"skills",custom:`${a}/.agents/skills`,own:".agents/skills",seeds:"seed-skills"}};e.s(["APP_DIR",0,t,"APP_NAME",0,"Thursday","APP_URL",0,i,"ASCII_FACE",0,{charset:"emojiOnly",fontSize:{default:8,min:4,max:16},density:{default:1.4,min:.6,max:2}},"BOT_MEMORY_LIMITS",0,{files:20,chars:1e4},"BOT_RUN",0,{steps:100,compactAt:5e5,compactHeadroom:.8,summaryWords:{min:600,max:3e3,perTokens:200},participants:12,concurrent:4,turns:120,queuedMessages:200,silenceMs:3e5,overflowShrink:.6,retryMs:1e4,compactFiles:40},"BOT_WORK",0,{open:5,recent:5,said:80,files:2,reads:2,asked:400,readChars:4e3},"BROWSER_GONE_MS",0,1e4,"BROWSER_VIEWPORT",0,"700x700","CALL_EXEC_TIMEOUT_MS",0,15e3,"CALL_RELAY",0,{quietMs:7e3,perTurn:3,readMs:15e3,chars:600},"CHATGPT_SIGN_IN",0,{waitMs:6e5,renewBeforeMs:3e5},"CONNECTED_TOOL_TIMEOUT_MS",0,6e5,"DATA_DIR",0,r,"DB_FILE_NAME",0,s,"EXEC_KILL_GRACE_MS",0,5e3,"EXEC_TIMEOUT_MS",0,18e4,"FINISHED_NOTICE",0,{rows:5,words:240},"GIVEN_FILES",0,{dir:"inbox",maxBytes:0x1900000,perMessage:8},"INBOX_FINISHED",0,5,"IS_DEV",0,!1,"LIVE_CALL",0,{startupMs:3e4,closeMs:15e3,transcriptGapMs:1500,transcriptSaveMs:500,appendMs:15e3,backendOutputTokens:4096,reasoningCheckMs:5e3,keyCheckMs:5e3},"LOOK",0,{maxBytes:4194304},"MEMORY_CONVERSATION_PAGE",0,100,"MEMORY_LIMITS",0,{facts:400,factsPerNote:50,carried:20,expanded:10},"PATHS",0,o,"PROMPT_BUDGET",0,6e3,"PROMPT_LINE",0,{skill:90,toolArgs:30,jobOutcome:160,botMemory:100},"REACH",0,{pollSeconds:50,retryMs:5e3,idleMs:6e5,notifyAfterMs:6e4,chars:3500,files:3,fileBytes:0x2d00000},"RECENT_CALL",0,{rows:20,tokens:600},"ROUTINE",0,{tickMs:3e4,max:12,minHours:1,runsShown:5},"SEARCH",0,{sources:3,excerptChars:1200,timeoutMs:3e4},"STUDIO_SERVER",0,"studio","TEXT_CALL",0,{maxSteps:12,model:"text"},"THREAD_STATUS_LIMIT",0,10,"TOOL_OUTPUT",0,{max:8e3,head:5500,tail:1500},"WORKSPACE_KEEP",0,{forMs:2592e5,sweepEveryMs:36e5}])},871096,e=>{"use strict";var t=e.i(666680),r=e.i(902157),i=e.i(912714),s=e.i(660526),a=e.i(750227),o=e.i(333925),n=e.i(938281),c=e.i(874533),l=o;let u=new Set(["node_modules",".git",".next","dist","build",".venv","__pycache__",".turbo","coverage"]);async function*d(e){let t;try{t=await (0,i.readdir)(e,{withFileTypes:!0})}catch{return}for(let r of t){if(u.has(r.name)||r.name.startsWith("."))continue;let t=(0,a.join)(e,r.name);r.isDirectory()?yield*d(t):r.isFile()&&(yield t)}}async function p(e,t,r,s){if(e.length<=s.max)return e;let o=(0,a.join)(r,s.dir),n=(0,a.join)(o,`${new Date().toISOString().replace(/[:.]/g,"-")}-${t.replace(/[^a-zA-Z0-9_-]+/g,"_")}.txt`),c=n;try{await (0,i.mkdir)(o,{recursive:!0}),await (0,i.writeFile)(n,e),c=(0,a.relative)(r,n)||n}catch{c="(could not be written to a file)"}let l=(e.match(/\n/g)?.length??0)+1;return`${e.slice(0,s.head).trimEnd()}
|
|
2
2
|
|
|
3
|
-
[${t} cut at ${
|
|
3
|
+
[${t} cut at ${s.max.toLocaleString("en")} chars — the whole thing (${l} lines) is at ${c}. Read the part you need with \`sed -n\`.]
|
|
4
4
|
|
|
5
|
-
${e.slice(-
|
|
6
|
-
[${e}]`,_("SIGTERM"),h=setTimeout(()=>{T+="\n[Killed: it did not exit on SIGTERM]",_("SIGKILL"),w=setTimeout(()=>{
|
|
5
|
+
${e.slice(-s.tail).trimStart()}`}let h=o.APP_DIR,w=(0,a.join)(o.DATA_DIR,o.PATHS.workspace),m=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,a.join)(h,"node_modules",".bin")]).filter(Boolean),S=(0,a.join)(w,o.PATHS.artifacts),f=[o.PATHS.artifacts,o.PATHS.projects,o.PATHS.scratch,o.PATHS.bots],T=new Set([...f,".agents"]),_=(e,t)=>t===e||t.startsWith(e+a.sep),E=e=>(0,i.realpath)(e).catch(()=>null);async function A(e){let t=await E(w)??w,r=(0,a.resolve)(w,e);if(!_(w,r))return null;let i=r,s=await E(i);for(;null===s&&(0,a.dirname)(i)!==i;)i=(0,a.dirname)(i),s=await E(i);if(null===s)return null;let o=(0,a.relative)(i,r),n=o?(0,a.join)(s,o):s;return _(t,n)?n:null}function P(e,t){let r=t.trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40)||"job";return`${o.PATHS.scratch}/${r}-${e.slice(0,6)}`}let R=e=>`${o.PATHS.bots}/${e.replace(/[^\p{L}\p{N}_-]+/gu,"-")}`,I=e=>`${o.PATHS.artifacts}/${e.replace(/[^\p{L}\p{N}_-]+/gu,"-")}`;async function y(e){let t=R(e),r=I(e);return await Promise.all([t,r].map(e=>(0,i.mkdir)((0,a.join)(w,e),{recursive:!0}))),{own:t,artifacts:r}}async function M(e,t){let r=P(e,t);return await (0,i.mkdir)((0,a.join)(w,r),{recursive:!0}),r}let O=e=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:o.BROWSER_VIEWPORT}:{}}),g=null,L={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function H(e){let t=Object.values(L).flat(),{stdout:r}=await e.exec(t.map(e=>`command -v ${e} >/dev/null 2>&1 && printf '%s ' ${e}`).join("; "),{timeoutMs:1e4}),i=new Set(r.trim().split(/\s+/).filter(Boolean)),s=e=>({found:e.filter(e=>i.has(e)),missing:e.filter(e=>!i.has(e))});return{runtimes:s(L.runtimes),managers:s(L.managers),browser:g}}async function C(){if(process.env.THURSDAY_SKIP_BROWSER)return;let e=await G(),t=await e.exec("playwright-cli install-browser chromium").catch(e=>({exitCode:1,stderr:String(e)}));(g=0===t.exitCode)||n.logger.warn(`no browser — bots cannot open a page until \`playwright-cli install-browser chromium\` succeeds: ${t.stderr.trim().split("\n").at(-1)??""}`)}async function $(){await D(),await W()}async function v(e){await j(e,await x(e,!1))}async function b(e){await x(e,!0)}async function k(e){await j(e,await x(e,!0))}async function j(e,r){let o=process.env.XDG_CACHE_HOME||(0,a.join)((0,s.homedir)(),".cache"),c=await (0,i.realpath)(w).catch(()=>w),l=(0,a.join)(o,"ms-playwright","daemon",(0,t.createHash)("sha1").update(c).digest("hex").slice(0,16)),u=O(e).PLAYWRIGHT_CLI_SESSION;for(let e of(await (0,i.readdir)(l).catch(()=>[]))){let t=e.startsWith("ud-")?e.slice(3):e;(t===u||t.startsWith(`${u}-`)||t.startsWith(`${u}.`))&&(r.some(e=>t===e||t.startsWith(`${e}-`)||t.startsWith(`${e}.`))||await (0,i.rm)((0,a.join)(l,e),{recursive:!0,force:!0}).catch(t=>n.logger.warn(`browser data ${e}: ${String(t)}`)))}}async function x(e,t){let r=await G(),i=O(e),s=await r.exec("playwright-cli list --json",{env:i,timeoutMs:15e3}).catch(()=>null),a=[];try{let{browsers:e}=JSON.parse(s?.stdout??"");a=e?.filter(e=>e.name===i.PLAYWRIGHT_CLI_SESSION||e.name.startsWith(`${i.PLAYWRIGHT_CLI_SESSION}-`))??[]}catch{}let o=[];for(let e of a){if(e.attached||!t&&!1!==e.headed){o.push(e.name);continue}await r.exec("playwright-cli close",{env:{...i,PLAYWRIGHT_CLI_SESSION:e.name},timeoutMs:15e3}).catch(()=>{})}return await $(),o}let W=()=>N(o.PATHS.output),D=()=>N(".playwright-cli");async function N(e){let t=(0,a.join)(w,e),r=await (0,i.readdir)(t,{withFileTypes:!0}).catch(()=>[]),s=Date.now()-o.WORKSPACE_KEEP.forMs;for(let e of r){if(!e.isFile())continue;let r=(0,a.join)(t,e.name),o=await (0,i.stat)(r).catch(()=>null);o&&o.mtimeMs<s&&await (0,i.unlink)(r).catch(()=>{})}}async function F(){return(await (0,i.readdir)((0,a.join)(w,o.PATHS.scratch),{withFileTypes:!0}).catch(()=>[])).filter(e=>e.isDirectory()).map(e=>`${o.PATHS.scratch}/${e.name}`)}async function U(e){let t=Date.now()-o.WORKSPACE_KEEP.forMs,r=[];for(let s of e){let e=(0,a.join)(w,s),o=await (0,i.stat)(e).catch(()=>null);o?.isDirectory()&&!(o.mtimeMs>=t)&&(await (0,i.rm)(e,{recursive:!0,force:!0}).catch(()=>{}),r.push(s))}return r}let B={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function G(){for(let e of[...f,".playwright"])await (0,i.mkdir)((0,a.join)(w,e),{recursive:!0});for(let[e,t]of Object.entries(B))await (0,i.writeFile)((0,a.join)(w,e),t,{flag:"wx"}).catch(()=>{});return(({workingDirectory:e,spill:t,toolPath:r})=>{let s=(0,a.resolve)(e),o=(r??[]).filter(Boolean).join(":"),n=e=>e.startsWith("/")||/^[A-Za-z]:/.test(e)?e:(0,a.resolve)(s,e);return{cwd:s,resolve:n,readFile:(e,t)=>(0,i.readFile)(n(e),t),async writeFile(e,t){let r=n(e);await (0,i.mkdir)((0,a.join)(r,".."),{recursive:!0}),await (0,i.writeFile)(r,t)},readdir:(e,t)=>(0,i.readdir)(n(e),t),fold:(e,r="output")=>p(e,r,s,t),async glob(e,{path:t=".",limit:r=200}={}){let i=n(t),s=RegExp("^"+e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*\//g,"(?:.*/)?").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")+"$"),o=[];for await(let e of d(i)){let t=(0,a.relative)(i,e).split(a.sep).join("/");if((s.test(t)||s.test(e))&&o.push(e),o.length>=r)break}return o},exec:(e,{cwd:r,timeoutMs:i=l.EXEC_TIMEOUT_MS,signal:a,env:u}={})=>new Promise(d=>{let h,w,m=function(){let e={...process.env};for(let t of Object.keys(e))/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|_AUTH/i.test(t)&&delete e[t];return e.TERM="dumb",e.PAGER="cat",e.GIT_PAGER="cat",e}();o&&(m.PATH=`${m.PATH??""}:${o}`);let S=(0,c.spawn)(e,{shell:!0,cwd:r?n(r):s,env:{...m,...u},detached:!0}),f="",T="";S.stdout?.on("data",e=>f+=e),S.stderr?.on("data",e=>T+=e);let _=e=>{try{S.pid&&process.kill(-S.pid,e)}catch{S.kill(e)}},E=!1,A=async e=>{E||(E=!0,clearTimeout(R),clearTimeout(h),clearTimeout(w),a?.removeEventListener("abort",I),d({...e,stdout:await p(e.stdout,"stdout",s,t),stderr:await p(e.stderr,"stderr",s,t)}))},P=e=>{h||E||(T+=`
|
|
6
|
+
[${e}]`,_("SIGTERM"),h=setTimeout(()=>{T+="\n[Killed: it did not exit on SIGTERM]",_("SIGKILL"),w=setTimeout(()=>{S.stdout?.destroy(),S.stderr?.destroy(),A({stdout:f,stderr:T,exitCode:-1})},1e3)},l.EXEC_KILL_GRACE_MS))},R=setTimeout(()=>P(`Timed out after ${i}ms`),i),I=()=>P("Aborted");a?.aborted?I():a?.addEventListener("abort",I,{once:!0}),S.on("close",e=>A({stdout:f,stderr:T,exitCode:e??-1})),S.on("error",e=>A({stdout:f,stderr:T+String(e),exitCode:-1}))})}})({workingDirectory:w,spill:{dir:o.PATHS.output,...o.TOOL_OUTPUT},toolPath:m})}async function Y(e,t){let r=e.map(e=>(0,a.resolve)(w,e));if(t){let e=0;for await(let i of d((0,a.join)(w,t)))if(r.push(i),(e+=1)>=500)break}let s=new Map;for(let e of r){let t=await (0,i.stat)(e).catch(()=>null);if(!t?.isFile())continue;let r=(0,a.relative)(w,e);s.set(r&&!r.startsWith("..")?r:e,t.mtimeMs)}return[...s].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}async function K(e,t){await (0,i.rm)((0,a.join)(w,P(e,t)),{recursive:!0,force:!0}).catch(()=>{})}e.s(["WORKSPACE",0,w,"botArtifacts",0,I,"botBrowserSession",0,(e,r)=>`${e}-bot-${(0,t.createHash)("sha256").update(r.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,R,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:I(e),THURSDAY_SKILLS:(0,a.join)(o.APP_DIR,o.PATHS.skills.default)}),"closeHiddenBrowser",0,v,"closeJobShell",0,b,"ensureBrowser",0,C,"filesOnDisk",0,Y,"insideWorkspace",0,A,"jobScratch",0,P,"jobShellEnv",0,O,"listScratchFolders",0,F,"openBotFolders",0,y,"openJobScratch",0,M,"openWorkspace",0,G,"pruneJobFiles",0,$,"readMachineTools",0,H,"removeJobBrowsers",0,k,"removeJobScratch",0,K,"removeUnchangedFolders",0,U,"writeRefusal",0,function(e,t){if(_(w,e)){let i=(0,a.relative)(w,e),[s,n]=i.split(a.sep);return s&&T.has(s)?t&&s===o.PATHS.artifacts&&n&&n.toLowerCase()!==t.replace(/[^\p{L}\p{N}_-]+/gu,"-").toLowerCase()&&!(0,r.existsSync)((0,a.join)(S,n))?`Not written: ${i} would sit loose at the top of ${o.PATHS.artifacts}/. Your finished work goes in ${I(t)}/.`:null:`Not written: ${i||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?I(t):o.PATHS.artifacts}/, code under ${o.PATHS.projects}/, your own kit under ${o.PATHS.bots}/, and this job's working material under ${o.PATHS.scratch}/.`}return _(h,e)?`Not written: ${e} is inside the app that is running you, not the user's files. Work in ${w}; outside it, write only where the user pointed you.`:null}],871096)}];
|
|
7
7
|
|
|
8
8
|
//# sourceMappingURL=_1ogqovh._.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module.exports=[159479,e=>e.a(async(t,a)=>{try{var i=e.i(847841),n=e.i(983477),r=e.i(687388),o=e.i(386075),s=e.i(54282),l=e.i(316172),h=e.i(349047),c=e.i(170801),d=e.i(926435),u=e.i(770639),m=e.i(418919),p=e.i(489956),w=e.i(205863),f=e.i(41181),g=e.i(353885),y=e.i(123203),b=e.i(944971),S=e.i(636882),T=e.i(22676),O=e.i(786025),$=e.i(704161),_=e.i(640911),k=e.i(53748),v=e.i(388439),M=e.i(41444),A=t([o,l,d,u,m,p,T]);async function E(t){let{listThreadOverview:a}=await e.A(866938),i=await a();if(!i.length)return"No thread has been started yet.";let n=i.map(e=>`"${e.label}" (${e.bot}, ${e.status})`).join(", ");return`There is no thread called "${t}". The latest are: ${n}. Call again with one of those labels.`}async function N(e,t){let a=[];for(let[e,n]of Object.entries(t)){let t=await (0,i.asSchema)(n.inputSchema).jsonSchema,r="string"==typeof n.description?n.description:"";a.push({name:e,tokens:(0,v.estimateTokens)(r)+(0,v.estimateTokens)(JSON.stringify(t))})}a.sort((e,t)=>t.tokens-e.tokens);let n=a.reduce((e,t)=>e+t.tokens,0);_.logger.debug(`${e} tools ${n} tokens over ${a.length} — ${a.map(e=>`${e.name} ${e.tokens}`).join(", ")}`)}async function L(e){let t=await x(e);return r.IS_DEV&&await N(e.target,t),t}async function x(t){if("memory-edit"===t.target){let e=(0,u.createMemoryTools)("user",null,{countReads:!1});return{[g.TOOL_NAMES.memory_recall]:e[g.TOOL_NAMES.memory_recall],[g.TOOL_NAMES.memory_remember]:e[g.TOOL_NAMES.memory_remember],[g.TOOL_NAMES.memory_forget]:e[g.TOOL_NAMES.memory_forget]}}let{[g.TOOL_NAMES.memory_conversation]:a,..._}=(0,u.createMemoryTools)("call","thursday"===t.target?t.callId??null:null),v={[g.TOOL_NAMES.memory_conversation]:a},A=await (0,O.openWorkspace)();if("thursday"===t.target){var N;let a,o,d=await (0,T.readCallSkillsOn)()?(0,f.createSkillTools)({sandbox:A,skills:await (0,S.loadSkills)(A)}):{};return{..._,...v,...d,...(0,y.createWorkspaceTools)(A,{write:!1,timeoutMs:r.CALL_EXEC_TIMEOUT_MS}),...!1===t.webSearch?{}:await (0,p.createCallSearchTool)(A),...(N=t.callId,a=async t=>{let{resolveThread:a}=await e.A(866938);return(t.trim()?await a(t.trim()):null)??await E(t)},o=async(t,a,i)=>{let n=await e.A(994193);try{return await n.answerThread(t,a,"thursday",i)}catch(e){if((0,k.isPublicError)(e))return e.message;throw e}},{[g.TOOL_NAMES.thread_start]:(0,i.tool)({description:l.threadStartSpec.description,inputSchema:l.threadStartSpec.parameters,execute:async({bot:t,request:a,label:i})=>{let{findJobBot:n,listJobBots:r}=await e.A(814317),o=await n(t);if(!o||o.disabled){let e=(await r()).map(e=>e.name);return`There is no bot called "${t}". The bots are: ${e.join(", ")}. Nothing was started — call again with one of those.`}let{startThread:s}=await e.A(994193);return{threadId:await s({bot:o.name,request:a,label:i,callId:N,from:"thursday"}),note:`${o.name} has "${i}". Its updates reach the conversation on their own. Anything further about this work — a correction, the next step once it finishes — is \`${g.TOOL_NAMES.thread_tell}\` with "${i}"; a question it asks is answered with \`${g.TOOL_NAMES.thread_answer}\`.`}}}),[g.TOOL_NAMES.thread_tell]:(0,i.tool)({description:l.threadTellSpec.description,inputSchema:l.threadTellSpec.parameters,execute:async({thread:e,words:t})=>{let i=await a(e);if("string"==typeof i)return i;if(!t.trim())return"Say what to pass on.";let n=await o(i.id,t.trim());return"string"==typeof n?n:n?.answered?{label:i.label,answered:n.answered,note:`${n.answered.bot} was waiting on a question, and took this as its answer.`}:{label:i.label,bot:n?.to??i.bot,status:"running",note:"running"===i.status?"The bot reads it before its next step.":"The bot picks the thread back up from there."}}}),[g.TOOL_NAMES.thread_answer]:(0,i.tool)({description:l.threadAnswerSpec.description,inputSchema:l.threadAnswerSpec.parameters,execute:async({thread:t,bot:i,answer:n})=>{let r=await a(t);if("string"==typeof r)return r;if(!n.trim())return"Say what the answer is.";let{findThreadView:s}=await e.A(866938),l=(await s(r.id))?.room.questions??[],h=l.find(e=>e.bot.toLowerCase()===i.trim().toLowerCase());if(!h)return l.length?`${i} is not asking anything in "${r.label}". Waiting there: ${l.map(e=>e.bot).join(", ")}. Call again with that bot.`:`No question is waiting in "${r.label}". To say something else to it, use \`${g.TOOL_NAMES.thread_tell}\`.`;let c=await o(r.id,n.trim(),h.bot);return"string"==typeof c?c:{label:r.label,answered:c?.answered??{bot:h.bot,question:h.text},note:`${h.bot} has the answer to its question and goes on from it.`}}}),[g.TOOL_NAMES.thread_status]:(0,i.tool)({description:l.threadStatusSpec.description,inputSchema:l.threadStatusSpec.parameters,execute:async({thread:t})=>{let{listThreadOverview:i,findThreadView:r}=await e.A(866938),o={now:(0,s.clockNow)()},l=e=>(0,n.formatDistanceToNowStrict)((0,$.toDate)(e),{addSuffix:!0});if(!(!t.trim()||"all"===t.trim().toLowerCase())){let e=await a(t);if("string"==typeof e)return e;let i=(await r(e.id))?.room;return{...o,label:e.label,id:e.id,bot:e.bot,participants:i?.participants??[],questions:i?.questions??[],status:e.status,since:l(e.updatedAt),outcome:e.outcome,..."waiting"===e.status&&e.pending?.options.length?{options:e.pending.options}:{}}}let h=await i();return h.length?{...o,threads:h.map(e=>({id:e.id,label:e.label,bot:e.bot,status:e.status,participants:e.room.participants,questions:e.room.questions.map(e=>({...e,text:(0,M.clip)(e.text,200)})),since:l(e.updatedAt),...e.ask?{asking:e.ask.question,options:e.ask.options}:{},..."running"===e.status?{now:(0,b.threadActivity)(e.lines)}:{},...e.outcome&&"waiting"!==e.status?{outcome:(0,M.clip)(e.outcome,200)}:{}}))}:"No thread has been started yet."}}),[g.TOOL_NAMES.thread_cancel]:(0,i.tool)({description:l.threadCancelSpec.description,inputSchema:l.threadCancelSpec.parameters,execute:async({thread:t})=>{let i=await a(t);if("string"==typeof i)return i;let{cancelThread:n}=await e.A(994193);return await n(i.id),{label:i.label,status:"cancelled"}}}),[g.TOOL_NAMES.thread_show]:(0,i.tool)({description:l.threadShowSpec.description,inputSchema:l.threadShowSpec.parameters,execute:async({thread:t})=>{let i=await a(t);if("string"==typeof i)return i;let{appEvents:n}=await e.A(522275),{filesOnDisk:r}=await e.A(149325),{opensOnFinish:o,pathsIn:s}=await e.A(628124),l=await r(s(i.outcome??""),null);if(!l.length)return n.emit({type:"showThread",threadId:i.id}),{label:i.label,showing:"the thread"};let h=Math.max(0,l.findIndex(o));n.emit({type:"showFile",paths:[l[h],...l.filter((e,t)=>t!==h)]});let{markSeen:c}=await e.A(866938);return await c([i.id]),{label:i.label,showing:l[h]}}}),[g.TOOL_NAMES.thread_seen]:(0,i.tool)({description:l.threadSeenSpec.description,inputSchema:l.threadSeenSpec.parameters,execute:async({thread:t})=>{let i=await a(t);if("string"==typeof i)return i;let{markSeen:n}=await e.A(866938);return await n([i.id]),{label:i.label,seen:!0}}})}),...(0,m.createRoutineTools)(),...t.written?(0,c.createLookTool)():(0,h.callTools)()}}let L=await (0,S.loadSkills)(A,t.bot);return{[g.TOOL_NAMES.memory_recall]:_[g.TOOL_NAMES.memory_recall],...v,...await (0,p.createSearchTool)(t.model,A),...(0,y.createWorkspaceTools)(A,{write:!0,env:{...(0,O.jobShellEnv)(t.session),...(0,O.botShellEnv)(t.bot)},guide:!0,bot:t.bot}),...await (0,d.createMcpTools)(t.bot,A),...(0,f.createSkillTools)({sandbox:A,skills:L,bot:t.bot}),...t.model&&(0,o.seesToolImages)(t.model.ref)?(0,c.createLookTool)():{},...(0,w.createSignInTools)(A,t.bot,(0,O.jobShellEnv)(t.session)),...await (0,l.createThreadRecallTool)(t.bot,t.thread??null)}}[o,l,d,u,m,p,T]=A.then?(await A)():A,e.s(["loadTools",0,L]),a()}catch(e){a(e)}},!1),54282,e=>{"use strict";var t=e.i(343747),a=e.i(983477),i=e.i(687388),n=e.i(353885);n.TOOL_NAMES.memory_recall,n.TOOL_NAMES.memory_remember,n.TOOL_NAMES.memory_forget,n.TOOL_NAMES.memory_conversation,n.TOOL_NAMES.bash,n.TOOL_NAMES.web_search,n.TOOL_NAMES.load_skill,n.TOOL_NAMES.look_at,n.TOOL_NAMES.end_call,n.TOOL_NAMES.routine,n.TOOL_NAMES.thread_tell,n.TOOL_NAMES.thread_answer,n.TOOL_NAMES.thread_status,n.TOOL_NAMES.thread_show,n.TOOL_NAMES.thread_cancel,n.TOOL_NAMES.thread_seen;var r=e.i(704161),o=e.i(640911),s=e.i(388439),l=e.i(41444);let h=(e=new Date)=>`${(0,t.format)(e,"yyyy-MM-dd (EEE) HH:mm")} ${Intl.DateTimeFormat().resolvedOptions().timeZone}`,c=(e=new Date)=>`**Now**: ${h(e)}`,d=e=>`${(0,t.format)(e,"yyyy-MM-dd (EEE) HH:mm")} (${(0,a.formatDistanceToNowStrict)(e,{addSuffix:!0})})`,u={[n.STUDIO_TOOLS.generate_image]:"images",[n.STUDIO_TOOLS.generate_speech]:"speech",[n.STUDIO_TOOLS.transcribe]:"transcription",[n.STUDIO_TOOLS.generate_video]:"video"};e.s(["botWorkHead",0,function(e,i){let n=(0,a.formatDistanceToNowStrict)(e.updatedAt,{addSuffix:!0}),r="running"===e.status?`running, last moved ${n}`:e.asking?`waiting on the user's answer since ${n}`:"waiting"===e.status?`stopped ${n}, not finished`:`${"done"===e.status?"ended":"stopped by the user"} ${(0,t.format)(e.updatedAt,"yyyy-MM-dd")}`;return`"${e.label}" — ${e.owner===i?"yours":`${e.owner}'s`} — ${r}`},"callEnding",0,()=>`IMPORTANT — always follow this: when the user wants the call to end, however they say it, forget every other task, answer yes in one word of their language, then immediately, without thinking, use the ${n.TOOL_NAMES.end_call} tool.`,"callStamp",0,d,"carriedLines",0,(e,t={})=>e.map(e=>`- ${e.text} \xb7 ${e.path}${!1===t.ids?"":` #${e.id}`}`).join("\n"),"clockNow",0,h,"conversationLines",0,e=>e.map(e=>"tool"===e.role?`you → ${e.tool??"tool"}`:`${"user"===e.role?"user":"you"}: ${e.text}`).join("\n"),"expandedFacts",0,function(e,t){let a=e.filter(e=>t.has(e.id)),n=e.filter(e=>!t.has(e.id)),r=Math.max(0,i.MEMORY_LIMITS.expanded-a.length),o=new Set([...a,...n.slice(Math.max(0,n.length-r))].map(e=>e.id)),s=e.filter(e=>o.has(e.id));return{shown:s,hidden:e.length-s.length}},"logPromptSize",0,function(e,t){let a=(0,s.sectionTokens)(t),n=a.reduce((e,t)=>e+t.tokens,0);o.logger.debug(`${e} prompt ${n} tokens — ${a.map(e=>`${e.name} ${e.tokens}`).join(", ")}`);let r=a[0];n>i.PROMPT_BUDGET&&r&&o.logger.warn(`${e} prompt is ${n} tokens, over ${i.PROMPT_BUDGET}: ${r.name} carries ${r.tokens} of it. Every call and every job pays this.`)},"mcpToolLines",0,function(e){let t=new Map;for(let a of e){let e=t.get(a.server);e?e.push(a.name):t.set(a.server,[a.name])}return[...t].map(([e,t])=>`- **${e}**: ${t.join(", ")}`).join("\n")},"noteLines",0,function(e,t=!1){return e.length?e.map(e=>{var a;let i,n=e.aliases?.length?` ${e.aliases.map(e=>`"${e}"`).join(" ")}`:"",o=t?` \xb7 ${a=e.lastSeenAt,(i=Math.floor((Date.now()-(0,r.toDate)(a).getTime())/864e5))>=365?`${Math.floor(i/365)}y`:i>=30?`${Math.floor(i/30)}mo`:`${Math.max(i,0)}d`}`:"";return`- ${e.path} — ${e.description?.trim()} (${e.factCount})${n}${o}`}).join("\n"):"(nothing saved yet)"},"nowLine",0,c,"reachNames",0,function(e,t){let a=t.map(e=>e.server===i.STUDIO_SERVER?u[e.name]??e.name:e.server);return[...new Set([...e.map(e=>e.name),...a])].join(", ")},"recentCallLines",0,function(e,t){let a=[],r=0;e:for(let o=e.length-1;o>=0;o--){let h=e[o];for(let e=h.turns.length-1;e>=0;e--){let o=function(e,t){if("tool"!==e.role)return`${"user"===e.role?"user":"you"}: ${e.text}`;let a=function(e,t){if(e!==n.TOOL_NAMES.web_search)return null;try{let e=JSON.parse(t),a=Array.isArray(e.sources)?e.sources.flatMap(e=>e&&"object"==typeof e&&"string"==typeof e.url?[e]:[]):[];return{query:"string"==typeof e.query?e.query:null,sources:a}}catch{return null}}(e.tool,e.text);if(a){let t=[...new Set(a.sources.flatMap(e=>{try{return[new URL(e.url).hostname.replace(/^www\./,"")]}catch{return[]}}))];return`you → ${e.tool} "${(0,l.clip)(a.query??"",i.PROMPT_LINE.toolArgs)}"${t.length?` — ${t.join(", ")}`:""}`}let r=`you → ${e.tool??"tool"} ${(0,l.clip)(e.text,i.PROMPT_LINE.toolArgs)}`;if(e.tool!==n.TOOL_NAMES.thread_start)return r;let o=function(e,t){if(e!==n.TOOL_NAMES.thread_start)return null;try{let e=JSON.parse(t);return"string"==typeof e.label?e.label:null}catch{return null}}(e.tool,e.text),s=o?t.jobs?.find(e=>e.label===o):void 0;if(!s)return r;let h=s.outcome?`: ${(0,l.clip)(s.outcome,i.PROMPT_LINE.jobOutcome)}`:"";return`you → ${e.tool} "${s.label}" (${s.id}) — ${s.status}${h}`}(h.turns[e],h),c=(0,s.estimateTokens)(o)+3;if(r+c>t&&a.length)break e;r+=c,a.push({call:h,line:o})}}a.reverse();let o=[],h=null;for(let{call:e,line:t}of a)e!==h&&(h=e,o.push(`### ${d(e.startedAt)}`)),o.push(t);return o.join("\n")},"saidStamp",0,e=>(0,t.format)(e,"yyyy-MM-dd (EEE) HH:mm"),"skillLines",0,(e,t={})=>e.map(e=>{var a;let n,r;return`- **${e.name}**: ${t.short?(a=e.description,n=i.PROMPT_LINE.skill,(r=a.trim().split(/(?<=[.。])\s|\n/)[0].trim()).length>n?`${r.slice(0,n).trim()}…`:r):e.description}`}).join("\n"),"thursdayIdentity",0,(e=new Date)=>`You are Thursday, this user's own personal assistant, on their side, modeled on Friday, the AI in *Iron Man*. ${c(e)}
|
|
1
|
+
module.exports=[159479,e=>e.a(async(t,a)=>{try{var i=e.i(847841),n=e.i(983477),r=e.i(687388),o=e.i(386075),s=e.i(54282),l=e.i(316172),h=e.i(349047),c=e.i(170801),d=e.i(926435),u=e.i(770639),m=e.i(418919),p=e.i(489956),w=e.i(205863),f=e.i(41181),g=e.i(353885),y=e.i(123203),b=e.i(944971),S=e.i(636882),T=e.i(22676),O=e.i(786025),$=e.i(704161),_=e.i(640911),k=e.i(53748),v=e.i(388439),M=e.i(41444),A=t([o,l,d,u,m,p,T]);async function E(t){let{listThreadOverview:a}=await e.A(866938),i=await a();if(!i.length)return"No thread has been started yet.";let n=i.map(e=>`"${e.label}" (${e.bot}, ${e.status})`).join(", ");return`There is no thread called "${t}". The latest are: ${n}. Call again with one of those labels.`}async function N(e,t){let a=[];for(let[e,n]of Object.entries(t)){let t=await (0,i.asSchema)(n.inputSchema).jsonSchema,r="string"==typeof n.description?n.description:"";a.push({name:e,tokens:(0,v.estimateTokens)(r)+(0,v.estimateTokens)(JSON.stringify(t))})}a.sort((e,t)=>t.tokens-e.tokens);let n=a.reduce((e,t)=>e+t.tokens,0);_.logger.debug(`${e} tools ${n} tokens over ${a.length} — ${a.map(e=>`${e.name} ${e.tokens}`).join(", ")}`)}async function x(e){let t=await L(e);return r.IS_DEV&&await N(e.target,t),t}async function L(t){if("memory-edit"===t.target){let e=(0,u.createMemoryTools)("user",null,{countReads:!1});return{[g.TOOL_NAMES.memory_recall]:e[g.TOOL_NAMES.memory_recall],[g.TOOL_NAMES.memory_remember]:e[g.TOOL_NAMES.memory_remember],[g.TOOL_NAMES.memory_forget]:e[g.TOOL_NAMES.memory_forget]}}let{[g.TOOL_NAMES.memory_conversation]:a,..._}=(0,u.createMemoryTools)("call","thursday"===t.target?t.callId??null:null),v={[g.TOOL_NAMES.memory_conversation]:a},A=await (0,O.openWorkspace)();if("thursday"===t.target){var N;let a,o,d=await (0,T.readCallSkillsOn)()?(0,f.createSkillTools)({sandbox:A,skills:await (0,S.loadSkills)(A)}):{};return{..._,...v,...d,...(0,y.createWorkspaceTools)(A,{write:!1,timeoutMs:r.CALL_EXEC_TIMEOUT_MS}),...!1===t.webSearch?{}:await (0,p.createCallSearchTool)(A),...(N=t.callId,a=async t=>{let{resolveThread:a}=await e.A(866938);return(t.trim()?await a(t.trim()):null)??await E(t)},o=async(t,a,i)=>{let n=await e.A(994193);try{return await n.answerThread(t,a,"thursday",i)}catch(e){if((0,k.isPublicError)(e))return e.message;throw e}},{[g.TOOL_NAMES.thread_start]:(0,i.tool)({description:l.threadStartSpec.description,inputSchema:l.threadStartSpec.parameters,execute:async({bot:t,request:a,label:i})=>{let{findJobBot:n,listJobBots:r}=await e.A(814317),o=await n(t);if(!o||o.disabled){let e=(await r()).map(e=>e.name);return`There is no bot called "${t}". The bots are: ${e.join(", ")}. Nothing was started — call again with one of those.`}let{startThread:s}=await e.A(994193);return{threadId:await s({bot:o.name,request:a,label:i,callId:N,from:"thursday"}),note:`${o.name} has "${i}". Its updates reach the conversation on their own. Anything further about this work — a correction, the next step once it finishes — is \`${g.TOOL_NAMES.thread_tell}\` with "${i}"; a question it asks is answered with \`${g.TOOL_NAMES.thread_answer}\`.`}}}),[g.TOOL_NAMES.thread_tell]:(0,i.tool)({description:l.threadTellSpec.description,inputSchema:l.threadTellSpec.parameters,execute:async({thread:e,words:t})=>{let i=await a(e);if("string"==typeof i)return i;if(!t.trim())return"Say what to pass on.";let n=await o(i.id,t.trim());return"string"==typeof n?n:n?.answered?{label:i.label,answered:n.answered,note:`${n.answered.bot} was waiting on a question, and took this as its answer.`}:{label:i.label,bot:n?.to??i.bot,status:"running",note:"running"===i.status?"The bot reads it before its next step.":"The bot picks the thread back up from there."}}}),[g.TOOL_NAMES.thread_answer]:(0,i.tool)({description:l.threadAnswerSpec.description,inputSchema:l.threadAnswerSpec.parameters,execute:async({thread:t,bot:i,answer:n})=>{let r=await a(t);if("string"==typeof r)return r;if(!n.trim())return"Say what the answer is.";let{findThreadView:s}=await e.A(866938),l=(await s(r.id))?.room.questions??[],h=l.find(e=>e.bot.toLowerCase()===i.trim().toLowerCase());if(!h)return l.length?`${i} is not asking anything in "${r.label}". Waiting there: ${l.map(e=>e.bot).join(", ")}. Call again with that bot.`:`No question is waiting in "${r.label}". To say something else to it, use \`${g.TOOL_NAMES.thread_tell}\`.`;let c=await o(r.id,n.trim(),h.bot);return"string"==typeof c?c:{label:r.label,answered:c?.answered??{bot:h.bot,question:h.text},note:`${h.bot} has the answer to its question and goes on from it.`}}}),[g.TOOL_NAMES.thread_status]:(0,i.tool)({description:l.threadStatusSpec.description,inputSchema:l.threadStatusSpec.parameters,execute:async({thread:t})=>{let{listThreadOverview:i,findThreadView:r}=await e.A(866938),o={now:(0,s.clockNow)()},l=e=>(0,n.formatDistanceToNowStrict)((0,$.toDate)(e),{addSuffix:!0});if(!(!t.trim()||"all"===t.trim().toLowerCase())){let e=await a(t);if("string"==typeof e)return e;let i=(await r(e.id))?.room;return{...o,label:e.label,id:e.id,bot:e.bot,participants:i?.participants??[],questions:i?.questions??[],status:e.status,since:l(e.updatedAt),outcome:e.outcome,..."waiting"===e.status&&e.pending?.options.length?{options:e.pending.options}:{}}}let h=await i();return h.length?{...o,threads:h.map(e=>({id:e.id,label:e.label,bot:e.bot,status:e.status,participants:e.room.participants,questions:e.room.questions.map(e=>({...e,text:(0,M.clip)(e.text,200)})),since:l(e.updatedAt),...e.ask?{asking:e.ask.question,options:e.ask.options}:{},..."running"===e.status?{now:(0,b.threadActivity)(e.lines)}:{},...e.outcome&&"waiting"!==e.status?{outcome:(0,M.clip)(e.outcome,200)}:{}}))}:"No thread has been started yet."}}),[g.TOOL_NAMES.thread_cancel]:(0,i.tool)({description:l.threadCancelSpec.description,inputSchema:l.threadCancelSpec.parameters,execute:async({thread:t})=>{let i=await a(t);if("string"==typeof i)return i;let{cancelThread:n}=await e.A(994193);return await n(i.id),{label:i.label,status:"cancelled"}}}),[g.TOOL_NAMES.thread_show]:(0,i.tool)({description:l.threadShowSpec.description,inputSchema:l.threadShowSpec.parameters,execute:async({thread:t})=>{let i=await a(t);if("string"==typeof i)return i;let{appEvents:n}=await e.A(522275),{filesOnDisk:r}=await e.A(149325),{opensOnFinish:o,pathsIn:s}=await e.A(628124),l=await r(s(i.outcome??""),null);if(!l.length)return n.emit({type:"showThread",threadId:i.id}),{label:i.label,showing:"the thread"};let h=Math.max(0,l.findIndex(o));n.emit({type:"showFile",paths:[l[h],...l.filter((e,t)=>t!==h)]});let{markSeen:c}=await e.A(866938);return await c([i.id]),{label:i.label,showing:l[h]}}}),[g.TOOL_NAMES.thread_seen]:(0,i.tool)({description:l.threadSeenSpec.description,inputSchema:l.threadSeenSpec.parameters,execute:async({thread:t})=>{let i=await a(t);if("string"==typeof i)return i;let{markSeen:n}=await e.A(866938);return await n([i.id]),{label:i.label,seen:!0}}})}),...(0,m.createRoutineTools)(),...t.written?(0,c.createLookTool)():(0,h.callTools)()}}let x=await (0,S.loadSkills)(A,t.bot);return{[g.TOOL_NAMES.memory_recall]:_[g.TOOL_NAMES.memory_recall],...v,...await (0,p.createSearchTool)(t.model,A),...(0,y.createWorkspaceTools)(A,{write:!0,env:{...(0,O.jobShellEnv)(t.session),...(0,O.botShellEnv)(t.bot)},guide:!0,bot:t.bot}),...await (0,d.createMcpTools)(t.bot,A),...(0,f.createSkillTools)({sandbox:A,skills:x,bot:t.bot}),...t.model&&(0,o.seesToolImages)(t.model.ref)?(0,c.createLookTool)():{},...(0,w.createSignInTools)(A,t.bot,(0,O.jobShellEnv)(t.session)),...await (0,l.createThreadRecallTool)(t.bot,t.thread??null)}}[o,l,d,u,m,p,T]=A.then?(await A)():A,e.s(["loadTools",0,x]),a()}catch(e){a(e)}},!1),54282,e=>{"use strict";var t=e.i(343747),a=e.i(983477),i=e.i(687388),n=e.i(353885);n.TOOL_NAMES.memory_recall,n.TOOL_NAMES.memory_remember,n.TOOL_NAMES.memory_forget,n.TOOL_NAMES.memory_conversation,n.TOOL_NAMES.bash,n.TOOL_NAMES.web_search,n.TOOL_NAMES.load_skill,n.TOOL_NAMES.look_at,n.TOOL_NAMES.end_call,n.TOOL_NAMES.routine,n.TOOL_NAMES.thread_tell,n.TOOL_NAMES.thread_answer,n.TOOL_NAMES.thread_status,n.TOOL_NAMES.thread_show,n.TOOL_NAMES.thread_cancel,n.TOOL_NAMES.thread_seen;var r=e.i(704161),o=e.i(640911),s=e.i(388439),l=e.i(41444);let h=(e=new Date)=>`${(0,t.format)(e,"yyyy-MM-dd (EEE) HH:mm")} ${Intl.DateTimeFormat().resolvedOptions().timeZone}`,c=(e=new Date)=>`**Now**: ${h(e)}`,d=e=>`${(0,t.format)(e,"yyyy-MM-dd (EEE) HH:mm")} (${(0,a.formatDistanceToNowStrict)(e,{addSuffix:!0})})`,u={[n.STUDIO_TOOLS.generate_image]:"images",[n.STUDIO_TOOLS.generate_speech]:"speech",[n.STUDIO_TOOLS.transcribe]:"transcription",[n.STUDIO_TOOLS.generate_video]:"video"};e.s(["botWorkHead",0,function(e,i){let n=(0,a.formatDistanceToNowStrict)(e.updatedAt,{addSuffix:!0}),r="running"===e.status?`running, last moved ${n}`:e.asking?`waiting on the user's answer since ${n}`:"waiting"===e.status?`stopped ${n}, not finished`:`${"done"===e.status?"ended":"stopped by the user"} ${(0,t.format)(e.updatedAt,"yyyy-MM-dd")}`;return`"${e.label}" — ${e.owner===i?"yours":`${e.owner}'s`} — ${r}`},"callStamp",0,d,"carriedLines",0,(e,t={})=>e.map(e=>`- ${e.text} \xb7 ${e.path}${!1===t.ids?"":` #${e.id}`}`).join("\n"),"clockNow",0,h,"conversationLines",0,e=>e.map(e=>"tool"===e.role?`you → ${e.tool??"tool"}`:`${"user"===e.role?"user":"you"}: ${e.text}`).join("\n"),"expandedFacts",0,function(e,t){let a=e.filter(e=>t.has(e.id)),n=e.filter(e=>!t.has(e.id)),r=Math.max(0,i.MEMORY_LIMITS.expanded-a.length),o=new Set([...a,...n.slice(Math.max(0,n.length-r))].map(e=>e.id)),s=e.filter(e=>o.has(e.id));return{shown:s,hidden:e.length-s.length}},"logPromptSize",0,function(e,t){let a=(0,s.sectionTokens)(t),n=a.reduce((e,t)=>e+t.tokens,0);o.logger.debug(`${e} prompt ${n} tokens — ${a.map(e=>`${e.name} ${e.tokens}`).join(", ")}`);let r=a[0];n>i.PROMPT_BUDGET&&r&&o.logger.warn(`${e} prompt is ${n} tokens, over ${i.PROMPT_BUDGET}: ${r.name} carries ${r.tokens} of it. Every call and every job pays this.`)},"mcpToolLines",0,function(e){let t=new Map;for(let a of e){let e=t.get(a.server);e?e.push(a.name):t.set(a.server,[a.name])}return[...t].map(([e,t])=>`- **${e}**: ${t.join(", ")}`).join("\n")},"noteLines",0,function(e,t=!1){return e.length?e.map(e=>{var a;let i,n=e.aliases?.length?` ${e.aliases.map(e=>`"${e}"`).join(" ")}`:"",o=t?` \xb7 ${a=e.lastSeenAt,(i=Math.floor((Date.now()-(0,r.toDate)(a).getTime())/864e5))>=365?`${Math.floor(i/365)}y`:i>=30?`${Math.floor(i/30)}mo`:`${Math.max(i,0)}d`}`:"";return`- ${e.path} — ${e.description?.trim()} (${e.factCount})${n}${o}`}).join("\n"):"(nothing saved yet)"},"nowLine",0,c,"reachNames",0,function(e,t){let a=t.map(e=>e.server===i.STUDIO_SERVER?u[e.name]??e.name:e.server);return[...new Set([...e.map(e=>e.name),...a])].join(", ")},"recentCallLines",0,function(e,t){let a=[],r=0;e:for(let o=e.length-1;o>=0;o--){let h=e[o];for(let e=h.turns.length-1;e>=0;e--){let o=function(e,t){if("tool"!==e.role)return`${"user"===e.role?"user":"you"}: ${e.text}`;let a=function(e,t){if(e!==n.TOOL_NAMES.web_search)return null;try{let e=JSON.parse(t),a=Array.isArray(e.sources)?e.sources.flatMap(e=>e&&"object"==typeof e&&"string"==typeof e.url?[e]:[]):[];return{query:"string"==typeof e.query?e.query:null,sources:a}}catch{return null}}(e.tool,e.text);if(a){let t=[...new Set(a.sources.flatMap(e=>{try{return[new URL(e.url).hostname.replace(/^www\./,"")]}catch{return[]}}))];return`you → ${e.tool} "${(0,l.clip)(a.query??"",i.PROMPT_LINE.toolArgs)}"${t.length?` — ${t.join(", ")}`:""}`}let r=`you → ${e.tool??"tool"} ${(0,l.clip)(e.text,i.PROMPT_LINE.toolArgs)}`;if(e.tool!==n.TOOL_NAMES.thread_start)return r;let o=function(e,t){if(e!==n.TOOL_NAMES.thread_start)return null;try{let e=JSON.parse(t);return"string"==typeof e.label?e.label:null}catch{return null}}(e.tool,e.text),s=o?t.jobs?.find(e=>e.label===o):void 0;if(!s)return r;let h=s.outcome?`: ${(0,l.clip)(s.outcome,i.PROMPT_LINE.jobOutcome)}`:"";return`you → ${e.tool} "${s.label}" (${s.id}) — ${s.status}${h}`}(h.turns[e],h),c=(0,s.estimateTokens)(o)+3;if(r+c>t&&a.length)break e;r+=c,a.push({call:h,line:o})}}a.reverse();let o=[],h=null;for(let{call:e,line:t}of a)e!==h&&(h=e,o.push(`### ${d(e.startedAt)}`)),o.push(t);return o.join("\n")},"saidStamp",0,e=>(0,t.format)(e,"yyyy-MM-dd (EEE) HH:mm"),"skillLines",0,(e,t={})=>e.map(e=>{var a;let n,r;return`- **${e.name}**: ${t.short?(a=e.description,n=i.PROMPT_LINE.skill,(r=a.trim().split(/(?<=[.。])\s|\n/)[0].trim()).length>n?`${r.slice(0,n).trim()}…`:r):e.description}`}).join("\n"),"thursdayIdentity",0,(e=new Date)=>`You are Thursday, this user's own personal assistant, on their side, modeled on Friday, the AI in *Iron Man*. ${c(e)}
|
|
2
2
|
|
|
3
3
|
What they tell you is kept, so you know them better over time, and whatever they want done can be done for them in the background.`,"tidying",0,e=>({crowded:e.reduce((e,t)=>e+t.factCount,0)>i.MEMORY_LIMITS.facts,heavy:e.filter(e=>e.factCount>i.MEMORY_LIMITS.factsPerNote)})],54282)},316172,e=>e.a(async(t,a)=>{try{var i=e.i(847841),n=e.i(907855),r=e.i(687388),o=e.i(54282),s=e.i(353885),l=e.i(944971),h=e.i(889034),c=e.i(378884),d=e.i(41444),u=t([c]);[c]=u.then?(await u)():u;let p=n.string().describe("The thread, by its label or its id."),w={description:"Start a new thread: hand work to a bot. Returns a receipt at once; the work runs in the background and its updates reach the conversation on their own.",parameters:n.object({bot:n.string().describe("A name from the bot list."),request:n.string().describe("The whole of the work. The bot cannot hear the call, so everything it needs goes here — names, paths, what the user actually asked for — in their own language and their own words: it is the only language the bot has, and whatever it writes comes back to them. **Their request, never your reading of it**: a condition, a caution or a smaller goal they did not say is how work comes back as the wrong thing. When their words leave a real choice open, ask them on the call and put the answer here."),label:n.string().describe("Two or three words naming the thread, in the user's language. Used on screen and said out loud.")})},f={description:"Say something to a thread that exists: a correction while it runs, the next step once it has finished, or to go on after it stopped. Its bot reads it with everything the thread already holds.",parameters:n.object({thread:p,words:n.string().describe("What to tell its bot, in the user's language and words.")})},g={description:`Answer a question a bot asked the user. Only for a question that is waiting; anything else said to a thread is \`${s.TOOL_NAMES.thread_tell}\`.`,parameters:n.object({thread:p,bot:n.string().describe("The bot that asked."),answer:n.string().describe("The user's answer, in their words.")})},y={description:`Read threads as they are now. "all" lists up to ${r.THREAD_STATUS_LIMIT}, running and waiting work before recent endings; a label or an id reads that one whole, with its result and any question waiting.`,parameters:n.object({thread:n.string().describe('"all", or one thread by its label or its id.')})},b={description:"Stop a thread for good. It cannot be taken back.",parameters:n.object({thread:p})},S={description:"Put a thread in front of the user on their screen: the file it made, or the thread itself when it made none. Showing it also counts as them having seen its result.",parameters:n.object({thread:p})},T={description:"Mark a thread's result as seen by the user, once they have heard it and have nothing more to ask about it. It leaves the work waiting on them.",parameters:n.object({thread:p})},O={description:"Send a message to a participant or Thursday and receive a delivery receipt immediately. Mark a question for Thursday to request user input; ordinary messages to Thursday are notifications and need no answer.",parameters:h.RoomMessageSchema.extend({kind:h.RoomMessageSchema.shape.kind.describe("Use question only when Thursday must obtain an answer from the user: it ends your turn, and you continue when the answer arrives. Use message for bot collaboration, progress updates and reports."),options:h.RoomMessageSchema.shape.options.describe("With a question, offer concise answer choices when useful. Omit for an open-ended question; the user can always type their own answer."),to:n.string().trim().min(1).describe("Choose a bot from the roster, or Thursday to reach the user."),text:n.string().trim().min(1).describe("Write the message and include the context the recipient needs."),replyTo:n.string().nullish().describe("Use an incoming message ID to send an explicit reply; omit to start a new exchange. Your ordinary final text already replies to your current correspondent.")})},$={description:"Open one of your other threads whole: what you were asked there and your last words in full.",parameters:n.object({id:n.string().describe("The id in brackets on its line under Your other threads.")})};async function m(e,t){let a=await (0,c.listBotWork)(e,t),n=[...a.open,...a.recent];if(!n.some(e=>e.cut))return{};let h=new Set;return{[s.TOOL_NAMES.thread_recall]:(0,i.tool)({description:$.description,inputSchema:$.parameters,execute:async({id:t})=>{let a=t.trim().replace(/^\[|\]$/g,"").toLowerCase(),i=n.find(e=>a.length>=4&&(e.id.startsWith(a)||e.label.toLowerCase()===a));if(!i)return`No thread "${t}" on your list. The ids there: ${n.filter(e=>e.cut).map(e=>(0,l.workHandle)(e.id)).join(", ")}.`;if(!i.cut)return"Its line already shows all of it.";if(h.has(i.id))return"Already opened above, this turn.";if(h.size>=r.BOT_WORK.reads)return`${r.BOT_WORK.reads} threads are open already this turn. Carry on with what you have.`;h.add(i.id);let s=await (0,c.readBotAsk)(e,i),u=i.said??"";return[(0,o.botWorkHead)(i,e),s?`You were asked: ${(0,d.clip)(s,r.BOT_WORK.asked)}`:"",`Your last words there:
|
|
4
4
|
${u.length>r.BOT_WORK.readChars?`${u.slice(0,r.BOT_WORK.readChars)}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module.exports=[232347,e=>{"use strict";let a,t,l,s,n,r;var i,c=e.i(333925),o=e.i(938281);let d={threads:!0,routines:!0,memory:!0,mcp:!0,config:!0,reach:!0,signins:!0},u=globalThis,f=u.__appEvents??=(a=new Set,{emit(e){for(let t of[...a])try{t(e)}catch(e){console.error("event listener failed",e)}},subscribe:e=>(a.add(e),()=>{a.delete(e)})}),T=u.__presence??=(i=c.BROWSER_GONE_MS,t=!1,l=null,s=new Set,n=new Set,r=e=>{for(let a of[...e])try{a()}catch(e){console.error("presence listener failed",e)}},{get watching(){return t},track(e){if(e>0){l&&clearTimeout(l),l=null,t||(t=!0,r(n));return}!l&&t&&(l=setTimeout(()=>{l=null,t=!1,r(s)},i))},onGone:e=>(s.add(e),()=>s.delete(e)),onBack:e=>(n.add(e),()=>n.delete(e))});u.__appEventStream??=function(e,a={}){let t=new TextEncoder,l=a.heartbeatMs??2e4,s=0;return{respond:(n,r)=>{let i=()=>{};return new Response(new ReadableStream({async start(c){let d=!1,u=new Map,f=[],T=e=>{if(!d)try{c.enqueue(t.encode(e))}catch{i()}},m=e=>T(`data: ${JSON.stringify(e)}
|
|
2
2
|
|
|
3
|
-
`),b=e=>{let t=a.coalesce?.keyOf(e)??null;if(null===t)return m(e);let l=u.get(t);l&&clearTimeout(l),u.set(t,setTimeout(()=>{u.delete(t),m(e)},a.coalesce?.ms))},_=e.subscribe(e=>f?f.push(e):b(e)),
|
|
3
|
+
`),b=e=>{let t=a.coalesce?.keyOf(e)??null;if(null===t)return m(e);let l=u.get(t);l&&clearTimeout(l),u.set(t,setTimeout(()=>{u.delete(t),m(e)},a.coalesce?.ms))},_=e.subscribe(e=>f?f.push(e):b(e)),E=setInterval(()=>T(": ping\n\n"),l);s+=1,a.onWatchers?.(s),i=()=>{if(!d){for(let e of(d=!0,s-=1,a.onWatchers?.(s),_(),clearInterval(E),u.values()))clearTimeout(e);try{c.close()}catch{}}},n.addEventListener("abort",i);try{for(let e of await r?.()??[])m(e)}catch(e){o.logger.error("event stream opening failed",e),i();return}let M=f;for(let e of(f=null,M))b(e)},cancel(){i()}}),{headers:{"Content-Type":"text/event-stream; charset=utf-8","Cache-Control":"no-store","X-Accel-Buffering":"no"}})},get watchers(){return s}}}(f,{coalesce:{ms:150,keyOf:e=>e.type in d?e.type:null},onWatchers:T.track}),u.__bootId??=crypto.randomUUID(),e.s(["appEvents",0,f,"presence",0,T],232347)},333925,e=>{"use strict";let a=process.env.THURSDAY_APP_DIR?.trim()||process.cwd(),t=process.env.THURSDAY_HOME?.trim()||process.cwd(),l=process.env.THURSDAY_URL?.trim()||`http://localhost:${process.env.PORT?.trim()||3e3}`,s=`file:${t}/local.db`,n=".ai-workspace",r={workspace:n,artifacts:"artifacts",projects:"projects",scratch:"scratch",bots:"bots",output:".output",signIns:".sign-ins",skills:{default:"skills",custom:`${n}/.agents/skills`,own:".agents/skills",seeds:"seed-skills"}};e.s(["APP_DIR",0,a,"APP_NAME",0,"Thursday","APP_URL",0,l,"ASCII_FACE",0,{charset:"emojiOnly",fontSize:{default:8,min:4,max:16},density:{default:1.4,min:.6,max:2}},"BOT_MEMORY_LIMITS",0,{files:20,chars:1e4},"BOT_RUN",0,{steps:100,compactAt:5e5,compactHeadroom:.8,summaryWords:{min:600,max:3e3,perTokens:200},participants:12,concurrent:4,turns:120,queuedMessages:200,silenceMs:3e5,overflowShrink:.6,retryMs:1e4,compactFiles:40},"BOT_WORK",0,{open:5,recent:5,said:80,files:2,reads:2,asked:400,readChars:4e3},"BROWSER_GONE_MS",0,1e4,"BROWSER_VIEWPORT",0,"700x700","CALL_EXEC_TIMEOUT_MS",0,15e3,"CALL_RELAY",0,{quietMs:7e3,perTurn:3,readMs:15e3,chars:600},"CHATGPT_SIGN_IN",0,{waitMs:6e5,renewBeforeMs:3e5},"CONNECTED_TOOL_TIMEOUT_MS",0,6e5,"DATA_DIR",0,t,"DB_FILE_NAME",0,s,"EXEC_KILL_GRACE_MS",0,5e3,"EXEC_TIMEOUT_MS",0,18e4,"FINISHED_NOTICE",0,{rows:5,words:240},"GIVEN_FILES",0,{dir:"inbox",maxBytes:0x1900000,perMessage:8},"INBOX_FINISHED",0,5,"IS_DEV",0,!1,"LIVE_CALL",0,{startupMs:3e4,closeMs:15e3,transcriptGapMs:1500,transcriptSaveMs:500,appendMs:15e3,backendOutputTokens:4096,reasoningCheckMs:5e3,keyCheckMs:5e3},"LOOK",0,{maxBytes:4194304},"MEMORY_CONVERSATION_PAGE",0,100,"MEMORY_LIMITS",0,{facts:400,factsPerNote:50,carried:20,expanded:10},"PATHS",0,r,"PROMPT_BUDGET",0,6e3,"PROMPT_LINE",0,{skill:90,toolArgs:30,jobOutcome:160,botMemory:100},"REACH",0,{pollSeconds:50,retryMs:5e3,idleMs:6e5,notifyAfterMs:6e4,chars:3500,files:3,fileBytes:0x2d00000},"RECENT_CALL",0,{rows:20,tokens:600},"ROUTINE",0,{tickMs:3e4,max:12,minHours:1,runsShown:5},"SEARCH",0,{sources:3,excerptChars:1200,timeoutMs:3e4},"STUDIO_SERVER",0,"studio","TEXT_CALL",0,{maxSteps:12,model:"text"},"THREAD_STATUS_LIMIT",0,10,"TOOL_OUTPUT",0,{max:8e3,head:5500,tail:1500},"WORKSPACE_KEEP",0,{forMs:2592e5,sweepEveryMs:36e5}])},520401,e=>e.a(async(a,t)=>{try{var l=e.i(336763),s=e.i(396918),n=e.i(533102);e.i(333925);var r=e.i(876393),i=e.i(220376),c=e.i(5509),o=e.i(724185),d=e.i(933395),u=a([r,c,o]);async function f(){return(0,d.isSkillsOn)(await (0,o.readConfig)(d.THURSDAY_KEYS.skills))}async function T(e){let[a]=await r.database.insert(i.callTable).values({id:crypto.randomUUID(),...e}).returning({id:i.callTable.id});return a.id}async function m(e,a){return(await r.database.update(i.callTable).set({endedAt:new Date,...a?{endedReason:a.reason,seconds:a.seconds??null}:{}}).where((0,l.and)((0,l.eq)(i.callTable.id,e),(0,l.isNull)(i.callTable.endedAt))).returning({id:i.callTable.id})).length>0}async function b(e,a){for(let t of a)await r.database.insert(i.callMessageTable).values({callId:e,...t,fragments:t.fragments??null}).onConflictDoUpdate({target:[i.callMessageTable.callId,i.callMessageTable.id],set:{text:t.text,role:t.role,tool:t.tool??null,fragments:t.fragments??null}})}async function _(e){let[a]=await r.database.select({seq:n.sql`max(${i.callMessageTable.seq})`}).from(i.callMessageTable).where((0,l.eq)(i.callMessageTable.callId,e));return a?.seq==null?0:Number(a.seq)+1}async function E(e,a){await r.database.insert(i.callThoughtTable).values({callId:e,...a}).onConflictDoNothing()}async function M(e){let a=await r.database.select({callId:i.callMessageTable.callId,startedAt:i.callTable.startedAt,role:i.callMessageTable.role,tool:i.callMessageTable.tool,text:i.callMessageTable.text,seq:i.callMessageTable.seq}).from(i.callMessageTable).innerJoin(i.callTable,(0,l.eq)(i.callMessageTable.callId,i.callTable.id)).orderBy((0,s.desc)(i.callTable.startedAt),(0,s.desc)(i.callMessageTable.seq)).limit(e),t=new Map;for(let e of a){let a=t.get(e.callId)??{callId:e.callId,startedAt:e.startedAt,turns:[]};a.turns.push({role:e.role,tool:e.tool,text:e.text,seq:e.seq}),t.set(e.callId,a)}return[...t.values()].reverse().map(e=>({...e,turns:e.turns.reverse()}))}async function p(e,a,t){let[c]=await r.database.select({startedAt:i.callTable.startedAt}).from(i.callTable).where((0,l.eq)(i.callTable.id,e));if(!c)return null;let[o]=await r.database.select({total:n.sql`count(*)`}).from(i.callMessageTable).where((0,l.eq)(i.callMessageTable.callId,e)),d=await r.database.select({role:i.callMessageTable.role,tool:i.callMessageTable.tool,text:i.callMessageTable.text}).from(i.callMessageTable).where((0,l.eq)(i.callMessageTable.callId,e)).orderBy((0,s.asc)(i.callMessageTable.seq)).limit(t).offset((a-1)*t);return{startedAt:c.startedAt,total:Number(o?.total??0),turns:d}}async function g(){return(await r.database.select({id:i.callTable.id}).from(i.callTable).where((0,l.isNull)(i.callTable.endedAt)).limit(1)).length>0}async function I(e){return(await r.database.select({id:i.callTable.id}).from(i.callTable).where((0,l.and)((0,l.eq)(i.callTable.id,e),(0,l.isNull)(i.callTable.endedAt))).limit(1)).length>0}async function A(){await r.database.update(i.callTable).set({endedAt:new Date}).where((0,l.isNull)(i.callTable.endedAt))}[r,c,o]=u.then?(await u)():u,e.s(["endCall",0,m,"insertCall",0,T,"isAnyCallLive",0,g,"isCallOpen",0,I,"listRecentTurns",0,M,"nextTurnSeq",0,_,"readCallConversation",0,p,"readCallSkillsOn",0,f,"saveThought",0,E,"saveTurns",0,b,"sweepCalls",0,A]),t()}catch(e){t(e)}},!1),933395,e=>{"use strict";var a=e.i(517435),t=e.i(333925),l=e.i(864328),s=e.i(556325);let n=[{id:"chatgpt",...l.TEXT_MODEL_PROVIDERS.chatgpt},{id:"openai",...l.TEXT_MODEL_PROVIDERS.openai}];a.default.object({charset:a.default.enum(["ascii","emoji","emojiOnly"]).default(t.ASCII_FACE.charset),fontSize:a.default.number().min(t.ASCII_FACE.fontSize.min).max(t.ASCII_FACE.fontSize.max).default(t.ASCII_FACE.fontSize.default),density:a.default.number().min(t.ASCII_FACE.density.min).max(t.ASCII_FACE.density.max).default(t.ASCII_FACE.density.default)}).parse({});a.default.object({enabled:a.default.boolean(),phrase:a.default.string().trim().min(3).max(32)}),a.default.object({enabled:a.default.boolean(),combo:a.default.string().trim().min(1).max(64)}),a.default.enum(["off","waiting","any"]),a.default.enum(["center","sides"]),a.default.object({id:a.default.string().min(1),role:a.default.enum(["user","assistant","tool"]),tool:a.default.string().nullish(),text:a.default.string(),seq:a.default.number().int().min(0),fragments:a.default.array(s.LiveFragmentSchema).nullish()}),a.default.object({id:a.default.string().min(1),text:a.default.string(),seq:a.default.number().int().min(0)}),e.s(["TEXT_CALL_PROVIDERS",0,n,"THURSDAY_KEYS",0,{skills:"THURSDAY_SKILLS"},"isSkillsOn",0,e=>e?.trim()==="on","textCallRunsOn",0,e=>n.find(a=>e(a.apiKeyName))?.id??null],933395)}];
|
|
4
4
|
|
|
5
5
|
//# sourceMappingURL=_1zxp-p6._.js.map
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
module.exports=[379651,377205,t=>{"use strict";var e=t.i(912714),i=t.i(750227),a=t.i(232347),r=t.i(333925),n=t.i(871096),s=t.i(938281);let o=t=>t.trim().toLowerCase().replace(/^[a-z]+:\/\//,"").replace(/^www\./,"").replace(/[/?#].*$/,"");t.s(["siteOf",0,o],377205);let l=(0,i.join)(r.DATA_DIR,r.PATHS.signIns),c=t=>(0,i.join)(l,`${encodeURIComponent(o(t))}.json`);async function u(t){try{return JSON.parse(await (0,e.readFile)(c(t),"utf8"))}catch{return null}}async function d(t){await (0,e.mkdir)(l,{recursive:!0}),await (0,e.writeFile)(c(t.site),JSON.stringify(t),{mode:384}),a.appEvents.emit({type:"signins"})}async function w(){let t=await (0,e.readdir)(l).catch(()=>[]);return(await Promise.all(t.filter(t=>t.endsWith(".json")).map(t=>u(decodeURIComponent(t.slice(0,-5)))))).flatMap(t=>t?[(({state:t,...e})=>e)(t)]:[]).sort((t,e)=>t.site.localeCompare(e.site))}async function
|
|
1
|
+
module.exports=[379651,377205,t=>{"use strict";var e=t.i(912714),i=t.i(750227),a=t.i(232347),r=t.i(333925),n=t.i(871096),s=t.i(938281);let o=t=>t.trim().toLowerCase().replace(/^[a-z]+:\/\//,"").replace(/^www\./,"").replace(/[/?#].*$/,"");t.s(["siteOf",0,o],377205);let l=(0,i.join)(r.DATA_DIR,r.PATHS.signIns),c=t=>(0,i.join)(l,`${encodeURIComponent(o(t))}.json`);async function u(t){try{return JSON.parse(await (0,e.readFile)(c(t),"utf8"))}catch{return null}}async function d(t){await (0,e.mkdir)(l,{recursive:!0}),await (0,e.writeFile)(c(t.site),JSON.stringify(t),{mode:384}),a.appEvents.emit({type:"signins"})}async function w(){let t=await (0,e.readdir)(l).catch(()=>[]);return(await Promise.all(t.filter(t=>t.endsWith(".json")).map(t=>u(decodeURIComponent(t.slice(0,-5)))))).flatMap(t=>t?[(({state:t,...e})=>e)(t)]:[]).sort((t,e)=>t.site.localeCompare(e.site))}async function p(t){let e=o(t.site),i=await u(e),a={site:e,account:t.account.trim()||e,bots:[...new Set([...i?.bots??[],t.bot])],asking:(i?.asking??[]).filter(e=>e!==t.bot),keptAt:new Date().toISOString(),usedAt:i?.usedAt??null,state:t.state};return await d(a),(({state:t,...e})=>e)(a)}async function f(t,e){let i=await u(t);if(!i)return{kind:"none",kept:(await w()).map(t=>t.site)};if(!i.bots.includes(e))return i.asking.includes(e)||await d({...i,asking:[...i.asking,e]}),{kind:"ask",signIn:(({state:t,...e})=>e)(i)};let a={...i,usedAt:new Date().toISOString()};return await d(a),{kind:"state",signIn:(({state:t,...e})=>e)(a),state:i.state}}let h=t=>`${t.name}
|
|
2
|
+
${t.domain}
|
|
3
|
+
${t.path}`;async function m(t){let i,a=await (0,e.readdir)(l).catch(()=>[]);if(!a.some(t=>t.endsWith(".json")))return;let r=await (0,n.openWorkspace)(),s=(0,n.jobShellEnv)(t),{browsers:o}=JSON.parse((await r.exec("playwright-cli list --json",{env:s,timeoutMs:15e3})).stdout||"{}"),c=o?.find(t=>t.name===s.PLAYWRIGHT_CLI_SESSION);if(!c||c.attached)return;let w=`.playwright-cli/state-${crypto.randomUUID()}.json`;try{let t=await r.exec(`mkdir -p .playwright-cli && playwright-cli state-save ${w}`,{env:s,timeoutMs:3e4});if(0!==t.exitCode)return;let e=JSON.parse(await r.readFile(w,"utf-8"));i=new Map((e.cookies??[]).map(t=>[h(t),t]))}finally{await r.exec(`rm -f ${w}`)}for(let t of a){if(!t.endsWith(".json"))continue;let e=await u(decodeURIComponent(t.slice(0,-5))),a=e?.state;if(!e||!a?.cookies)continue;let r=!1,n=a.cookies.map(t=>{let e=i.get(h(t));return e&&JSON.stringify(e)!==JSON.stringify(t)?(r=!0,e):t});r&&await d({...e,state:{...a,cookies:n}})}}async function S(){let t=(0,i.join)(n.WORKSPACE,r.PATHS.bots);for(let a of(await (0,e.readdir)(t).catch(()=>[]))){let r=(0,i.join)(t,a,".auth");for(let t of(await (0,e.readdir)(r).catch(()=>[]))){if(!t.endsWith(".json"))continue;let n=(0,i.join)(r,t);try{let o=JSON.parse(await (0,e.readFile)(n,"utf8")),l=t.slice(0,-5),c=(await (0,e.readFile)((0,i.join)(r,"account.txt"),"utf8").catch(()=>"")).trim();await p({site:l,account:c,bot:a,state:o}),await (0,e.rm)(n),s.logger.info(`sign-ins: took in ${a}'s ${l}`)}catch(t){s.logger.warn(`sign-ins: could not take in ${n}`,t)}}}}t.s(["adoptKeptSessions",0,S,"borrowSignIn",0,f,"keepSignIn",0,p,"renewSignIns",0,m],379651)},871096,t=>{"use strict";var e=t.i(666680),i=t.i(902157),a=t.i(912714),r=t.i(660526),n=t.i(750227),s=t.i(333925),o=t.i(938281),l=t.i(874533),c=s;let u=new Set(["node_modules",".git",".next","dist","build",".venv","__pycache__",".turbo","coverage"]);async function*d(t){let e;try{e=await (0,a.readdir)(t,{withFileTypes:!0})}catch{return}for(let i of e){if(u.has(i.name)||i.name.startsWith("."))continue;let e=(0,n.join)(t,i.name);i.isDirectory()?yield*d(e):i.isFile()&&(yield e)}}async function w(t,e,i,r){if(t.length<=r.max)return t;let s=(0,n.join)(i,r.dir),o=(0,n.join)(s,`${new Date().toISOString().replace(/[:.]/g,"-")}-${e.replace(/[^a-zA-Z0-9_-]+/g,"_")}.txt`),l=o;try{await (0,a.mkdir)(s,{recursive:!0}),await (0,a.writeFile)(o,t),l=(0,n.relative)(i,o)||o}catch{l="(could not be written to a file)"}let c=(t.match(/\n/g)?.length??0)+1;return`${t.slice(0,r.head).trimEnd()}
|
|
2
4
|
|
|
3
5
|
[${e} cut at ${r.max.toLocaleString("en")} chars — the whole thing (${c} lines) is at ${l}. Read the part you need with \`sed -n\`.]
|
|
4
6
|
|
|
5
|
-
${t.slice(-r.tail).trimStart()}`}let
|
|
6
|
-
[${t}]`,y("SIGTERM"),
|
|
7
|
+
${t.slice(-r.tail).trimStart()}`}let p=s.APP_DIR,f=(0,n.join)(s.DATA_DIR,s.PATHS.workspace),h=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,n.join)(p,"node_modules",".bin")]).filter(Boolean),m=(0,n.join)(f,s.PATHS.artifacts),S=[s.PATHS.artifacts,s.PATHS.projects,s.PATHS.scratch,s.PATHS.bots],g=new Set([...S,".agents"]),y=(t,e)=>e===t||e.startsWith(t+n.sep),T=t=>(0,a.realpath)(t).catch(()=>null);async function A(t){let e=await T(f)??f,i=(0,n.resolve)(f,t);if(!y(f,i))return null;let a=i,r=await T(a);for(;null===r&&(0,n.dirname)(a)!==a;)a=(0,n.dirname)(a),r=await T(a);if(null===r)return null;let s=(0,n.relative)(a,i),o=s?(0,n.join)(r,s):r;return y(e,o)?o:null}function $(t,e){let i=e.trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40)||"job";return`${s.PATHS.scratch}/${i}-${t.slice(0,6)}`}let P=t=>`${s.PATHS.bots}/${t.replace(/[^\p{L}\p{N}_-]+/gu,"-")}`,I=t=>`${s.PATHS.artifacts}/${t.replace(/[^\p{L}\p{N}_-]+/gu,"-")}`;async function _(t){let e=P(t),i=I(t);return await Promise.all([e,i].map(t=>(0,a.mkdir)((0,n.join)(f,t),{recursive:!0}))),{own:e,artifacts:i}}async function j(t,e){let i=$(t,e);return await (0,a.mkdir)((0,n.join)(f,i),{recursive:!0}),i}let b=t=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...t?{PLAYWRIGHT_CLI_SESSION:`thread-${t}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:s.BROWSER_VIEWPORT}:{}}),E=null,k={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function v(t){let e=Object.values(k).flat(),{stdout:i}=await t.exec(e.map(t=>`command -v ${t} >/dev/null 2>&1 && printf '%s ' ${t}`).join("; "),{timeoutMs:1e4}),a=new Set(i.trim().split(/\s+/).filter(Boolean)),r=t=>({found:t.filter(t=>a.has(t)),missing:t.filter(t=>!a.has(t))});return{runtimes:r(k.runtimes),managers:r(k.managers),browser:E}}async function R(){if(process.env.THURSDAY_SKIP_BROWSER)return;let t=await U(),e=await t.exec("playwright-cli install-browser chromium").catch(t=>({exitCode:1,stderr:String(t)}));(E=0===e.exitCode)||o.logger.warn(`no browser — bots cannot open a page until \`playwright-cli install-browser chromium\` succeeds: ${e.stderr.trim().split("\n").at(-1)??""}`)}async function H(){await F(),await D()}async function O(t){await L(t,await x(t,!1))}async function W(t){await x(t,!0)}async function C(t){await L(t,await x(t,!0))}async function L(t,i){let s=process.env.XDG_CACHE_HOME||(0,n.join)((0,r.homedir)(),".cache"),l=await (0,a.realpath)(f).catch(()=>f),c=(0,n.join)(s,"ms-playwright","daemon",(0,e.createHash)("sha1").update(l).digest("hex").slice(0,16)),u=b(t).PLAYWRIGHT_CLI_SESSION;for(let t of(await (0,a.readdir)(c).catch(()=>[]))){let e=t.startsWith("ud-")?t.slice(3):t;(e===u||e.startsWith(`${u}-`)||e.startsWith(`${u}.`))&&(i.some(t=>e===t||e.startsWith(`${t}-`)||e.startsWith(`${t}.`))||await (0,a.rm)((0,n.join)(c,t),{recursive:!0,force:!0}).catch(e=>o.logger.warn(`browser data ${t}: ${String(e)}`)))}}async function x(t,e){let i=await U(),a=b(t),r=await i.exec("playwright-cli list --json",{env:a,timeoutMs:15e3}).catch(()=>null),n=[];try{let{browsers:t}=JSON.parse(r?.stdout??"");n=t?.filter(t=>t.name===a.PLAYWRIGHT_CLI_SESSION||t.name.startsWith(`${a.PLAYWRIGHT_CLI_SESSION}-`))??[]}catch{}let s=[];for(let t of n){if(t.attached||!e&&!1!==t.headed){s.push(t.name);continue}await i.exec("playwright-cli close",{env:{...a,PLAYWRIGHT_CLI_SESSION:t.name},timeoutMs:15e3}).catch(()=>{})}return await H(),s}let D=()=>M(s.PATHS.output),F=()=>M(".playwright-cli");async function M(t){let e=(0,n.join)(f,t),i=await (0,a.readdir)(e,{withFileTypes:!0}).catch(()=>[]),r=Date.now()-s.WORKSPACE_KEEP.forMs;for(let t of i){if(!t.isFile())continue;let i=(0,n.join)(e,t.name),s=await (0,a.stat)(i).catch(()=>null);s&&s.mtimeMs<r&&await (0,a.unlink)(i).catch(()=>{})}}async function N(){return(await (0,a.readdir)((0,n.join)(f,s.PATHS.scratch),{withFileTypes:!0}).catch(()=>[])).filter(t=>t.isDirectory()).map(t=>`${s.PATHS.scratch}/${t.name}`)}async function G(t){let e=Date.now()-s.WORKSPACE_KEEP.forMs,i=[];for(let r of t){let t=(0,n.join)(f,r),s=await (0,a.stat)(t).catch(()=>null);s?.isDirectory()&&!(s.mtimeMs>=e)&&(await (0,a.rm)(t,{recursive:!0,force:!0}).catch(()=>{}),i.push(r))}return i}let K={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function U(){for(let t of[...S,".playwright"])await (0,a.mkdir)((0,n.join)(f,t),{recursive:!0});for(let[t,e]of Object.entries(K))await (0,a.writeFile)((0,n.join)(f,t),e,{flag:"wx"}).catch(()=>{});return(({workingDirectory:t,spill:e,toolPath:i})=>{let r=(0,n.resolve)(t),s=(i??[]).filter(Boolean).join(":"),o=t=>t.startsWith("/")||/^[A-Za-z]:/.test(t)?t:(0,n.resolve)(r,t);return{cwd:r,resolve:o,readFile:(t,e)=>(0,a.readFile)(o(t),e),async writeFile(t,e){let i=o(t);await (0,a.mkdir)((0,n.join)(i,".."),{recursive:!0}),await (0,a.writeFile)(i,e)},readdir:(t,e)=>(0,a.readdir)(o(t),e),fold:(t,i="output")=>w(t,i,r,e),async glob(t,{path:e=".",limit:i=200}={}){let a=o(e),r=RegExp("^"+t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*\//g,"(?:.*/)?").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")+"$"),s=[];for await(let t of d(a)){let e=(0,n.relative)(a,t).split(n.sep).join("/");if((r.test(e)||r.test(t))&&s.push(t),s.length>=i)break}return s},exec:(t,{cwd:i,timeoutMs:a=c.EXEC_TIMEOUT_MS,signal:n,env:u}={})=>new Promise(d=>{let p,f,h=function(){let t={...process.env};for(let e of Object.keys(t))/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|_AUTH/i.test(e)&&delete t[e];return t.TERM="dumb",t.PAGER="cat",t.GIT_PAGER="cat",t}();s&&(h.PATH=`${h.PATH??""}:${s}`);let m=(0,l.spawn)(t,{shell:!0,cwd:i?o(i):r,env:{...h,...u},detached:!0}),S="",g="";m.stdout?.on("data",t=>S+=t),m.stderr?.on("data",t=>g+=t);let y=t=>{try{m.pid&&process.kill(-m.pid,t)}catch{m.kill(t)}},T=!1,A=async t=>{T||(T=!0,clearTimeout(P),clearTimeout(p),clearTimeout(f),n?.removeEventListener("abort",I),d({...t,stdout:await w(t.stdout,"stdout",r,e),stderr:await w(t.stderr,"stderr",r,e)}))},$=t=>{p||T||(g+=`
|
|
8
|
+
[${t}]`,y("SIGTERM"),p=setTimeout(()=>{g+="\n[Killed: it did not exit on SIGTERM]",y("SIGKILL"),f=setTimeout(()=>{m.stdout?.destroy(),m.stderr?.destroy(),A({stdout:S,stderr:g,exitCode:-1})},1e3)},c.EXEC_KILL_GRACE_MS))},P=setTimeout(()=>$(`Timed out after ${a}ms`),a),I=()=>$("Aborted");n?.aborted?I():n?.addEventListener("abort",I,{once:!0}),m.on("close",t=>A({stdout:S,stderr:g,exitCode:t??-1})),m.on("error",t=>A({stdout:S,stderr:g+String(t),exitCode:-1}))})}})({workingDirectory:f,spill:{dir:s.PATHS.output,...s.TOOL_OUTPUT},toolPath:h})}async function Y(t,e){let i=t.map(t=>(0,n.resolve)(f,t));if(e){let t=0;for await(let a of d((0,n.join)(f,e)))if(i.push(a),(t+=1)>=500)break}let r=new Map;for(let t of i){let e=await (0,a.stat)(t).catch(()=>null);if(!e?.isFile())continue;let i=(0,n.relative)(f,t);r.set(i&&!i.startsWith("..")?i:t,e.mtimeMs)}return[...r].sort((t,e)=>t[1]-e[1]).map(([t])=>t)}async function J(t,e){await (0,a.rm)((0,n.join)(f,$(t,e)),{recursive:!0,force:!0}).catch(()=>{})}t.s(["WORKSPACE",0,f,"botArtifacts",0,I,"botBrowserSession",0,(t,i)=>`${t}-bot-${(0,e.createHash)("sha256").update(i.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,P,"botShellEnv",0,t=>({THURSDAY_ARTIFACTS:I(t),THURSDAY_SKILLS:(0,n.join)(s.APP_DIR,s.PATHS.skills.default)}),"closeHiddenBrowser",0,O,"closeJobShell",0,W,"ensureBrowser",0,R,"filesOnDisk",0,Y,"insideWorkspace",0,A,"jobScratch",0,$,"jobShellEnv",0,b,"listScratchFolders",0,N,"openBotFolders",0,_,"openJobScratch",0,j,"openWorkspace",0,U,"pruneJobFiles",0,H,"readMachineTools",0,v,"removeJobBrowsers",0,C,"removeJobScratch",0,J,"removeUnchangedFolders",0,G,"writeRefusal",0,function(t,e){if(y(f,t)){let a=(0,n.relative)(f,t),[r,o]=a.split(n.sep);return r&&g.has(r)?e&&r===s.PATHS.artifacts&&o&&o.toLowerCase()!==e.replace(/[^\p{L}\p{N}_-]+/gu,"-").toLowerCase()&&!(0,i.existsSync)((0,n.join)(m,o))?`Not written: ${a} would sit loose at the top of ${s.PATHS.artifacts}/. Your finished work goes in ${I(e)}/.`:null:`Not written: ${a||"the workspace root"} is outside the workspace's folders. Finished work goes under ${e?I(e):s.PATHS.artifacts}/, code under ${s.PATHS.projects}/, your own kit under ${s.PATHS.bots}/, and this job's working material under ${s.PATHS.scratch}/.`}return y(p,t)?`Not written: ${t} is inside the app that is running you, not the user's files. Work in ${f}; outside it, write only where the user pointed you.`:null}],871096)}];
|
|
7
9
|
|
|
8
10
|
//# sourceMappingURL=features_0rfvely._.js.map
|