thursday-agent 0.17.2 → 0.19.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 +4 -2
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/routes-manifest.json +28 -12
- 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 +12 -12
- package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -12
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +11 -11
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/artifact/route.js +7 -7
- package/.next/server/app/api/artifact/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/files/route.js +4 -4
- package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/route.js +4 -4
- package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/route.js +4 -4
- package/.next/server/app/api/bot/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/[id]/route.js +1 -1
- package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/file/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/bot/thread/file/route.js +29 -0
- package/.next/server/app/api/bot/thread/file/route.js.nft.json +1 -0
- package/.next/server/app/api/bot/thread/file/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/bot/thread/route.js +1 -1
- package/.next/server/app/api/bot/thread/route.js.nft.json +1 -1
- package/.next/server/app/api/config/route.js +1 -1
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/events/route.js +2 -2
- 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/automatic/route.js +3 -3
- package/.next/server/app/api/llm-model/automatic/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/catalog/[provider]/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/llm-model/catalog/{route.js → [provider]/route.js} +8 -8
- package/.next/server/app/api/llm-model/catalog/[provider]/route.js.nft.json +1 -0
- package/.next/server/app/api/llm-model/catalog/[provider]/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/llm-model/credits/[provider]/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/llm-model/credits/[provider]/route/build-manifest.json +12 -0
- package/.next/server/app/api/llm-model/credits/[provider]/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/llm-model/credits/{route.js → [provider]/route.js} +8 -8
- package/.next/server/app/api/llm-model/credits/[provider]/route.js.map +5 -0
- package/.next/server/app/api/llm-model/credits/[provider]/route.js.nft.json +1 -0
- package/.next/server/app/api/llm-model/credits/[provider]/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/llm-model/route.js +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 +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 +1 -1
- package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth/callback/route.js +2 -2
- package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +1 -1
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/tools/route.js +1 -1
- package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/edit/route.js +12 -12
- package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/route.js +1 -1
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/reach/route.js +17 -17
- package/.next/server/app/api/reach/route.js.nft.json +1 -1
- package/.next/server/app/api/routine/route.js +6 -6
- package/.next/server/app/api/routine/route.js.nft.json +1 -1
- package/.next/server/app/api/running/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/running/route/build-manifest.json +12 -0
- package/.next/server/app/api/running/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/running/route.js +10 -0
- package/.next/server/app/api/running/route.js.map +5 -0
- package/.next/server/app/api/running/route.js.nft.json +1 -0
- package/.next/server/app/api/running/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/signins/route.js +4 -4
- 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 +6 -6
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/call/end/route.js +1 -1
- package/.next/server/app/api/thursday/call/end/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/call/route.js +1 -1
- package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/settings/route.js +1 -1
- package/.next/server/app/api/thursday/settings/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/text/route.js +12 -12
- package/.next/server/app/api/thursday/text/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/tool-call/route.js +13 -13
- package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/files/route.js +7 -7
- package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/route.js +6 -6
- package/.next/server/app/api/workspace/route.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +94 -6
- package/.next/server/app/artifact/[...path]/page.js +9 -5
- 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 +161 -128
- package/.next/server/app/page.js +10 -9
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +4 -2
- package/.next/server/chunks/[root-of-the-server]__00qyw01._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__02ra64t._.js +5 -0
- package/.next/server/chunks/{[root-of-the-server]__05dp5tr._.js → [root-of-the-server]__06ky9of._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0b565-x._.js +7 -0
- package/.next/server/chunks/[root-of-the-server]__0bmtib_._.js +7 -0
- package/.next/server/chunks/[root-of-the-server]__0bqveex._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0brmiv2._.js +7 -0
- package/.next/server/chunks/[root-of-the-server]__0eivkvk._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__0f7m79q._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0g38-aj._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__0gvdr2h._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0h656y-._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__0hm3tiq._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__0hzdqnv._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__0kzmxpg._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0mgyt8p._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__0mrk2it._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0o5s5-o._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0p80i1n._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0qdoc_9._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0qzho69._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0v_kuor._.js +5 -0
- package/.next/server/chunks/{[root-of-the-server]__061o2_x._.js → [root-of-the-server]__0ypkfbu._.js} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1-18_pz._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__13hng6h._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__01k3vi3._.js → [root-of-the-server]__14iga7p._.js} +1 -1
- package/.next/server/chunks/[root-of-the-server]__16gn7zn._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__18e65_-._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__1_cgawk._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1ceammd._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1ckt1yj._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1cu5f3z._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1dth047._.js +5 -0
- package/.next/server/chunks/{[root-of-the-server]__1k2qs1m._.js → [root-of-the-server]__1fc6v12._.js} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1hviq62._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__1ksm9m-._.js +12 -0
- package/.next/server/chunks/[root-of-the-server]__1m1q6u5._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1m_dmf6._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1mys2c3._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1ndi14y._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1p0njle._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1p47fbb._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__1pugoq0._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0ts7ai0._.js → [root-of-the-server]__1trns9g._.js} +1 -1
- package/.next/server/chunks/[root-of-the-server]__1ygplx1._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1zn039k._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__20w_g71._.js +3 -0
- package/.next/server/chunks/_01c32w9._.js +1 -1
- package/.next/server/chunks/_02bov6_._.js +1 -1
- package/.next/server/chunks/_06hnfi8._.js +2 -2
- package/.next/server/chunks/_06u9yo-._.js +1 -1
- package/.next/server/chunks/_08354bn._.js +12 -11
- package/.next/server/chunks/_08_-9ay._.js +7 -0
- package/.next/server/chunks/_08s4vft._.js +1 -1
- package/.next/server/chunks/_0bgjf07._.js +5 -0
- package/.next/server/chunks/_0c49lmw._.js +1 -1
- package/.next/server/chunks/_0fb6dvr._.js +1 -1
- package/.next/server/chunks/_0hgvg55._.js +1 -1
- package/.next/server/chunks/_0iw19ig._.js +1 -1
- package/.next/server/chunks/_0poi1t2._.js +1 -1
- package/.next/server/chunks/_0s8ao8z._.js +1 -1
- package/.next/server/chunks/_0t_7gji._.js +1 -1
- package/.next/server/chunks/_0ucx1jv._.js +1 -1
- package/.next/server/chunks/_0uzj57i._.js +1 -1
- package/.next/server/chunks/_0wyh244._.js +112 -0
- package/.next/server/chunks/_1-sk_q4._.js +1 -1
- package/.next/server/chunks/_108gsm8._.js +2 -2
- package/.next/server/chunks/_136j09a._.js +5 -5
- package/.next/server/chunks/_15negpy._.js +2 -2
- package/.next/server/chunks/_1d7og_q._.js +1 -1
- package/.next/server/chunks/_1dxq827._.js +2 -2
- package/.next/server/chunks/_1e54wxa._.js +1 -1
- package/.next/server/chunks/_1frcwj1._.js +1 -1
- package/.next/server/chunks/_1gn2r2q._.js +8 -6
- package/.next/server/chunks/_1gxankq._.js +2 -2
- package/.next/server/chunks/_1i3uucm._.js +1 -1
- package/.next/server/chunks/_1jvy78-._.js +5 -0
- package/.next/server/chunks/_1lg0lsu._.js +53 -0
- package/.next/server/chunks/_1njolhx._.js +294 -0
- package/.next/server/chunks/_1q6e56i._.js +8 -6
- package/.next/server/chunks/_1qgix-j._.js +1 -1
- package/.next/server/chunks/_1wtb-77._.js +294 -0
- package/.next/server/chunks/_1wwl_7o._.js +1 -1
- package/.next/server/chunks/_1y8w80a._.js +5 -5
- package/.next/server/chunks/_1yx285_._.js +3 -0
- package/.next/server/chunks/_20qn224._.js +3 -0
- package/.next/server/chunks/_211dn2c._.js +1 -1
- package/.next/server/chunks/_next-internal_server_app_api_bot_thread_file_route_actions_0q3be0o.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_llm-model_catalog_[provider]_route_actions_1i0449q.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_llm-model_credits_[provider]_route_actions_0iui9hz.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_running_route_actions_0o1g-aw.js +3 -0
- package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
- package/.next/server/chunks/features_bot_08z387_._.js +3 -3
- package/.next/server/chunks/features_bot_0zy_q8y._.js +7 -7
- package/.next/server/chunks/features_bot_1dfrdsb._.js +7 -7
- package/.next/server/chunks/features_workspace_workspace_ts_13h82gv._.js +3 -3
- package/.next/server/chunks/features_workspace_workspace_ts_1iyjroj._.js +3 -3
- package/.next/server/chunks/{node_modules_1rosz79._.js → node_modules_035o7ku._.js} +1 -1
- package/.next/server/chunks/{node_modules_1er1u8w._.js → node_modules_0tn5t13._.js} +1 -1
- package/.next/server/chunks/{node_modules_103lpef._.js → node_modules_12oq3hr._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0g87zst._.js → node_modules_consola_dist_chunks_prompt_mjs_0yd5xa0._.js} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__04upd5v._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0p0mv2u._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0sk5enu._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0xyaud4._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1-gi9sm._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__16nn3pe._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1867koj._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1c8-7cw._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__1d7usu0._.js → [root-of-the-server]__1qn0axo._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__1tb5vve._.js +47 -0
- package/.next/server/chunks/ssr/_02cm0fr._.js +5 -0
- package/.next/server/chunks/ssr/{features_bot_1knyan7._.js → _07nmtxo._.js} +2 -2
- package/.next/server/chunks/ssr/_088vzgn._.js +1 -1
- package/.next/server/chunks/ssr/{_1dfv66y._.js → _0bg1u1j._.js} +2 -2
- package/.next/server/chunks/ssr/_0cv9tmv._.js +1 -1
- package/.next/server/chunks/ssr/{_10-_awu._.js → _0f9hx5p._.js} +2 -2
- package/.next/server/chunks/ssr/_0g9ula_._.js +3 -0
- package/.next/server/chunks/ssr/{_1aqjk-1._.js → _0irozu9._.js} +2 -2
- package/.next/server/chunks/ssr/{_123y-ah._.js → _0is8m6y._.js} +2 -2
- package/.next/server/chunks/ssr/_0iwsdp7._.js +3 -0
- package/.next/server/chunks/ssr/_0l7rjg5._.js +1 -1
- package/.next/server/chunks/ssr/{lib_logger_ts_0-olsze._.js → _0mfgsk-._.js} +4 -2
- package/.next/server/chunks/ssr/{_0fo4552._.js → _0nk80t6._.js} +53 -13
- package/.next/server/chunks/ssr/_0p6w0ef._.js +3 -0
- package/.next/server/chunks/ssr/_0pbav_w._.js +3 -0
- package/.next/server/chunks/ssr/{_0vo_oym._.js → _0q-mdwv._.js} +8 -8
- package/.next/server/chunks/ssr/_0s5_ahb._.js +3 -0
- package/.next/server/chunks/ssr/{_0e2fnvg._.js → _0t5f2c3._.js} +2 -2
- package/.next/server/chunks/ssr/_0v9r8g2._.js +1 -1
- package/.next/server/chunks/ssr/_0x8ophf._.js +1 -1
- package/.next/server/chunks/ssr/_0x9f717._.js +60 -0
- package/.next/server/chunks/ssr/_107vtdk._.js +162 -0
- package/.next/server/chunks/ssr/{_17a4qyk._.js → _12lql1x._.js} +3 -3
- package/.next/server/chunks/ssr/{_163dr78._.js → _165wnr4._.js} +2 -2
- package/.next/server/chunks/ssr/_16_7zeo._.js +3 -0
- package/.next/server/chunks/ssr/_17komoi._.js +3 -0
- package/.next/server/chunks/ssr/_190hjys._.js +3 -0
- package/.next/server/chunks/ssr/_1bfrntd._.js +6 -0
- package/.next/server/chunks/ssr/{_01al00i._.js → _1booff4._.js} +2 -2
- package/.next/server/chunks/ssr/{_0xfafez._.js → _1ew1j7l._.js} +2 -2
- package/.next/server/chunks/ssr/_1i2swyr._.js +3 -0
- package/.next/server/chunks/ssr/_1neoj22._.js +1 -1
- package/.next/server/chunks/ssr/_1qsa25k._.js +3 -0
- package/.next/server/chunks/ssr/_1soynbw._.js +6 -0
- package/.next/server/chunks/ssr/_1vc2xmu._.js +3 -0
- package/.next/server/chunks/ssr/{_14oirtb._.js → _1wq90j8._.js} +2 -2
- package/.next/server/chunks/ssr/_1xwtbdz._.js +3 -0
- package/.next/server/chunks/ssr/_1zrhkf0._.js +310 -0
- package/.next/server/chunks/ssr/_21awrs2._.js +5 -0
- package/.next/server/chunks/ssr/features_0796o8r._.js +1 -1
- package/.next/server/chunks/ssr/features_bot_0tb4ui-._.js +2 -2
- package/.next/server/chunks/ssr/features_bot_1c56lew._.js +37 -0
- package/.next/server/chunks/ssr/features_bot_1fn_grf._.js +3 -0
- package/.next/server/chunks/ssr/{features_config_09n-q9q._.js → features_config_05zi68v._.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_1k5i-_9._.js → node_modules_0-sux1a._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0msrhxf._.js → node_modules_01oezhb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1gq3ght._.js → node_modules_04m6ebg._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0nmkv-v._.js → node_modules_067jfov._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0gd9hbz._.js → node_modules_06ugby3._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0d6j33x._.js → node_modules_07p51j3._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_10_fv2a._.js → node_modules_0995xyq._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1lmyts8._.js → node_modules_0_uecwx._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_04x5wyv._.js → node_modules_0dsyc90._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0__0tvm._.js → node_modules_0hli6s2._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0k8-y89._.js → node_modules_0m-bde_._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1p_6sq7._.js → node_modules_0oqfdbr._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules_0qd7p5f._.js +3 -0
- package/.next/server/chunks/ssr/{node_modules_13g-d25._.js → node_modules_0tgy5s5._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1_8-jcj._.js → node_modules_1-kjmls._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0m73b88._.js → node_modules_1-l3ka5._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_113l3e5._.js → node_modules_1-w3ayh._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0q-klni._.js → node_modules_133exgm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1xb-ndg._.js → node_modules_17xc5_k._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_021lid9._.js → node_modules_1_i_w30._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1ri_eip._.js → node_modules_1a2cjfk._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_13bqv6i._.js → node_modules_1k752fe._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1qstb1x._.js → node_modules_1lie7z8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_096up6a._.js → node_modules_1mv70-y._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_156kv_t._.js → node_modules_1r611t2._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules_1vfd8dz._.js +3 -0
- package/.next/server/chunks/ssr/{node_modules_0cjnmzp._.js → node_modules_1yaowd7._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0nw5jz7._.js → node_modules_20a1wpo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0amkw0b._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1r8pxbe._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0zq3l45._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1siiu4h._.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 +205 -132
- package/.next/static/chunks/{0obogzscwwekj.js → 088d3w5qxu19g.js} +2 -2
- package/.next/static/chunks/0_s4z70lx1tgs.js +1 -0
- package/.next/static/chunks/0bxekp4hnuk1g.js +1 -0
- package/.next/static/chunks/{1cglo3a2mbeou.js → 0fw4u_s974j24.js} +1 -1
- package/.next/static/chunks/0hy2x7qhk8wgx.css +1 -0
- package/.next/static/chunks/{2zbl41hed17g3.js → 0n_eshmn_7wfn.js} +2 -2
- package/.next/static/chunks/0q9b2n6l4flqb.js +1 -0
- package/.next/static/chunks/0ulcp_u_y1u0b.js +15 -0
- package/.next/static/chunks/0vj93zo0yvix9.js +35 -0
- package/.next/static/chunks/{166smhw8v-s3j.js → 10f98bh4hdmhe.js} +1 -1
- package/.next/static/chunks/1b8bce_z_act0.js +1 -0
- package/.next/static/chunks/1c32d2azsjaj_.js +1 -0
- package/.next/static/chunks/{1xv4g10m-cl1s.js → 1fs829mz69pxz.js} +1 -1
- package/.next/static/chunks/1lwlh4mo_vv8d.js +1 -0
- package/.next/static/chunks/{0p2f6uv4xytfm.js → 1po8fkg40peu-.js} +1 -1
- package/.next/static/chunks/{0uxq_vs6uxi-b.js → 1rg6b9l5fm1hj.js} +1 -1
- package/.next/static/chunks/{3b96xy59nl_gd.js → 26g3iwfuad-7p.js} +1 -1
- package/.next/static/chunks/2bjnmtke_q43c.js +1 -0
- package/.next/static/chunks/2c86k0o-1p9_w.js +1 -0
- package/.next/static/chunks/2gf4t0d76bvyv.js +1 -0
- package/.next/static/chunks/2rj3q_ahctv19.js +1 -0
- package/.next/static/chunks/{2lhc74urf3acr.js → 2x6-fpctvucte.js} +1 -1
- package/.next/static/chunks/2yicf7bky866n.js +3 -0
- package/.next/static/chunks/337g9g_ux2gj-.js +1 -0
- package/.next/static/chunks/350ws7svim7ij.js +58 -0
- package/.next/static/chunks/{0o7o0eb7ihxi6.js → 396enq-m0sss5.js} +1 -1
- package/.next/static/chunks/3e1w_nwfb39j-.js +1 -0
- package/.next/static/chunks/3v3ooretb54ag.js +1 -0
- package/.next/static/chunks/40re_3ukjulg9.js +1 -0
- package/.next/static/chunks/{3gsxnqqqphh-1.js → 44bcbnmup71so.js} +1 -1
- package/.next/static/chunks/{2qgkbdshzpq1c.js → 458dtbsemx996.js} +1 -1
- package/README.md +5 -5
- package/bin/background.mjs +995 -0
- package/bin/lock.mjs +121 -5
- package/bin/thursday.mjs +126 -30
- package/bin/tools.mjs +72 -1
- package/database/migrations/20260926021847_thread_cache_tokens/migration.sql +2 -0
- package/database/migrations/20260926021847_thread_cache_tokens/snapshot.json +1949 -0
- package/guide/bots.md +173 -317
- package/guide/calls.md +106 -146
- package/guide/index.md +2 -2
- package/guide/memory.md +14 -18
- package/guide/phone.md +86 -133
- package/guide/setup.md +141 -172
- package/guide/trouble.md +42 -65
- package/package.json +1 -1
- package/seed-skills/concierge/travel/references/itinerary.md +1 -1
- package/seed-skills/concierge/travel/scripts/itinerary.mjs +8 -3
- package/skills/artifact/references/book.md +3 -3
- package/skills/artifact/runtime/shell/shell.js +32 -3
- package/.next/server/app/api/llm-model/catalog/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/llm-model/catalog/route.js.nft.json +0 -1
- package/.next/server/app/api/llm-model/catalog/route_client-reference-manifest.js +0 -3
- package/.next/server/app/api/llm-model/credits/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/llm-model/credits/route.js.nft.json +0 -1
- package/.next/server/app/api/llm-model/credits/route_client-reference-manifest.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__01ypm_z._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__021dkui._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__03xamry._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__09gdscj._.js +0 -7
- package/.next/server/chunks/[root-of-the-server]__0ljizgj._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0nmust6._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0svzjwa._.js +0 -7
- package/.next/server/chunks/[root-of-the-server]__1-rmal0._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__10xnb7e._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1_h4hf9._.js +0 -7
- package/.next/server/chunks/[root-of-the-server]__1c2kwku._.js +0 -12
- package/.next/server/chunks/[root-of-the-server]__1t02-1p._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1t0jj1j._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1v7x5ym._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1vlxv19._.js +0 -5
- package/.next/server/chunks/_07nxi75._.js +0 -254
- package/.next/server/chunks/_08btiir._.js +0 -7
- package/.next/server/chunks/_0j0-gq6._.js +0 -5
- package/.next/server/chunks/_0p6v1fr._.js +0 -5
- package/.next/server/chunks/_0srlnvd._.js +0 -16
- package/.next/server/chunks/_0xygcxs._.js +0 -254
- package/.next/server/chunks/_1ic3bew._.js +0 -5
- package/.next/server/chunks/_next-internal_server_app_api_llm-model_catalog_route_actions_1eu2y41.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_llm-model_credits_route_actions_0v424pb.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_04oxl25._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0-af_o7._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__09f39cp._.js +0 -4
- package/.next/server/chunks/ssr/[root-of-the-server]__0ouu4qp._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0q9g9ea._.js +0 -5
- package/.next/server/chunks/ssr/[root-of-the-server]__17h1ggo._.js +0 -46
- package/.next/server/chunks/ssr/[root-of-the-server]__1jyeu61._.js +0 -5
- package/.next/server/chunks/ssr/_0afrpci._.js +0 -3
- package/.next/server/chunks/ssr/_0bgse1c._.js +0 -162
- package/.next/server/chunks/ssr/_0jstvlg._.js +0 -39
- package/.next/server/chunks/ssr/_0qsmpcu._.js +0 -3
- package/.next/server/chunks/ssr/_0z38nha._.js +0 -3
- package/.next/server/chunks/ssr/_1-41lck._.js +0 -3
- package/.next/server/chunks/ssr/_10_ph1t._.js +0 -3
- package/.next/server/chunks/ssr/_116lfdc._.js +0 -3
- package/.next/server/chunks/ssr/_14dfh7a._.js +0 -4
- package/.next/server/chunks/ssr/_17qtuv7._.js +0 -3
- package/.next/server/chunks/ssr/_19jez1a._.js +0 -3
- package/.next/server/chunks/ssr/_1_5xof_._.js +0 -3
- package/.next/server/chunks/ssr/_1alxym6._.js +0 -3
- package/.next/server/chunks/ssr/_1ou5sj0._.js +0 -3
- package/.next/server/chunks/ssr/_1tmw842._.js +0 -5
- package/.next/server/chunks/ssr/_1uij_rj._.js +0 -3
- package/.next/server/chunks/ssr/_1w9w1ok._.js +0 -3
- package/.next/server/chunks/ssr/_20gq_24._.js +0 -3
- package/.next/server/chunks/ssr/features_bot_0ouemw8._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_@base-ui_react_1j9i1ho._.js +0 -3
- package/.next/static/chunks/01l7kw74vfp32.js +0 -1
- package/.next/static/chunks/0a5_-jqhaktjj.js +0 -1
- package/.next/static/chunks/0npvak0wpgagb.js +0 -1
- package/.next/static/chunks/19l81deo_pyoc.js +0 -1
- package/.next/static/chunks/1bnhw-5fj7aiz.js +0 -1
- package/.next/static/chunks/1in6nxpu33iab.js +0 -1
- package/.next/static/chunks/1u7kg91f9qy3g.js +0 -1
- package/.next/static/chunks/2ajs12-fcdwzm.js +0 -1
- package/.next/static/chunks/2i7qtmxc1kuqg.js +0 -1
- package/.next/static/chunks/2kz1f6r59nky0.js +0 -3
- package/.next/static/chunks/31kn4_h2rvf6k.css +0 -1
- package/.next/static/chunks/35jj-5u4te56r.js +0 -1
- package/.next/static/chunks/37ixzapa06xlo.js +0 -1
- package/.next/static/chunks/3jtcieuk1l6tw.js +0 -1
- package/.next/static/chunks/3k1d8y03t5nax.js +0 -58
- package/.next/static/chunks/3sla-dm1puqd1.js +0 -35
- package/.next/static/chunks/3t2c76awm9k_p.js +0 -1
- package/.next/static/chunks/3vrmcm31ih7gb.js +0 -1
- package/.next/static/chunks/3yiqr95d7ybeq.js +0 -15
- package/bin/autostart.mjs +0 -162
- /package/.next/server/app/api/{llm-model/catalog → bot/thread/file}/route/build-manifest.json +0 -0
- /package/.next/server/app/api/{llm-model/catalog → bot/thread/file}/route/server-reference-manifest.json +0 -0
- /package/.next/server/app/api/{llm-model/catalog → bot/thread/file}/route.js.map +0 -0
- /package/.next/server/app/api/llm-model/{credits → catalog/[provider]}/route/build-manifest.json +0 -0
- /package/.next/server/app/api/llm-model/{credits → catalog/[provider]}/route/server-reference-manifest.json +0 -0
- /package/.next/server/app/api/llm-model/{credits → catalog/[provider]}/route.js.map +0 -0
- /package/.next/static/{8I2hKtciyA9LXvd8txuOz → YhaRHJqObuAcXZe5VLFs0}/_buildManifest.js +0 -0
- /package/.next/static/{8I2hKtciyA9LXvd8txuOz → YhaRHJqObuAcXZe5VLFs0}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{8I2hKtciyA9LXvd8txuOz → YhaRHJqObuAcXZe5VLFs0}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
module.exports=[851372,e=>e.a(async(t,o)=>{try{var a=e.i(343747),r=e.i(687388),n=e.i(186304),s=e.i(353885),i=e.i(393189),l=e.i(265143),d=e.i(944971),h=e.i(438188),u=e.i(378884),c=e.i(148831),p=e.i(619898),w=e.i(636882),m=e.i(629668),f=e.i(786025),y=e.i(704161),g=e.i(41444),b=e.i(660948),T=e.i(54282),v=t([l,u,c,p,w,b]);async function $(e,t,o,n){var h,v,$,x,O,S,N,M,C,E;let R,A,_,B,P,W,j,L=await (0,f.openWorkspace)(),U=e.trim(),[Y,D,H,F,J,q,K,G,z]=await Promise.all([(0,w.loadSkills)(L,U),(0,p.listNoteIndex)(),(0,b.listConnectedToolNames)(),(0,c.findPinnedTools)(U),(0,l.listJobBots)(),(0,i.listBotMemory)(U),(0,l.readBotMemoryOn)(),(0,f.readMachineTools)(L),(0,u.listBotWork)(U,o?.thread??null)]),Q=J.filter(e=>e.name!==U),V=J.find(e=>e.name===U)??await (0,l.findJobBot)(U),X=[(h=U,v=V,$=o,A=(R=$?.owner??h)===h?"**You** coordinate this thread: its result goes from you to Thursday.":`**${R}** coordinates this thread and brings its result to Thursday.`,_=$?`
|
|
2
|
+
|
|
3
|
+
Current conversation: ${$.caller} → ${h}. Your final text goes back to ${$.caller}.`:"",B=v?`
|
|
4
|
+
Others know you as: ${(0,d.rosterLine)(v)}`:"",`You are ${h}, one of the bots in this thread. ${(0,T.todayLine)()}${B}
|
|
5
|
+
|
|
6
|
+
- **The user** — the one person all of this is for. They talk with Thursday by voice and follow this thread on their screen.
|
|
7
|
+
- **Thursday** — their personal assistant. She talks with them, hands bots the work that takes time, and tells them what comes back.
|
|
8
|
+
- ${A}
|
|
9
|
+
- **Everyone on it** keeps their own work and conversation; the others see only the messages sent to them.${_}
|
|
10
|
+
|
|
11
|
+
**The job is done, not described.** You are on the user's own computer, with a shell, files and the web, and how you get there is yours: when one way fails, try another; where no tool exists, write one — \`node\` is always here. Before deciding something cannot be done, look at what you have — your tools, the other bots, this machine. Bring back the thing itself — their account, their file, the real result — not a smaller, safer stand-in, and not a note on why not.
|
|
12
|
+
|
|
13
|
+
**Never present a guess as a result.** Thursday says what you return out loud, as fact: say which part is unverified and why.`),(x=D,`## Thursday's memory of the user
|
|
14
|
+
|
|
15
|
+
What Thursday keeps from talking with them. When the job needs something about them, open the note with \`${s.TOOL_NAMES.memory_recall}\`; a fact marked \`said\` came from a call. What you learn about them goes in your answer — Thursday decides what to keep.
|
|
16
|
+
|
|
17
|
+
path — what it is about (facts)
|
|
18
|
+
|
|
19
|
+
${(0,T.noteLines)(x)}`),function(e,t){let o=new Set(t.map(e=>`${e.server}/${e.name}`)),a=e.filter(e=>!o.has(`${e.server}/${e.name}`));if(0===a.length)return"";let r=o.size?" The ones you already hold are in your tools instead.":"";return`## Connected tools
|
|
20
|
+
|
|
21
|
+
${(0,T.mcpToolLines)(a)}
|
|
22
|
+
|
|
23
|
+
Names only: \`${s.TOOL_NAMES.tool_search}\` returns what each one takes, \`${s.TOOL_NAMES.tool_call}\` runs one.${r}`}(H,F),(O=Y,0===O.length?"":`## Skills
|
|
24
|
+
|
|
25
|
+
Written-down ways of doing things. Open one with \`${s.TOOL_NAMES.load_skill}\` before a job it covers, unless its instructions are already in your conversation.
|
|
26
|
+
|
|
27
|
+
${(0,T.skillLines)(O)}`),I(L.cwd,G,n),K?(S=(0,i.botMemoryFolder)(U),P=(N=q).entries.length?N.entries.map(({file:e,line:t,at:o})=>{let n=t?` — ${(0,g.clip)(t,r.PROMPT_LINE.botMemory)}`:"";return`- ${e}${n} \xb7 ${(0,a.format)((0,y.toDate)(o),"yyyy-MM-dd")}`}).join("\n"):"Empty.",W=N.total>N.entries.length?`
|
|
28
|
+
|
|
29
|
+
The newest ${N.entries.length} of ${N.total}; \`ls ${S}\` for the rest.`:"",`## Your memory
|
|
30
|
+
|
|
31
|
+
What you learned on your own earlier jobs, in \`${S}/\`: one topic per file, its first line saying what it holds, read by no other bot, up to ${r.BOT_MEMORY_LIMITS.files} files of ${r.BOT_MEMORY_LIMITS.chars.toLocaleString("en-US")} characters each. It is how you get better at this work. When a job teaches you something a later one would otherwise find out again — how a site signs in, the way through its screens, a command that turned out right — or the user asks you to remember how to work, keep it with the date it was true, and fix or delete what proved wrong. No passwords, keys or codes.
|
|
32
|
+
|
|
33
|
+
${P}${W}`):"",function(e,t){if(!t.open.length&&!t.recent.length)return"";let o=t=>{let o=t.said?` — ${(0,g.clip)(t.said,r.BOT_WORK.said)}`:"",a=t.said?(0,m.pathsIn)(t.said).slice(0,r.BOT_WORK.files):[],n=a.length?` \xb7 ${a.map(e=>`\`${e}\``).join(", ")}`:"";return`- ${t.cut?`[${(0,d.workHandle)(t.id)}] `:""}${(0,T.botWorkHead)(t,e)}${o}${n}`},a=(e,t)=>t.length?`${e}
|
|
34
|
+
${t.map(o).join("\n")}`:"",n=[...t.open,...t.recent].some(e=>e.cut)?` A line with an id in brackets was cut short: \`${s.TOOL_NAMES.thread_recall}\` opens that one whole, for when this job builds on it.`:"";return`## Your other threads
|
|
35
|
+
|
|
36
|
+
Your threads besides this one. You remember none of them here: each line is where it stands, your own last words there, and the files those words name.${n}
|
|
37
|
+
|
|
38
|
+
${[a("Open",t.open),a("Ended",t.recent)].filter(Boolean).join("\n")}`}(U,z),(M=Q,0===M.length?"":`## Bots
|
|
39
|
+
|
|
40
|
+
${M.map(e=>`- **${e.name}** — ${(0,d.rosterLine)(e)}`).join("\n")}
|
|
41
|
+
|
|
42
|
+
These lines were written for the user: where one says "you", it means them. When part of the job is another bot's strength, bring it in with \`${s.TOOL_NAMES.send_message}\` rather than rebuilding it yourself.`),(C=U,E=o,j=(E?.owner??C)===C?"While work you handed out is still out, your result waits for it: end your turn and its answer wakes you; write the result once everything you asked for is in. Bring what you received together into one result for Thursday: what was done, where it is, what you decided that the request did not say, and what is still open, at the detail the user asked for. Every file you name in it is drawn under your words in the thread and waits in the screen's corner for the user to open, so name each one you want them to see — the page to read first, then the rest.":`Your final text is your answer to ${E?.caller??"whoever asked"}, and all they see of your work: give them everything they need to carry on. When you cannot go on without something from them, end with that question instead; their reply brings you back with all you have done still in front of you.`,`## Working together
|
|
43
|
+
|
|
44
|
+
Nobody sees your work but you, and you see only what others send you, so whatever crosses between you has to stand on its own. A request says what is wanted, what is already known or done, and where the files are; an answer gives exact values, file paths and what is still unverified. Tell a bot you handed work to when what it depends on changes: it reads that before its next step. End your turn when you have nothing more to do now: replies arrive as new messages and wake you.
|
|
45
|
+
|
|
46
|
+
Ask the user, through Thursday, with kind \`question\` only for a decision, permission or something only they know: clearly, with the context to answer, and short options when they help. Use kind \`message\` for news that needs no answer, and your final text for the result.
|
|
47
|
+
|
|
48
|
+
${j}
|
|
49
|
+
|
|
50
|
+
Write in the user's language, and name the paths of finished work. In Markdown, reference images by absolute route (\`/api/file/${r.PATHS.artifacts}/…\`).`),k(U,t)].filter(Boolean).join("\n\n");return(0,T.logPromptSize)("bot",X),{text:X}}[l,u,c,p,w,b]=v.then?(await v)():v;let k=(e,t)=>{let o=t?.trim();return o?(0,h.findBotSeed)(e)?.systemPrompt.trim()===o?`## Your role
|
|
51
|
+
|
|
52
|
+
What this bot is for, as the app sets it up. Where it and anything above disagree, it wins.
|
|
53
|
+
|
|
54
|
+
${o}`:`## Owner's instructions
|
|
55
|
+
|
|
56
|
+
Written by the person this bot works for. Where these and anything above disagree, these win.
|
|
57
|
+
|
|
58
|
+
${o}`:""},I=(e,t,o)=>{var a;let i,l;return`## Environment
|
|
59
|
+
|
|
60
|
+
Current Cwd: ${e}
|
|
61
|
+
Platform: ${process.platform}
|
|
62
|
+
${a=t,i=(e,t)=>`${e}: ${t.found.length?t.found.join(", "):"none"}.${t.missing.length?` Not here: ${t.missing.join(", ")}.`:""}`,l=a.managers.found.includes("pnpm")?" Use pnpm, not npm — this workspace is fenced for it (`pnpm-workspace.yaml`, `.npmrc`).":"",[i("Runtimes",a.runtimes),`${i("Package managers",a.managers)}${l}`,null===a.browser?"":`Browser: ${a.browser?"installed":"not installed"}.`].filter(Boolean).join("\n")}
|
|
63
|
+
|
|
64
|
+
Read off this machine as the job opened: what is already here, not the limit of what you can use.
|
|
65
|
+
|
|
66
|
+
Your workspace, where \`${s.TOOL_NAMES.bash}\` runs. Everything you write goes in one of these folders, kept apart because what is in them lives for different lengths of time:
|
|
67
|
+
|
|
68
|
+
- \`${o?.artifacts??r.PATHS.artifacts}/\` — finished work the user opens, one entry per result. Theirs, and it stays.
|
|
69
|
+
- \`${r.PATHS.projects}/\` — code you build, one folder each; it outlives this job, and its dependencies install inside it, never at the workspace root.
|
|
70
|
+
- \`${o?.scratch??r.PATHS.scratch}/\` — this job's working material, shared by every bot on it; cleared ${Math.round(r.WORKSPACE_KEEP.forMs/864e5)} days after the job ends.
|
|
71
|
+
- \`${o?.own??r.PATHS.bots}/\` — yours across every job you run here: what you keep for next time.
|
|
72
|
+
|
|
73
|
+
Inside the workspace, set up whatever the job needs yourself; installing anything machine-wide waits for the user's yes. Never the directory above the workspace — it is the app's, not the user's; outside the workspace, only where the user pointed you.
|
|
74
|
+
|
|
75
|
+
${(0,n.botGuideLine)()}`};e.s(["buildThreadOpening",0,function(e){if(e.routine){let{when:t,last:o}=e.routine,n=o?` Its last run ended ${(0,a.format)(o.at,"yyyy-MM-dd HH:mm")}: ${(0,g.clip)(o.said,r.PROMPT_LINE.jobOutcome)}`:" This is its first run.";return[{type:"text",text:`You are ${e.bot}. A routine the user set up hands you this thread: it starts by itself, ${t}, and nobody is watching as it does.${n}`},{type:"text",text:`## The routine → ${e.bot}: the job
|
|
76
|
+
|
|
77
|
+
${e.request.trim()}`}]}let t="user"===e.from?"The user":"Thursday";return[{type:"text",text:`You are ${e.bot}. ${t} hands you this thread${"user"===e.from?" on screen":" during a call"}.`},{type:"text",text:`## ${t} → ${e.bot}: the job
|
|
78
|
+
|
|
79
|
+
${e.request.trim()}`}]},"loadBotPrompt",0,$]),o()}catch(e){o(e)}},!1),235190,e=>{"use strict";e.s(["asWords",0,function(e,t,o=e=>e){let a=[];for(let r of e){if("tool"===r.role)continue;if("system"===r.role){a.push(r);continue}if("user"===r.role){a.push("string"==typeof r.content?{role:"user",content:o(r.content)}:r);continue}let e="string"==typeof r.content?[{type:"text",text:r.content}]:r.content,n=e.flatMap(e=>"text"===e.type?[e.text]:[]).join("\n").trim()||e.flatMap(e=>"tool-call"===e.type?[t(e.toolName,e.input)]:[]).join("\n");if(!n)continue;let s=a.at(-1);s?.role==="assistant"&&"string"==typeof s.content?a[a.length-1]={role:"assistant",content:`${s.content}
|
|
80
|
+
${o(n)}`}:a.push({role:"assistant",content:o(n)})}return a}])},585099,e=>e.a(async(t,o)=>{try{var a=e.i(666680),r=e.i(68356),n=e.i(847841),s=e.i(687388),i=e.i(159479),l=e.i(386075),d=e.i(851372),h=e.i(316172),u=e.i(353885),c=e.i(235190),p=e.i(944971),w=e.i(527608),m=e.i(786025),f=e.i(640911),y=e.i(388439),g=e.i(265143),b=e.i(889034),T=e.i(378884),v=t([i,l,d,h,g,T]);[i,l,d,h,g,T]=v.then?(await v)():v;let S=s.BOT_RUN.steps;async function $(e,t){var o;let a,c,v,$,x,C,E,R,A,_=t.parent??null,B=await (0,g.findJobBot)(e.bot.trim()),P=B?.name??e.bot.trim(),W=e=>t.emit({...e,bot:P,parent:_});if(!B)return void await W({type:"error",message:`No bot named "${e.bot}". Use a name from the list.`,retry:!1});let j=e.messages,L=await O(B),U=t.threadId?await (0,T.findThread)(t.threadId):null,[Y,{own:D,artifacts:H}]=await Promise.all([t.threadId?(0,m.openJobScratch)(t.threadId,U?.label??"job"):null,(0,m.openBotFolders)(P)]),F=t.session??(t.threadId?(0,m.botBrowserSession)(t.threadId,P):null),[J,q]=await Promise.all([(0,d.loadBotPrompt)(P,B.systemPrompt,{thread:t.threadId??null,owner:t.owner,caller:t.caller},{scratch:Y,own:D,artifacts:H}),(0,i.loadTools)({target:"bot",bot:P,thread:t.threadId??null,session:F,model:L})]),K=Math.min(await (0,l.compactBudget)(L.ref,B.compactAt),t.contextBudget||1/0),G=await (0,l.runEffort)(L.ref,B.effort),z=(0,l.promptCacheOptions)(L.ref,t.threadId?M(t.threadId,P):null),Q=!1,V={...q,[u.TOOL_NAMES.send_message]:(0,n.tool)({description:h.sendMessageSpec.description,inputSchema:h.sendMessageSpec.parameters,execute:async(e,o)=>{let a=await t.send({...e,id:o.toolCallId});if("question"===e.kind&&(Q=!0),!a||"object"!=typeof a||!("to"in a))return a;let r=String(a.to);return r===b.ROOM_THURSDAY?a:{...a,note:`${r} has it now. When they finish, their answer — what they did and where the files are — comes to you as a new message and wakes you. Until then you do not know it: do not report it, guess it or do it yourself, and do not watch their folder. Go on with other work, or end your turn if there is none; the thread stays open.`}}})},X=new Set,Z=(o=s.BOT_RUN.silenceMs,c=new AbortController,v=0,$=!1,x=()=>{clearTimeout(a),a=void 0,$||v>0||(a=setTimeout(()=>{c.abort(new DOMException(`The model sent nothing for ${Math.round(o/6e4)} minutes.`,"TimeoutError"))},o))},{signal:c.signal,touch:x,hold:()=>{v+=1,x()},release:()=>{v=Math.max(0,v-1),x()},end:()=>{$=!0,x()}});for(let[e,o]of Object.entries(V)){let a=o.execute;a&&(o.execute=(o,r)=>{let n=(async()=>{t.signal?.throwIfAborted(),await W({type:"tool",id:r.toolCallId,name:e,input:o}),Z.hold();try{t.signal?.throwIfAborted();let n=await a(o,r);if(n&&"object"==typeof n&&Symbol.asyncIterator in n){let e;for await(let t of n)e=t;n=e}return await W({type:"tool-result",id:r.toolCallId,name:e,output:n}),n}catch(t){throw await W({type:"tool-result",id:r.toolCallId,name:e,output:(0,l.modelErrorToString)(t),error:!0}),t}finally{Z.release()}})();return X.add(n),n.finally(()=>X.delete(n)).catch(()=>{}),n})}let ee=Promise.resolve(),et=()=>{},eo=0,ea=new r.ToolLoopAgent({model:L.model,instructions:J.text,tools:V,reasoning:G,providerOptions:z,stopWhen:[(0,r.stepCountIs)(S),()=>Q],prepareStep:async({stepNumber:e,steps:o,messages:a})=>{await ee,t.signal?.throwIfAborted();let r={},n=(o.at(-1)?.usage.inputTokens??0)||a.reduce((e,t)=>e+(0,y.estimateTokens)("string"==typeof t.content?t.content:JSON.stringify(t.content))+4,0);eo=n;let s=a,i=t.compactNow?.()??!1;if((n>K||i)&&a.length>2){Z.hold();let e=await I(L.model,V,a,{signal:t.signal,budget:K,instructions:J.text,providerOptions:z}).finally(Z.release);f.logger.debug(`compacted ${a.length} messages at ${n} tokens (budget ${K})`);let o=`${e.text}${await k(U?.id??null,a,Y)}`;await W({type:"compact",text:o,usage:e.usage,messages:a.length,tokens:n}),s=[a[0],{role:"user",content:o}]}let l=e>0?await t.notes?.()??[]:[];return(l.length&&(s=[...s,...l.map(e=>({role:"user",content:e}))]),s===a)?r:{...r,messages:s}}}),er=(C=[],E=[],R=!1,{push(e){let t=E.shift();t?t(e):C.push(e)},take(){let e=C.shift();return e?Promise.resolve(e):R?Promise.resolve(null):new Promise(e=>E.push(e))},end(){for(let e of(R=!0,E.splice(0)))e(null)}}),en=t.signal?AbortSignal.any([t.signal,Z.signal]):Z.signal;Z.touch();let es=new AbortController,ei=AbortSignal.any([en,es.signal]);try{A=await ea.stream({messages:j,abortSignal:ei,onStepEnd:e=>{ee=new Promise(e=>{et=e}),er.push({messages:function(e){if(!e.toolResults.length)return e.response.messages;let t=new Map(e.toolResults.map(e=>[e.toolCallId,e.output]));return e.response.messages.map(e=>"tool"!==e.role?e:{...e,content:e.content.map(e=>{if("tool-result"!==e.type||!t.has(e.toolCallId))return e;let o=t.get(e.toolCallId);return{...e,output:"string"==typeof o?{type:"text",value:o}:{type:"json",value:o}}})})}(e),usage:N(e.usage)})}})}catch(e){throw Z.end(),es.abort(),await Promise.allSettled([...X]),e}let el="",ed="",eh=null,eu=e=>{f.logger.error(`${P}: the model run broke`,e);let t=(0,l.modelErrorToString)(e),o=!(0,l.isProviderRefusal)(e);if(!(0,l.isContextOverflow)(e))return{type:"error",message:t,retry:o};let a=Math.floor(Math.min(K,eo||K)*s.BOT_RUN.overflowShrink);return{type:"error",message:t,budget:Math.max(p.COMPACT_AT_MIN,a),retry:o}};en.addEventListener("abort",()=>{er.end(),et()},{once:!0});try{for await(let e of A.stream)switch(Z.touch(),e.type){case"start-step":ed="",el="";break;case"text-delta":el+=e.text;break;case"text-end":{let e=el.trim();if(el="",!e)break;ed=[ed,e].filter(Boolean).join("\n\n"),await W({type:"text",text:e});break}case"tool-call":await W({type:"tool",id:e.toolCallId,name:e.toolName,input:e.input,providerExecuted:e.providerExecuted,providerOptions:e.providerMetadata});break;case"tool-result":await W({type:"tool-result",id:e.toolCallId,name:e.toolName,output:e.output});break;case"tool-error":await W({type:"tool-result",id:e.toolCallId,name:e.toolName,output:(0,l.modelErrorToString)(e.error),error:!0});break;case"finish-step":{eh=e.finishReason;let t=await er.take();t&&await W({type:"step",...t,budget:K}),et();break}case"abort":if(t.signal?.aborted)return;await W(eu(e.reason??"The model stopped sending."));return;case"error":await W(eu(e.error));return}}finally{es.abort(),er.end(),Z.end(),et(),await Promise.allSettled([...X]),F&&(0,w.renewSignIns)(F).catch(e=>f.logger.warn(`${P}: kept sign-ins were not renewed`,e))}try{await A.finalStep}catch(e){if(t.signal?.aborted)return;await W(eu(e));return}"content-filter"===eh?await W({type:"error",message:"The provider's content filter stopped the response.",retry:!1}):await W({type:"turn-end",text:ed,stopped:!Q&&("length"===eh||"error"===eh||"tool-calls"===eh)})}async function k(e,t,o){try{let a=e?await (0,T.listWrittenPaths)(e):(0,T.writtenPathsIn)(t.map(e=>e.content)),r=await (0,m.filesOnDisk)(a,o);if(!r.length)return"";let n=r.slice(-s.BOT_RUN.compactFiles),i=r.length-n.length,l=n.map(e=>`- ${e}`);return i&&l.unshift(`- …and ${i} older ones`),`
|
|
81
|
+
|
|
82
|
+
Files this job has on disk now — open one rather than fetching again what is in it:
|
|
83
|
+
${l.join("\n")}`}catch(e){return f.logger.warn("files under the summary could not be listed",e),""}}async function I(e,t,o,a){let r;try{return await x(e,t,o,a)}catch(e){if(a.signal?.aborted)throw e;r=e}if((0,l.isContextOverflow)(r)){let n=(0,c.asWords)(o,(e,t)=>`${e}: ${(0,T.argumentLine)(e,t)}`);try{return await x(e,t,n,a)}catch(e){if(a.signal?.aborted)throw e;r=e}}throw Error(`Could not compact the context (${(0,l.modelErrorToString)(r)}).`,{cause:r})}async function x(e,t,o,a){let n,{text:i,usage:l}=await (0,r.generateText)({model:e,instructions:a.instructions,tools:t,toolChoice:"none",messages:[...o,{role:"user",content:(n=(e=>{let{min:t,max:o,perTokens:a}=s.BOT_RUN.summaryWords;return Math.min(o,Math.max(t,Math.round(e/a)))})(a.budget),`Compact your context. The first message above — who handed you the job, and the job — stays exactly as it is. Everything after it is replaced by what you write now, and you carry on from that first message and this alone; nothing else above can be read again. Write it for a fresh copy of you that has your tools, your instructions and that first message, but has seen none of the rest.
|
|
84
|
+
|
|
85
|
+
Cover all of it, and prefer a fact over a description of a fact:
|
|
86
|
+
|
|
87
|
+
- **Where the job stands against that first message.** Do not restate the job; say what has changed since — a choice made, a detail settled, an answer that came back, a correction, anything you are still waiting on.
|
|
88
|
+
- **What is already true.** Every value you have — numbers, names, dates, ids, urls, prices, times — written out, not referred to. A value you leave out is one the next steps go and fetch again.
|
|
89
|
+
- **Where you are.** Which page the browser is on by url, whether you are signed in and to what, what is running, what you were in the middle of. Element refs do not survive this: name what to look for, never a ref.
|
|
90
|
+
- **Files.** Every path you wrote or read, and one line on what each holds.
|
|
91
|
+
- **What did not work**, and why: the url that 404s, the endpoint that needs POST not GET, the selector that is not there, the site that refuses a headless browser, the argument a tool rejected. This is the part that stops the next steps repeating an hour of yours.
|
|
92
|
+
- **What is left**, in the order you would do it.
|
|
93
|
+
|
|
94
|
+
Plain text, under ${n} words. No preamble, no headings about the summary itself, no account of how you have been going.`)}],abortSignal:a.signal,timeout:s.BOT_RUN.silenceMs,providerOptions:a.providerOptions}),d=i.trim();if(!d)throw Error("The summary of the context came back empty, so there is nothing to carry on from.");return{text:`Everything between the first message and here was compacted. Below is your own summary of it; carry on from the first message and this.
|
|
95
|
+
|
|
96
|
+
${d}`,usage:N(l)}}let N=e=>({input:e.inputTokens??0,output:e.outputTokens??0,cacheRead:e.inputTokenDetails?.cacheReadTokens??0,cacheWrite:e.inputTokenDetails?.cacheWriteTokens??0}),M=(e,t)=>(0,a.createHash)("sha256").update(`${e}
|
|
97
|
+
${t}`).digest("hex").slice(0,32);function O(e,t={}){return e.provider&&e.model?(0,l.getTextModel)({provider:e.provider,model:e.model}):(0,l.resolveDefaultModel)(void 0,t).then(l.getTextModel)}e.s(["resolveModel",0,O,"resumeTranscript",0,function(e,t=new Map){let o=new Map,a=new Set;for(let t of e)if(("tool"===t.role||"assistant"===t.role)&&Array.isArray(t.content))for(let e of t.content)"tool-result"===e.type&&(o.has(e.toolCallId)||o.set(e.toolCallId,e),"assistant"===t.role&&a.add(e.toolCallId));let r=[],n=new Set;for(let s of e){if("tool"===s.role){let e=s.content.filter(e=>"tool-result"!==e.type);e.length&&r.push({...s,content:e});continue}if("assistant"!==s.role||"string"==typeof s.content){r.push(s);continue}let e=[],i=[];for(let r of s.content){if("tool-call"!==r.type){i.push(r);continue}if(n.has(r.toolCallId))continue;let s=r.input;if("string"==typeof s)try{s=JSON.parse(s)}catch{s=void 0}if(!r.toolCallId||void 0===s){i.push({type:"text",text:"A tool argument stream was interrupted before a complete call was recorded. Inspect the saved work before continuing."});continue}let l=r.toolName===u.TOOL_NAMES.send_message?t.get(r.toolCallId):void 0,d=o.get(r.toolCallId)??(l?{type:"tool-result",toolCallId:r.toolCallId,toolName:r.toolName,output:{type:"json",value:l}}:void 0);if(r.providerExecuted&&(!d||!a.has(r.toolCallId))){i.push({type:"text",text:d?`The provider operation ${r.toolName} returned this data before its native continuation was interrupted: ${JSON.stringify(d.output)}`:`The provider operation ${r.toolName} was interrupted without a recorded result. Its remote execution state is unknown.`});continue}n.add(r.toolCallId),i.push({...r,input:s}),a.has(r.toolCallId)||e.push(d??{type:"tool-result",toolCallId:r.toolCallId,toolName:r.toolName,output:{type:"text",value:"No result: execution was interrupted before a result was recorded. The outcome is unknown. Inspect the current state before repeating the action."}})}i.length&&r.push({...s,content:i}),e.length&&r.push({role:"tool",content:e})}return r},"runBot",0,$]),o()}catch(e){o(e)}},!1),39803,e=>e.a(async(t,o)=>{try{var a=e.i(136340),r=e.i(380690),n=e.i(687388),s=e.i(386075),i=e.i(851372),l=e.i(22676),d=e.i(629668),h=e.i(786025),u=e.i(167004),c=e.i(640911),p=e.i(53748),w=e.i(268486),m=e.i(41444),f=e.i(265143),y=e.i(585099),g=e.i(944971),b=e.i(742712),T=e.i(889034),v=e.i(378884),$=t([s,i,l,f,y,b,v]);[s,i,l,f,y,b,v]=$.then?(await $)():$;let P=globalThis.__roomRuns??=new Map,W=globalThis.__roomThreadLock??=(0,w.createKeyedLock)(),j=globalThis.__roomCompactAsked??=new Set,L=(e,t)=>`${e}
|
|
98
|
+
${t}`;async function k(e){let t=await (0,f.findJobBot)(e.bot);(!t||t.disabled)&&(0,p.publicError)("Choose an enabled bot.");let{from:o,routine:a,...r}={...e,bot:t.name},n=(0,i.buildThreadOpening)({bot:r.bot,request:r.request,from:o,routine:a}),s=await (0,v.insertThread)({...r,routineId:a?.id??null,opening:n});return await x(s.id),s.id}async function I(e,t,o="user",a,r){let n=null;return await W(e,async()=>{let s=await (0,v.findThread)(e);if(s||(0,p.publicError)("No such thread."),a){let t=(await (0,b.listRoomWork)(e)).find(e=>e.bot.toLowerCase()===a.trim().toLowerCase());t&&t.bot!==T.ROOM_THURSDAY||(0,p.publicError)("Choose a participant in this thread."),a=t.bot}t.trim()===g.THREAD_CONTINUE&&(0,g.isAppStop)(s.pending)?(await (0,b.resumeRoom)(e),(await (0,b.listRoomWork)(e)).some(e=>"queued"===e.state)||(n=await (0,b.tellRoom)(e,"Continue from the saved conversation.","user"===o?T.ROOM_USER:T.ROOM_THURSDAY,a,void 0,!1))):n=await (0,b.tellRoom)(e,t,"user"===o?T.ROOM_USER:T.ROOM_THURSDAY,a,r)}),await x(e),n}async function x(e){await W(e,async()=>{for(let t=0;t<2;t++){let t;for(;t=await (0,b.claimRoomWork)(e);)!function(e){let t,o=new AbortController,a=new Promise(e=>{t=e});P.set(e.id,{threadId:e.threadId,stop:o,done:a}),O(e,o.signal).catch(t=>c.logger.error(`thread ${e.threadId}: participant`,t)).finally(()=>{P.delete(e.id),t(),x(e.threadId).catch(t=>c.logger.error(`thread ${e.threadId}: scheduling`,t))})}(t);await (0,b.settleRoom)(e)}})}async function O(e,t){let o=await S(e,t);if(o?.failure?.retry&&!t.aborted&&(await (0,b.noteRoomBreak)(e,o.failure.message),await (0,a.setTimeout)(n.BOT_RUN.retryMs,void 0,{signal:t}).catch(()=>{}),t.aborted||(o=await S(e,t))),!o||t.aborted)return;let s=o.failure?.message,i=o.ending;if(s||!i||i.stopped){let t=s??"The turn was interrupted. Continue from the saved conversation.";W(e.threadId,async()=>{let o=(await (0,b.listRoomWork)(e.threadId)).find(t=>t.id===e.id);if(o?.state!=="running"||o.generation!==e.generation)return;let a=N(e.threadId);await (0,b.pauseRoom)(e.threadId,t),await a}).catch(t=>c.logger.error(`thread ${e.threadId}: pausing`,t));return}await (0,b.finishRoomWork)(e,i.text);let p=await (0,v.findThread)(e.threadId);if(p?.status==="done"){let e=(0,m.plainText)(p.outcome??"").slice(0,n.FINISHED_NOTICE.words);r.presence.watching||await (0,l.isAnyCallLive)()||(0,u.desktopNotify)(p.label,e);let t=await (0,h.filesOnDisk)((0,d.pathsIn)(p.outcome??""),null);r.appEvents.emit({type:"finished",threadId:p.id,label:p.label,bot:p.bot,words:e,paths:(0,d.leadFirst)(t)})}}async function S(e,t){let o=new U(e,t),a=null,r=null;try{let n=await (0,v.findThread)(e.threadId);if(!n)return null;(await (0,b.listParticipantTranscript)(e.threadId,e.bot)).length||await (0,b.appendRoomMessage)(e.threadId,{bot:e.bot,parent:e.id,role:"user",content:`Request: ${n.request}
|
|
99
|
+
Coordinator: ${n.bot}. Continue as ${e.bot} in this thread.`,hidden:!0}),await (0,b.consumeRoomInbox)(e);let s=await (0,b.listParticipantTranscript)(e.threadId,e.bot);await (0,y.runBot)({bot:e.bot,messages:(0,y.resumeTranscript)(s,await (0,b.listRoomReceipts)(e.threadId,e.bot,s))},{signal:t,threadId:e.threadId,parent:e.id,caller:e.caller,owner:n.bot,contextBudget:await (0,b.roomContextBudget)(e.threadId,e.bot),compactNow:()=>j.delete(L(e.threadId,e.bot)),session:(0,h.botBrowserSession)(e.threadId,e.bot),notes:()=>(0,b.consumeRoomInbox)(e),send:async o=>{t.throwIfAborted();let a=o.to.trim();if(a.toLowerCase()===T.ROOM_THURSDAY.toLowerCase())a=T.ROOM_THURSDAY;else{let e=await (0,f.findJobBot)(a);(!e||e.disabled)&&(0,p.publicError)(`No enabled bot named "${a}".`),a=e.name}let r=await (0,b.sendRoomMessage)(e,{...o,to:a});return x(e.threadId).catch(e=>c.logger.error("room message scheduling",e)),r},emit:async s=>{(!t.aborted||"tool-result"===s.type)&&(await o.on(s),"step"===s.type&&await (0,v.addThreadUsage)(e.threadId,s.usage,e.bot===n.bot?{tokens:s.usage.input,budget:s.budget}:null),"compact"===s.type&&await (0,v.addThreadUsage)(e.threadId,s.usage),"turn-end"===s.type&&(a=s),"error"===s.type&&(r={message:s.message,retry:s.retry},s.budget&&await (0,b.lowerRoomContextBudget)(e,s.budget)))}})}catch(o){t.aborted||(c.logger.error(`thread ${e.threadId}: ${e.bot} broke`,o),r={message:(0,s.modelErrorToString)(o),retry:!(0,p.isPublicError)(o)&&!(0,s.isProviderRefusal)(o)})}return{ending:a,failure:r}}class U{work;signal;lane;assistant;tool;parts;calls;results;constructor(e,t){this.work=e,this.signal=t,this.lane=(0,m.PromiseChain)(),this.assistant=null,this.tool=null,this.parts={assistant:[],tool:[]},this.calls=new Set,this.results=new Set}async write(e,t,o=!1){let a={bot:this.work.bot,parent:this.work.id,role:t.role,content:t.content,compact:o,note:o};return null===e?(0,b.appendRoomMessage)(this.work.threadId,a):(await (0,v.upsertMessage)(this.work.threadId,e,a),e)}on(e){return this.lane(async()=>{if(!this.signal.aborted||"tool-result"===e.type)if("text"===e.type)this.parts.assistant.push({type:"text",text:e.text}),this.assistant=await this.write(this.assistant,{role:"assistant",content:this.parts.assistant});else if("tool"===e.type){if(this.calls.has(e.id)){let t=this.parts.assistant.find(t=>"tool-call"===t.type&&t.toolCallId===e.id);t&&"tool-call"===t.type&&e.providerOptions&&(t.providerOptions=e.providerOptions,this.assistant=await this.write(this.assistant,{role:"assistant",content:this.parts.assistant}));return}this.calls.add(e.id),this.parts.assistant.push({type:"tool-call",toolCallId:e.id,toolName:e.name,input:e.input,...e.providerExecuted?{providerExecuted:!0}:{},...e.providerOptions?{providerOptions:e.providerOptions}:{}}),this.assistant=await this.write(this.assistant,{role:"assistant",content:this.parts.assistant})}else if("tool-result"===e.type){if(this.results.has(e.id))return;this.results.add(e.id),this.parts.tool.push({type:"tool-result",toolCallId:e.id,toolName:e.name,output:e.error?{type:"error-text",value:String(e.output)}:"string"==typeof e.output?{type:"text",value:e.output}:{type:"json",value:e.output}}),this.tool=await this.write(this.tool,{role:"tool",content:this.parts.tool})}else if("step"===e.type){let t=[this.assistant,this.tool];for(let[o,a]of e.messages.entries())await this.write(t[o]??null,a);let o=t.slice(e.messages.length).filter(e=>null!==e);o.length&&await (0,v.deleteMessages)(this.work.threadId,o),this.assistant=this.tool=null,this.parts={assistant:[],tool:[]}}else"compact"===e.type&&await this.write(null,{role:"user",content:e.text},!0)})}}async function N(e){let t=[...P.values()].filter(t=>t.threadId===e);for(let e of t)e.stop.abort();await Promise.all(t.map(e=>e.done))}async function M(e){await W(e,async()=>{let t=await (0,v.findThread)(e);t||(0,p.publicError)("No such thread."),t.endedAt&&(0,p.publicError)("That thread has already ended."),await (0,b.cancelRoom)(e),await (0,v.updateThread)(e,{status:"cancelled",outcome:null,pending:null,seen:!0,endedAt:new Date}),await N(e),await (0,h.closeJobShell)(e)})}async function C(e){return W(e,()=>E(e))}async function E(e){let t=await (0,v.findThread)(e);await (0,b.cancelRoom)(e),await N(e),await (0,h.removeJobBrowsers)(e);let o=await (0,v.deleteThread)(e);return o&&t&&await (0,h.removeJobScratch)(e,t.label),o}async function R(e){let t=e?.getTime(),o=e=>void 0===t||(e.endedAt??e.updatedAt).getTime()<t,a=0;for(let e of(await (0,v.listThreadFolders)()))("done"===e.status||"cancelled"===e.status)&&o(e)&&await W(e.id,async()=>{let t=await (0,v.findThread)(e.id);t?.status!=="done"&&t?.status!=="cancelled"||o(t)&&await E(e.id)&&(a+=1)});return a}async function A(){let e=Date.now()-n.WORKSPACE_KEEP.forMs,t=t=>("done"===t.status||"cancelled"===t.status)&&(t.endedAt??t.updatedAt).getTime()<e,o=new Set(await (0,h.listScratchFolders)()),a=[];for(let e of(await (0,v.listThreadFolders)())){let r=(0,h.jobScratch)(e.id,e.label);o.delete(r)&&t(e)&&await W(e.id,async()=>{let o=await (0,v.findThread)(e.id);o&&t(o)&&(await (0,h.closeHiddenBrowser)(e.id),await (0,h.removeJobScratch)(e.id,e.label),a.push(r))})}return a.push(...await (0,h.removeUnchangedFolders)([...o])),await (0,h.pruneJobFiles)(),a.length&&c.logger.info(`cleared ${a.length} old job folder(s): ${a.join(", ")}`),a}async function _(){for(let e of(await (0,v.listRunningThreadIds)()))await W(e,async()=>{[...P.values()].some(t=>t.threadId===e)||(await (0,v.findThread)(e))?.status==="running"&&await (0,b.pauseRoom)(e,"The server restarted. Resume from the saved conversation.")})}async function B(e){let t=await (0,v.listRunningThreadIds)();await Promise.all(t.map(t=>W(t,async()=>{(await (0,v.findThread)(t))?.status==="running"&&(await N(t),await (0,b.pauseRoom)(t,e))})))}e.s(["answerThread",0,I,"askCompact",0,function(e,t){j.add(L(e,t))},"cancelThread",0,M,"pauseThreads",0,B,"removeFinishedThreads",0,R,"removeThread",0,C,"startThread",0,k,"sweepJobFiles",0,A,"sweepThreads",0,_]),o()}catch(e){o(e)}},!1),167004,e=>{"use strict";var t=e.i(874533),o=e.i(687388);let a=`on run argv
|
|
100
|
+
display notification (item 2 of argv) with title (item 1 of argv)
|
|
101
|
+
end run`,r=`
|
|
102
|
+
$ErrorActionPreference = 'Stop'
|
|
103
|
+
[void][Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime]
|
|
104
|
+
$xml = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02)
|
|
105
|
+
$text = $xml.GetElementsByTagName('text')
|
|
106
|
+
[void]$text.Item(0).AppendChild($xml.CreateTextNode($env:NOTIFY_TITLE))
|
|
107
|
+
[void]$text.Item(1).AppendChild($xml.CreateTextNode($env:NOTIFY_BODY))
|
|
108
|
+
$id = '{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\\WindowsPowerShell\\v1.0\\powershell.exe'
|
|
109
|
+
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($id).Show([Windows.UI.Notifications.ToastNotification]::new($xml))
|
|
110
|
+
`,n={darwin:(e,t)=>["osascript",["-e",a,"--",e,t]],win32:()=>["powershell.exe",["-NoProfile","-NonInteractive","-Command",r]],linux:(e,t)=>["notify-send",["--app-name",o.APP_NAME,"--",e,t]]};e.s(["desktopNotify",0,function(e,o){let a=e.slice(0,80),r=o.slice(0,200),s=n[process.platform]?.(a,r);if(!s)return;let[i,l]=s;(0,t.execFile)(i,l,{env:{...process.env,NOTIFY_TITLE:a,NOTIFY_BODY:r},timeout:1e4,windowsHide:!0},()=>{})}])}];
|
|
111
|
+
|
|
112
|
+
//# sourceMappingURL=_0wyh244._.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[469315,e=>e.a(async(t,a)=>{try{var r=e.i(687388),i=e.i(378884),o=e.i(91264),n=t([i]);[i]=n.then?(await n)():n;let l=(0,o.serverRoute)(e=>{let t=new URL(e.url).searchParams,a=t.get("id");if(a)return(0,i.findThreadView)(a);if(!t.get("history"))return(0,i.listInboxThreads)();let o=t.get("before"),n=o?new Date(o):null;return(0,i.listThreadHistory)({before:n&&!Number.isNaN(n.getTime())?n:null,limit:r.PAGE_SIZE})});e.s(["GET",0,l]),a()}catch(e){a(e)}},!1),178614,e=>{"use strict";var t=e.i(747909),a=e.i(174017),r=e.i(996250),i=e.i(759756),o=e.i(561916),n=e.i(174677),l=e.i(869741),s=e.i(316795),u=e.i(487718),d=e.i(995169),p=e.i(47587),c=e.i(666012),h=e.i(570101),m=e.i(626937),f=e.i(10372),R=e.i(193695);e.i(52474);var y=e.i(600220);let
|
|
1
|
+
module.exports=[469315,e=>e.a(async(t,a)=>{try{var r=e.i(687388),i=e.i(378884),o=e.i(91264),n=t([i]);[i]=n.then?(await n)():n;let l=(0,o.serverRoute)(e=>{let t=new URL(e.url).searchParams,a=t.get("id");if(a)return(0,i.findThreadView)(a);if(!t.get("history"))return(0,i.listInboxThreads)();let o=t.get("before"),n=o?new Date(o):null;return(0,i.listThreadHistory)({before:n&&!Number.isNaN(n.getTime())?n:null,limit:r.PAGE_SIZE})});e.s(["GET",0,l]),a()}catch(e){a(e)}},!1),178614,e=>{"use strict";var t=e.i(747909),a=e.i(174017),r=e.i(996250),i=e.i(759756),o=e.i(561916),n=e.i(174677),l=e.i(869741),s=e.i(316795),u=e.i(487718),d=e.i(995169),p=e.i(47587),c=e.i(666012),h=e.i(570101),m=e.i(626937),f=e.i(10372),R=e.i(193695);e.i(52474);var y=e.i(600220);let g=new t.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/bot/thread/route",pathname:"/api/bot/thread",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/app/api/bot/thread/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(469315),...{}}),{workAsyncStorage:v,workUnitAsyncStorage:w,serverHooks:b}=g;async function C(e,t,r){r.requestMeta&&(0,i.setRequestMeta)(e,r.requestMeta),g.isDev&&(0,i.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let v="/api/bot/thread/route";v=v.replace(/\/index$/,"")||"/";let w=await g.prepare(e,t,{srcPage:v,multiZoneDraftMode:!1});if(!w)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:b,deploymentId:C,params:E,nextConfig:x,parsedUrl:T,isDraftMode:q,prerenderManifest:A,routerServerContext:S,isOnDemandRevalidate:N,revalidateOnlyGenerated:P,resolvedPathname:k,clientReferenceManifest:_,serverActionsManifest:H}=w,I=(0,l.normalizeAppPath)(v),O=!!(A.dynamicRoutes[I]||A.routes[k]),M=async()=>((null==S?void 0:S.render404)?await S.render404(e,t,T,!1):t.end("This page could not be found"),null);if(O&&!q){let e=!!A.routes[k],t=A.dynamicRoutes[I];if(t&&!1===t.fallback&&!e){if(x.adapterPath)return await M();throw new R.NoFallbackError}}let U=null;!O||g.isDev||q||(U="/index"===(U=k)?"/":U);let $=!0===g.isDev||!O,D=O&&!$;H&&_&&(0,n.setManifestsSingleton)({page:v,clientReferenceManifest:_,serverActionsManifest:H});let F=e.method||"GET",j=(0,o.getTracer)(),K=j.getActiveScopeSpan(),L=!!(null==S?void 0:S.isWrappedByNextServer),V=!!(0,i.getRequestMeta)(e,"minimalMode"),G=(0,i.getRequestMeta)(e,"incrementalCache")||await g.getIncrementalCache(e,x,A,V);null==G||G.resetRequestCache(),globalThis.__incrementalCache=G;let B={params:E,previewProps:A.preview,renderOpts:{experimental:{authInterrupts:!!x.experimental.authInterrupts,useCacheTimeout:x.experimental.useCacheTimeout},cacheComponents:!!x.cacheComponents,validationLevel:x.experimental.instantInsights.validationLevel,supportsDynamicResponse:$,incrementalCache:G,hmrRefreshHash:(0,i.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:x.cacheLife,staticPageGenerationTimeout:x.staticPageGenerationTimeout,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,r,i)=>g.onRequestError(e,t,r,i,S)},sharedContext:{buildId:b,deploymentId:C}},W=new s.NodeNextRequest(e),X=new s.NodeNextResponse(t),Z=u.NextRequestAdapter.fromNodeNextRequest(W,(0,u.signalFromNodeResponse)(t)),z=async({previousCacheEntry:a})=>{try{if(!V&&N&&P&&!a)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let i=await g.handle(Z,B);e.fetchMetrics=B.renderOpts.fetchMetrics;let o=B.renderOpts.pendingWaitUntil;o&&r.waitUntil&&(r.waitUntil(o),o=void 0);let n=B.renderOpts.collectedTags;if(!O)return await (0,c.sendResponse)(W,X,i,o),null;{let e=await i.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(i.headers);n&&(t[f.NEXT_CACHE_TAGS_HEADER]=n),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==B.renderOpts.collectedRevalidate&&!(B.renderOpts.collectedRevalidate>=f.INFINITE_CACHE)&&B.renderOpts.collectedRevalidate,r=void 0===B.renderOpts.collectedExpire||B.renderOpts.collectedExpire>=f.INFINITE_CACHE?!1!==a&&a>0?x.expireTime:void 0:B.renderOpts.collectedExpire;return{value:{kind:y.CachedRouteKind.APP_ROUTE,status:i.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:r}}}}catch(t){throw(null==a?void 0:a.isStale)&&await g.onRequestError(e,t,{routerKind:"App Router",routePath:v,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:N})},!1,S),t}},J=async(i,n)=>{try{var l,s;let i=await g.handleResponse({req:e,nextConfig:x,cacheKey:U,routeKind:a.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:A,isRoutePPREnabled:!1,isOnDemandRevalidate:N,revalidateOnlyGenerated:P,responseGenerator:z,waitUntil:r.waitUntil,isMinimalMode:V});if(!O)return;if((null==i||null==(l=i.value)?void 0:l.kind)!==y.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==i||null==(s=i.value)?void 0:s.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});V||t.setHeader("x-nextjs-cache",N?"REVALIDATED":i.isMiss?"MISS":i.isStale?"STALE":"HIT"),q&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let o=(0,h.fromNodeOutgoingHttpHeaders)(i.value.headers);V&&O||o.delete(f.NEXT_CACHE_TAGS_HEADER),!i.cacheControl||t.getHeader("Cache-Control")||o.get("Cache-Control")||o.set("Cache-Control",(0,m.getCacheControlHeader)(i.cacheControl)),await (0,c.sendResponse)(W,X,new Response(i.value.body,{headers:o,status:i.value.status||200}));return}catch(t){if(t instanceof R.NoFallbackError||await g.onRequestError(e,t,{routerKind:"App Router",routePath:I,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:N})},!1,S),O)throw t;await (0,c.sendResponse)(W,X,new Response(null,{status:500}));return}finally{(()=>{if(!i)return;let e=t.statusCode;i.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(i.setStatus({code:o.SpanStatusCode.ERROR}),i.setAttribute("error.type",e.toString()));let a=j.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let r=a.get("next.route")||I,l=`${F} ${r}`;i.setAttributes({"next.route":r,"http.route":r,"next.span_name":l}),i.updateName(l),n&&n!==i&&(n.setAttribute("http.route",r),n.updateName(l))})()}};if(L&&K)await J(K,void 0);else{let t=j.getActiveScopeSpan();await j.withPropagatedContext(e.headers,()=>j.trace(d.BaseServerSpan.handleRequest,{spanName:`${F} ${v}`,kind:o.SpanKind.SERVER,attributes:{"http.method":F,"http.target":e.url}},e=>J(e,t)),void 0,!L)}}e.s(["handler",0,C,"patchFetch",0,function(){return(0,r.patchFetch)({workAsyncStorage:v,workUnitAsyncStorage:w})},"routeModule",0,g,"serverHooks",0,b,"workAsyncStorage",0,v,"workUnitAsyncStorage",0,w])},175936,e=>{"use strict";let t=e=>e.split("/").map(encodeURIComponent).join("/");e.s(["decodePath",0,e=>e.join("/"),"queryKey",0,{memory:"/api/memory",memoryPage:e=>({url:"/api/memory",query:{offset:e||null}}),mcp:"/api/mcp",mcpServer:e=>({url:"/api/mcp",pathVariable:[e]}),mcpTools:"/api/mcp/tools",skills:"/api/skills",skillNode:(e,t,a)=>({url:"/api/skills",pathVariable:[e,t],query:{path:a}}),bot:"/api/bot",botMemory:"/api/bot/memory",botMemoryFiles:e=>({url:"/api/bot/memory/files",query:{bot:e}}),routines:"/api/routine",threads:"/api/bot/thread",threadHistory:e=>({url:"/api/bot/thread",query:{history:1,before:e}}),thread:e=>({url:"/api/bot/thread",query:{id:e}}),fileNotes:"/api/bot/thread/file",fileNote:(e,t)=>({url:"/api/bot/thread/file",query:{path:e,from:t}}),toolResult:(e,t)=>({url:"/api/bot/thread",pathVariable:[e],query:{call:t}}),workspace:"/api/workspace",workspaceFolder:(e,t)=>({url:"/api/workspace",query:{path:e||null,rows:t}}),workspaceFiles:e=>({url:"/api/workspace/files",query:{paths:JSON.stringify(e)}}),artifacts:"/api/artifact",artifactShelf:e=>({url:"/api/artifact",query:{rows:e}}),artifactSet:(e,t)=>({url:"/api/artifact",query:{set:e,rows:t}}),file:e=>`/api/file/${t(e)}`,fileFace:e=>`/api/file/${t(e)}?face`,favicon:e=>`/api/favicon/${encodeURIComponent(e)}`,fileView:e=>`/artifact/${t(e)}`,events:"/api/events",config:"/api/config",callHistory:e=>({url:"/api/thursday/call",query:{before:e}}),thursdaySettings:"/api/thursday/settings",toolCall:"/api/thursday/tool-call",callEnd:"/api/thursday/call/end",signIns:"/api/signins",reach:"/api/reach",textCall:"/api/thursday/text",memoryEdit:"/api/memory/edit",llmModel:"/api/llm-model",automaticModel:"/api/llm-model/automatic",modelCatalog:e=>`/api/llm-model/catalog/${e}`,keyCredits:e=>`/api/llm-model/credits/${e}`,subscriptionUsage:"/api/llm-model/subscription",running:"/api/running"}])},260338,e=>{"use strict";var t=e.i(518899),a=e.i(844988),r=e.i(156325);e.s(["count",0,function(e){return t.sql`count(${e||t.sql.raw("*")})`.mapWith(Number)},"max",0,function(e){return t.sql`max(${e})`.mapWith((0,a.is)(e,r.Column)?e:String)}])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=_1-sk_q4._.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module.exports=[811592,e=>e.a(async(t,a)=>{try{var r=e.i(666680),d=e.i(336763),n=e.i(157406),l=e.i(533102),i=e.i(232347),o=e.i(333925),s=e.i(876393),h=e.i(220376),u=e.i(51083),b=e.i(212389),c=e.i(951056),T=e.i(600690),p=t([s]);[s]=p.then?(await p)():p;let C=()=>i.appEvents.emit({type:"threads"}),H=e=>"done"===e||"cancelled"===e,L=(e,t,a)=>`message:${(0,r.createHash)("sha256").update(JSON.stringify([e,t,a])).digest("hex")}`;async function w(e,t,a){let[r]=await e.select({id:h.threadWorkTable.id}).from(h.threadWorkTable).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,t),(0,d.eq)(h.threadWorkTable.state,"external"),(0,d.eq)(h.threadWorkTable.caller,a))).limit(1);return!!r}async function f(e,t,a){let r=a.flatMap(e=>"assistant"===e.role&&Array.isArray(e.content)?e.content.flatMap(e=>"tool-call"===e.type&&e.toolName===u.TOOL_NAMES.send_message?[e.toolCallId]:[]):[]),n=r.map(a=>L(e,t,a)),l=new Map;if(!n.length)return l;let[i,o]=await Promise.all([s.database.select({key:h.threadWorkTable.id,to:h.threadWorkTable.bot}).from(h.threadWorkTable).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,e),(0,d.inArray)(h.threadWorkTable.id,n))),s.database.select({key:h.threadDeliveryTable.key,to:h.threadWorkTable.bot}).from(h.threadDeliveryTable).innerJoin(h.threadWorkTable,(0,d.eq)(h.threadWorkTable.id,h.threadDeliveryTable.workId)).where((0,d.and)((0,d.eq)(h.threadDeliveryTable.threadId,e),(0,d.inArray)(h.threadDeliveryTable.key,n)))]),b=new Map([...i,...o].map(e=>[e.key,e.to]));for(let[e,t]of r.entries()){let a=b.get(n[e]);a&&l.set(t,{messageId:n[e],to:a})}return l}async function y(e,t,a){let[r]=await e.select({seq:(0,n.max)(h.threadMessageTable.seq)}).from(h.threadMessageTable).where((0,d.eq)(h.threadMessageTable.threadId,t)),l=(r?.seq??-1)+1;return await e.insert(h.threadMessageTable).values({threadId:t,seq:l,...a}),l}let Y=(e,t)=>({bot:e.bot,parent:e.id,role:"user",content:`${t} ${T.RESUME_CHECK}`,note:!0});async function g(e,t){await m(e.threadId,Y(e,t))}async function m(e,t){let a=await s.database.transaction(a=>y(a,e,t));return C(),a}async function k(e){return s.database.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.threadId,e)).orderBy(h.threadWorkTable.createdAt,h.threadWorkTable.id)}async function q(e,t){let[a]=await s.database.select({budget:l.sql`min(nullif(${h.threadWorkTable.contextBudget}, 0))`}).from(h.threadWorkTable).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,e),(0,d.eq)(h.threadWorkTable.bot,t)));return a?.budget??void 0}async function I(e,t){await s.database.transaction(async a=>{await W(a,e),await a.update(h.threadWorkTable).set({contextBudget:t}).where((0,d.eq)(h.threadWorkTable.id,e.id))}),C()}async function W(e,t){let[a]=await e.select().from(h.threadWorkTable).where((0,d.and)((0,d.eq)(h.threadWorkTable.id,t.id),(0,d.eq)(h.threadWorkTable.generation,t.generation),(0,d.eq)(h.threadWorkTable.state,"running")));return a||(0,b.publicError)("This turn is no longer running."),a}async function A(e,t){await e.insert(h.threadDeliveryTable).values(t).onConflictDoNothing();let[a]=await e.select({bot:h.threadWorkTable.bot}).from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.id,t.workId));a&&await w(e,t.threadId,a.bot)||await e.update(h.threadWorkTable).set({state:"queued"}).where((0,d.and)((0,d.eq)(h.threadWorkTable.id,t.workId),(0,d.inArray)(h.threadWorkTable.state,["waiting","done"])))}async function R(e,t){let a={...T.RoomMessageSchema.parse(t),id:t.id};"question"===a.kind&&a.to!==T.ROOM_THURSDAY&&(0,b.publicError)("Address user questions to Thursday; use a message to contact another bot."),a.options?.length&&"question"!==a.kind&&(0,b.publicError)("Offer answer choices only with a user question.");let r=await s.database.transaction(async t=>{await W(t,e);let r=L(e.threadId,e.bot,a.id),[n]=await t.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.id,r));if(n)return{messageId:r,to:n.bot};let[l]=await t.select({to:h.threadWorkTable.bot}).from(h.threadDeliveryTable).innerJoin(h.threadWorkTable,(0,d.eq)(h.threadWorkTable.id,h.threadDeliveryTable.workId)).where((0,d.eq)(h.threadDeliveryTable.key,r));if(l)return{messageId:r,to:l.to};a.to===e.bot&&(0,b.publicError)("Continue your own work directly; choose another recipient."),a.to!==T.ROOM_THURSDAY&&a.to===e.caller&&(0,b.publicError)(`${a.to} is who you are answering. End your turn and your final text goes to ${a.to}: the answer, or the question you need settled first.`);let i=await t.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.threadId,e.threadId)),s=i.filter(t=>t.bot===a.to&&t.caller===e.bot&&a.to!==T.ROOM_THURSDAY&&!H(t.state)),u=s.find(e=>"running"===e.state)??s[0];if(u){let n=await w(t,e.threadId,a.to);return await A(t,{key:r,threadId:e.threadId,workId:u.id,speaker:e.bot,text:a.text}),await t.update(h.threadTable).set({wrapped:!1,updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e.threadId)),{messageId:r,to:a.to,note:n?`${a.to} is waiting for the user's answer and reads this after it.`:`${a.to} is already working for you and reads this before its next step. Its one answer covers both.`}}let c=new Set(i.map(e=>e.bot).filter(e=>e!==T.ROOM_THURSDAY));a.to!==T.ROOM_THURSDAY&&!c.has(a.to)&&c.size>=o.BOT_RUN.participants&&(0,b.publicError)("This thread has reached its participant limit."),i.filter(e=>!H(e.state)).length>=o.BOT_RUN.queuedMessages&&(0,b.publicError)("This thread has reached its pending message limit.");let p=a.to!==T.ROOM_THURSDAY&&await w(t,e.threadId,a.to);return await t.insert(h.threadWorkTable).values({id:r,threadId:e.threadId,bot:a.to,caller:e.bot,parentId:e.id,state:a.to===T.ROOM_THURSDAY?"question"===a.kind?"external":"done":p?"waiting":"queued",result:a.to===T.ROOM_THURSDAY?a.text:null,options:[...new Set(a.options??[])]}),a.to===T.ROOM_THURSDAY?await t.insert(h.threadRelayTable).values({key:r,threadId:e.threadId,bot:e.bot,text:a.text,kind:a.kind,messageId:"question"===a.kind?r:null}):await A(t,{key:r,threadId:e.threadId,workId:r,speaker:e.bot,text:a.text}),await t.update(h.threadTable).set({wrapped:!1,updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e.threadId)),{messageId:r,to:a.to,...p?{note:`${a.to} is waiting for the user's answer and reads this after it.`}:{}}});return C(),r}async function v(e){let t=!1,a=await s.database.transaction(async a=>{let[r]=await a.select().from(h.threadTable).where((0,d.eq)(h.threadTable.id,e));if(!r||"running"!==r.status)return null;let n=await a.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.threadId,e)).orderBy(l.sql`${h.threadWorkTable}.rowid`),i=new Set(n.filter(e=>"external"===e.state).map(e=>e.caller));for(let e of n)"queued"===e.state&&i.has(e.bot)&&(await a.update(h.threadWorkTable).set({state:"waiting"}).where((0,d.eq)(h.threadWorkTable.id,e.id)),e.state="waiting",t=!0);let s=n.filter(e=>"running"===e.state);if(s.length>=o.BOT_RUN.concurrent)return null;let u=n.find(e=>"queued"===e.state&&!s.some(t=>t.bot===e.bot));if(!u)return null;if(r.turns>=o.BOT_RUN.turns)return await a.update(h.threadWorkTable).set({state:"paused"}).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,e),(0,d.eq)(h.threadWorkTable.state,"queued"))),null;let[b]=await a.update(h.threadWorkTable).set({state:"running",generation:u.generation+1}).where((0,d.eq)(h.threadWorkTable.id,u.id)).returning();return await a.update(h.threadTable).set({turns:r.turns+1}).where((0,d.eq)(h.threadTable.id,e)),b});return(a||t)&&C(),a}async function x(e){let t=await s.database.transaction(async t=>{await W(t,e);let a=await t.select().from(h.threadDeliveryTable).where((0,d.and)((0,d.eq)(h.threadDeliveryTable.workId,e.id),(0,d.eq)(h.threadDeliveryTable.consumed,!1))).orderBy(h.threadDeliveryTable.id);for(let r of a){let a=O(r);await y(t,e.threadId,{bot:e.bot,parent:e.id,role:"user",content:a,hidden:!r.visible}),await t.update(h.threadDeliveryTable).set({consumed:!0}).where((0,d.eq)(h.threadDeliveryTable.id,r.id))}return a.map(O)});return t.length&&C(),t}function O(e){return e.visible?(0,c.tagSpeaker)(e.speaker===T.ROOM_USER?"user":"thursday",e.text):`${e.speaker}:
|
|
2
2
|
|
|
3
|
-
${e.text}`}async function D(e,t){await s.database.transaction(async a=>{await W(a,e);let r=await a.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.parentId,e.id)),n=await a.select({id:h.threadDeliveryTable.id}).from(h.threadDeliveryTable).where((0,d.and)((0,d.eq)(h.threadDeliveryTable.workId,e.id),(0,d.eq)(h.threadDeliveryTable.consumed,!1))).limit(1),l=await w(a,e.threadId,e.bot),i=n.length&&!l?"queued":n.length||r.some(e=>!H(e.state))?"waiting":"done";if(await a.update(h.threadWorkTable).set({state:i,result:t}).where((0,d.eq)(h.threadWorkTable.id,e.id)),"done"!==i)return;if(e.parentId){let[r]=await a.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.id,e.parentId)),[n]=t?[]:await a.select({id:h.threadDeliveryTable.id}).from(h.threadDeliveryTable).where((0,d.and)((0,d.eq)(h.threadDeliveryTable.workId,e.parentId),(0,d.eq)(h.threadDeliveryTable.speaker,e.bot),(0,d.eq)(h.threadDeliveryTable.consumed,!1))).limit(1);r&&"cancelled"!==r.state&&!n&&await A(a,{key:`return:${e.id}:${e.generation}`,threadId:e.threadId,workId:r.id,speaker:e.bot,text:t||"This turn ended without a message."})}let[o]=await a.select().from(h.threadTable).where((0,d.eq)(h.threadTable.id,e.threadId)),s=await a.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.threadId,e.threadId));o&&e.bot===o.bot&&!e.parentId&&s.every(e=>H(e.state))&&(await a.update(h.threadTable).set({status:t?"done":"waiting",outcome:t||"The room is idle. Send a message to continue.",pending:t?null:{options:[c.THREAD_CONTINUE]},wrapped:!0,endedAt:t?new Date:null,seen:!1,updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e.threadId)),t&&await a.insert(h.threadRelayTable).values({key:`report:${e.threadId}:${o.generation}`,threadId:e.threadId,bot:e.bot,text:t,kind:"report"}).onConflictDoNothing())}),C()}async function M(e){await s.database.transaction(async t=>{let[a]=await t.select().from(h.threadTable).where((0,d.eq)(h.threadTable.id,e));if(!a||"running"!==a.status)return;let r=await t.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.threadId,e));if(r.some(e=>"queued"===e.state||"running"===e.state))return;let n=r.find(e=>"external"===e.state);if(n)return void await t.update(h.threadTable).set({status:"waiting",outcome:n.result,pending:{options:n.options,messageId:n.id,bot:n.caller},updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e));if(r.some(e=>!H(e.state))||a.wrapped)return void await t.update(h.threadTable).set({status:"waiting",outcome:a.turns>=o.BOT_RUN.turns?"The room reached its automatic turn limit. Continue from the saved conversation.":"Work is paused. Continue from the saved conversation.",pending:{options:[c.THREAD_CONTINUE]},updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e));let l=crypto.randomUUID();await t.insert(h.threadWorkTable).values({id:l,threadId:e,bot:a.bot,caller:T.ROOM_THURSDAY,state:"queued"}),await A(t,{key:l,threadId:e,workId:l,speaker:"Thread activity",text:"The participants have finished their current turns. Bring together the results you received for Thursday, including anything still unresolved."}),await t.update(h.threadTable).set({wrapped:!0}).where((0,d.eq)(h.threadTable.id,e))}),C()}async function S(e,t){await s.database.transaction(async a=>{let r=await a.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.threadId,e));for(let n of r.filter(e=>"running"===e.state||"queued"===e.state))await a.update(h.threadWorkTable).set({state:"paused",generation:n.generation+1}).where((0,d.eq)(h.threadWorkTable.id,n.id)),await y(a,e,Y(n,t));await a.update(h.threadTable).set({status:"waiting",outcome:t,pending:{options:[c.THREAD_CONTINUE]},seen:!1,endedAt:null,updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e)),await a.insert(h.threadRelayTable).values({key:crypto.randomUUID(),threadId:e,bot:r.find(e=>!e.parentId)?.bot??"Bot",text:t,kind:"interrupted"})}),C()}async function _(e){await s.database.transaction(async t=>{await t.update(h.threadWorkTable).set({state:"queued"}).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,e),(0,d.eq)(h.threadWorkTable.state,"paused"))),await t.update(h.threadTable).set({status:"running",generation:l.sql`${h.threadTable.generation} + 1`,turns:0,pending:null,outcome:null,endedAt:null,updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e)),await t.update(h.threadRelayTable).set({accepted:!0}).where((0,d.and)((0,d.eq)(h.threadRelayTable.threadId,e),(0,d.eq)(h.threadRelayTable.kind,"interrupted")))}),C()}async function E(e,t,a){let r=e.select({workId:h.threadDeliveryTable.workId}).from(h.threadDeliveryTable).where((0,d.and)((0,d.eq)(h.threadDeliveryTable.threadId,t),(0,d.eq)(h.threadDeliveryTable.consumed,!1)));await e.update(h.threadWorkTable).set({state:"queued"}).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,t),(0,d.eq)(h.threadWorkTable.bot,a),(0,d.inArray)(h.threadWorkTable.state,["waiting","done"]),(0,d.inArray)(h.threadWorkTable.id,r)))}async function N(e,t,a,r,n,i=!0){let o=await s.database.transaction(async o=>{let[s]=await o.select().from(h.threadTable).where((0,d.eq)(h.threadTable.id,e));s||(0,b.publicError)("No such thread.");let u=await o.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.threadId,e)).orderBy(h.threadWorkTable.createdAt),c=u.filter(e=>"external"===e.state),p=n?c.find(e=>e.id===n)??(0,b.publicError)("That question is no longer waiting for an answer."):i?function(e,t){let a=t?e.filter(e=>e.caller===t):e;if(a.length<=1)return a[0];(0,b.publicError)(`Several questions are waiting for an answer: ${a.map(e=>`${e.caller} (replyTo ${e.id}): “${(e.result??"").slice(0,160)}”`).join("; ")}. Answer one of them by its replyTo.`)}(c,r):void 0,f=p?.caller??r??s.bot,y=p?u.find(e=>e.id===p.parentId):u.find(e=>e.bot===f&&"running"===e.state)??u.find(e=>e.bot===f&&!H(e.state)&&"external"!==e.state);if(p&&(await o.update(h.threadWorkTable).set({state:"done",result:t}).where((0,d.eq)(h.threadWorkTable.id,p.id)),await o.update(h.threadRelayTable).set({accepted:!0}).where((0,d.eq)(h.threadRelayTable.messageId,p.id))),!y){let t=null;if(f!==s.bot){let a=u.findLast(e=>e.bot===s.bot&&!e.parentId&&"cancelled"!==e.state);a?"done"===a.state&&await o.update(h.threadWorkTable).set({state:"waiting"}).where((0,d.eq)(h.threadWorkTable.id,a.id)):a=(await o.insert(h.threadWorkTable).values({id:crypto.randomUUID(),threadId:e,bot:s.bot,caller:T.ROOM_THURSDAY,state:"waiting"}).returning())[0],t=a.id}y=(await o.insert(h.threadWorkTable).values({id:crypto.randomUUID(),threadId:e,bot:f,caller:t?s.bot:T.ROOM_THURSDAY,parentId:t,state:"queued"}).returning())[0]}p&&await A(o,{key:`answer:${p.id}`,threadId:e,workId:y.id,speaker:"Thread activity",text:`The next message answers your question to the user: “${p.result??""}”`});let g=crypto.randomUUID();return await A(o,{key:g,threadId:e,workId:y.id,speaker:a,text:t,visible:!0}),p&&!await w(o,e,f)&&await E(o,e,f),await o.update(h.threadWorkTable).set({state:"queued"}).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,e),(0,d.eq)(h.threadWorkTable.state,"paused"))),await o.update(h.threadTable).set({status:"running",generation:l.sql`${h.threadTable.generation} + 1`,turns:0,wrapped:!1,pending:null,outcome:null,endedAt:null,seen:!1,updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e)),await o.update(h.threadRelayTable).set({accepted:!0}).where((0,d.and)((0,d.eq)(h.threadRelayTable.threadId,e),(0,d.inArray)(h.threadRelayTable.kind,["interrupted","report"]))),{key:g,to:f,answered:p?{bot:p.caller,question:p.result??""}:null}});return C(),o}async function $(e){await s.database.transaction(async t=>{await t.update(h.threadWorkTable).set({state:"cancelled",generation:l.sql`${h.threadWorkTable.generation} + 1`}).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,e),(0,d.inArray)(h.threadWorkTable.state,["queued","running","waiting","external","paused"]))),await t.update(h.threadRelayTable).set({accepted:!0}).where((0,d.eq)(h.threadRelayTable.threadId,e))}),C()}async function U(e,t){let[a]=await s.database.select({bot:h.threadTable.bot}).from(h.threadTable).where((0,d.eq)(h.threadTable.id,e)),r=await s.database.select().from(h.threadMessageTable).where((0,d.and)((0,d.eq)(h.threadMessageTable.threadId,e),(0,d.or)((0,d.eq)(h.threadMessageTable.bot,t),a?.bot===t?l.sql`${h.threadMessageTable.bot} is null AND ${h.threadMessageTable.parent} is null`:void 0))).orderBy(h.threadMessageTable.seq),n=r.findLastIndex(e=>e.compact);return(n>0?[r[0],...r.slice(n)]:r).map(e=>({role:e.role,content:e.content}))}async function B(e){e.length&&(await s.database.update(h.threadRelayTable).set({accepted:!0}).where((0,d.inArray)(h.threadRelayTable.id,e)),C())}e.s(["acceptRoomRelays",0,B,"appendRoomMessage",0,m,"cancelRoom",0,$,"claimRoomWork",0,v,"consumeRoomInbox",0,x,"finishRoomWork",0,D,"listParticipantTranscript",0,U,"listRoomReceipts",0,f,"listRoomWork",0,k,"lowerRoomContextBudget",0,I,"messageKey",0,L,"noteRoomBreak",0,g,"pauseRoom",0,S,"resumeRoom",0,_,"roomContextBudget",0,q,"sendRoomMessage",0,R,"settleRoom",0,M,"tellRoom",0,N]),a()}catch(e){a(e)}},!1),5509,e=>e.a(async(t,a)=>{try{var r=e.i(336763),d=e.i(396918),n=e.i(533102),l=e.i(232347),i=e.i(139886),o=e.i(333925),s=e.i(876393),h=e.i(220376),u=e.i(51083),b=e.i(64774),c=e.i(951056),T=e.i(811592),p=e.i(600690),w=t([s,T]);[s,T]=w.then?(await w)():w;let j=()=>l.appEvents.emit({type:"threads"}),J={id:h.threadTable.id,bot:h.threadTable.bot,label:h.threadTable.label,request:h.threadTable.request,status:h.threadTable.status,outcome:h.threadTable.outcome,pending:h.threadTable.pending,seen:h.threadTable.seen,routineId:h.threadTable.routineId,inputTokens:h.threadTable.inputTokens,outputTokens:h.threadTable.outputTokens,contextTokens:h.threadTable.contextTokens,contextBudget:h.threadTable.contextBudget,createdAt:h.threadTable.createdAt,updatedAt:h.threadTable.updatedAt};async function f(e){let{opening:t,...a}=e,r=await s.database.transaction(async e=>{let[r]=await e.insert(h.threadTable).values({id:crypto.randomUUID(),status:"running",...a}).returning();return await e.insert(h.threadMessageTable).values({threadId:r.id,seq:0,bot:null,parent:null,role:"user",content:t,compact:!1,note:!1}),await e.insert(h.threadWorkTable).values({id:crypto.randomUUID(),threadId:r.id,bot:r.bot,caller:p.ROOM_THURSDAY,state:"queued"}),r});return j(),r}async function y(e,t){await s.database.update(h.threadTable).set({...t,updatedAt:new Date}).where((0,r.eq)(h.threadTable.id,e)),j()}async function g(e){0!==e.length&&(await s.database.transaction(async t=>{await t.update(h.threadTable).set({seen:!0}).where((0,r.inArray)(h.threadTable.id,e)),await t.update(h.threadRelayTable).set({accepted:!0}).where((0,r.inArray)(h.threadRelayTable.threadId,e))}),j())}async function m(){let e=s.database.select({id:h.threadTable.id}).from(h.threadTable).where((0,r.inArray)(h.threadTable.status,["done","cancelled"])),t=await s.database.update(h.threadWorkTable).set({state:"cancelled"}).where((0,r.and)((0,r.notInArray)(h.threadWorkTable.state,["done","cancelled"]),(0,r.inArray)(h.threadWorkTable.threadId,e))).returning({id:h.threadWorkTable.id}),a=await s.database.update(h.threadTable).set({pending:null}).where((0,r.and)((0,r.inArray)(h.threadTable.status,["done","cancelled"]),(0,r.isNotNull)(h.threadTable.pending))).returning({id:h.threadTable.id});return(t.length||a.length)&&j(),{closed:t.length,cleared:a.length}}async function k(e,t,a=null){(t.input||t.output||null!==a)&&(await s.database.update(h.threadTable).set({inputTokens:n.sql`${h.threadTable.inputTokens} + ${t.input}`,outputTokens:n.sql`${h.threadTable.outputTokens} + ${t.output}`,...null===a?{}:{contextTokens:a.tokens,contextBudget:a.budget}}).where((0,r.eq)(h.threadTable.id,e)),j())}async function q(e){let[t]=await s.database.select(J).from(h.threadTable).where((0,r.eq)(h.threadTable.id,e));if(!t)return null;let[a]=await U([t]);return a??null}async function I(e){let[t]=await s.database.select().from(h.threadTable).where((0,r.eq)(h.threadTable.id,e));return t??null}async function W(){let[e,t,a,n]=await Promise.all([s.database.select(J).from(h.threadTable).where((0,r.inArray)(h.threadTable.status,["running","waiting"])).orderBy((0,d.desc)(h.threadTable.updatedAt)),s.database.select(J).from(h.threadTable).where((0,r.inArray)(h.threadTable.status,["done","cancelled"])).orderBy((0,d.desc)(h.threadTable.updatedAt)).limit(o.INBOX_FINISHED),s.database.select(J).from(h.threadTable).where((0,r.and)((0,r.inArray)(h.threadTable.status,["done","cancelled"]),(0,r.eq)(h.threadTable.seen,!1))),s.database.select(J).from(h.threadTable).where((0,r.inArray)(h.threadTable.id,s.database.select({id:h.threadRelayTable.threadId}).from(h.threadRelayTable).where((0,r.eq)(h.threadRelayTable.accepted,!1))))]),l=[...new Map([...e,...t,...a,...n].map(e=>[e.id,e])).values()].sort((e,t)=>t.updatedAt.getTime()-e.updatedAt.getTime());return U(l,e=>{let t;return t=e.status,"running"===t||"waiting"===t})}async function A(){let e=await s.database.select(J).from(h.threadTable).orderBy(n.sql`case when ${h.threadTable.status} in ('running', 'waiting') then 0 else 1 end`,(0,d.desc)(h.threadTable.updatedAt),(0,d.desc)(h.threadTable.id)).limit(o.THREAD_STATUS_LIMIT);return U(e)}async function R(e){return e.length?await s.database.select({id:h.threadTable.id,callId:h.threadTable.callId,label:h.threadTable.label,status:h.threadTable.status,outcome:h.threadTable.outcome}).from(h.threadTable).where((0,r.inArray)(h.threadTable.callId,e)).orderBy(h.threadTable.createdAt):[]}async function v(e,t){let a=(a,n)=>s.database.select({id:h.threadTable.id,owner:h.threadTable.bot,label:h.threadTable.label,status:h.threadTable.status,pending:h.threadTable.pending,updatedAt:h.threadTable.updatedAt}).from(h.threadTable).where((0,r.and)((0,r.inArray)(h.threadTable.status,a),t?(0,r.ne)(h.threadTable.id,t):void 0,(0,r.inArray)(h.threadTable.id,s.database.select({id:h.threadWorkTable.threadId}).from(h.threadWorkTable).where((0,r.eq)(h.threadWorkTable.bot,e))))).orderBy((0,d.desc)(h.threadTable.updatedAt)).limit(n),[n,l]=await Promise.all([a(["running","waiting"],o.BOT_WORK.open),a(["done","cancelled"],o.BOT_WORK.recent)]),i=[...n,...l].map(e=>e.id);if(!i.length)return{open:[],recent:[]};let u=await s.database.select({id:h.threadWorkTable.id,threadId:h.threadWorkTable.threadId,result:h.threadWorkTable.result}).from(h.threadWorkTable).where((0,r.and)((0,r.eq)(h.threadWorkTable.bot,e),(0,r.inArray)(h.threadWorkTable.threadId,i),(0,r.isNotNull)(h.threadWorkTable.result))).orderBy((0,d.desc)(h.threadWorkTable.createdAt)),b=new Map;for(let{id:e,threadId:t,result:a}of u)a?.trim()&&!b.has(t)&&b.set(t,{workId:e,words:a});let c=({pending:e,...t})=>{let a=b.get(t.id);return{...t,workId:a?.workId??null,asking:"waiting"===t.status&&!!e?.messageId,said:a?.words??null,cut:!!a&&a.words.replace(/\s+/g," ").trim().length>o.BOT_WORK.said}};return{open:n.map(c),recent:l.map(c)}}async function x(e,t){if(t.owner===e){let[e]=await s.database.select({request:h.threadTable.request}).from(h.threadTable).where((0,r.eq)(h.threadTable.id,t.id));return e?.request??""}return t.workId?(await s.database.select({text:h.threadDeliveryTable.text}).from(h.threadDeliveryTable).where((0,r.eq)(h.threadDeliveryTable.workId,t.workId)).orderBy(h.threadDeliveryTable.id)).map(e=>e.text).join("\n\n"):""}async function O(e){let t=await s.database.delete(h.threadTable).where((0,r.eq)(h.threadTable.id,e)).returning({id:h.threadTable.id});return t.length&&j(),t.length>0}async function D(){return(await s.database.select({id:h.threadTable.id}).from(h.threadTable).where((0,r.eq)(h.threadTable.status,"running"))).map(e=>e.id)}async function M(){return await s.database.select({id:h.threadTable.id,label:h.threadTable.label,status:h.threadTable.status,endedAt:h.threadTable.endedAt,updatedAt:h.threadTable.updatedAt}).from(h.threadTable)}function S(e){let t=new Set;for(let a of e)if(Array.isArray(a))for(let e of a){if("tool-call"!==e.type||e.toolName!==u.TOOL_NAMES.write_file)continue;let a=e.input?.path;"string"==typeof a&&a.trim()&&(t.delete(a.trim()),t.add(a.trim()))}return[...t]}async function _(e){let t=await s.database.select({content:h.threadMessageTable.content}).from(h.threadMessageTable).where((0,r.and)((0,r.eq)(h.threadMessageTable.threadId,e),(0,r.eq)(h.threadMessageTable.role,"assistant"))).orderBy(h.threadMessageTable.seq);return S(t.map(e=>e.content))}async function E(e){let t=e.trim();if(!t)return null;let a=await I(t);if(a)return a;let r=t.toLowerCase();return(await s.database.select().from(h.threadTable).orderBy((0,d.desc)(h.threadTable.updatedAt)).limit(o.THREAD_LABEL_REACH)).find(e=>e.label.toLowerCase()===r)??null}async function N(e,t,a){await s.database.insert(h.threadMessageTable).values({threadId:e,seq:t,...a,compact:a.compact??!1,note:a.note??!1}).onConflictDoUpdate({target:[h.threadMessageTable.threadId,h.threadMessageTable.seq],set:{role:a.role,content:a.content,compact:a.compact??!1,note:a.note??!1}}),j()}async function $(e,t){t.length&&(await s.database.delete(h.threadMessageTable).where((0,r.and)((0,r.eq)(h.threadMessageTable.threadId,e),(0,r.inArray)(h.threadMessageTable.seq,t))),j())}async function U(e,t=()=>!0){if(0===e.length)return[];let a=e.filter(t).map(e=>e.id),d=a.length?await s.database.select().from(h.threadMessageTable).where((0,r.inArray)(h.threadMessageTable.threadId,a)).orderBy(h.threadMessageTable.seq):[],n=e.map(e=>e.id),[l,i,o]=await Promise.all([s.database.select().from(h.threadWorkTable).where((0,r.inArray)(h.threadWorkTable.threadId,n)),s.database.select().from(h.threadDeliveryTable).where((0,r.and)((0,r.inArray)(h.threadDeliveryTable.threadId,n),(0,r.eq)(h.threadDeliveryTable.visible,!0))),s.database.select().from(h.threadRelayTable).where((0,r.and)((0,r.inArray)(h.threadRelayTable.threadId,n),(0,r.eq)(h.threadRelayTable.accepted,!1)))]),w=new Map(e.map(e=>[e.id,e.bot])),f=new Map(l.map(e=>[e.id,e.caller])),y=new Map;for(let e of d){let t=y.get(e.threadId)??[];t.push(...function(e,t){if(e.hidden)return[];let a={seq:e.seq,bot:e.bot,parent:e.parent,to:"user"===e.role?e.bot:t,at:e.createdAt},r=t=>`${e.id}-${t}`,d=e.content;if("user"===e.role){if(0===e.seq)return[];let t="string"==typeof d?d:d.flatMap(e=>"text"===e.type&&e.text?[e.text]:[]).join("\n").trim();if(!t)return[];if(e.compact)return[{...a,id:r(0),kind:"note",text:t}];if(e.note){let e=t.endsWith(p.RESUME_CHECK)?t.slice(0,-p.RESUME_CHECK.length).trimEnd():t;return[{...a,id:r(0),kind:"stop",text:e}]}return[{...a,id:r(0),kind:"user",text:(0,c.untagSpeaker)(t)}]}if("assistant"===e.role){let t=e.content;if("string"==typeof t)return t.trim()?[{...a,id:r(0),kind:"text",text:t.trim()}]:[];let d=[];return t.forEach((t,n)=>{if("text"===t.type){let e=t.text.trim();e&&d.push({...a,id:r(n),kind:"text",text:e});return}if("tool-result"===t.type)return void d.push(L(a,r(n),t));if("tool-call"!==t.type)return;let l=t.input??{};if(t.toolName===u.TOOL_NAMES.send_message){let i;d.push({...a,id:r(n),kind:"ask",callId:t.toolCallId,to:(i=String(l.to??"").trim()).toLowerCase()===p.ROOM_THURSDAY.toLowerCase()?p.ROOM_THURSDAY:i,text:String(l.text??""),question:"question"===l.kind,..."question"===l.kind&&e.bot?{questionId:(0,T.messageKey)(e.threadId,e.bot,t.toolCallId)}:{}})}else t.toolName===u.TOOL_NAMES.bash?d.push({...a,id:r(n),kind:"tool",callId:t.toolCallId,name:t.toolName,input:(0,b.clip)(String(l.command??""),120),note:B(l)}):d.push({...a,id:r(n),kind:"tool",callId:t.toolCallId,name:t.toolName,input:C(t.toolName,l),note:B(l),path:t.toolName===u.TOOL_NAMES.write_file?P(l,"path")??null:null})}),d}if("tool"===e.role){let t=[];return e.content.forEach((e,d)=>{"tool-result"!==e.type||(e.toolName!==u.TOOL_NAMES.send_message||"error-text"===e.output.type)&&t.push(L(a,r(d),e))}),t}return[]}(e,(e.parent?f.get(e.parent):null)??w.get(e.threadId)??"")),y.set(e.threadId,t)}return e.map(e=>{let t=l.filter(t=>t.threadId===e.id),a=["running","queued","paused","waiting","done","cancelled"],r=[...new Set(t.map(e=>e.bot))].filter(e=>e!==p.ROOM_THURSDAY).map(e=>({bot:e,state:t.filter(t=>t.bot===e).sort((e,t)=>a.indexOf(e.state)-a.indexOf(t.state))[0].state}));return{...function(e,t){let{pending:a,inputTokens:r,outputTokens:d,...n}=e;return{...n,ask:"waiting"===e.status?{question:e.outcome??"",options:a?.options??[],messageId:a?.messageId,bot:a?.bot}:null,tokens:{input:r,output:d},lines:t}}(e,y.get(e.id)??[]),room:{participants:r,questions:t.filter(e=>"external"===e.state).map(e=>({id:e.id,bot:e.caller,text:e.result??"",options:e.options})),deliveries:i.filter(t=>t.threadId===e.id).map(a=>({id:a.key,bot:t.find(e=>e.id===a.workId)?.bot??e.bot,text:a.text,delivered:a.consumed})),relays:o.filter(t=>t.threadId===e.id)}}})}let K=["query","command","prompt","url","path","pattern","request","question","title","name","thread","text"],P=(e,t)=>{let a=e[t];return"string"==typeof a&&a.trim()?a:null};function B(e){let t=P(e,"description");return t?(0,b.clip)(t,120):null}function C(e,t){let a=t??{};if("object"!=typeof a||Array.isArray(a))return(0,b.clip)(String(t??""),120);if(e===u.TOOL_NAMES.bash)return B(a)??(0,b.clip)(String(a.command??""),120);if(e===u.TOOL_NAMES.tool_call||e===u.TOOL_NAMES.tool_search){let e=Array.isArray(a.tools)?a.tools.map(String).join(", "):String(a.tool??""),t=a.args??null,r=t&&"object"==typeof t?String(a.server??"")===o.STUDIO_SERVER?H(t):JSON.stringify(t):"";return(0,b.clip)([String(a.server??""),e,r].filter(Boolean).join(" "),120)}let r=H(a);return r?(0,b.clip)(r,120):Object.keys(a).length?(0,b.clip)(JSON.stringify(a),120):""}function H(e){for(let t of K){let a=P(e,t);if(a)return a}for(let t of Object.keys(e)){let a=P(e,t);if(a)return a}return""}let F=/https?:\/\/\S+(?: · \d{4}-\d{2}-\d{2})?\s*$/,V=" — ";function L(e,t,a){let r=a.toolName===u.TOOL_NAMES.web_search,d=function e(t,a,r=!1){var d;if(null==t)return[];if("string"==typeof t)return Y(t,a,r);if("object"!=typeof t)return Y(String(t),a,r);switch(t.type){case"text":case"error-text":return Y(String(t.value??""),a,r);case"json":case"error-json":return e(t.value,a,r);case"execution-denied":return Y("Denied.",a,r);case"content":{if(!Array.isArray(t.value))return[];let e=[];for(let d of t.value){if("text"===d.type&&"string"==typeof d.text){e.push(...Y(d.text,a,r));continue}let t=function(e){let t=String(e.mediaType??"");if(!t.startsWith("image/"))return null;let a=e.data;return"string"==typeof a?`data:${t};base64,${a}`:a?.type==="url"&&a.url?a.url:a?.type==="data"&&"string"==typeof a.data?`data:${t};base64,${a.data}`:null}(d);t&&e.push({type:"image",src:t})}return e}}return"string"==typeof t.path&&String(t.mediaType??"").startsWith("image/")?[{type:"text",text:t.path},{type:"image",src:i.queryKey.file(t.path)}]:Array.isArray(t.sources)?t.sources.map(e=>String(e?.title??"")).filter(Boolean).slice(0,a).map(e=>({type:"text",text:e})):"string"==typeof t.stdout?Y(t.stdout||String(t.stderr??""),a,r):"string"==typeof t.answer?Y(t.answer,a,r):Y(r?(d=t,Array.isArray(d)?JSON.stringify(d,null,2):Object.entries(d).map(([e,t])=>"string"==typeof t&&t.includes("\n")?`${e}:
|
|
4
|
-
${t}`:`${e}: ${JSON.stringify(t,null,2)}`).join("\n")):JSON.stringify(t),a,r)}(a.output,r?o.FULL_RESULT_LINES:5),n=d.flatMap(e=>"text"===e.type?[e.text]:[]),l=r?n.filter(e=>F.test(e)):[],s=(l.length?l:n).slice(0,4);return{...e,id:t,kind:"tool-result",callId:a.toolCallId,name:a.toolName,results:s.map(e=>({type:"text",text:l.length?function(e){let t=e.replace(/\s+/g," ").trim(),a=F.exec(t);if(!a||t.length<=200)return(0,b.clip)(t,200);let r=a[0].trim(),d=t.slice(0,a.index).replace(/[\s—-]+$/,""),n=200-r.length-V.length;return d&&n>1?`${(0,b.clip)(d,n)}${V}${r}`:r}(e):(0,b.clip)(e,200)})),more:n.length>s.length||d.length>n.length||s.some(e=>e.length>200)}}function Y(e,t,a=!1){if(a){let a=e.split("\n"),r=a.slice(0,t);a.length>t&&r.push(`… ${a.length-t} more lines`);let d=r.join("\n").trimEnd();return d?[{type:"text",text:d}]:[]}return e.split("\n").map(e=>e.trim()).filter(Boolean).slice(0,t).map(e=>({type:"text",text:e}))}e.s(["addThreadUsage",0,k,"argumentLine",0,C,"closeEndedQuestions",0,m,"deleteMessages",0
|
|
3
|
+
${e.text}`}async function D(e,t){await s.database.transaction(async a=>{await W(a,e);let r=await a.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.parentId,e.id)),n=await a.select({id:h.threadDeliveryTable.id}).from(h.threadDeliveryTable).where((0,d.and)((0,d.eq)(h.threadDeliveryTable.workId,e.id),(0,d.eq)(h.threadDeliveryTable.consumed,!1))).limit(1),l=await w(a,e.threadId,e.bot),i=n.length&&!l?"queued":n.length||r.some(e=>!H(e.state))?"waiting":"done";if(await a.update(h.threadWorkTable).set({state:i,result:t}).where((0,d.eq)(h.threadWorkTable.id,e.id)),"done"!==i)return;if(e.parentId){let[r]=await a.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.id,e.parentId)),[n]=t?[]:await a.select({id:h.threadDeliveryTable.id}).from(h.threadDeliveryTable).where((0,d.and)((0,d.eq)(h.threadDeliveryTable.workId,e.parentId),(0,d.eq)(h.threadDeliveryTable.speaker,e.bot),(0,d.eq)(h.threadDeliveryTable.consumed,!1))).limit(1);r&&"cancelled"!==r.state&&!n&&await A(a,{key:`return:${e.id}:${e.generation}`,threadId:e.threadId,workId:r.id,speaker:e.bot,text:t||"This turn ended without a message."})}let[o]=await a.select().from(h.threadTable).where((0,d.eq)(h.threadTable.id,e.threadId)),s=await a.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.threadId,e.threadId));o&&e.bot===o.bot&&!e.parentId&&s.every(e=>H(e.state))&&(await a.update(h.threadTable).set({status:t?"done":"waiting",outcome:t||"The room is idle. Send a message to continue.",pending:t?null:{options:[c.THREAD_CONTINUE]},wrapped:!0,endedAt:t?new Date:null,seen:!1,updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e.threadId)),t&&await a.insert(h.threadRelayTable).values({key:`report:${e.threadId}:${o.generation}`,threadId:e.threadId,bot:e.bot,text:t,kind:"report"}).onConflictDoNothing())}),C()}async function M(e){await s.database.transaction(async t=>{let[a]=await t.select().from(h.threadTable).where((0,d.eq)(h.threadTable.id,e));if(!a||"running"!==a.status)return;let r=await t.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.threadId,e));if(r.some(e=>"queued"===e.state||"running"===e.state))return;let n=r.find(e=>"external"===e.state);if(n)return void await t.update(h.threadTable).set({status:"waiting",outcome:n.result,pending:{options:n.options,messageId:n.id,bot:n.caller},updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e));if(r.some(e=>!H(e.state))||a.wrapped)return void await t.update(h.threadTable).set({status:"waiting",outcome:a.turns>=o.BOT_RUN.turns?"The room reached its automatic turn limit. Continue from the saved conversation.":"Work is paused. Continue from the saved conversation.",pending:{options:[c.THREAD_CONTINUE]},updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e));let l=crypto.randomUUID();await t.insert(h.threadWorkTable).values({id:l,threadId:e,bot:a.bot,caller:T.ROOM_THURSDAY,state:"queued"}),await A(t,{key:l,threadId:e,workId:l,speaker:"Thread activity",text:"The participants have finished their current turns. Bring together the results you received for Thursday, including anything still unresolved."}),await t.update(h.threadTable).set({wrapped:!0}).where((0,d.eq)(h.threadTable.id,e))}),C()}async function S(e,t){await s.database.transaction(async a=>{let r=await a.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.threadId,e));for(let n of r.filter(e=>"running"===e.state||"queued"===e.state))await a.update(h.threadWorkTable).set({state:"paused",generation:n.generation+1}).where((0,d.eq)(h.threadWorkTable.id,n.id)),await y(a,e,Y(n,t));await a.update(h.threadTable).set({status:"waiting",outcome:t,pending:{options:[c.THREAD_CONTINUE]},seen:!1,endedAt:null,updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e)),await a.insert(h.threadRelayTable).values({key:crypto.randomUUID(),threadId:e,bot:r.find(e=>!e.parentId)?.bot??"Bot",text:t,kind:"interrupted"})}),C()}async function _(e){await s.database.transaction(async t=>{await t.update(h.threadWorkTable).set({state:"queued"}).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,e),(0,d.eq)(h.threadWorkTable.state,"paused"))),await t.update(h.threadTable).set({status:"running",generation:l.sql`${h.threadTable.generation} + 1`,turns:0,pending:null,outcome:null,endedAt:null,updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e)),await t.update(h.threadRelayTable).set({accepted:!0}).where((0,d.and)((0,d.eq)(h.threadRelayTable.threadId,e),(0,d.eq)(h.threadRelayTable.kind,"interrupted")))}),C()}async function E(e,t,a){let r=e.select({workId:h.threadDeliveryTable.workId}).from(h.threadDeliveryTable).where((0,d.and)((0,d.eq)(h.threadDeliveryTable.threadId,t),(0,d.eq)(h.threadDeliveryTable.consumed,!1)));await e.update(h.threadWorkTable).set({state:"queued"}).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,t),(0,d.eq)(h.threadWorkTable.bot,a),(0,d.inArray)(h.threadWorkTable.state,["waiting","done"]),(0,d.inArray)(h.threadWorkTable.id,r)))}async function $(e,t,a,r,n,i=!0){let o=await s.database.transaction(async o=>{let[s]=await o.select().from(h.threadTable).where((0,d.eq)(h.threadTable.id,e));s||(0,b.publicError)("No such thread.");let u=await o.select().from(h.threadWorkTable).where((0,d.eq)(h.threadWorkTable.threadId,e)).orderBy(h.threadWorkTable.createdAt),c=u.filter(e=>"external"===e.state),p=n?c.find(e=>e.id===n)??(0,b.publicError)("That question is no longer waiting for an answer."):i?function(e,t){let a=t?e.filter(e=>e.caller===t):e;if(a.length<=1)return a[0];(0,b.publicError)(`Several questions are waiting for an answer: ${a.map(e=>`${e.caller} (replyTo ${e.id}): “${(e.result??"").slice(0,160)}”`).join("; ")}. Answer one of them by its replyTo.`)}(c,r):void 0,f=p?.caller??r??s.bot,y=p?u.find(e=>e.id===p.parentId):u.find(e=>e.bot===f&&"running"===e.state)??u.find(e=>e.bot===f&&!H(e.state)&&"external"!==e.state);if(p&&(await o.update(h.threadWorkTable).set({state:"done",result:t}).where((0,d.eq)(h.threadWorkTable.id,p.id)),await o.update(h.threadRelayTable).set({accepted:!0}).where((0,d.eq)(h.threadRelayTable.messageId,p.id))),!y){let t=null;if(f!==s.bot){let a=u.findLast(e=>e.bot===s.bot&&!e.parentId&&"cancelled"!==e.state);a?"done"===a.state&&await o.update(h.threadWorkTable).set({state:"waiting"}).where((0,d.eq)(h.threadWorkTable.id,a.id)):a=(await o.insert(h.threadWorkTable).values({id:crypto.randomUUID(),threadId:e,bot:s.bot,caller:T.ROOM_THURSDAY,state:"waiting"}).returning())[0],t=a.id}y=(await o.insert(h.threadWorkTable).values({id:crypto.randomUUID(),threadId:e,bot:f,caller:t?s.bot:T.ROOM_THURSDAY,parentId:t,state:"queued"}).returning())[0]}p&&await A(o,{key:`answer:${p.id}`,threadId:e,workId:y.id,speaker:"Thread activity",text:`The next message answers your question to the user: “${p.result??""}”`});let g=crypto.randomUUID();return await A(o,{key:g,threadId:e,workId:y.id,speaker:a,text:t,visible:!0}),p&&!await w(o,e,f)&&await E(o,e,f),await o.update(h.threadWorkTable).set({state:"queued"}).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,e),(0,d.eq)(h.threadWorkTable.state,"paused"))),await o.update(h.threadTable).set({status:"running",generation:l.sql`${h.threadTable.generation} + 1`,turns:0,wrapped:!1,pending:null,outcome:null,endedAt:null,seen:!1,updatedAt:new Date}).where((0,d.eq)(h.threadTable.id,e)),await o.update(h.threadRelayTable).set({accepted:!0}).where((0,d.and)((0,d.eq)(h.threadRelayTable.threadId,e),(0,d.inArray)(h.threadRelayTable.kind,["interrupted","report"]))),{key:g,to:f,answered:p?{bot:p.caller,question:p.result??""}:null}});return C(),o}async function N(e){await s.database.transaction(async t=>{await t.update(h.threadWorkTable).set({state:"cancelled",generation:l.sql`${h.threadWorkTable.generation} + 1`}).where((0,d.and)((0,d.eq)(h.threadWorkTable.threadId,e),(0,d.inArray)(h.threadWorkTable.state,["queued","running","waiting","external","paused"]))),await t.update(h.threadRelayTable).set({accepted:!0}).where((0,d.eq)(h.threadRelayTable.threadId,e))}),C()}async function U(e,t){let[a]=await s.database.select({bot:h.threadTable.bot}).from(h.threadTable).where((0,d.eq)(h.threadTable.id,e)),r=await s.database.select().from(h.threadMessageTable).where((0,d.and)((0,d.eq)(h.threadMessageTable.threadId,e),(0,d.or)((0,d.eq)(h.threadMessageTable.bot,t),a?.bot===t?l.sql`${h.threadMessageTable.bot} is null AND ${h.threadMessageTable.parent} is null`:void 0))).orderBy(h.threadMessageTable.seq),n=r.findLastIndex(e=>e.compact);return(n>0?[r[0],...r.slice(n)]:r).map(e=>({role:e.role,content:e.content}))}async function B(e){e.length&&(await s.database.update(h.threadRelayTable).set({accepted:!0}).where((0,d.inArray)(h.threadRelayTable.id,e)),C())}e.s(["acceptRoomRelays",0,B,"appendRoomMessage",0,m,"cancelRoom",0,N,"claimRoomWork",0,v,"consumeRoomInbox",0,x,"finishRoomWork",0,D,"listParticipantTranscript",0,U,"listRoomReceipts",0,f,"listRoomWork",0,k,"lowerRoomContextBudget",0,I,"messageKey",0,L,"noteRoomBreak",0,g,"pauseRoom",0,S,"resumeRoom",0,_,"roomContextBudget",0,q,"sendRoomMessage",0,R,"settleRoom",0,M,"tellRoom",0,$]),a()}catch(e){a(e)}},!1),5509,e=>e.a(async(t,a)=>{try{var r=e.i(336763),d=e.i(396918),n=e.i(533102),l=e.i(232347),i=e.i(139886),o=e.i(333925),s=e.i(876393),h=e.i(220376),u=e.i(51083),b=e.i(64774),c=e.i(951056),T=e.i(811592),p=e.i(600690),w=t([s,T]);[s,T]=w.then?(await w)():w;let j=()=>l.appEvents.emit({type:"threads"}),J={id:h.threadTable.id,bot:h.threadTable.bot,label:h.threadTable.label,request:h.threadTable.request,status:h.threadTable.status,outcome:h.threadTable.outcome,pending:h.threadTable.pending,seen:h.threadTable.seen,routineId:h.threadTable.routineId,inputTokens:h.threadTable.inputTokens,outputTokens:h.threadTable.outputTokens,contextTokens:h.threadTable.contextTokens,contextBudget:h.threadTable.contextBudget,createdAt:h.threadTable.createdAt,updatedAt:h.threadTable.updatedAt};async function f(e){let{opening:t,...a}=e,r=await s.database.transaction(async e=>{let[r]=await e.insert(h.threadTable).values({id:crypto.randomUUID(),status:"running",...a}).returning();return await e.insert(h.threadMessageTable).values({threadId:r.id,seq:0,bot:null,parent:null,role:"user",content:t,compact:!1,note:!1}),await e.insert(h.threadWorkTable).values({id:crypto.randomUUID(),threadId:r.id,bot:r.bot,caller:p.ROOM_THURSDAY,state:"queued"}),r});return j(),r}async function y(e,t){await s.database.update(h.threadTable).set({...t,updatedAt:new Date}).where((0,r.eq)(h.threadTable.id,e)),j()}async function g(e){0!==e.length&&(await s.database.transaction(async t=>{await t.update(h.threadTable).set({seen:!0}).where((0,r.inArray)(h.threadTable.id,e)),await t.update(h.threadRelayTable).set({accepted:!0}).where((0,r.inArray)(h.threadRelayTable.threadId,e))}),j())}async function m(){let e=s.database.select({id:h.threadTable.id}).from(h.threadTable).where((0,r.inArray)(h.threadTable.status,["done","cancelled"])),t=await s.database.update(h.threadWorkTable).set({state:"cancelled"}).where((0,r.and)((0,r.notInArray)(h.threadWorkTable.state,["done","cancelled"]),(0,r.inArray)(h.threadWorkTable.threadId,e))).returning({id:h.threadWorkTable.id}),a=await s.database.update(h.threadTable).set({pending:null}).where((0,r.and)((0,r.inArray)(h.threadTable.status,["done","cancelled"]),(0,r.isNotNull)(h.threadTable.pending))).returning({id:h.threadTable.id});return(t.length||a.length)&&j(),{closed:t.length,cleared:a.length}}async function k(e,t,a=null){(t.input||t.output||null!==a)&&(await s.database.update(h.threadTable).set({inputTokens:n.sql`${h.threadTable.inputTokens} + ${t.input}`,outputTokens:n.sql`${h.threadTable.outputTokens} + ${t.output}`,cacheReadTokens:n.sql`${h.threadTable.cacheReadTokens} + ${t.cacheRead}`,cacheWriteTokens:n.sql`${h.threadTable.cacheWriteTokens} + ${t.cacheWrite}`,...null===a?{}:{contextTokens:a.tokens,contextBudget:a.budget}}).where((0,r.eq)(h.threadTable.id,e)),j())}async function q(e){let[t]=await s.database.select(J).from(h.threadTable).where((0,r.eq)(h.threadTable.id,e));if(!t)return null;let[a]=await U([t]);return a??null}async function I(e){let[t]=await s.database.select().from(h.threadTable).where((0,r.eq)(h.threadTable.id,e));return t??null}async function W(){let[e,t,a,n]=await Promise.all([s.database.select(J).from(h.threadTable).where((0,r.inArray)(h.threadTable.status,["running","waiting"])).orderBy((0,d.desc)(h.threadTable.updatedAt)),s.database.select(J).from(h.threadTable).where((0,r.inArray)(h.threadTable.status,["done","cancelled"])).orderBy((0,d.desc)(h.threadTable.updatedAt)).limit(o.INBOX_FINISHED),s.database.select(J).from(h.threadTable).where((0,r.and)((0,r.inArray)(h.threadTable.status,["done","cancelled"]),(0,r.eq)(h.threadTable.seen,!1))),s.database.select(J).from(h.threadTable).where((0,r.inArray)(h.threadTable.id,s.database.select({id:h.threadRelayTable.threadId}).from(h.threadRelayTable).where((0,r.eq)(h.threadRelayTable.accepted,!1))))]),l=[...new Map([...e,...t,...a,...n].map(e=>[e.id,e])).values()].sort((e,t)=>t.updatedAt.getTime()-e.updatedAt.getTime());return U(l,e=>{let t;return t=e.status,"running"===t||"waiting"===t})}async function A(){let e=await s.database.select(J).from(h.threadTable).orderBy(n.sql`case when ${h.threadTable.status} in ('running', 'waiting') then 0 else 1 end`,(0,d.desc)(h.threadTable.updatedAt),(0,d.desc)(h.threadTable.id)).limit(o.THREAD_STATUS_LIMIT);return U(e)}async function R(e){return e.length?await s.database.select({id:h.threadTable.id,callId:h.threadTable.callId,label:h.threadTable.label,status:h.threadTable.status,outcome:h.threadTable.outcome}).from(h.threadTable).where((0,r.inArray)(h.threadTable.callId,e)).orderBy(h.threadTable.createdAt):[]}async function v(e,t){let a=(a,n)=>s.database.select({id:h.threadTable.id,owner:h.threadTable.bot,label:h.threadTable.label,status:h.threadTable.status,pending:h.threadTable.pending,updatedAt:h.threadTable.updatedAt}).from(h.threadTable).where((0,r.and)((0,r.inArray)(h.threadTable.status,a),t?(0,r.ne)(h.threadTable.id,t):void 0,(0,r.inArray)(h.threadTable.id,s.database.select({id:h.threadWorkTable.threadId}).from(h.threadWorkTable).where((0,r.eq)(h.threadWorkTable.bot,e))))).orderBy((0,d.desc)(h.threadTable.updatedAt)).limit(n),[n,l]=await Promise.all([a(["running","waiting"],o.BOT_WORK.open),a(["done","cancelled"],o.BOT_WORK.recent)]),i=[...n,...l].map(e=>e.id);if(!i.length)return{open:[],recent:[]};let u=await s.database.select({id:h.threadWorkTable.id,threadId:h.threadWorkTable.threadId,result:h.threadWorkTable.result}).from(h.threadWorkTable).where((0,r.and)((0,r.eq)(h.threadWorkTable.bot,e),(0,r.inArray)(h.threadWorkTable.threadId,i),(0,r.isNotNull)(h.threadWorkTable.result))).orderBy((0,d.desc)(h.threadWorkTable.createdAt)),b=new Map;for(let{id:e,threadId:t,result:a}of u)a?.trim()&&!b.has(t)&&b.set(t,{workId:e,words:a});let c=({pending:e,...t})=>{let a=b.get(t.id);return{...t,workId:a?.workId??null,asking:"waiting"===t.status&&!!e?.messageId,said:a?.words??null,cut:!!a&&a.words.replace(/\s+/g," ").trim().length>o.BOT_WORK.said}};return{open:n.map(c),recent:l.map(c)}}async function x(e,t){if(t.owner===e){let[e]=await s.database.select({request:h.threadTable.request}).from(h.threadTable).where((0,r.eq)(h.threadTable.id,t.id));return e?.request??""}return t.workId?(await s.database.select({text:h.threadDeliveryTable.text}).from(h.threadDeliveryTable).where((0,r.eq)(h.threadDeliveryTable.workId,t.workId)).orderBy(h.threadDeliveryTable.id)).map(e=>e.text).join("\n\n"):""}async function O(e){let t=await s.database.delete(h.threadTable).where((0,r.eq)(h.threadTable.id,e)).returning({id:h.threadTable.id});return t.length&&j(),t.length>0}async function D(){return(await s.database.select({id:h.threadTable.id}).from(h.threadTable).where((0,r.eq)(h.threadTable.status,"running"))).map(e=>e.id)}async function M(){return await s.database.select({id:h.threadTable.id,label:h.threadTable.label,status:h.threadTable.status,endedAt:h.threadTable.endedAt,updatedAt:h.threadTable.updatedAt}).from(h.threadTable)}function S(e){let t=new Set;for(let a of e)if(Array.isArray(a))for(let e of a){if("tool-call"!==e.type||e.toolName!==u.TOOL_NAMES.write_file)continue;let a=e.input?.path;"string"==typeof a&&a.trim()&&(t.delete(a.trim()),t.add(a.trim()))}return[...t]}async function _(e){let t=await s.database.select({content:h.threadMessageTable.content}).from(h.threadMessageTable).where((0,r.and)((0,r.eq)(h.threadMessageTable.threadId,e),(0,r.eq)(h.threadMessageTable.role,"assistant"))).orderBy(h.threadMessageTable.seq);return S(t.map(e=>e.content))}async function E(e){let t=e.trim();if(!t)return null;let a=await I(t);if(a)return a;let r=t.toLowerCase();return(await s.database.select().from(h.threadTable).orderBy((0,d.desc)(h.threadTable.updatedAt)).limit(o.THREAD_LABEL_REACH)).find(e=>e.label.toLowerCase()===r)??null}async function $(e,t,a){await s.database.insert(h.threadMessageTable).values({threadId:e,seq:t,...a,compact:a.compact??!1,note:a.note??!1}).onConflictDoUpdate({target:[h.threadMessageTable.threadId,h.threadMessageTable.seq],set:{role:a.role,content:a.content,compact:a.compact??!1,note:a.note??!1}}),j()}async function N(e,t){t.length&&(await s.database.delete(h.threadMessageTable).where((0,r.and)((0,r.eq)(h.threadMessageTable.threadId,e),(0,r.inArray)(h.threadMessageTable.seq,t))),j())}async function U(e,t=()=>!0){if(0===e.length)return[];let a=e.filter(t).map(e=>e.id),d=a.length?await s.database.select().from(h.threadMessageTable).where((0,r.inArray)(h.threadMessageTable.threadId,a)).orderBy(h.threadMessageTable.seq):[],n=e.map(e=>e.id),[l,i,o]=await Promise.all([s.database.select().from(h.threadWorkTable).where((0,r.inArray)(h.threadWorkTable.threadId,n)),s.database.select().from(h.threadDeliveryTable).where((0,r.and)((0,r.inArray)(h.threadDeliveryTable.threadId,n),(0,r.eq)(h.threadDeliveryTable.visible,!0))),s.database.select().from(h.threadRelayTable).where((0,r.and)((0,r.inArray)(h.threadRelayTable.threadId,n),(0,r.eq)(h.threadRelayTable.accepted,!1)))]),w=new Map(e.map(e=>[e.id,e.bot])),f=new Map(l.map(e=>[e.id,e.caller])),y=new Map;for(let e of d){let t=y.get(e.threadId)??[];t.push(...function(e,t){if(e.hidden)return[];let a={seq:e.seq,bot:e.bot,parent:e.parent,to:"user"===e.role?e.bot:t,at:e.createdAt},r=t=>`${e.id}-${t}`,d=e.content;if("user"===e.role){if(0===e.seq)return[];let t="string"==typeof d?d:d.flatMap(e=>"text"===e.type&&e.text?[e.text]:[]).join("\n").trim();if(!t)return[];if(e.compact)return[{...a,id:r(0),kind:"note",text:t}];if(e.note){let e=t.endsWith(p.RESUME_CHECK)?t.slice(0,-p.RESUME_CHECK.length).trimEnd():t;return[{...a,id:r(0),kind:"stop",text:e}]}return[{...a,id:r(0),kind:"user",text:(0,c.untagSpeaker)(t)}]}if("assistant"===e.role){let t=e.content;if("string"==typeof t)return t.trim()?[{...a,id:r(0),kind:"text",text:t.trim()}]:[];let d=[];return t.forEach((t,n)=>{if("text"===t.type){let e=t.text.trim();e&&d.push({...a,id:r(n),kind:"text",text:e});return}if("tool-result"===t.type)return void d.push(L(a,r(n),t));if("tool-call"!==t.type)return;let l=t.input??{};if(t.toolName===u.TOOL_NAMES.send_message){let i;d.push({...a,id:r(n),kind:"ask",callId:t.toolCallId,to:(i=String(l.to??"").trim()).toLowerCase()===p.ROOM_THURSDAY.toLowerCase()?p.ROOM_THURSDAY:i,text:String(l.text??""),question:"question"===l.kind,..."question"===l.kind&&e.bot?{questionId:(0,T.messageKey)(e.threadId,e.bot,t.toolCallId)}:{}})}else t.toolName===u.TOOL_NAMES.bash?d.push({...a,id:r(n),kind:"tool",callId:t.toolCallId,name:t.toolName,input:(0,b.clip)(String(l.command??""),120),note:B(l)}):d.push({...a,id:r(n),kind:"tool",callId:t.toolCallId,name:t.toolName,input:C(t.toolName,l),note:B(l),path:t.toolName===u.TOOL_NAMES.write_file?P(l,"path")??null:null})}),d}if("tool"===e.role){let t=[];return e.content.forEach((e,d)=>{"tool-result"!==e.type||(e.toolName!==u.TOOL_NAMES.send_message||"error-text"===e.output.type)&&t.push(L(a,r(d),e))}),t}return[]}(e,(e.parent?f.get(e.parent):null)??w.get(e.threadId)??"")),y.set(e.threadId,t)}return e.map(e=>{let t=l.filter(t=>t.threadId===e.id),a=["running","queued","paused","waiting","done","cancelled"],r=[...new Set(t.map(e=>e.bot))].filter(e=>e!==p.ROOM_THURSDAY).map(e=>({bot:e,state:t.filter(t=>t.bot===e).sort((e,t)=>a.indexOf(e.state)-a.indexOf(t.state))[0].state}));return{...function(e,t){let{pending:a,inputTokens:r,outputTokens:d,...n}=e;return{...n,ask:"waiting"===e.status?{question:e.outcome??"",options:a?.options??[],messageId:a?.messageId,bot:a?.bot}:null,tokens:{input:r,output:d},lines:t}}(e,y.get(e.id)??[]),room:{participants:r,questions:t.filter(e=>"external"===e.state).map(e=>({id:e.id,bot:e.caller,text:e.result??"",options:e.options})),deliveries:i.filter(t=>t.threadId===e.id).map(a=>({id:a.key,bot:t.find(e=>e.id===a.workId)?.bot??e.bot,text:a.text,delivered:a.consumed})),relays:o.filter(t=>t.threadId===e.id)}}})}let K=["query","command","prompt","url","path","pattern","request","question","title","name","thread","text"],P=(e,t)=>{let a=e[t];return"string"==typeof a&&a.trim()?a:null};function B(e){let t=P(e,"description");return t?(0,b.clip)(t,120):null}function C(e,t){let a=t??{};if("object"!=typeof a||Array.isArray(a))return(0,b.clip)(String(t??""),120);if(e===u.TOOL_NAMES.bash)return B(a)??(0,b.clip)(String(a.command??""),120);if(e===u.TOOL_NAMES.tool_call||e===u.TOOL_NAMES.tool_search){let e=Array.isArray(a.tools)?a.tools.map(String).join(", "):String(a.tool??""),t=a.args??null,r=t&&"object"==typeof t?String(a.server??"")===o.STUDIO_SERVER?H(t):JSON.stringify(t):"";return(0,b.clip)([String(a.server??""),e,r].filter(Boolean).join(" "),120)}let r=H(a);return r?(0,b.clip)(r,120):Object.keys(a).length?(0,b.clip)(JSON.stringify(a),120):""}function H(e){for(let t of K){let a=P(e,t);if(a)return a}for(let t of Object.keys(e)){let a=P(e,t);if(a)return a}return""}let F=/https?:\/\/\S+(?: · \d{4}-\d{2}-\d{2})?\s*$/,V=" — ";function L(e,t,a){let r=a.toolName===u.TOOL_NAMES.web_search,d=function e(t,a,r=!1){var d;if(null==t)return[];if("string"==typeof t)return Y(t,a,r);if("object"!=typeof t)return Y(String(t),a,r);switch(t.type){case"text":case"error-text":return Y(String(t.value??""),a,r);case"json":case"error-json":return e(t.value,a,r);case"execution-denied":return Y("Denied.",a,r);case"content":{if(!Array.isArray(t.value))return[];let e=[];for(let d of t.value){if("text"===d.type&&"string"==typeof d.text){e.push(...Y(d.text,a,r));continue}let t=function(e){let t=String(e.mediaType??"");if(!t.startsWith("image/"))return null;let a=e.data;return"string"==typeof a?`data:${t};base64,${a}`:a?.type==="url"&&a.url?a.url:a?.type==="data"&&"string"==typeof a.data?`data:${t};base64,${a.data}`:null}(d);t&&e.push({type:"image",src:t})}return e}}return"string"==typeof t.path&&String(t.mediaType??"").startsWith("image/")?[{type:"text",text:t.path},{type:"image",src:i.queryKey.file(t.path)}]:Array.isArray(t.sources)?t.sources.map(e=>String(e?.title??"")).filter(Boolean).slice(0,a).map(e=>({type:"text",text:e})):"string"==typeof t.stdout?Y(t.stdout||String(t.stderr??""),a,r):"string"==typeof t.answer?Y(t.answer,a,r):Y(r?(d=t,Array.isArray(d)?JSON.stringify(d,null,2):Object.entries(d).map(([e,t])=>"string"==typeof t&&t.includes("\n")?`${e}:
|
|
4
|
+
${t}`:`${e}: ${JSON.stringify(t,null,2)}`).join("\n")):JSON.stringify(t),a,r)}(a.output,r?o.FULL_RESULT_LINES:5),n=d.flatMap(e=>"text"===e.type?[e.text]:[]),l=r?n.filter(e=>F.test(e)):[],s=(l.length?l:n).slice(0,4);return{...e,id:t,kind:"tool-result",callId:a.toolCallId,name:a.toolName,results:s.map(e=>({type:"text",text:l.length?function(e){let t=e.replace(/\s+/g," ").trim(),a=F.exec(t);if(!a||t.length<=200)return(0,b.clip)(t,200);let r=a[0].trim(),d=t.slice(0,a.index).replace(/[\s—-]+$/,""),n=200-r.length-V.length;return d&&n>1?`${(0,b.clip)(d,n)}${V}${r}`:r}(e):(0,b.clip)(e,200)})),more:n.length>s.length||d.length>n.length||s.some(e=>e.length>200)}}function Y(e,t,a=!1){if(a){let a=e.split("\n"),r=a.slice(0,t);a.length>t&&r.push(`… ${a.length-t} more lines`);let d=r.join("\n").trimEnd();return d?[{type:"text",text:d}]:[]}return e.split("\n").map(e=>e.trim()).filter(Boolean).slice(0,t).map(e=>({type:"text",text:e}))}e.s(["addThreadUsage",0,k,"argumentLine",0,C,"closeEndedQuestions",0,m,"deleteMessages",0,N,"deleteThread",0,O,"findThread",0,I,"findThreadView",0,q,"insertThread",0,f,"listBotWork",0,v,"listCallJobs",0,R,"listInboxThreads",0,W,"listRunningThreadIds",0,D,"listThreadFolders",0,M,"listThreadOverview",0,A,"listWrittenPaths",0,_,"markSeen",0,g,"readBotAsk",0,x,"resolveThread",0,E,"updateThread",0,y,"upsertMessage",0,$,"writtenPathsIn",0,S]),a()}catch(e){a(e)}},!1),212389,e=>{"use strict";class t extends Error{message;constructor(e){super(e),this.message=e}}e.s(["isPublicError",0,e=>e instanceof t,"publicError",0,function(e){throw new t(e)}])},157406,e=>{"use strict";var t=e.i(533102),a=e.i(539774),r=e.i(763369);e.s(["count",0,function(e){return t.sql`count(${e||t.sql.raw("*")})`.mapWith(Number)},"max",0,function(e){return t.sql`max(${e})`.mapWith((0,a.is)(e,r.Column)?e:String)}])}];
|
|
5
5
|
|
|
6
6
|
//# sourceMappingURL=_108gsm8._.js.map
|