botmancers 0.6.1 → 0.8.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/CHANGELOG.md +48 -0
- package/README.md +13 -12
- package/app/.next/BUILD_ID +1 -1
- package/app/.next/app-path-routes-manifest.json +1 -2
- package/app/.next/build-manifest.json +3 -3
- package/app/.next/prerender-manifest.json +4 -4
- package/app/.next/required-server-files.json +2 -2
- package/app/.next/routes-manifest.json +8 -12
- package/app/.next/server/app/_global-error.html +1 -1
- package/app/.next/server/app/_global-error.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_not-found.html +1 -1
- package/app/.next/server/app/_not-found.rsc +2 -2
- package/app/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/api/bots/[id]/config/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/[id]/sessions/[ref]/pins/route.js +2 -2
- package/app/.next/server/app/api/bots/[id]/sessions/[ref]/pins/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/[id]/sessions/[ref]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/[id]/sessions/[ref]/shares/route.js +3 -3
- package/app/.next/server/app/api/bots/[id]/sessions/[ref]/shares/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/[id]/sessions/route.js +5 -5
- package/app/.next/server/app/api/bots/[id]/sessions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/[id]/sessions/sync/route/app-paths-manifest.json +3 -0
- package/app/.next/server/app/api/bots/[id]/sessions/sync/route.js +11 -0
- package/app/.next/server/app/api/bots/[id]/sessions/sync/route.js.nft.json +1 -0
- package/app/.next/server/app/api/bots/[id]/sessions/sync/route_client-reference-manifest.js +3 -0
- package/app/.next/server/app/api/bots/[id]/share-policy/route.js +3 -3
- package/app/.next/server/app/api/bots/[id]/share-policy/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/[id]/skill/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/availability/route.js +3 -2
- package/app/.next/server/app/api/bots/availability/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/delete-preview/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/import/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/manage/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/name-migrations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/route.js +4 -4
- package/app/.next/server/app/api/bots/route.js.nft.json +1 -1
- package/app/.next/server/app/api/conversations/[id]/approve/route.js.nft.json +1 -1
- package/app/.next/server/app/api/conversations/[id]/deny/route.js.nft.json +1 -1
- package/app/.next/server/app/api/conversations/[id]/draft/route.js.nft.json +1 -1
- package/app/.next/server/app/api/conversations/[id]/messages/[messageId]/stop/route.js.nft.json +1 -1
- package/app/.next/server/app/api/conversations/[id]/messages/route.js +5 -5
- package/app/.next/server/app/api/conversations/[id]/messages/route.js.nft.json +1 -1
- package/app/.next/server/app/api/conversations/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/conversations/[id]/stop/route.js +6 -6
- package/app/.next/server/app/api/conversations/[id]/stop/route.js.nft.json +1 -1
- package/app/.next/server/app/api/conversations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/exchanges/[id]/cancel/route.js +2 -2
- package/app/.next/server/app/api/exchanges/[id]/cancel/route.js.nft.json +1 -1
- package/app/.next/server/app/api/exchanges/[id]/route.js +3 -3
- package/app/.next/server/app/api/exchanges/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/exchanges/route.js +2 -2
- package/app/.next/server/app/api/exchanges/route.js.nft.json +1 -1
- package/app/.next/server/app/api/files/[name]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/groups/route.js.nft.json +1 -1
- package/app/.next/server/app/api/health/route.js +2 -2
- package/app/.next/server/app/api/health/route.js.nft.json +1 -1
- package/app/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/app/.next/server/app/api/messages/[id]/between/route.js.nft.json +1 -1
- package/app/.next/server/app/api/runtime-connections/route.js.nft.json +1 -1
- package/app/.next/server/app/api/service-grants/route.js.nft.json +1 -1
- package/app/.next/server/app/api/shares/[shareRef]/revoke/route.js +3 -3
- package/app/.next/server/app/api/shares/[shareRef]/revoke/route.js.nft.json +1 -1
- package/app/.next/server/app/api/shares/route.js +3 -3
- package/app/.next/server/app/api/shares/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/agents/[agentId]/conversations/[conversationId]/route.js +3 -3
- package/app/.next/server/app/api/v0/agents/[agentId]/conversations/[conversationId]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/agents/[agentId]/conversations/route.js +3 -3
- package/app/.next/server/app/api/v0/agents/[agentId]/conversations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/agents/[agentId]/messages/route.js +2 -2
- package/app/.next/server/app/api/v0/agents/[agentId]/messages/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/agents/[agentId]/pins/route.js +3 -3
- package/app/.next/server/app/api/v0/agents/[agentId]/pins/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/agents/[agentId]/route.js +3 -3
- package/app/.next/server/app/api/v0/agents/[agentId]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/agents/[agentId]/sessions/[ref]/route.js +3 -3
- package/app/.next/server/app/api/v0/agents/[agentId]/sessions/[ref]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/agents/[agentId]/sessions/route.js +3 -3
- package/app/.next/server/app/api/v0/agents/[agentId]/sessions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/agents/route.js +3 -3
- package/app/.next/server/app/api/v0/agents/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/capabilities/route.js +3 -3
- package/app/.next/server/app/api/v0/capabilities/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/conversations/[id]/route.js +2 -2
- package/app/.next/server/app/api/v0/conversations/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/exchanges/[id]/cancel/route.js +3 -3
- package/app/.next/server/app/api/v0/exchanges/[id]/cancel/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/exchanges/[id]/route.js +3 -3
- package/app/.next/server/app/api/v0/exchanges/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/exchanges/route.js +3 -3
- package/app/.next/server/app/api/v0/exchanges/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/mcp/route.js +4 -4
- package/app/.next/server/app/api/v0/mcp/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/pins/[pinRef]/detach/route.js +3 -3
- package/app/.next/server/app/api/v0/pins/[pinRef]/detach/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/pins/[pinRef]/messages/route.js +3 -3
- package/app/.next/server/app/api/v0/pins/[pinRef]/messages/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/pins/[pinRef]/route.js +3 -3
- package/app/.next/server/app/api/v0/pins/[pinRef]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/requests/[id]/route.js +2 -2
- package/app/.next/server/app/api/v0/requests/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/sessions/[ref]/messages/route.js +3 -3
- package/app/.next/server/app/api/v0/sessions/[ref]/messages/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/sessions/[ref]/pins/route.js +3 -3
- package/app/.next/server/app/api/v0/sessions/[ref]/pins/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/sessions/[ref]/shares/route.js +3 -3
- package/app/.next/server/app/api/v0/sessions/[ref]/shares/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/shares/[shareRef]/revoke/route.js +3 -3
- package/app/.next/server/app/api/v0/shares/[shareRef]/revoke/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/shares/[shareRef]/route.js +3 -3
- package/app/.next/server/app/api/v0/shares/[shareRef]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/shares/current/route.js +3 -3
- package/app/.next/server/app/api/v0/shares/current/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/shares/route.js +3 -3
- package/app/.next/server/app/api/v0/shares/route.js.nft.json +1 -1
- package/app/.next/server/app/api/wake-grants/[id]/revoke/route.js +2 -2
- package/app/.next/server/app/api/wake-grants/[id]/revoke/route.js.nft.json +1 -1
- package/app/.next/server/app/api/wakes/[id]/decision/route.js +2 -2
- package/app/.next/server/app/api/wakes/[id]/decision/route.js.nft.json +1 -1
- package/app/.next/server/app/api/wakes/[id]/retry/route.js +2 -2
- package/app/.next/server/app/api/wakes/[id]/retry/route.js.nft.json +1 -1
- package/app/.next/server/app/bots/[id]/config/page.js.nft.json +1 -1
- package/app/.next/server/app/bots/[id]/config/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/exchanges/page.js.nft.json +1 -1
- package/app/.next/server/app/exchanges/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/exchanges.html +1 -1
- package/app/.next/server/app/exchanges.rsc +3 -3
- package/app/.next/server/app/exchanges.segments/_full.segment.rsc +3 -3
- package/app/.next/server/app/exchanges.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/exchanges.segments/exchanges/__PAGE__.segment.rsc +3 -3
- package/app/.next/server/app/index.html +1 -1
- package/app/.next/server/app/index.rsc +3 -3
- package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
- package/app/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/page.js.nft.json +1 -1
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/settings/page.js.nft.json +1 -1
- package/app/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/settings.html +1 -1
- package/app/.next/server/app/settings.rsc +3 -3
- package/app/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/app/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +3 -3
- package/app/.next/server/app/threads/[id]/page.js.nft.json +1 -1
- package/app/.next/server/app/threads/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app-paths-manifest.json +1 -2
- package/app/.next/server/chunks/[root-of-the-server]__0d3fjix._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0hhill-._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__0k8wfe2._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__0mp8bap._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__0qaiqut._.js +5 -5
- package/app/.next/server/chunks/[root-of-the-server]__0qqsovi._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__0zrx1iz._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__10b5-i-._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__17xl_55._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__1j8fg_n._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__1x8phwp._.js +44 -0
- package/app/.next/server/chunks/[root-of-the-server]__200ep0k._.js +1 -1
- package/app/.next/server/chunks/_0061c2q._.js +1 -1
- package/app/.next/server/chunks/_057h7zr._.js +3 -0
- package/app/.next/server/chunks/_0_b7py8._.js +3 -0
- package/app/.next/server/chunks/_0a2do3x._.js +1 -1
- package/app/.next/server/chunks/_1-5mthb._.js +1 -1
- package/app/.next/server/chunks/_next-internal_server_app_api_bots_[id]_sessions_sync_route_actions_00y6n-f.js +3 -0
- package/app/.next/server/chunks/lib_0-opbv7._.js +330 -0
- package/app/.next/server/chunks/lib_0aejojj._.js +330 -0
- package/app/.next/server/chunks/lib_0il0ml1._.js +330 -0
- package/app/.next/server/chunks/lib_0iujsdg._.js +330 -0
- package/app/.next/server/chunks/lib_0kik6bx._.js +20 -20
- package/app/.next/server/chunks/lib_0pe3tiv._.js +20 -20
- package/app/.next/server/chunks/{lib_1zc7-gl._.js → lib_15a9ejf._.js} +122 -130
- package/app/.next/server/chunks/{lib_15adnlz._.js → lib_19pzc33._.js} +122 -130
- package/app/.next/server/chunks/lib_1a4ucxv._.js +330 -0
- package/app/.next/server/chunks/lib_1dehbst._.js +330 -0
- package/app/.next/server/chunks/lib_1z4vnh4._.js +330 -0
- package/app/.next/server/chunks/lib_1z7d95m._.js +2181 -0
- package/app/.next/server/chunks/lib_db_ts_1ttuckb._.js +58 -56
- package/app/.next/server/chunks/lib_service-api-http_ts_0xzqhny._.js +5 -5
- package/app/.next/server/chunks/ssr/_00ysoah._.js +3 -0
- package/app/.next/server/chunks/ssr/_14d-lxn._.js +3 -0
- package/app/.next/server/chunks/ssr/_1cvuhjt._.js +1 -1
- package/app/.next/server/chunks/ssr/_1lkd0ui._.js +3 -0
- package/app/.next/server/chunks/ssr/_1n5mvo5._.js +1 -1
- package/app/.next/server/chunks/ssr/_1o94bnv._.js +8 -1
- package/app/.next/server/chunks/ssr/_1r5kd5j._.js +3 -0
- package/app/.next/server/chunks/ssr/app_1-nwnha._.js +3 -0
- package/app/.next/server/chunks/ssr/app_bots_[id]_config_page_tsx_1e0uue9._.js +1 -1
- package/app/.next/server/chunks/ssr/lib_exchange-view_ts_1a4q9ju._.js +3 -0
- package/app/.next/server/instrumentation.js +1 -1
- package/app/.next/server/middleware-build-manifest.js +3 -3
- package/app/.next/server/pages/404.html +1 -1
- package/app/.next/server/pages/500.html +1 -1
- package/app/.next/server/server-reference-manifest.js +1 -1
- package/app/.next/server/server-reference-manifest.json +1 -1
- package/app/.next/static/chunks/0y1ihx4vq8du3.js +10 -0
- package/app/.next/static/chunks/1c2dl2ga-lqcb.css +3 -0
- package/app/.next/static/chunks/2q-tgwkalrnms.js +1 -0
- package/app/.next/static/chunks/2qf-mb__71dkk.js +1 -0
- package/app/.next/static/chunks/399dvlpyl00wn.js +1 -0
- package/app/.next/static/chunks/3b7r6u9nfsjb1.js +1 -0
- package/app/.next/static/chunks/3f1v-zuki9k7k.js +1 -0
- package/app/.next/static/chunks/3whw2-l4a2sli.js +1 -0
- package/app/BUILD_INFO.json +2 -2
- package/app/package.json +1 -1
- package/app/server.js +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +2 -2
- package/dist/product.d.ts +0 -1
- package/dist/product.js +12 -22
- package/dist/setup.js +9 -9
- package/package.json +1 -2
- package/schemas/botmancers.mcp.v2.tools.json +3 -3
- package/app/.next/server/app/api/agent-deck/decks/route/app-paths-manifest.json +0 -3
- package/app/.next/server/app/api/agent-deck/decks/route.js +0 -9
- package/app/.next/server/app/api/agent-deck/decks/route.js.nft.json +0 -1
- package/app/.next/server/app/api/agent-deck/decks/route_client-reference-manifest.js +0 -3
- package/app/.next/server/app/api/agent-deck/settings/route/app-paths-manifest.json +0 -3
- package/app/.next/server/app/api/agent-deck/settings/route/build-manifest.json +0 -12
- package/app/.next/server/app/api/agent-deck/settings/route/server-reference-manifest.json +0 -4
- package/app/.next/server/app/api/agent-deck/settings/route.js +0 -9
- package/app/.next/server/app/api/agent-deck/settings/route.js.nft.json +0 -1
- package/app/.next/server/app/api/agent-deck/settings/route_client-reference-manifest.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__0e_agq4._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__0j4pjyg._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__0mo_kn3._.js +0 -48
- package/app/.next/server/chunks/[root-of-the-server]__17mum5-._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__1bhzfu_._.js +0 -7
- package/app/.next/server/chunks/[root-of-the-server]__1g_n99l._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__1t4ybp2._.js +0 -48
- package/app/.next/server/chunks/_0qv-4by._.js +0 -3
- package/app/.next/server/chunks/_next-internal_server_app_api_agent-deck_decks_route_actions_0yguyfv.js +0 -3
- package/app/.next/server/chunks/_next-internal_server_app_api_agent-deck_settings_route_actions_0z_nbkb.js +0 -3
- package/app/.next/server/chunks/lib_0v4d9w0._.js +0 -339
- package/app/.next/server/chunks/lib_0v6lblw._.js +0 -5
- package/app/.next/server/chunks/lib_0zzo6zb._.js +0 -339
- package/app/.next/server/chunks/lib_1_u7n-u._.js +0 -339
- package/app/.next/server/chunks/lib_1muhwn7._.js +0 -339
- package/app/.next/server/chunks/lib_1xnxg-q._.js +0 -339
- package/app/.next/server/chunks/ssr/_0_fa0na._.js +0 -3
- package/app/.next/server/chunks/ssr/_0epgorw._.js +0 -3
- package/app/.next/server/chunks/ssr/_1i02yyi._.js +0 -3
- package/app/.next/server/chunks/ssr/app_components_AgentDeckRuntime_tsx_024janf._.js +0 -3
- package/app/.next/server/chunks/ssr/app_exchanges_page_tsx_0j-n2a1._.js +0 -3
- package/app/.next/server/chunks/ssr/app_settings_page_tsx_1t-rdz-._.js +0 -3
- package/app/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_1ztp13a._.js +0 -3
- package/app/.next/static/chunks/0jon21u-9j2aw.css +0 -3
- package/app/.next/static/chunks/14k6cvywgknx2.js +0 -3
- package/app/.next/static/chunks/1ku9himlsx-hn.js +0 -1
- package/app/.next/static/chunks/1r5tqd-7h1xjn.js +0 -1
- package/app/.next/static/chunks/21aqekm5z0j47.js +0 -1
- package/app/.next/static/chunks/22xbkclbkct3s.js +0 -1
- package/app/.next/static/chunks/2c953okoei6ip.js +0 -1
- package/app/.next/static/chunks/2t_2gf3xoxz_m.js +0 -1
- package/app/.next/static/chunks/34vnvo1qssbaj.js +0 -1
- /package/app/.next/server/app/api/{agent-deck/decks → bots/[id]/sessions/sync}/route/build-manifest.json +0 -0
- /package/app/.next/server/app/api/{agent-deck/decks → bots/[id]/sessions/sync}/route/server-reference-manifest.json +0 -0
- /package/app/.next/static/{_yrIZIFsIbXA0Gaxkytjd → 3rSDqQK0KGcTDI98uoZRy}/_buildManifest.js +0 -0
- /package/app/.next/static/{_yrIZIFsIbXA0Gaxkytjd → 3rSDqQK0KGcTDI98uoZRy}/_clientMiddlewareManifest.js +0 -0
- /package/app/.next/static/{_yrIZIFsIbXA0Gaxkytjd → 3rSDqQK0KGcTDI98uoZRy}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
module.exports=[45383,17834,e=>{"use strict";e.s(["AgentApiError",()=>es,"MCP_IDEMPOTENCY_PREFIX",()=>er,"acceptAgentMessage",()=>ef,"apiStateOf",()=>el,"cancelExchangeCommand",()=>ej,"createExchangeCommand",()=>eP,"decideWakeGrantCommand",()=>eO,"dispatchExchange",()=>eH,"exchanges",()=>eF,"getAgentRequest",()=>ez,"getAuthorizedWorkRequest",()=>eX,"getConversation",()=>eY,"getExchangeView",()=>eU,"isPrincipalKind",()=>ea,"recoverCoordinatorLoops",()=>eW,"retryWakeCommand",()=>eL,"revokeWakeGrantCommand",()=>eD,"samePrincipal",()=>eo,"startAgentDispatch",()=>e$,"sweepDispatch",()=>eN],45383);var t=e.i(54799),n=e.i(62294),r=e.i(27510),i=e.i(53059),s=e.i(35613),a=e.i(57281),o=e.i(54226),d=e.i(64974),u=e.i(76459),l=e.i(62349),c=e.i(51749);let _=new Set(["version","target","executionKind","objective","contextWorkRequests","resumeWorkRequest","limits"]),p=new Set(["maxAttempts","deadlineSeconds"]),f=new Set(["conversation","implementation","review","revision"]);function h(e,t){return"string"==typeof e&&e.trim().length>0&&e.length<=t}function m(e,t,n){return Number.isInteger(e)&&e>=t&&e<=n}function g(e){if(!e||"object"!=typeof e||Array.isArray(e))return{ok:!1,reason:"envelope must be a JSON object"};let t=Object.keys(e).filter(e=>!_.has(e));if(t.length>0)return{ok:!1,reason:`unknown field ${t.join(", ")}`};if(1!==e.version)return{ok:!1,reason:"version must be 1"};if(!h(e.target,120))return{ok:!1,reason:"target must be a non-empty Agent name (max 120 characters)"};if("string"!=typeof e.executionKind||!f.has(e.executionKind))return{ok:!1,reason:"unknown executionKind"};if(!h(e.objective,2e4))return{ok:!1,reason:"objective must be non-empty (max 20000 characters)"};let n={version:1,target:e.target.trim(),executionKind:e.executionKind,objective:e.objective.trim()};if(void 0!==e.contextWorkRequests){let t=e.contextWorkRequests;if(!Array.isArray(t)||t.length>8||t.some(e=>!h(e,160)))return{ok:!1,reason:"contextWorkRequests must be at most 8 Work Request references"};if(new Set(t).size!==t.length)return{ok:!1,reason:"contextWorkRequests must be unique"};n.contextWorkRequests=[...t]}let r=Object.prototype.hasOwnProperty.call(e,"resumeWorkRequest");if("revision"===n.executionKind){if(!r||!h(e.resumeWorkRequest,160))return{ok:!1,reason:"revision requires resumeWorkRequest"};n.resumeWorkRequest=e.resumeWorkRequest}else if(r)return{ok:!1,reason:"resumeWorkRequest is revision-only"};if(void 0!==e.limits){let t=e.limits;if(!t||"object"!=typeof t||Array.isArray(t))return{ok:!1,reason:"limits must be an object"};if(Object.keys(t).some(e=>!p.has(e)))return{ok:!1,reason:"unknown limits field"};if(void 0!==t.maxAttempts&&!m(t.maxAttempts,1,10))return{ok:!1,reason:"limits.maxAttempts must be 1-10"};if(void 0!==t.deadlineSeconds&&!m(t.deadlineSeconds,1,86400))return{ok:!1,reason:"limits.deadlineSeconds must be 1-86400"};n.limits={},void 0!==t.maxAttempts&&(n.limits.maxAttempts=t.maxAttempts),void 0!==t.deadlineSeconds&&(n.limits.deadlineSeconds=t.deadlineSeconds)}return{ok:!0,envelope:n}}let y=/```botmancers-wake[^\S\r\n]*\r?\n([\s\S]*?)```/g,w=/WAKE\s+([A-Za-z0-9_-]+)\s*:/gi;function v(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(e):t&&"object"==typeof t?Object.fromEntries(Object.keys(t).sort().map(n=>[n,e(t[n])])):t}(e.validation.ok?{syntax:e.syntax,envelope:e.validation.envelope}:{syntax:e.syntax,raw:e.raw}))}var k=e.i(142);(0,k.wakeSafetyLimits)().maxWakeDepth,(0,k.wakeSafetyLimits)().rootBudget;class E extends Error{code;constructor(e,t){super(t),this.name="WakeRouterError",this.code=e}}let b=n.default.prepare("SELECT * FROM wakes WHERE id = ?"),S=n.default.prepare("SELECT * FROM wakes WHERE idempotency_key = ?"),T=n.default.prepare("SELECT * FROM wakes WHERE source_event_id = ? AND position = ?");function I(e){return b.get(e)}function R(e,t){return{wake:e,request:e.work_request_id?n.engine.getWorkRequest(e.work_request_id)??null:null,created:t}}function A(e){return"accepted"===e.status||"blocked"===e.status}function q(e){return n.default.prepare("SELECT COUNT(*) AS n FROM work_requests WHERE root_request_id = ? AND wake_event_id IS NOT NULL").get(e).n}function x(e){let{rootBudget:t}=(0,k.wakeSafetyLimits)(),n=q(e);return n<t?null:{status:"rejected",code:"root_budget_exhausted",limit:t,observed:n,reason:`This work already used ${n} Wakes (limit ${t}).`}}function N(e,t,r){let i=(0,n.resolveWakeTarget)(e.target);if(!i.ok){var s;return"ambiguous"===i.reason?{status:"unavailable",code:"target_ambiguous",reason:`More than one Agent is named ${e.target}; rename one to restore routing.`}:(s=e.target,n.default.prepare("SELECT 1 FROM groups WHERE lower(trim(name)) = lower(trim(?))").get(s))?{status:"rejected",code:"target_is_group",reason:`${e.target} is a Group; wake one Agent by name.`}:{status:"unavailable",code:"target_not_found",reason:`No Agent is named ${e.target}.`}}return C(e,t,{id:i.agentId,name:i.displayName},r)}function C(e,t,r,i){let s=i.parent?.root_request_id??null,a=(0,d.selectExecutionPolicy)({entryPoint:"wake",executionKind:e.executionKind,wakeSyntax:t,resumesWorkRequest:!!e.resumeWorkRequest});if(!a.ok)return{status:"rejected",code:"unsupported_policy",reason:a.reason,target:r};let o=a.policy;if(e.resumeWorkRequest){let t=n.engine.getWorkRequest(e.resumeWorkRequest);if(!t||t.target_agent_id!==r.id||!["implementation","revision"].includes(t.execution_kind))return{status:"rejected",code:"invalid_reference",reason:"A revision resumes an implementation Work Request of the same Agent.",target:r}}if("review"===e.executionKind&&((e.contextWorkRequests??[]).some(e=>{let t=n.engine.getWorkRequest(e);return t&&["implementation","revision"].includes(t.execution_kind)&&t.target_agent_id===r.id})||null!==s&&n.default.prepare("SELECT 1 FROM work_requests WHERE root_request_id = ? AND target_agent_id = ? AND execution_kind IN ('implementation', 'revision') LIMIT 1").get(s,r.id)))return{status:"rejected",code:"reviewer_not_independent",reason:`${r.name} did the work under review; wake a different reviewer or ask the person.`,target:r};let u=function(e,t,r){if(!(0,k.needsEditGrant)(e.executionKind))return{rule:"readonly_default",id:null};if(function(e,t,r){let i=r.parent;if("implementation"!==e.executionKind||t.id!==r.agentId||!i||null!==i.wake_event_id||0!==i.wake_depth||null!==i.parent_request_id||i.target_agent_id!==r.agentId||!(0,k.isOwnerPrincipal)({kind:i.root_principal_kind??"",id:i.root_principal_id??""}))return!1;let s=n.engine.listSafetyDecisions(i.id)[0];return s?.principal_type==="human_owner"}(e,t,r))return{rule:"owner_direct_self_wake",id:null};let i=(0,k.activeEditGrant)(r.agentId,t.id);return i?{rule:"edit_grant",id:i.id}:null}(e,r,i);return u?function(e,t,r){var i;let s=n.bots.getById(e.id),a=(0,l.resolveAgent)(s);if(!a.launchable)return{status:"blocked",code:"target_unconfigured",reason:"connection"===a.launch_blocker?`${e.name} has no runtime connection.`:"session_scope"===a.launch_blocker?`${e.name} has no session scope.`:`${e.name} has an unsupported Agent type.`,target:e,policy:t,grant:r};let o=(i=s,"hermes-gateway"===(0,l.agentTransport)((0,l.resolveAgent)(i).agent)?(0,c.loadHermesConfig)()?{available:!0}:{available:!1,reason:"The Hermes gateway is not configured (HERMES_API_SERVER_KEY is unset)."}:{available:!0});return o.available?{status:"accepted",code:null,reason:null,target:e,policy:t,grant:r}:{status:"blocked",code:"target_unavailable",reason:o.reason,target:e,policy:t,grant:r}}(r,o,u):{status:"blocked",code:"grant_required",reason:`${r.name} needs your approval for edit work.`,target:r,policy:o,grant:null}}function O(e){let t=(0,k.wakeSafetyLimits)(),n=e.rootRequestId?q(e.rootRequestId):0;return{safety_version:k.WAKE_SAFETY_VERSION,root_principal:e.rootPrincipal,wake_depth:e.wakeDepth,grant_rule:e.grant?.rule??null,grant_id:e.grant?.id??null,root_budget:{used:n+ +!!e.counting,limit:t.rootBudget},safety_limits:{max_wake_depth:t.maxWakeDepth,root_budget:t.rootBudget}}}function L(e,t,n,r,i){return{principalType:"agent_principal",principal:{kind:"bot",id:n},decision:"accepted"===e.status?"allowed":"blocked",reasonCode:e.code,grantRule:e.grant?.rule??null,grantId:e.grant?.id??null,wakeId:t,snapshot:r,now:i}}function D(e,t,r,i){let s=e.parent_request_id?n.engine.getWorkRequest(e.parent_request_id)??null:null;if(!s)throw new E("invalid_input","A Wake creates work only in a tracked lineage.");let a=O({rootPrincipal:{kind:s.root_principal_kind??"unknown",id:s.root_principal_id??"unknown"},wakeDepth:s.wake_depth+1,grant:r.grant,rootRequestId:s.root_request_id,counting:!0}),{request:o}=n.engine.createOrGetWorkRequest({sourceConversationId:e.source_conversation_id,sourceEventId:e.source_event_id,requester:{kind:"bot",id:e.requester_agent_id},targetAgentId:r.target.id,intent:t.objective,executionKind:r.policy.execution_kind,toolProfile:r.policy.tool_profile,idempotencyKey:e.idempotency_key,parentRequestId:e.parent_request_id,wakeEventId:e.id,policy:{source:"wake",wake_version:1,wake_syntax:e.syntax,root_wake_id:e.root_wake_id,requested_target:t.target,target_name_snapshot:r.target.name,context_work_requests:t.contextWorkRequests??[],resume_work_request:t.resumeWorkRequest??null,limits:t.limits??{},return_to:{agent_id:e.requester_agent_id,conversation_id:e.source_conversation_id}},executionPolicy:r.policy,initialState:"blocked"===r.status?"blocked":"queued",stateReason:"blocked"===r.status?`${r.code}: ${r.reason}`:null,safetySnapshot:a,safety:L(r,e.id,e.requester_agent_id,a,i),now:i});return"grant_required"===r.code&&M(o,e.id,i),o}function M(e,t,r){n.engine.appendEvent(e.id,{type:"grant_requested",data:{wake_id:t,caller_agent_id:e.requester_id,target_agent_id:e.target_agent_id,authority:"edit",execution_kind:e.execution_kind},now:r})}function $(e){if("string"!=typeof e.sourceEventId||!e.sourceEventId.trim())throw new E("invalid_input","sourceEventId is required.");return n.default.transaction(()=>{let r=n.default.prepare("SELECT * FROM messages WHERE id = ?").get(e.sourceEventId);if(!r)throw new E("source_not_found",`No conversation event ${e.sourceEventId}.`);if("bot"!==r.sender_type||!r.sender_id||!n.bots.getById(r.sender_id))throw new E("invalid_input","Wakes are routed only from an Agent message.");let i=null;if(e.parentRequestId){if(!(i=n.engine.getWorkRequest(e.parentRequestId)??null))throw new E("not_found",`No parent Work Request ${e.parentRequestId}.`);if(i.target_agent_id!==r.sender_id||i.source_conversation_id!==r.conversation_id)throw new E("parent_mismatch","The parent Work Request was not run by this Agent in this conversation.")}let s=e.now??Date.now();return(function(e){let t=[],n=0,r=(n,r)=>{var i;let s;for(let a of(i=e.slice(n,r),(s=[...i.matchAll(w)]).map((e,t)=>{let r=t+1<s.length?s[t+1].index:i.length,a=i.slice(e.index,r);return{at:n+e.index,raw:a.trim(),target:e[1],message:a.slice(e[0].length).trim()}}))){let e="GROUP"===a.target.toUpperCase()?{ok:!1,reason:"group wakes are not supported; wake one Agent by name"}:0===a.message.length?{ok:!1,reason:"objective must be non-empty (max 20000 characters)"}:g({version:1,target:a.target,executionKind:"conversation",objective:a.message});t.push({at:a.at,syntax:"legacy",raw:a.raw,validation:e})}};for(let i of e.matchAll(y)){let e,s=i.index;r(n,s);try{e=g(JSON.parse(i[1]))}catch{e={ok:!1,reason:"block is not valid JSON"}}t.push({at:s,syntax:"structured",raw:i[0],validation:e}),n=s+i[0].length}return r(n,e.length),t.sort((e,t)=>e.at-t.at).map((e,t)=>({position:t,syntax:e.syntax,raw:e.raw,validation:e.validation}))})(r.content).map(e=>(function(e,r,i,s,a){var o;let d,u,l=(o=r.id,u=(0,t.createHash)("sha256").update(v(e)).digest("hex").slice(0,32),`wake:v1:${o}:${e.position}:${u}`),c=S.get(l);if(c)return R(c,!1);if(T.get(r.id,e.position))throw new E("idempotency_conflict",`Wake ${e.position} of event ${r.id} was already recorded with a different payload.`);let _=(0,t.randomUUID)(),p=s?.wake_event_id?I(s.wake_event_id):void 0,f={id:_,idempotency_key:l,source_conversation_id:r.conversation_id,source_event_id:r.id,requester_agent_id:i,parent_request_id:s?.id??null,root_wake_id:p?.root_wake_id??_,syntax:e.syntax},h=null;if(e.validation.ok)if(s){let t=function(e,t,r){for(let i of[...e.contextWorkRequests??[],...e.resumeWorkRequest?[e.resumeWorkRequest]:[]]){let e=n.engine.getWorkRequest(i);if(!(e&&(r?e.root_request_id===r.root_request_id:e.source_conversation_id===t)))return`Work Request ${i} is not in this conversation lineage.`}return null}(h=e.validation.envelope,r.conversation_id,s);d=t?{status:"rejected",code:"invalid_reference",reason:t}:function(e){let{maxWakeDepth:t}=(0,k.wakeSafetyLimits)(),n=e.wake_depth+1;return n>t?{status:"rejected",code:"depth_exceeded",limit:t,observed:n,reason:`This work is already ${e.wake_depth} Wakes deep (limit ${t}).`}:x(e.root_request_id)}(s)??N(h,e.syntax,{agentId:i,parent:s})}else h=e.validation.envelope,d={status:"rejected",code:"untracked_lineage",reason:"Its source turn is not tracked work, so the Wake cannot start a lineage."};else d={status:"rejected",code:"invalid_envelope",reason:e.validation.reason};let m=h&&A(d)?D(f,h,d,a):null;return n.default.prepare(`
|
|
2
|
+
INSERT INTO wakes (
|
|
3
|
+
id, idempotency_key, source_conversation_id, source_event_id, position, syntax, payload,
|
|
4
|
+
requester_agent_id, requested_target, target_agent_id, target_name_snapshot, execution_kind,
|
|
5
|
+
parent_request_id, root_request_id, root_wake_id, depth, status, reason_code, reason,
|
|
6
|
+
work_request_id, limit_value, observed_value, created_at, updated_at
|
|
7
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
8
|
+
`).run(_,l,r.conversation_id,r.id,e.position,e.syntax,v(e),i,h?.target??null,d.target?.id??null,d.target?.name??null,h?.executionKind??null,s?.id??null,m?.root_request_id??s?.root_request_id??null,f.root_wake_id,m?.wake_depth??(s?s.wake_depth+1:0),d.status,d.code,d.reason,m?.id??null,A(d)?null:d.limit??null,A(d)?null:d.observed??null,a,a),R(I(_),!0)})(e,r,r.sender_id,i,s))}).immediate()}function W(e,t=Date.now()){return n.default.transaction(()=>{let r=I(e);if(!r)throw new E("not_found",`No Wake ${e}.`);if("unavailable"!==r.status&&"blocked"!==r.status||"grant_denied"===r.reason_code)return R(r,!1);let i=JSON.parse(r.payload).envelope,s=n.default.prepare(`
|
|
9
|
+
UPDATE wakes SET status = ?, reason_code = ?, reason = ?, target_agent_id = ?, target_name_snapshot = ?,
|
|
10
|
+
work_request_id = ?, root_request_id = ?, limit_value = ?, observed_value = ?, updated_at = ?
|
|
11
|
+
WHERE id = ?
|
|
12
|
+
`),a=r.parent_request_id?n.engine.getWorkRequest(r.parent_request_id)??null:null,o={agentId:r.requester_agent_id,parent:a};if("unavailable"===r.status){let e=a?x(a.root_request_id)??N(i,r.syntax,o):{status:"rejected",code:"untracked_lineage",reason:"Its source turn is not tracked work, so the Wake cannot start a lineage."};if(!A(e))return(e.status!==r.status||e.code!==r.reason_code||e.reason!==r.reason)&&s.run(e.status,e.code,e.reason,null,null,null,r.root_request_id,e.limit??null,e.observed??null,t,r.id),R(I(r.id),!1);let n=D(r,i,e,t);return s.run(e.status,e.code,e.reason,e.target.id,e.target.name,n.id,n.root_request_id,null,null,t,r.id),R(I(r.id),!0)}let d=n.engine.getWorkRequest(r.work_request_id),u=n.bots.getById(d.target_agent_id);if(!u||"blocked"!==d.state)return R(r,!1);let l=C(i,r.syntax,{id:u.id,name:u.name},o);return F(r,d,l,"target_available",t)}).immediate()}function F(e,t,r,i,s){let a=n.default.prepare("UPDATE wakes SET status = ?, reason_code = ?, reason = ?, updated_at = ? WHERE id = ?");if("blocked"===r.status){var o,d;if(r.code===e.reason_code&&r.reason===e.reason)return R(e,!1);a.run("blocked",r.code,r.reason,s,e.id);let i=O({rootPrincipal:{kind:t.root_principal_kind??"unknown",id:t.root_principal_id??"unknown"},wakeDepth:t.wake_depth,grant:r.grant,rootRequestId:null,counting:!1});return n.engine.recordSafetyDecision(t.id,L(r,e.id,e.requester_agent_id,i,s)),"grant_required"===r.code&&M(t,e.id,s),o=r.code,d=r.reason,n.engine.reblockWorkRequest(t.id,{reason:`${o}: ${d}`,type:"wake_reblocked",data:{reason_code:o,reason:d},now:s}),R(I(e.id),!1)}if("accepted"!==r.status)return R(e,!1);let u=O({rootPrincipal:{kind:t.root_principal_kind??"unknown",id:t.root_principal_id??"unknown"},wakeDepth:t.wake_depth,grant:r.grant,rootRequestId:null,counting:!1});return n.engine.recordSafetyDecision(t.id,L(r,e.id,e.requester_agent_id,u,s)),n.engine.transitionWorkRequest(t.id,{from:"blocked",to:"queued",reason:i,data:{grant_rule:r.grant?.rule??null,grant_id:r.grant?.id??null},now:s}),a.run("accepted",null,null,s,e.id),R(I(e.id),!0)}function P(e){if((0,k.assertOwner)(e.caller.category),"allow"!==e.decision&&"deny"!==e.decision)throw new E("invalid_input","decision must be allow or deny.");let t=e.now??Date.now();return n.default.transaction(()=>{let r=I(e.wakeId);if(!r)throw new k.WakeSafetyError("not_found",`No Wake ${e.wakeId}.`);let i=r.work_request_id?n.engine.getWorkRequest(r.work_request_id):void 0,s=(t,n)=>({...t,decision:e.decision,grant:n,runnable:t.request?.state==="queued",ended:t.request?.terminal_at!==null&&t.request?.terminal_at!==void 0});if("blocked"!==r.status||"grant_required"!==r.reason_code||!i||"blocked"!==i.state){let t=i?(0,k.activeEditGrant)(r.requester_agent_id,i.target_agent_id)??null:null;if("deny"===e.decision&&"grant_denied"===r.reason_code)return{...s(R(r,!1),null),runnable:!1};if("allow"===e.decision&&t&&"grant_denied"!==r.reason_code)return{...s(R(r,!1),t),runnable:!1};throw new k.WakeSafetyError("not_pending","This Wake is not waiting for an owner grant decision.")}let a={kind:e.caller.principal.kind,id:e.caller.principal.id};if("deny"===e.decision)return n.default.prepare("UPDATE wakes SET reason_code = 'grant_denied', reason = ?, updated_at = ? WHERE id = ?").run("The owner denied this edit Wake.",t,r.id),n.engine.appendEvent(i.id,{type:"grant_denied",data:{wake_id:r.id,caller_agent_id:r.requester_agent_id,target_agent_id:i.target_agent_id,authority:"edit",decided_by:a},now:t}),n.engine.recordSafetyDecision(i.id,{principalType:"human_owner",principal:a,decision:"denied",reasonCode:"grant_denied",wakeId:r.id,snapshot:{safety_version:k.WAKE_SAFETY_VERSION,decision:"deny",decided_by:a},now:t}),n.engine.transitionWorkRequest(i.id,{from:"blocked",to:"cancelled",reason:"grant_denied",expectedVersion:i.version,errorCode:"grant_denied",errorMessage:"The owner denied this edit Wake; no work ran.",now:t}),s(R(I(r.id),!1),null);let{grant:o}=(0,k.ensureEditGrant)({callerAgentId:r.requester_agent_id,targetAgentId:i.target_agent_id,grantedBy:a,sourceWakeId:r.id,now:t});n.engine.appendEvent(i.id,{type:"grant_approved",data:{wake_id:r.id,grant_id:o.id,caller_agent_id:o.caller_agent_id,target_agent_id:o.target_agent_id,authority:"edit",decided_by:a},now:t});let d=JSON.parse(r.payload).envelope,u=n.bots.getById(i.target_agent_id),l=r.parent_request_id?n.engine.getWorkRequest(r.parent_request_id)??null:null,c=C(d,r.syntax,{id:u.id,name:u.name},{agentId:r.requester_agent_id,parent:l});return s(F(r,i,c,"grant_approved",t),o)}).immediate()}e.s(["WakeRouterError",0,E,"decideWakeGrant",0,P,"retryWake",0,W,"routeAgentWakes",0,$],17834),(0,k.wakeSafetyLimits)().maxContinuations;let H={kind:"service",id:"botmancers-engine"},U="Botmancers";function j(e){try{let t=JSON.parse(e.policy_snapshot);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}catch{return{}}}function B(e){return n.bots.getById(e)?.name??`agent:${e}`}function K(e){let t;if("completed"!==e.state||!e.result)return null;try{t=JSON.parse(e.result).reply_message_id}catch{return null}if("string"!=typeof t)return null;let r=n.default.prepare("SELECT * FROM messages WHERE id = ?").get(t);return r&&"bot"===r.sender_type&&r.sender_id===e.target_agent_id?r:null}function X(e,t=!1){let r=n.engine.listAttempts(e.id),i=r.length>0?r[r.length-1]:null,s=[`Work Request: ${e.id}`,...i?[`Attempt: ${i.id}`]:[],`Agent: ${B(e.target_agent_id)}`,`Execution kind: ${e.execution_kind}`,`State: ${e.state}`],a=K(e);if(a){var o;s.push(t?`Result: the ${B(e.target_agent_id)} reply above.`:`Result:
|
|
13
|
+
${(o=a.content).length>8e3?`${o.slice(0,8e3)}
|
|
14
|
+
[truncated]`:o}`)}else"failed"===e.state||"cancelled"===e.state?s.push(`Failure: ${e.error_code??e.state}${e.error_message?` - ${e.error_message}`:""}`):null===e.terminal_at&&s.push("Result: not finished yet.");return s.join("\n")}let G='You coordinate this work. Decide the next step yourself: reply to the person, ask a question, or emit a botmancers-wake block (one per Agent). Reference earlier work with "contextWorkRequests"; a revision names the implementation it resumes in "resumeWorkRequest". Never report a review that did not run.',J=n.default.prepare("SELECT * FROM work_requests WHERE requester_kind = ? AND requester_id = ? AND idempotency_key = ?");function z(e){let t=J.get(H.kind,H.id,e.key);if(t)return t;if(!n.bots.getById(e.coordinatorId)||!n.default.prepare("SELECT 1 FROM conversations WHERE id = ?").get(e.conversationId))return null;let r=n.default.prepare("SELECT COUNT(*) AS n FROM work_requests WHERE root_request_id = ? AND requester_kind = ? AND requester_id = ?").get(e.parent.root_request_id,H.kind,H.id),i=(0,k.wakeSafetyLimits)().maxContinuations;if(r.n>=i)return n.default.prepare("SELECT 1 FROM engine_events WHERE request_id = ? AND type = 'lineage_stopped'").get(e.parent.id)||n.engine.appendEvent(e.parent.id,{type:"lineage_stopped",data:{reason:"continuation_budget_exhausted",limit:i,observed:r.n,continues:e.continues,coordinator_agent_id:e.coordinatorId},now:e.now}),null;let s=(0,d.selectExecutionPolicy)({entryPoint:"continuation",executionKind:"conversation"});if(!s.ok)return null;let a="result"===e.continues?Math.max(e.parent.wake_depth-1,0):e.parent.wake_depth,o={safety_version:k.WAKE_SAFETY_VERSION,root_principal:{kind:e.parent.root_principal_kind??"unknown",id:e.parent.root_principal_id??"unknown"},wake_depth:a,grant_rule:"readonly_default",grant_id:null,continuations:{used:r.n+1,limit:i}};return n.engine.createOrGetWorkRequest({sourceConversationId:e.conversationId,sourceEventId:e.sourceEventId,requester:H,targetAgentId:e.coordinatorId,intent:e.intent,executionKind:s.policy.execution_kind,toolProfile:s.policy.tool_profile,idempotencyKey:e.key,parentRequestId:e.parent.id,policy:{source:"coordinator_continuation",continues:e.continues,work_requests:e.subjects},executionPolicy:s.policy,wakeDepth:a,safetySnapshot:o,safety:{principalType:"engine",principal:H,decision:"allowed",grantRule:"readonly_default",snapshot:o,now:e.now},now:e.now}).request}let V=n.default.prepare("SELECT 1 FROM terminal_followups WHERE request_id = ? AND done_at IS NULL"),Y=n.default.prepare("UPDATE terminal_followups SET done_at = ? WHERE request_id = ? AND done_at IS NULL");function Z(e,t=Date.now()){return n.engine.transaction(()=>{var r;if(!V.get(e))return[];let i=n.engine.getWorkRequest(e);if(!i||null===i.terminal_at||null!==i.legacy_agent_request_id)return[];Y.run(t,e);let s=[],a=e=>{e&&"queued"===e.state&&s.push(e.id)},o=K(i);if(o){let e,n=[],r=null;try{n=$({sourceEventId:o.id,parentRequestId:i.id,now:t})}catch(e){if(!(e instanceof E))throw e;console.error(`Wakes of ${o.id} could not be routed:`,e.message),r=e}for(let e of n)a(e.request);let s=n.filter(e=>"rejected"===e.wake.status||"unavailable"===e.wake.status);(r||s.length>0)&&a(z({key:`continuation:v1:wakes:${o.id}`,coordinatorId:i.target_agent_id,conversationId:o.conversation_id,sourceEventId:o.id,parent:i,intent:r?["[Wake not started] The Wakes in your last message could not be routed, so no work started:",r.message,G].join("\n\n"):(e=s.map(({wake:e})=>{let t=e.target_name_snapshot??e.requested_target??"an unnamed target",n=e.execution_kind??"unknown",r="blocked"===e.status?"is waiting (blocked)":`was ${e.status}`;return`- Wake ${e.position+1} (${n}) to ${t} ${r}: ${e.reason??e.reason_code??"no reason recorded"}`+(e.work_request_id?` Work Request: ${e.work_request_id}.`:" No Work Request was created.")}),[`[Wake not started] ${1===s.length?"One Wake":`${s.length} Wakes`} from your last message did not start any work:`,e.join("\n"),G].join("\n\n")),continues:"wake_outcome",subjects:s.flatMap(e=>e.wake.work_request_id?[e.wake.work_request_id]:[]),now:t}))}let d=function(e){if(!e.wake_event_id)return null;let t=j(e).return_to;return t&&"string"==typeof t.agent_id&&"string"==typeof t.conversation_id?{agentId:t.agent_id,conversationId:t.conversation_id}:null}(i);return d&&a(z({key:`continuation:v1:result:${i.id}`,coordinatorId:d.agentId,conversationId:d.conversationId,sourceEventId:o?.id??i.source_event_id,parent:i,intent:(r=o?.conversation_id===d.conversationId,[`[Work Request result] ${B(i.target_agent_id)} finished the ${i.execution_kind} you requested.`,X(i,r),G].join("\n\n")),continues:"result",subjects:[i.id],now:t})),s})}var Q=e.i(63020),ee=e.i(93399),et=e.i(91253);let en=["person","bot","service"],er="mcp:",ei={authentication_unavailable:503,unauthenticated:401,principal_mismatch:403,invalid_request:400,agent_not_found:404,conversation_not_found:404,conversation_not_writable:409,request_not_found:404,idempotency_conflict:409,internal_error:500};class es extends Error{code;constructor(e,t){super(t),this.name="AgentApiError",this.code=e}get status(){return ei[this.code]}}function ea(e){return"string"==typeof e&&en.includes(e)}function eo(e,t){return e.kind===t.kind&&e.id===t.id}function ed(e){return"string"==typeof e&&e.trim().length>0}function eu(e,t){return!!n.default.prepare("SELECT 1 FROM conversation_participants WHERE conversation_id = ? AND participant_kind = ? AND participant_id = ?").get(e,t.kind,t.id)}function el(e){switch(e){case"running":case"waiting":return"dispatched";case"completed":return"completed";case"failed":case"cancelled":return"failed";default:return"accepted"}}function ec(e){if(!ea(e.kind)||!ed(e.id)||"bot"===e.kind&&!n.bots.getById(e.id))throw new es("unauthenticated","Authentication failed.")}let e_={invalid_request:"invalid_request",conversation_not_found:"conversation_not_found",conversation_not_writable:"conversation_not_writable",target_not_found:"agent_not_found",idempotency_conflict:"idempotency_conflict",unknown_principal:"unauthenticated",intake_failed:"internal_error"};function ep(e){return Promise.all(e.requestIds.map(e$)).then(()=>void 0)}function ef(e,t,n){let r;if(ec(e),!ed(t.agentId))throw new es("invalid_request","agentId is required.");if(!ed(t.content))throw new es("invalid_request","content is required.");if(!ed(t.idempotencyKey)||t.idempotencyKey.length>200)throw new es("invalid_request","An idempotency key (1-200 characters) is required.");if(void 0!==t.conversationId&&null!==t.conversationId&&!ed(t.conversationId))throw new es("invalid_request","conversationId must be a non-empty string when present.");try{r=(0,u.acceptConversationMessage)({surface:"api",requester:e,idempotencyKey:t.idempotencyKey,conversation:t.conversationId?{id:t.conversationId}:{create:!0},content:t.content,fingerprint:[t.agentId,t.conversationId??null,t.content],route:()=>({deliveries:[{agentId:t.agentId}]}),beforeCommit:n,dispatch:ep})}catch(e){if(e instanceof u.IntakeError)throw new es(e_[e.code],"intake_failed"===e.code?"The request could not be processed.":e.message);throw e}let i=r.requests[0];return{accepted:{requestId:i?eK(i):r.requestIds[0],conversationId:r.conversationId,acceptedMessageId:r.acceptedMessageId,state:i?el(i.state):"accepted",replayed:r.replayed},dispatched:r.dispatched}}function eh(e,t,r,i){n.engine.transaction(()=>{t&&n.engine.finishAttempt(t,{outcome:"failed",errorCategory:r,errorMessage:i});let s=n.engine.getWorkRequest(e);s&&("queued"===s.state||"running"===s.state)&&n.engine.transitionWorkRequest(e,{from:s.state,to:"failed",errorCode:r,errorMessage:i})})}let em=(0,o.createDispatcher)(n.default,n.engine);class eg extends Error{reason;constructor(e){super(`Commit deferred: ${e}`),this.reason=e}}async function ey(e){let t=await ek(e);ew(e,t||n.engine.getWorkRequest(e)?.state!=="queued")}function ew(e,t){for(let t of Z(e))e$(t);(function(e){let t=eF.forHopRequest(e);if(t)try{for(let e of eF.advance(t.id))e$(e)}catch(e){console.error("Exchange advance failed:",e instanceof Error?e.message:"unknown error")}})(e),t&&ev()}function ev(){for(let e of em.deferredRequestIds())eM.has(e)||e$(e)}async function ek(e){let t,a,u=n.engine.getWorkRequest(e);if(!u||"queued"!==u.state||null!==u.next_eligible_at&&em.now()<u.next_eligible_at)return!1;let l=n.bots.getById(u.target_agent_id);if(!l)return eh(e,null,"agent_unavailable","The agent is no longer registered."),!1;let c=(0,d.authorizeWorkRequest)(u);if(!c.ok){try{n.engine.transitionWorkRequest(e,{from:"queued",to:"failed",expectedVersion:u.version,reason:"policy_rejected",errorCode:c.code,errorMessage:c.reason})}catch(e){if(!(e instanceof s.EngineStoreError&&"stale_state"===e.code))throw e}return!1}let _=c.policy,p=(0,r.agentForDispatch)(l),f=eF.resumeFor(u,p)??function(e,t){if("revision"!==e.execution_kind)return{ok:!0,binding:null};let r=j(e).resume_work_request,i="string"==typeof r?n.engine.getWorkRequest(r):void 0;if(!i||i.root_request_id!==e.root_request_id||i.target_agent_id!==e.target_agent_id||!["implementation","revision"].includes(i.execution_kind))return{ok:!1,reason:"The revision does not reference an implementation of this Agent in this lineage."};let s=n.engine.getActiveSessionBinding({agentId:e.target_agent_id,adapter:t,conversationId:i.source_conversation_id,requestId:i.id});return s?{ok:!0,binding:s}:{ok:!1,reason:"The session of the referenced implementation is not available to resume."}}(u,p);if(!f.ok){try{n.engine.transitionWorkRequest(e,{from:"queued",to:"failed",expectedVersion:u.version,reason:"session_unavailable",errorCode:"session_unavailable",errorMessage:f.reason})}catch(e){if(!(e instanceof s.EngineStoreError&&"stale_state"===e.code))throw e}return!1}let h=null,m=null;try{h=(0,r.prepareDispatch)({bot:l,history:[...n.default.prepare(`SELECT * FROM messages WHERE conversation_id = ?
|
|
15
|
+
AND rowid <= (SELECT rowid FROM messages WHERE id = ?)
|
|
16
|
+
ORDER BY rowid ASC`).all(u.source_conversation_id,u.source_event_id).map(e=>({speakerLabel:function(e){if("bot"===e.sender_kind&&e.sender_id){let t=n.bots.getById(e.sender_id);return t?t.name:`bot:${e.sender_id}`}return`${e.sender_kind??"person"}:${e.sender_id??"unknown"}`}(e),fromAgent:"bot"===e.sender_kind&&e.sender_id===l.id,content:e.content})),...function(e){if(e.requester_kind===H.kind&&e.requester_id===H.id&&"coordinator_continuation"===j(e).source)return[{speakerLabel:U,fromAgent:!1,content:e.intent}];if(!e.wake_event_id)return[];let t=j(e),r=Array.isArray(t.context_work_requests)?t.context_work_requests.filter(e=>"string"==typeof e):[],i=[`[${e.execution_kind} Wake from ${B(e.requester_id)}] Work Request: ${e.id}`,`Objective:
|
|
17
|
+
${e.intent}`];for(let s of("string"==typeof t.resume_work_request&&i.push(`This revision continues your session from Work Request ${t.resume_work_request}.`),r)){let t=n.engine.getWorkRequest(s);t&&t.root_request_id===e.root_request_id&&i.push(`Context:
|
|
18
|
+
${X(t)}`)}return[{speakerLabel:U,fromAgent:!1,content:i.join("\n\n")}]}(u),...eF.turnContext(u)??[]],toolProfile:_.tool_profile,sessionBinding:f.binding?{bindingId:f.binding.id,externalSessionId:f.binding.external_session_id}:null,..."freshSession"in f&&f.freshSession?{freshSession:!0}:{}})}catch(e){m=e instanceof r.DispatchFailure?e:new r.DispatchFailure("runtime_failed","The agent runtime did not complete the turn.")}let g={agent:p,agent_id:l.id,execution_kind:_.execution_kind,tool_profile:_.tool_profile,policy_rule:_.rule},y=new AbortController;try{t=n.engine.transaction(()=>{let t=em.claim(e,{expectedVersion:u.version,data:{agent:p}});if(!t.ok)return a=t.blockedBy,null;if(h){let r=em.now(),s=em.control.attemptDeadlineFor(t.request,r),a={...h.input,deadlineAt:s,signal:y.signal},o=(0,i.beginAttempt)(n.engine,e,{agent:p,adapter:h.adapter,input:a,snapshot:g,now:r});return em.recordLaunchIntent(t.lease,o.attempt.id,h.adapter.name,h.adapter.launchIntent?.(o.input)??null),eF.hopClaimed(e,o.attempt.id,r),{lease:t.lease,attempt:o}}let r=n.engine.createAttempt(e,{kind:"launch",adapter:p,toolProfile:_.tool_profile,launchSnapshot:g});return eF.hopClaimed(e,r.id,r.started_at),{lease:t.lease,attempt:r.id}})}catch(e){if(e instanceof s.EngineStoreError&&"stale_state"===e.code)return!1;throw e}if(!t)return a&&e$(a),!1;let{lease:w}=t;if(!h||"string"==typeof t.attempt){let i=m??new r.DispatchFailure("runtime_failed","The agent runtime did not complete the turn."),s="string"==typeof t.attempt?t.attempt:t.attempt.attempt.id;return n.engine.transaction(()=>{em.assertHeld(w),eh(e,s,i.code,i.message),em.release(w,"failed")}),!0}let v=t.attempt.attempt.id;return eE.set(e,{attemptId:v,controller:y}),await eI(w,async()=>{(0,o.dispatchFault)("before_launch",e);try{let r=await (0,i.runAttempt)(n.engine,t.attempt,h.adapter,{fence:()=>em.holds(w),onEvent:t=>{"started"===t.type&&(0,o.dispatchFault)("after_run_id_persisted",e)},sanitize:e=>eF.sanitizeHopResult(u,e),project:(e,t)=>eA(w,u,t,e)});r.abandoned&&await eT(r.abandoned,{localSignalled:!0,launched:!0}),r.projected?.retryAt!=null&&eb(e,r.projected.retryAt)}catch(e){eR(w,v,e)}},y),eE.get(e)?.attemptId===v&&eE.delete(e),!0}let eE=new Map;function eb(e,t){let n=setTimeout(()=>{e$(e)},Math.max(0,t-em.now()));n.unref&&n.unref()}async function eS(e){let t=eE.get(e.requestId);if(t&&t.attemptId===e.attemptId){t.controller.abort();let n=eM.get(e.requestId);if(n){let t=`abandoned:${e.attemptId}`;eM.delete(e.requestId),eM.set(t,n),n.finally(()=>{eM.get(t)===n&&eM.delete(t)})}}await eT(e,{localSignalled:!!t&&t.attemptId===e.attemptId,launched:e.launched})}async function eT(e,t){let i,s=e.transport?(0,r.adapterForTransport)(e.transport)?.reconciler??null:null;i="failed"===e.externalCancel?"failed":e.externalRunId?s?.cancel?await s.cancel(e.externalRunId):"unsupported":t.launched?"unsupported":"not_launched",n.engine.appendEvent(e.requestId,{type:"external_cancel",attemptId:e.attemptId,data:{status:i,reason:e.reason,external_run_id:e.externalRunId,transport:e.transport,local_signalled:t.localSignalled},now:em.now()})}async function eI(e,t,r){let i=setInterval(()=>{try{em.heartbeat(e);let t=n.engine.getWorkRequest(e.requestId);r&&t&&(null!==t.cancel_requested_at||s.TERMINAL_STATES.includes(t.state))&&r.abort()}catch(e){console.error("Dispatch heartbeat failed:",e)}},em.config.heartbeatMs);i.unref&&i.unref();try{return await t()}finally{clearInterval(i)}}function eR(e,t,n){if(!(n instanceof o.LeaseLostError)){if(n instanceof eg){try{em.defer(e,n.reason,t)}catch(e){if(!(e instanceof o.LeaseLostError))throw e}return}throw n}}function eA(e,s,a,d){if((0,o.dispatchFault)("before_terminal_commit",s.id),em.assertHeld(e),"failed"===d.status&&d.launchUnconfirmed&&!a.external_run_id)throw new eg("launch_unconfirmed");let u=s.id,l=em.now(),c=n.engine.getWorkRequest(u)??s,_=null!==c.cancel_requested_at;if(_||null!==c.deadline_at&&l>=c.deadline_at)return _?n.engine.transitionWorkRequest(u,{from:"running",to:"cancelled",reason:"cancel_requested",errorCode:"cancelled",errorMessage:c.cancel_reason??"The request was cancelled.",data:{attempt_outcome:a.outcome},now:l}):n.engine.transitionWorkRequest(u,{from:"running",to:"failed",reason:"timed_out",errorCode:"timed_out",errorMessage:"The request passed its deadline.",data:{deadline_at:c.deadline_at,attempt_outcome:a.outcome},now:l}),"completed"===d.status&&(0,i.recordLateResult)(n.engine,a,d,l),em.release(e,_?"cancelled":"timed_out"),{retryAt:null};if("completed"!==d.status||null===d.output){let t=(0,r.dispatchFailureFor)(d),n=em.control.settleFailure(u,{category:"completed"===d.status?"result_contract":d.failure?.category??"runtime_failed",code:d.failure?.code??null,errorCode:t.code,errorMessage:t.message,..."failed"===d.externalCancel?{attention:"external_cancel_failed"}:{}},l);return em.release(e,n.outcome),{retryAt:"retry"===n.decision.action?n.decision.nextEligibleAt:null}}let p=(0,Q.hopOf)(s);if(p){let t=eF.commitHop(s,a,d,l);return n.engine.transitionWorkRequest(u,{from:"running",to:"completed",result:t,now:l}),em.release(e,"completed"),eF.advance(p.exchangeId,l),{retryAt:null}}let f=(0,t.randomUUID)();return n.default.prepare("INSERT INTO messages (id, conversation_id, sender_type, sender_id, sender_kind, request_id, content, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run(f,s.source_conversation_id,"bot",s.target_agent_id,"bot",u,d.output,l),"edit"===s.tool_profile&&d.externalSessionId&&n.engine.bindSession({agentId:s.target_agent_id,adapter:a.adapter,externalSessionId:d.externalSessionId,conversationId:s.source_conversation_id,requestId:u,sourceAttemptId:a.id,now:l}),n.engine.transitionWorkRequest(u,{from:"running",to:"completed",result:{reply_message_id:f},now:l}),em.release(e,"completed"),{retryAt:null}}function eq(e){return e?{kind:e.kind,..."run"===e.kind?{state:e.state}:{},..."accepted"===e.kind?{run_id:e.runId}:{},..."rejected"===e.kind?{status:e.status,code:e.code}:{}}:null}async function ex(e){let t=n.engine.getWorkRequest(e.requestId);if(!t||"running"!==t.state)return void em.release(e,"stale");let s=async(r,i)=>{let s=n.engine.transaction(()=>{em.assertHeld(e);let n=em.control.enforceRequest(t.id,em.now(),{force:!0});return n?(i?.(),{enforced:n}):{value:r()}});return"enforced"in s?(s.enforced.abandoned&&await eS(s.enforced.abandoned),{won:!0}):{won:!1,value:s.value}},a=null;try{let p;if((await s(()=>void 0)).won)return;let f=n.engine.listAttempts(t.id).find(e=>null===e.finished_at);if(!f)return void n.engine.transaction(()=>{em.assertHeld(e),n.engine.transitionWorkRequest(t.id,{from:"running",to:"failed",reason:"retryable",errorCode:"interrupted",errorMessage:"The request was interrupted before its Attempt was recorded."}),em.release(e,"interrupted")});a=f.id;let h={};try{h=JSON.parse(f.launch_snapshot)}catch{}let m="string"==typeof h.transport?(0,r.adapterForTransport)(h.transport):null,g=m?.reconciler??null,y=async(e,r,i,a)=>!(await s(()=>{n.engine.appendEvent(t.id,{type:"reconcile_decided",attemptId:f.id,data:{phase:e,...r,external_run_id:a,observation:eq(i)}})})).won,w=f.external_run_id,v=null;if(w){if(g){if(v=await g.inspect(w),p=(0,o.decideWithRunId)(v),!await y("run",p,v,w))return}else if(p={action:"interrupted",reason:"runtime_unobservable"},!await y("run",p,null,w))return}else{let r=em.launchIntent(f.id);if(p=(0,o.decideWithoutRunId)({reconcilable:!!g,intent:r,currentGrantFingerprint:g?.currentGrantFingerprint()??null}),"repost"===p.action&&g&&r?.body&&r.idempotency_key){if(!await y("launch",p,null,null))return;if(v=await g.repost({idempotencyKey:r.idempotency_key,body:r.body}),p=(0,o.decideRepostResult)(v),"accepted"===v.kind){var d,u,l,c,_;let r=v.runId,i=(d=e,u=t.id,l=f.id,c=r,_=m?.name??null,n.engine.transaction(()=>{let e=n.engine.getAttempt(l);if(!e)return null;if(null===e.finished_at)return em.assertHeld(d),n.engine.recordAttemptExternalIds(l,{externalRunId:c}),n.engine.appendEvent(u,{type:"runtime_started",attemptId:l,data:{adapter:_,external_run_id:c,recovered:!0}}),null;n.default.prepare("UPDATE work_attempts SET external_run_id = ? WHERE id = ? AND external_run_id IS NULL").run(c,l),n.engine.appendEvent(u,{type:"runtime_started",attemptId:l,data:{adapter:_,external_run_id:c,recovered:!0,after_abandon:!0}});let t="timed_out"===e.outcome?"timed_out":"cancelled"===e.outcome?"cancelled":"retried",r=null;try{let t=JSON.parse(e.launch_snapshot);r="string"==typeof t.transport?t.transport:null}catch{}return{requestId:u,attemptId:l,externalRunId:c,transport:r,reason:t,launched:!0}}));if(i)return void await eT(i,{localSignalled:!1,launched:!0});w=r}}if(!await y("launch",p,v,w))return}switch(p.action){case"defer":await s(()=>em.defer(e,p.reason,f.id));return;case"attention":await s(()=>em.setAttention(e,{attemptId:f.id,reason:p.reason,detail:v?JSON.stringify(eq(v)):null}));return;case"interrupted_attention":return void await s(()=>{n.engine.recordAttemptUsage(f.id,{usage:null,observedAt:Date.now()}),n.engine.finishAttempt(f.id,{outcome:"interrupted",errorCategory:"interrupted",errorMessage:`The provider run ${w} died.`}),em.setAttention(e,{attemptId:f.id,reason:p.reason})});case"fail":await s(()=>{n.engine.finishAttempt(f.id,{outcome:"failed",errorCategory:p.category,errorMessage:`The session provider refused the launch (${p.code}).`}),n.engine.transitionWorkRequest(t.id,{from:"running",to:"failed",reason:"retryable",errorCode:"runtime_failed",errorMessage:"The agent runtime did not start the turn."}),em.release(e,"failed")});return;case"interrupted":await s(()=>{w&&n.engine.recordAttemptUsage(f.id,{usage:null,observedAt:Date.now()}),n.engine.finishAttempt(f.id,{outcome:"interrupted",errorCategory:"interrupted",errorMessage:"The runtime cannot be observed after a restart; the outcome is unknown."}),n.engine.transitionWorkRequest(t.id,{from:"running",to:"failed",reason:"retryable",errorCode:"interrupted",errorMessage:"The agent turn was interrupted by a restart. It was not relaunched."}),em.release(e,"interrupted")});return}if(!g||!w)return;let k=w,E="string"==typeof h.session_binding_id?h.session_binding_id:null,b=E?n.default.prepare("SELECT external_session_id FROM session_bindings WHERE id = ?").get(E):void 0,S=new AbortController;if((await s(()=>eE.set(t.id,{attemptId:f.id,controller:S}))).won)return;await eI(e,async()=>{let r=await g.follow(k,{resumeSessionId:b?.external_session_id??null,deadlineAt:"number"==typeof h.deadline_at?h.deadline_at:null,signal:S.signal}),s=eF.sanitizeHopResult(t,r),a=null,o=n.engine.transaction(()=>{let r=n.engine.getAttempt(f.id);if(r&&null!==r.finished_at)return(0,i.recordLateResult)(n.engine,r,s,em.now()),{retryAt:null};em.assertHeld(e);let o=(a=m?(0,i.abandonedLocally)(f,m,S.signal,s):null)?(0,i.recordAbandonedResult)(n.engine,a,s):(0,i.recordAttemptResult)(n.engine,f.id,s);return eA(e,t,o,s)});a&&await eT(a,{localSignalled:!0,launched:!0}),null!==o.retryAt&&eb(t.id,o.retryAt)},S).finally(()=>{eE.get(t.id)?.attemptId===f.id&&eE.delete(t.id)})}catch(t){eR(e,a,t)}}function eN(){let e=[];for(let t of em.control.enforceDue())e.push((t.abandoned?eS(t.abandoned):Promise.resolve()).then(()=>ew(t.requestId,!0)).catch(e=>{console.error("Request enforcement follow-up failed:",e)}));for(let t of em.recoverable()){let n=`reconcile:${t.requestId}`;if(eM.has(n)||eM.has(t.requestId))continue;let r=em.takeOver(t);if(!r)continue;let i=ex(r).then(()=>ew(t.requestId,!em.holds(r))).catch(e=>{console.error("Dispatch reconciliation failed unexpectedly:",e)}).finally(()=>{eM.delete(n)});eM.set(n,i),e.push(i)}for(let e of(ev(),n.default.prepare(`
|
|
19
|
+
SELECT id FROM work_requests
|
|
20
|
+
WHERE state = 'queued' AND legacy_agent_request_id IS NULL AND executor = 'dispatcher' AND next_eligible_at IS NOT NULL AND next_eligible_at <= ?
|
|
21
|
+
ORDER BY next_eligible_at ASC, id ASC
|
|
22
|
+
`).all(em.now()).map(e=>e.id)))eM.has(e)||e$(e);return Promise.all(e).then(()=>void 0)}async function eC(e,t={}){let n=em.control.cancel(e,t);return"cancel_requested"!==n.outcome||n.replayed||eE.get(e)?.controller.abort(),n.abandoned&&await eS(n.abandoned),"cancelled"!==n.outcome||n.replayed||ew(e,!0),n}function eO(e,t,n){let r=P({wakeId:e,decision:t,caller:n});if(r.request&&r.runnable&&e$(r.request.id),r.request&&r.ended)for(let e of Z(r.request.id))e$(e);return r}function eL(e){let t=W(e);return t.request?.state==="queued"&&e$(t.request.id),t}function eD(e,t){return(0,k.revokeWakeGrant)(e,t)}let eM=new Map;function e$(e){let t=eM.get(e);if(t)return t;let n=ey(e).catch(e=>{console.error("Agent dispatch failed unexpectedly:",e)}).finally(()=>{eM.get(e)===n&&eM.delete(e)});return eM.set(e,n),n}function eW(){return Promise.all([eN(),...(function(e=Date.now()){let t=n.default.prepare("SELECT request_id AS id FROM terminal_followups WHERE done_at IS NULL ORDER BY created_at ASC, request_id ASC").all(),r=new Set;for(let n of t)for(let t of Z(n.id,e))r.add(t);for(let e of n.default.prepare(`
|
|
23
|
+
SELECT w.id FROM work_requests w JOIN terminal_followups f ON f.request_id = w.parent_request_id
|
|
24
|
+
WHERE w.state = 'queued' AND (w.wake_event_id IS NOT NULL OR (w.requester_kind = ? AND w.requester_id = ?))
|
|
25
|
+
ORDER BY w.created_at ASC, w.id ASC
|
|
26
|
+
`).all(H.kind,H.id))r.add(e.id);return[...r]})().map(e$),...(function(){let e=[];for(let t of eF.openIds())try{e.push(...eF.advance(t))}catch(e){console.error("Exchange recovery failed:",e instanceof Error?e.message:"unknown error")}return e})().map(e$)]).then(()=>void 0)}let eF=(0,Q.createExchangeStore)(n.default,n.engine);function eP(e){let{exchange:t,created:n}=eF.create(e),r=eH(t.id);return{exchange:eF.view(t.id),created:n,dispatched:r}}function eH(e){return Promise.all(eF.advance(e).map(e$)).then(()=>void 0)}function eU(e){return eF.view(e)}async function ej(e,t,r=null,i){let{hopRequestId:o,replayed:d}=n.default.transaction(()=>{let n=eF.requestCancel(e,t,r);return i?.(n.exchange),n}).immediate();if(o){let e=n.engine.getWorkRequest(o);if(e&&!s.TERMINAL_STATES.includes(e.state))try{await eC(o,{actor:t,reason:r??"The exchange was cancelled."})}catch(e){if(!(e instanceof a.ControlError))throw e}}return eF.advance(e),{exchange:eF.view(e),replayed:d}}let eB=["attempt_started","attempt_finished","session_bound","backfilled","runtime_progress","policy_selected","dispatch_claimed","dispatch_released","dispatch_deferred","dispatch_lease_taken_over","launch_intent_recorded","reconcile_decided","reconcile_deferred","attention_set","attempt_abandoned","external_cancel","late_result_recorded"];function eK(e){return e.legacy_agent_request_id??e.id}function eX(e,t){ec(e);let r=n.default.prepare("SELECT id FROM work_requests WHERE legacy_agent_request_id = ?").get(t),i=n.engine.getWorkRequest(r?r.id:t),s=!!i&&"service"===e.kind&&!!(0,Q.hopOf)(i);if(!i||!(s?eG(e,i):eu(i.source_conversation_id,e)||eG(e,i)))throw new es("request_not_found","No request with that id is visible to this principal.");return i}function eG(e,t){if(!(0,Q.hopOf)(t))return!1;let n=eF.forHopRequest(t.id);return!!n&&n.requester_kind===e.kind&&n.requester_id===e.id&&("service"!==e.kind||eJ(e,n))}function eJ(e,t){let r=(0,et.loadServiceGrants)();if("absent"===r.state||"invalid"===r.state)return!1;let i=r.grants.get(e.id),s=t.idempotency_key.startsWith(et.MESSAGE_KEY_PREFIX)?"sessions:message":"exchanges:read",a=e=>!!i?.get(e)?.has(s)&&!!n.bots.getById(e);return a(t.source_agent_id)&&(null===t.destination_agent_id||a(t.destination_agent_id))}function ez(e,t){var r;let i,s,a,o,d,u,l=(i=(r=eX(e,t)).result?JSON.parse(r.result):null,o=(a=(s=(0,Q.hopOf)(r)?.hop==="ask"?eF.forHopRequest(r.id):void 0)?i?.answer_message_id:i?.reply_message_id)?n.default.prepare("SELECT id, content FROM messages WHERE id = ?").get(a):void 0,d=s?n.default.prepare("SELECT id FROM messages WHERE conversation_id = ? AND request_id = ? AND sender_kind = ? ORDER BY rowid ASC LIMIT 1").get(s.origin_conversation_id,r.id,s.requester_kind):void 0,u="failed"===r.state||"cancelled"===r.state,{requestId:eK(r),conversationId:s?s.origin_conversation_id:r.source_conversation_id,agentId:r.target_agent_id,acceptedMessageId:d?d.id:r.source_event_id,state:el(r.state),reply:o?{messageId:o.id,content:o.content}:null,failure:u?{code:r.error_code??r.state,message:r.error_message??""}:null,events:n.engine.listEvents(r.id).flatMap(e=>{let t=function(e){if("state_changed"===e.type){let t=e.data?JSON.parse(e.data).to:void 0;return"running"===t?"dispatched":"completed"===t?"completed":"failed"===t||"cancelled"===t?"failed":t??null}return eB.includes(e.type)?null:e.type}(e);return t?[{type:t,at:e.created_at}]:[]}),createdAt:r.created_at,updatedAt:r.updated_at});return"service"!==e.kind?l:(0,ee.serviceRedactor)().deep(l)}let eV={agent:"agent",bot:"direct",group:"group"};function eY(e,t){ec(e);let r=n.default.prepare("SELECT * FROM conversations WHERE id = ?").get(t);if(!r||!eu(r.id,e))throw new es("conversation_not_found","No conversation with that id is visible to this principal.");let i=n.default.prepare("SELECT participant_kind, participant_id, joined_at FROM conversation_participants WHERE conversation_id = ? ORDER BY joined_at ASC, rowid ASC").all(r.id),s=function(e){if("service"!==e.kind)return()=>!1;let t=new Map;return n=>{if(!n)return!1;let r=t.get(n);if(void 0===r){let i=eF.forHopRequest(n);r=!!i&&!(i.requester_kind===e.kind&&i.requester_id===e.id&&eJ(e,i)),t.set(n,r)}return r}}(e),a=n.default.prepare("SELECT * FROM messages WHERE conversation_id = ? ORDER BY rowid ASC").all(r.id).filter(e=>!s(e.request_id)),o={conversationId:r.id,type:eV[r.type]??"agent",origin:r.origin_kind&&r.origin_id?{kind:r.origin_kind,id:r.origin_id}:null,participants:i.map(e=>({kind:e.participant_kind,id:e.participant_id,joinedAt:e.joined_at})),messages:a.map((e,t)=>{var n,i;let s;return{messageId:e.id,seq:t+1,sender:(n=e,i=r,s=n.sender_kind??("bot"===n.sender_type?"bot":"person"),n.sender_id?{kind:s,id:n.sender_id}:"bot"!==s&&i.origin_kind===s&&i.origin_id?{kind:s,id:i.origin_id}:{kind:s,id:"unknown"}),content:e.content,requestId:e.request_id,createdAt:e.created_at}}),events:n.projector.listConversationEvents(r.id).filter(e=>!s(e.requestId)).map((e,t)=>({...e,seq:t+1}))};return"service"!==e.kind?o:(0,ee.serviceRedactor)().deep(o)}},27510,53059,57281,54226,e=>{"use strict";e.s(["DispatchFailure",()=>u,"adapterForTransport",()=>_,"agentForDispatch",()=>l,"dispatchFailureFor",()=>f,"prepareDispatch",()=>p],27510);var t=e.i(62349),n=e.i(18966),r=e.i(93029),i=e.i(51749),s=e.i(71114),a=e.i(6200),o=e.i(35613),d=e.i(64974);class u extends Error{code;constructor(e,t){super(t),this.name="DispatchFailure",this.code=e}}function l(e){return(0,t.resolveAgent)(e).agent}let c={"hermes-gateway":()=>(0,s.createHermesAttemptAdapter)({fetchImpl:null}),"session-provider":()=>(0,a.createSessionProviderAttemptAdapter)()};function _(e){return"hermes-gateway"===e?c["hermes-gateway"]():"session-provider"===e?(0,a.createSessionProviderAttemptAdapter)():null}function p(e){var s,a;let o,l=(0,t.resolveAgent)(e.bot);if(!l.launchable)throw new u("agent_unavailable","connection"===(s=l.launch_blocker)?"The agent has no runtime connection. Choose one in Config.":"session_scope"===s?"The agent has no session scope. Choose one in Config.":"The agent has an unsupported Agent type.");let _={prompt:{kind:"conversation",system:(o=(a=e.bot).title?`${a.name} (${a.title})`:a.name,`You are ${o}.
|
|
27
|
+
${a.description}`),history:e.history},toolProfile:e.toolProfile??d.TOOL_PROFILE_FOR_KIND.conversation,sessionBinding:e.sessionBinding??null,correlation:{},...e.freshSession?{freshSession:!0}:{}};if("hermes-gateway"===(0,t.agentTransport)(l.agent))return{agent:l.agent,adapter:c["hermes-gateway"](),input:{..._,target:{agentId:e.bot.id,agent:l.agent,hermesProfilePath:(0,i.hermesProfilePathForBot)(e.bot)},cwd:null}};let p=_.sessionBinding?null:function(e){let t=(0,n.directLaunchWorkspace)(e);if(!t){let t=(0,n.readStoredScope)(e);throw new u("agent_unavailable",t?.kind==="sessions"?"This turn starts a new session but the agent is limited to selected sessions.":"The agent has no default workspace for a new session. Set one in Config, or resume one of its sessions.")}try{return(0,r.ensureBotWorkdir)(t)}catch{throw new u("agent_unavailable","The agent working directory is unavailable.")}}(e.bot);return{agent:l.agent,adapter:c["session-provider"](),input:{..._,target:{agentId:e.bot.id,agent:l.agent},cwd:p}}}function f(e){let t=e.failure?.category??"runtime_failed";if("hermes-gateway"===e.adapter)return"unavailable"===t?new u("agent_unavailable","The agent runtime is not configured."):new u("runtime_failed",`The agent runtime did not complete the turn (${e.failure?.code??"unknown"}).`);let n="string"==typeof e.failure?.code&&e.failure.code?` [${e.failure.code}]`:"";return"unavailable"===t||"unsupported_authority"===t?new u("agent_unavailable",`The agent runtime is not available${n}.`):"cancelled"===t?new u("runtime_failed","The agent run was cancelled."):"launch_failed"===t?new u("runtime_failed","The agent runtime did not start the turn."):new u("runtime_failed","The agent runtime did not complete the turn.")}var h=e.i(54799),m=e.i(29370);function g(e){return"completed"===e.status?"succeeded":e.failure?.category==="cancelled"?"cancelled":e.failure?.category==="timed_out"?"timed_out":"failed"}function y(e,t,n){(function(e){if(e.usage||"completed"===e.status||e.externalRunId)return!0;let t=e.failure?.category;return void 0!==t&&!["unavailable","unsupported_authority","launch_failed"].includes(t)})(n)&&e.recordAttemptUsage(t,{usage:n.usage??null,observedAt:n.finishedAt})}function w(e,t,n){return y(e,t,n),e.finishAttempt(t,{outcome:g(n),output:n.output,errorCategory:n.failure?.category??null,errorMessage:n.failure?.message??null,artifacts:n.artifacts,...n.externalRunId?{externalRunId:n.externalRunId}:{},...n.externalSessionId?{externalSessionId:n.externalSessionId}:{},now:n.finishedAt})}function v(e,t,n,r=Date.now()){y(e,t.id,n);let i=e.getWorkRequest(t.request_id);e.appendEvent(t.request_id,{type:"late_result_recorded",attemptId:t.id,data:{attempt_number:t.attempt_number,attempt_outcome:t.outcome,result_status:n.status,result_outcome:g(n),error_category:n.failure?.category??null,external_run_id:n.externalRunId,output:n.output,request_state:i?.state??null},now:r})}async function k(e,t,n,r={}){let i,s=!1,a=!1;try{i=await n.run(t.input,n=>{var i,o;if("started"===n.type&&(a=!0),s||(i=t.attempt,o=r.fence,!e.transaction(()=>(!o||!!o())&&("started"===n.type?((n.externalRunId||n.externalSessionId)&&e.recordAttemptExternalIds(i.id,{...n.externalRunId?{externalRunId:n.externalRunId}:{},...n.externalSessionId?{externalSessionId:n.externalSessionId}:{}}),e.appendEvent(i.request_id,{type:"runtime_started",attemptId:i.id,data:{adapter:n.adapter,external_run_id:n.externalRunId},now:n.at})):e.appendEvent(i.request_id,{type:"runtime_progress",attemptId:i.id,data:{adapter:n.adapter,...n.detail},now:n.at}),!0)))){s=!0;return}r.onEvent?.(n)})}catch(r){let e=Date.now();i={status:"failed",adapter:n.name,externalRunId:null,externalSessionId:null,output:null,artifacts:[],startedAt:t.attempt.started_at,finishedAt:e,failure:(0,m.attemptFailure)("runtime_failed",r instanceof Error?r.message:String(r))}}return r.sanitize&&(i=r.sanitize(i)),e.transaction(()=>{let s=e.getAttempt(t.attempt.id);if(s&&null!==s.finished_at)return v(e,s,i),{attempt:s,result:i,projected:void 0,late:!0,abandoned:null};let o=a?E(t.attempt,n,t.input.signal??null,i):null,d=o?b(e,o,i):w(e,t.attempt.id,i),u=r.project?r.project(i,d):void 0;return{attempt:d,result:i,projected:u,late:!1,abandoned:o}})}function E(e,t,n,r){if("failed"!==r.status)return null;let i=r.failure?.category,s="failed"===r.externalCancel,a={requestId:e.request_id,attemptId:e.id,externalRunId:r.externalRunId,transport:t.name};return"cancelled"!==i&&"timed_out"!==i?s?{...a,reason:"observation_lost",externalCancel:"failed"}:null:("cancelled"!==i||n?.aborted)&&(!t.externalCancel||s)?{...a,reason:i,externalCancel:s?"failed":null}:null}function b(e,t,n){y(e,t.attemptId,n);let r="failed"===t.externalCancel?"The runtime did not accept the cancel request":"The runtime cannot stop the run",i=e.finishAttempt(t.attemptId,{outcome:g(n),errorCategory:"abandoned",errorMessage:`${n.failure?.message??"The attempt was interrupted."} ${r}; it may continue and a later result is not awaited.`.slice(0,500),artifacts:n.artifacts,...n.externalRunId?{externalRunId:n.externalRunId}:{},...n.externalSessionId?{externalSessionId:n.externalSessionId}:{},now:n.finishedAt});return t.externalRunId=i.external_run_id,e.appendEvent(t.requestId,{type:"attempt_abandoned",attemptId:t.attemptId,data:{reason:t.reason,attempt_number:i.attempt_number,external_run_id:i.external_run_id,transport:t.transport,local_only:!0,error_code:n.failure?.code??null,external_cancel:t.externalCancel},now:n.finishedAt}),i}e.s(["abandonedLocally",0,E,"beginAttempt",0,function(e,t,n){let r=n.input.sessionBinding;if(r&&!r.bindingId)throw new o.EngineStoreError("invalid_input","A persisted resume attempt names its Session Binding.");if(r&&n.input.freshSession)throw new o.EngineStoreError("invalid_input","A fresh-session attempt cannot resume a Session Binding.");let i=e.createAttempt(t,{kind:r?"resume":"launch",adapter:n.agent,toolProfile:n.input.toolProfile,launchSnapshot:function(e){let{input:t}=e;return{...e.snapshot??{},agent:e.agent,agent_id:t.target.agentId,transport:e.adapter.name,cwd:t.cwd,tool_profile:t.toolProfile,hermes_profile_path:t.target.hermesProfilePath??null,prompt_kind:t.prompt.kind,prompt_hash:(0,h.createHash)("sha256").update(JSON.stringify(t.prompt)).digest("hex"),session_binding_id:t.sessionBinding?.bindingId??null,fresh_session:!0===t.freshSession,deadline_at:t.deadlineAt??null}}(n),resumedSessionBindingId:r?.bindingId??null,now:n.now});return{attempt:i,input:(0,m.freezeAttemptInput)({...n.input,correlation:{...n.input.correlation,requestId:t,attemptId:i.id}})}},"recordAbandonedResult",0,b,"recordAttemptResult",0,w,"recordLateResult",0,v,"runAttempt",0,k],53059);var S=e.i(11626);class T extends Error{code;constructor(e,t){super(t),this.name="ControlError",this.code=e}}let I=["queued","blocked","running","waiting"];function R(e){try{let t=JSON.parse(e.launch_snapshot);return t&&"object"==typeof t?t:{}}catch{return{}}}function A(e,t,n={}){let r=n.now??Date.now,i=n.cancelGraceMs??3e4,s=e.prepare("SELECT * FROM work_attempts WHERE request_id = ? AND finished_at IS NULL"),a=e.prepare("SELECT COUNT(*) AS n FROM work_attempts WHERE request_id = ?"),d=e.prepare("SELECT owner, token, expires_at FROM dispatch_leases WHERE request_id = ?"),u=e.prepare("SELECT 1 FROM engine_events WHERE attempt_id = ? AND type = 'runtime_started' LIMIT 1");function l(e){let n=t.getWorkRequest(e);if(!n)throw new T("not_found",`No work request ${e}.`);return n}function c(e,t,n,r){if(r&&(!e||!r(e,t,n)))throw new T("forbidden",`Not allowed to ${n} this request.`)}function _(e){return Math.max(e.attempt_count,a.get(e.id).n)}function p(t,n){e.prepare("UPDATE dispatch_attention SET cleared_at = ? WHERE request_id = ? AND cleared_at IS NULL").run(n,t)}function f(n,r,i){let s=d.get(n);s&&(e.prepare("DELETE FROM dispatch_leases WHERE request_id = ?").run(n),t.appendEvent(n,{type:"dispatch_released",data:{owner:s.owner,outcome:r,forced:!0},now:i}))}function m(e,n,r){let i=s.get(e.id);if(!i)return null;let a=R(i).transport;return t.finishAttempt(i.id,{outcome:"timed_out"===n?"timed_out":"cancelled"===n?"cancelled":"interrupted",errorCategory:"abandoned",errorMessage:{cancelled:"The request was cancelled while this Attempt was open; its result is no longer awaited.",timed_out:"The Attempt passed its deadline; its result is no longer awaited.",retried:"An operator retried the request; this Attempt is superseded."}[n],now:r}),t.appendEvent(e.id,{type:"attempt_abandoned",attemptId:i.id,data:{reason:n,attempt_number:i.attempt_number,external_run_id:i.external_run_id,transport:"string"==typeof a?a:null},now:r}),{requestId:e.id,attemptId:i.id,externalRunId:i.external_run_id,transport:"string"==typeof a?a:null,reason:n,launched:!!i.external_run_id||!!i.external_session_id||!!u.get(i.id)}}function g(n,r,i,s){let a=r?`${r.kind}:${r.id}`:null;e.prepare("UPDATE work_requests SET cancel_requested_at = ?, cancel_requested_by = ?, cancel_reason = ?, updated_at = ? WHERE id = ? AND cancel_requested_at IS NULL").run(s,a,i,s,n.id),t.appendEvent(n.id,{type:"cancel_requested",data:{by:a,reason:i,state:n.state},now:s})}function y(e,n,r={}){return t.transitionWorkRequest(e.id,{from:e.state,to:"cancelled",reason:"cancel_requested",errorCode:"cancelled",errorMessage:e.cancel_reason??"The request was cancelled.",data:r,now:n})}function w(e,n,r={}){return t.transitionWorkRequest(e.id,{from:e.state,to:"failed",reason:"timed_out",errorCode:"timed_out",errorMessage:"The request passed its deadline.",data:{...r,deadline_at:e.deadline_at},now:n})}function v(n,r,i){let s=(0,S.storedRetryPolicy)(n.retry_policy),a=(0,S.classifyFailure)(r.category,r.code),o=_(n),d=(0,S.decideRetry)({policy:s,attemptCount:o,disposition:a,deadlineAt:n.deadline_at,now:i}),u=r.attention&&"retry"===d.action?{action:"attention"}:d,l={category:r.category,disposition:a,attempt_count:o,max_attempts:s.max_attempts};switch(u.action){case"retry":{e.prepare("UPDATE work_requests SET next_eligible_at = ? WHERE id = ?").run(u.nextEligibleAt,n.id);let s=t.transitionWorkRequest(n.id,{from:"running",to:"queued",reason:"retry_scheduled",data:{...l,retry:u.retry,delay_ms:u.delayMs,next_eligible_at:u.nextEligibleAt,error_code:r.errorCode},now:i});return{outcome:"retry_scheduled",decision:u,request:s}}case"deadline":return{outcome:"timed_out",decision:u,request:w(n,i,l)};case"attention":{let s=r.attention??`failure:${r.category??"unknown"}`;return e.prepare("INSERT INTO dispatch_attention (id, request_id, attempt_id, reason, detail, created_at) VALUES (?, ?, NULL, ?, ?, ?)").run((0,h.randomUUID)(),n.id,s,r.code,i),t.appendEvent(n.id,{type:"attention_set",data:{reason:s,detail:r.code},now:i}),{outcome:"attention",decision:u,request:t.transitionWorkRequest(n.id,{from:"running",to:"waiting",reason:`manual_attention:${r.attention??r.category??"unknown"}`,data:l,now:i})}}case"exhausted":if(s.max_attempts>1)return{outcome:"retries_exhausted",decision:u,request:t.transitionWorkRequest(n.id,{from:"running",to:"failed",reason:"retries_exhausted",errorCode:r.errorCode,errorMessage:r.errorMessage,data:l,now:i})};case"fail":return{outcome:"failed",decision:u,request:t.transitionWorkRequest(n.id,{from:"running",to:"failed",errorCode:r.errorCode,errorMessage:r.errorMessage,data:"fail"===u.action?l:{},now:i})}}}let k={now:r,cancelGraceMs:i,cancel:(e,n={})=>t.transaction(()=>{let t=l(e);if(c(n.actor,t,"cancel",n.authorize),o.TERMINAL_STATES.includes(t.state))return{outcome:"already_terminal",state:t.state,replayed:!0,abandoned:null};let i=n.now??r();if("running"===t.state)return null!==t.cancel_requested_at?{outcome:"cancel_requested",state:"running",replayed:!0,abandoned:null}:(g(t,n.actor,n.reason??null,i),{outcome:"cancel_requested",state:"running",replayed:!1,abandoned:null});null===t.cancel_requested_at&&g(t,n.actor,n.reason??null,i);let s=l(e),a=m(s,"cancelled",i);return p(e,i),f(e,"cancelled",i),{outcome:"cancelled",state:y(s,i,{from_state:t.state}).state,replayed:!1,abandoned:a}}),retry:(n,i={})=>t.transaction(()=>{let s=l(n);if(c(i.actor,s,"retry",i.authorize),o.TERMINAL_STATES.includes(s.state))return{outcome:"already_terminal",state:s.state,abandoned:null};if("queued"===s.state)return{outcome:"already_queued",state:"queued",abandoned:null};if("waiting"!==s.state||null!==s.cancel_requested_at)return{outcome:"not_retryable",state:s.state,abandoned:null};let a=(0,S.storedRetryPolicy)(s.retry_policy),d=_(s);if(d>=a.max_attempts)return{outcome:"retries_exhausted",state:s.state,abandoned:null};let u=i.now??r();if(null!==s.deadline_at&&u>=s.deadline_at)return{outcome:"not_retryable",state:s.state,abandoned:null};let f=m(s,"retried",u);return p(n,u),e.prepare("UPDATE work_requests SET next_eligible_at = ? WHERE id = ?").run(u,n),{outcome:"retry_scheduled",state:t.transitionWorkRequest(n,{from:"waiting",to:"queued",reason:"retry_scheduled",data:{manual:!0,by:i.actor?`${i.actor.kind}:${i.actor.id}`:null,attempt_count:d,max_attempts:a.max_attempts,retry:d,delay_ms:0,next_eligible_at:u},now:u}).state,abandoned:f}}),timeOut:(e,n)=>t.transaction(()=>{let i=t.getWorkRequest(e),s=n??r();if(!i||!I.includes(i.state)||null===i.deadline_at||s<i.deadline_at)return null;let a=m(i,"timed_out",s);return p(e,s),f(e,"timed_out",s),w(i,s,{from_state:i.state}),{requestId:e,outcome:"timed_out",abandoned:a}}),settleFailure:(e,n,i)=>t.transaction(()=>{let t=l(e);if("running"!==t.state)throw new o.EngineStoreError("stale_state",`Work request ${e} is ${t.state}, not running.`);return v(t,n,i??r())}),enforceRequest:(e,n,a={})=>t.transaction(()=>{let o,u=t.getWorkRequest(e),c=n??r();if(!u||!I.includes(u.state)||null!==u.legacy_agent_request_id)return null;if(null!==u.deadline_at&&c>=u.deadline_at)return k.timeOut(e,c);if("running"!==u.state)return null;if(null!==u.cancel_requested_at){let t=d.get(e);if(!(!0===a.force||!t||t.expires_at<=c)&&c-u.cancel_requested_at<i)return null;let n=m(u,"cancelled",c);return f(e,"cancelled",c),y(u,c,{abandoned:null!==n}),{requestId:e,outcome:"cancelled",abandoned:n}}let _=s.get(e),p=_&&"number"==typeof(o=R(_).deadline_at)?o:null;if(!_||null===p||c<p)return null;let h=m(u,"timed_out",c);f(e,"attempt_timed_out",c);let g=v(l(e),{category:"timed_out",code:null,errorCode:"timed_out",errorMessage:"The Attempt passed its deadline."},c);return{requestId:e,outcome:g.outcome,abandoned:h}}),dueRequests(t){let n=t??r();return e.prepare(`
|
|
28
|
+
SELECT id FROM work_requests
|
|
29
|
+
WHERE state IN ('queued', 'blocked', 'running', 'waiting') AND legacy_agent_request_id IS NULL AND executor = 'dispatcher'
|
|
30
|
+
AND ((deadline_at IS NOT NULL AND deadline_at <= ?) OR state = 'running')
|
|
31
|
+
ORDER BY created_at ASC, id ASC
|
|
32
|
+
`).all(n).map(e=>e.id)},enforceDue(e){let t=e??r(),n=[];for(let e of k.dueRequests(t)){let r=k.enforceRequest(e,t);r&&n.push(r)}return n},attemptDeadlineFor:(e,t)=>(0,S.attemptDeadline)((0,S.storedRetryPolicy)(e.retry_policy),e.deadline_at,t),attemptsUsed:_};return k}e.s(["ControlError",0,T,"createRequestControl",0,A],57281);var q=e.i(46786);let x="'grant_requested', 'grant_approved', 'grant_denied', 'grant_revoked'",N=Object.freeze({maxGlobal:4,maxPerTarget:1,leaseMs:6e4,heartbeatMs:15e3,deferMs:5e3,cancelGraceMs:3e4}),C={maxGlobal:"BOTMANCERS_DISPATCH_MAX_GLOBAL",maxPerTarget:"BOTMANCERS_DISPATCH_MAX_PER_TARGET",leaseMs:"BOTMANCERS_DISPATCH_LEASE_MS",heartbeatMs:"BOTMANCERS_DISPATCH_HEARTBEAT_MS",deferMs:"BOTMANCERS_DISPATCH_DEFER_MS",cancelGraceMs:"BOTMANCERS_DISPATCH_CANCEL_GRACE_MS"},O=Object.freeze({maxGlobal:N.maxGlobal,maxPerTarget:N.maxPerTarget});class L extends Error{requestId;constructor(e){super(`The dispatch lease for ${e} is no longer held.`),this.name="LeaseLostError",this.requestId=e}}let D=[{status:400,code:/.*/},{status:404,code:/^DECK_NOT_FOUND$/},{status:422,code:/^(WORKSPACE_[A-Z0-9_]+|PROFILE_UNSUPPORTED|RESUME_UNVERIFIED|FINALIZATION_INVALID)$/},{status:409,code:/^INDEX_DIRTY$/},{status:503,code:/^CLIENT_UNAVAILABLE$/}];e.s(["LeaseLostError",0,L,"createDispatcher",0,function(e,t,n={}){let r=n.owner??`${q.default.hostname()}:${process.pid}:${(0,h.randomUUID)().slice(0,8)}`,i={...function(e=process.env){let t={...N};for(let n of Object.keys(C)){let r=e[C[n]];if(void 0===r||!/^\d+$/.test(r.trim()))continue;let i=Number(r.trim());Number.isSafeInteger(i)&&i>0&&(t[n]=i)}return t.maxGlobal=Math.min(t.maxGlobal,O.maxGlobal),t.maxPerTarget=Math.min(t.maxPerTarget,O.maxPerTarget),t}(),...n.config??{}},s=n.now??Date.now,a=A(e,t,{now:s,cancelGraceMs:i.cancelGraceMs}),o=e.prepare("SELECT COUNT(*) AS n FROM dispatch_leases"),d=e.prepare("SELECT COUNT(*) AS n FROM dispatch_leases WHERE target_agent_id = ?"),u=e.prepare("SELECT * FROM dispatch_attention WHERE request_id = ? AND cleared_at IS NULL"),l=e.prepare(`SELECT type, data FROM engine_events WHERE request_id = ? AND type NOT IN (${x}) ORDER BY sequence DESC LIMIT 1`),c=e.prepare(`
|
|
33
|
+
SELECT w.id FROM work_requests w
|
|
34
|
+
WHERE w.state = 'queued' AND w.executor = 'dispatcher'
|
|
35
|
+
AND (SELECT e.type FROM engine_events e WHERE e.request_id = w.id AND e.type NOT IN (${x}) ORDER BY e.sequence DESC LIMIT 1) = 'dispatch_deferred'
|
|
36
|
+
ORDER BY w.created_at ASC, w.id ASC
|
|
37
|
+
`),_=e.prepare("SELECT 1 FROM dispatch_leases WHERE request_id = ? AND token = ?"),p=e.prepare("SELECT decision FROM wake_safety_decisions WHERE request_id = ? ORDER BY sequence DESC LIMIT 1"),f=e.prepare("SELECT status FROM wakes WHERE id = ?"),m=e.prepare(`
|
|
38
|
+
SELECT w.id FROM work_requests w
|
|
39
|
+
WHERE w.state = 'queued' AND w.legacy_agent_request_id IS NULL AND w.executor = 'dispatcher' AND w.id <> ?
|
|
40
|
+
AND (w.created_at < ? OR (w.created_at = ? AND w.rowid < (SELECT rowid FROM work_requests WHERE id = ?)))
|
|
41
|
+
AND (w.next_eligible_at IS NULL OR w.next_eligible_at <= ?)
|
|
42
|
+
AND (w.deadline_at IS NULL OR w.deadline_at > ?)
|
|
43
|
+
AND NOT EXISTS (SELECT 1 FROM dispatch_attention a WHERE a.request_id = w.id AND a.cleared_at IS NULL)
|
|
44
|
+
AND (SELECT d.decision FROM wake_safety_decisions d WHERE d.request_id = w.id ORDER BY d.sequence DESC LIMIT 1) = 'allowed'
|
|
45
|
+
AND (w.wake_event_id IS NULL OR EXISTS (SELECT 1 FROM wakes k WHERE k.id = w.wake_event_id AND k.status = 'accepted'))
|
|
46
|
+
AND (SELECT COUNT(*) FROM dispatch_leases l WHERE l.target_agent_id = w.target_agent_id) < ?
|
|
47
|
+
ORDER BY w.created_at ASC, w.rowid ASC
|
|
48
|
+
LIMIT 1
|
|
49
|
+
`);function g(e,n,r,a){let o=l.get(e.id);return(o?.type==="dispatch_deferred"&&o.data?JSON.parse(o.data).reason:null)!==n&&t.appendEvent(e.id,{type:"dispatch_deferred",data:{reason:n,active_global:r.global,active_target:r.target,max_global:i.maxGlobal,max_per_target:i.maxPerTarget,...a?{waiting_behind:a}:{}},now:s()}),a?{ok:!1,reason:n,blockedBy:a}:{ok:!1,reason:n}}function y(e){if(!_.get(e.requestId,e.token))throw new L(e.requestId)}let w={owner:r,config:i,now:s,control:a,claim:(n,l={})=>t.transaction(()=>{let c=t.getWorkRequest(n);if(!c||"queued"!==c.state||void 0!==l.expectedVersion&&c.version!==l.expectedVersion)return{ok:!1,reason:"not_queued"};let _=s();if(null!==c.deadline_at&&_>=c.deadline_at)return a.timeOut(n,_),{ok:!1,reason:"timed_out"};if(null!==c.next_eligible_at&&_<c.next_eligible_at)return{ok:!1,reason:"not_eligible"};if(u.get(n))return{ok:!1,reason:"attention"};let y=function(e){let t=p.get(e.id);if(t?.decision!=="allowed")return"The request has no allowed safety decision.";if(null!==e.wake_event_id){let t=f.get(e.wake_event_id);if(t?.status!=="accepted")return"The Wake that created this request was not accepted."}return null}(c);if(y)return t.transitionWorkRequest(n,{from:"queued",to:"failed",reason:"not_authorized",expectedVersion:c.version,errorCode:"not_authorized",errorMessage:y,now:_}),{ok:!1,reason:"not_authorized"};let w=(0,S.storedRetryPolicy)(c.retry_policy),v=a.attemptsUsed(c);if(v>=w.max_attempts)return t.transitionWorkRequest(n,{from:"queued",to:"failed",reason:"retries_exhausted",expectedVersion:c.version,errorCode:"retries_exhausted",errorMessage:"No Attempt is left in the retry budget.",data:{attempt_count:v,max_attempts:w.max_attempts},now:_}),{ok:!1,reason:"exhausted"};let k=o.get().n,E=d.get(c.target_agent_id).n;if(k>=i.maxGlobal)return g(c,"global_limit",{global:k,target:E});if(E>=i.maxPerTarget)return g(c,"target_limit",{global:k,target:E});let b=m.get(n,c.created_at,c.created_at,n,_,_,i.maxPerTarget);if(b)return g(c,"older_waiting",{global:k,target:E},b.id);let T={requestId:n,owner:r,token:(0,h.randomUUID)(),expiresAt:_+i.leaseMs};return e.prepare(`
|
|
50
|
+
INSERT INTO dispatch_leases (request_id, target_agent_id, owner, token, acquired_at, heartbeat_at, expires_at)
|
|
51
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
52
|
+
`).run(n,c.target_agent_id,r,T.token,_,_,T.expiresAt),t.appendEvent(n,{type:"dispatch_claimed",data:{owner:r,lease_expires_at:T.expiresAt,active_global:k+1,active_target:E+1,attempt_number:v+1,max_attempts:w.max_attempts},now:_}),e.prepare("UPDATE work_requests SET attempt_count = ?, next_eligible_at = NULL WHERE id = ?").run(v+1,n),{ok:!0,lease:T,request:t.transitionWorkRequest(n,{from:"queued",to:"running",expectedVersion:c.version,data:l.data,now:_})}}),claimNext(t){let n=t??e.prepare(`
|
|
53
|
+
SELECT id FROM work_requests WHERE state = 'queued' AND legacy_agent_request_id IS NULL AND executor = 'dispatcher'
|
|
54
|
+
AND (next_eligible_at IS NULL OR next_eligible_at <= ?)
|
|
55
|
+
ORDER BY created_at ASC, rowid ASC
|
|
56
|
+
`).all(s()).map(e=>e.id),r="not_queued";for(let e of n){let t=w.claim(e);if(t.ok||"global_limit"===t.reason)return t;("target_limit"===t.reason||"older_waiting"===t.reason)&&(r=t.reason)}return{ok:!1,reason:r}},recordLaunchIntent:(n,i,a,o)=>t.transaction(()=>{y(n);let d=s(),u=o?(0,h.createHash)("sha256").update(o.body).digest("hex"):null;return e.prepare(`
|
|
57
|
+
INSERT INTO attempt_launch_intents (attempt_id, request_id, transport, idempotency_key, body, body_hash, grant_fingerprint, owner, created_at)
|
|
58
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
59
|
+
`).run(i,n.requestId,a,o?.idempotencyKey??null,o?.body??null,u,o?.grantFingerprint??null,r,d),t.appendEvent(n.requestId,{type:"launch_intent_recorded",attemptId:i,data:{transport:a,idempotency_key:o?.idempotencyKey??null,body_hash:u,grant_fingerprint:o?.grantFingerprint??null},now:d}),w.launchIntent(i)}),launchIntent:t=>e.prepare("SELECT * FROM attempt_launch_intents WHERE attempt_id = ?").get(t),heartbeat(t){let n=s(),r=n+i.leaseMs,a=1===e.prepare("UPDATE dispatch_leases SET heartbeat_at = ?, expires_at = ? WHERE request_id = ? AND token = ?").run(n,r,t.requestId,t.token).changes;return a&&(t.expiresAt=r),a},holds:e=>!!_.get(e.requestId,e.token),assertHeld(e){y(e)},release(n,i){t.transaction(()=>{y(n),e.prepare("DELETE FROM dispatch_leases WHERE request_id = ? AND token = ?").run(n.requestId,n.token),t.appendEvent(n.requestId,{type:"dispatch_released",data:{owner:r,outcome:i},now:s()})})},defer(n,a,o=null){t.transaction(()=>{y(n);let d=s();n.expiresAt=d+i.deferMs,e.prepare("UPDATE dispatch_leases SET heartbeat_at = ?, expires_at = ? WHERE request_id = ? AND token = ?").run(d,n.expiresAt,n.requestId,n.token),t.appendEvent(n.requestId,{type:"reconcile_deferred",attemptId:o,data:{owner:r,reason:a,retry_at:n.expiresAt},now:d})})},setAttention:(n,i)=>t.transaction(()=>{y(n);let a=s(),o=(0,h.randomUUID)();e.prepare("INSERT INTO dispatch_attention (id, request_id, attempt_id, reason, detail, created_at) VALUES (?, ?, ?, ?, ?, ?)").run(o,n.requestId,i.attemptId,i.reason,i.detail??null,a),t.appendEvent(n.requestId,{type:"attention_set",attemptId:i.attemptId,data:{reason:i.reason,detail:i.detail??null},now:a});let d=t.getWorkRequest(n.requestId);return d?.state==="running"&&t.transitionWorkRequest(n.requestId,{from:"running",to:"waiting",reason:`manual_attention:${i.reason}`,now:a}),e.prepare("DELETE FROM dispatch_leases WHERE request_id = ? AND token = ?").run(n.requestId,n.token),t.appendEvent(n.requestId,{type:"dispatch_released",data:{owner:r,outcome:"attention"},now:a}),u.get(n.requestId)}),attention:e=>u.get(e),recoverable(){let t=s(),n=[];for(let i of e.prepare("SELECT request_id, owner, token, expires_at FROM dispatch_leases ORDER BY acquired_at ASC, request_id ASC").all()){if(i.owner===r&&i.expires_at>t)continue;let e=i.expires_at<=t?"lease_expired":!function(e){let t=/^(.*):(\d+):[^:]+$/.exec(e);if(!t||t[1]!==q.default.hostname())return!1;let n=Number(t[2]);if(n===process.pid)return!1;try{return process.kill(n,0),!1}catch(e){return"ESRCH"===e.code}}(i.owner)?null:"owner_exited";e&&n.push({requestId:i.request_id,reason:e,priorToken:i.token,priorOwner:i.owner})}for(let t of e.prepare(`
|
|
60
|
+
SELECT w.id FROM work_requests w
|
|
61
|
+
WHERE w.state = 'running' AND w.legacy_agent_request_id IS NULL AND w.executor = 'dispatcher'
|
|
62
|
+
AND NOT EXISTS (SELECT 1 FROM dispatch_leases l WHERE l.request_id = w.id)
|
|
63
|
+
AND NOT EXISTS (SELECT 1 FROM dispatch_attention a WHERE a.request_id = w.id AND a.cleared_at IS NULL)
|
|
64
|
+
ORDER BY w.updated_at ASC, w.id ASC
|
|
65
|
+
`).all())n.push({requestId:t.id,reason:"unleased_running",priorToken:null,priorOwner:null});return n},takeOver:n=>t.transaction(()=>{let a=s(),o={requestId:n.requestId,owner:r,token:(0,h.randomUUID)(),expiresAt:a+i.leaseMs};if(n.priorToken){let t="lease_expired"===n.reason?"AND expires_at <= ?":"",i=[r,o.token,a,a,o.expiresAt,n.requestId,n.priorToken];if(t&&i.push(a),1!==e.prepare(`
|
|
66
|
+
UPDATE dispatch_leases SET owner = ?, token = ?, acquired_at = ?, heartbeat_at = ?, expires_at = ?
|
|
67
|
+
WHERE request_id = ? AND token = ? ${t}
|
|
68
|
+
`).run(...i).changes)return null}else{let i=t.getWorkRequest(n.requestId);if(!i||"running"!==i.state||e.prepare("SELECT 1 FROM dispatch_leases WHERE request_id = ?").get(n.requestId)||u.get(n.requestId))return null;e.prepare(`
|
|
69
|
+
INSERT INTO dispatch_leases (request_id, target_agent_id, owner, token, acquired_at, heartbeat_at, expires_at)
|
|
70
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
71
|
+
`).run(n.requestId,i.target_agent_id,r,o.token,a,a,o.expiresAt)}return t.appendEvent(n.requestId,{type:"dispatch_lease_taken_over",data:{owner:r,previous_owner:n.priorOwner,reason:n.reason},now:a}),o}),deferredRequestIds:()=>c.all().map(e=>e.id),leaseOf:t=>e.prepare("SELECT owner, token, expires_at FROM dispatch_leases WHERE request_id = ?").get(t)};return w},"decideRepostResult",0,function(e){switch(e.kind){case"accepted":return{action:"reattach"};case"unreachable":return{action:"defer",reason:"unreachable"};case"unauthorized":case"forbidden":case"no_grant":return{action:"attention",reason:"grant"};case"rejected":if(409===e.status&&"IDEMPOTENCY_CONFLICT"===e.code)return{action:"attention",reason:"idempotency_conflict"};if(D.some(t=>t.status===e.status&&t.code.test(e.code??"")))return{action:"fail",category:"launch_failed",code:e.code??String(e.status)};if(null!==e.status&&e.status>=500)return{action:"defer",reason:"server_error"};return{action:"attention",reason:"unrecognized_response"};default:return{action:"attention",reason:"unrecognized_response"}}},"decideWithRunId",0,function(e){switch(e.kind){case"run":if("died"===e.state)return{action:"interrupted_attention",reason:"run_died"};return{action:"reattach"};case"not_found":return{action:"attention",reason:"run_not_found"};case"unauthorized":return{action:"attention",reason:"grant_expired"};case"forbidden":return{action:"attention",reason:"grant_scope"};case"no_grant":return{action:"attention",reason:"grant_unavailable"};case"unreachable":return{action:"defer",reason:"unreachable"};case"rejected":if(null!==e.status&&e.status>=500)return{action:"defer",reason:"server_error"};return{action:"attention",reason:"unrecognized_response"};default:return{action:"attention",reason:"unrecognized_response"}}},"decideWithoutRunId",0,function(e){if(!e.reconcilable)return{action:"interrupted",reason:"runtime_unobservable"};if(!e.intent?.body||!e.intent.idempotency_key)return{action:"attention",reason:"launch_intent_missing"};let t=e.intent.grant_fingerprint??null,n=e.currentGrantFingerprint??null;return null===t&&null===n?{action:"repost"}:n?t!==n?{action:"attention",reason:"grant_mismatch"}:{action:"repost"}:{action:"attention",reason:"grant_unavailable"}},"dispatchFault",0,function(e,t){}],54226)},93029,e=>{"use strict";var t=e.i(22734);e.i(46786),e.i(14747),e.s(["ensureBotWorkdir",0,function(e){return t.default.mkdirSync(e,{recursive:!0}),e}])},29370,e=>{"use strict";function t(e,n,r=null){return{category:e,code:r,message:n.slice(0,500)}}e.s(["attemptFailure",0,t,"freezeAttemptInput",0,function(e){return Object.freeze({...e,target:Object.freeze({...e.target}),prompt:Object.freeze("text"===e.prompt.kind?{...e.prompt}:{...e.prompt,history:Object.freeze(e.prompt.history.map(e=>Object.freeze({...e})))}),sessionBinding:e.sessionBinding?Object.freeze({...e.sessionBinding}):null,correlation:Object.freeze({...e.correlation})})},"interruption",0,function(e){let n=null,r=null;return{promise:new Promise(i=>{if(e.signal&&(r=()=>i(t("cancelled","The attempt was cancelled.")),e.signal.aborted?r():e.signal.addEventListener("abort",r,{once:!0})),"number"==typeof e.deadlineAt){let r=e.deadlineAt,s=()=>{let e=r-Date.now();e<=0?i(t("timed_out","The attempt passed its deadline.")):(n=setTimeout(s,Math.min(e,0x7fffffff))).unref&&n.unref()};s()}}),dispose:()=>{n&&clearTimeout(n),r&&e.signal&&e.signal.removeEventListener("abort",r)}}},"preLaunchInterruption",0,function(e){return e.signal?.aborted?t("cancelled","The attempt was cancelled before launch."):"number"==typeof e.deadlineAt&&Date.now()>=e.deadlineAt?t("timed_out","The attempt passed its deadline before launch."):null}])},12227,e=>{"use strict";e.s(["attemptPromptText",0,function(e){if("text"===e.kind)return e.text;let t=e.history.map(e=>`[${e.fromAgent?"you":e.speakerLabel}] ${e.content}`).join("\n\n");return`${e.system}
|
|
72
|
+
|
|
73
|
+
Conversation so far (reply to the last message):
|
|
74
|
+
|
|
75
|
+
${t}`}])},76459,e=>{"use strict";var t=e.i(54799),n=e.i(62294),r=e.i(35613),i=e.i(64974),s=e.i(142);let a={invalid_request:400,conversation_not_found:404,conversation_not_writable:409,target_not_found:404,idempotency_conflict:409,unknown_principal:403,intake_failed:500};class o extends Error{code;constructor(e,t){super(t),this.name="IntakeError",this.code=e}get status(){return a[this.code]}}let d={ui:["bot","group"],api:["agent"]};function u(e){return"string"==typeof e&&e.trim().length>0}function l(e,t,r){n.default.prepare("INSERT OR IGNORE INTO conversation_participants (conversation_id, participant_kind, participant_id, joined_at) VALUES (?, ?, ?, ?)").run(e,t.kind,t.id,r)}function c(e,r,i,s,a,o){let d=(0,t.randomUUID)();return n.default.prepare("INSERT INTO messages (id, conversation_id, sender_type, sender_id, sender_kind, content, handoff_targets, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run(d,r,"bot"===i.kind?"bot":"user","ui"===e?null:i.id,i.kind,s,a&&a.length>0?JSON.stringify(a):null,o),d}function _(e){return e.map(e=>n.engine.getWorkRequest(e)).filter(e=>!!e)}e.s(["IntakeError",0,o,"acceptConversationMessage",0,function(e){var a,p;let f,h;if(!e.requester||!["person","bot","service"].includes(e.requester.kind)||!u(e.requester.id))throw new o("invalid_request","A requester principal is required.");if("unknown"===(0,s.categorizeIntakeCaller)(e.surface,e.requester))throw new o("unknown_principal","The caller is not a recognized principal.");if(!u(e.content))throw new o("invalid_request","content is required.");if(!u(e.idempotencyKey)||e.idempotencyKey.length>200)throw new o("invalid_request","An idempotency key (1-200 characters) is required.");let m=(a=e.surface,p=e.fingerprint,(0,t.createHash)("sha256").update(JSON.stringify([a,p??null])).digest("hex"));try{f=function(e,r){let{surface:a,requester:p}=e;return n.default.transaction(()=>{let f,h=n.default.prepare("SELECT * FROM conversation_intakes WHERE requester_kind = ? AND requester_id = ? AND idempotency_key = ?").get(p.kind,p.id,e.idempotencyKey);if(h){var m;if(h.request_hash!==r)throw new o("idempotency_conflict","The idempotency key was already used with a different payload.");let e=JSON.parse(h.work_request_ids);return{surface:h.surface,conversationId:h.conversation_id,acceptedMessageId:h.source_event_id,requestIds:e,requests:_(e),replayed:!0}}let g=Date.now();if("id"in e.conversation){let t=n.default.prepare("SELECT * FROM conversations WHERE id = ?").get(e.conversation.id);if(!t||(m=t.id,!n.default.prepare("SELECT 1 FROM conversation_participants WHERE conversation_id = ? AND participant_kind = ? AND participant_id = ?").get(m,p.kind,p.id)))throw new o("conversation_not_found","No conversation with that id is visible to this requester.");if(!d[a].includes(t.type))throw new o("conversation_not_writable","api"===a?"UI conversations are written through the UI compatibility routes.":"Agent conversations are written through the agent conversation API.");f=t}else{if("api"!==a)throw new o("invalid_request","Only the agent conversation API opens new conversations.");f={id:(0,t.randomUUID)(),type:"agent",origin_kind:p.kind,origin_id:p.id,created_at:g},n.default.prepare("INSERT INTO conversations (id, type, origin_kind, origin_id, created_at) VALUES (?, ?, ?, ?, ?)").run(f.id,f.type,p.kind,p.id,g),l(f.id,p,g)}let y=e.route(f),w=new Set,v=[];for(let e of y.deliveries){let t=e.conversationId??f.id,r=`${t}:${e.agentId}`;if(!w.has(r)){if(w.add(r),!u(e.agentId)||!n.bots.getById(e.agentId))throw new o("target_not_found","No registered agent has that id.");if("bot"===p.kind&&p.id===e.agentId)throw new o("invalid_request","An agent cannot address itself.");if(t!==f.id&&!n.default.prepare("SELECT 1 FROM conversations WHERE id = ?").get(t))throw new o("target_not_found","The target conversation does not exist.");v.push({agentId:e.agentId,conversationId:t})}}let k=new Map;for(let t of(k.set(f.id,c(a,f.id,p,e.content,y.handoffTargets,g)),v))k.has(t.conversationId)||k.set(t.conversationId,c(a,t.conversationId,p,e.content,y.handoffTargets,g));let E=(0,i.selectExecutionPolicy)({entryPoint:a,executionKind:"conversation"});if(!E.ok)throw new o("invalid_request",E.reason);let b=E.policy,S=(0,s.categorizeIntakeCaller)(a,p);if("unknown"===S)throw new o("unknown_principal","The caller is not a recognized principal.");let T={safety_version:s.WAKE_SAFETY_VERSION,root_principal:{kind:p.kind,id:p.id},wake_depth:0,grant_rule:"readonly_default",grant_id:null},I=[];for(let t of v){l(t.conversationId,{kind:"bot",id:t.agentId},g);let r=1===v.length?e.idempotencyKey:`${e.idempotencyKey}#${t.conversationId}:${t.agentId}`,{request:i}=n.engine.createOrGetWorkRequest({sourceConversationId:t.conversationId,sourceEventId:k.get(t.conversationId),requester:p,targetAgentId:t.agentId,intent:e.content,executionKind:b.execution_kind,toolProfile:b.tool_profile,idempotencyKey:r,policy:{source:"conversation_intake",surface:a},executionPolicy:b,rootPrincipal:p,wakeDepth:0,safetySnapshot:T,safety:{principalType:S,principal:p,decision:"allowed",grantRule:"readonly_default",snapshot:T,now:g},executor:e.executor,now:g});I.push(i.id)}for(let[e,t]of k){let r=v.flatMap((t,n)=>t.conversationId===e?[I[n]]:[]);1===r.length&&n.default.prepare("UPDATE messages SET request_id = ? WHERE id = ?").run(r[0],t)}return n.default.prepare(`
|
|
76
|
+
INSERT INTO conversation_intakes (
|
|
77
|
+
requester_kind, requester_id, idempotency_key, request_hash, surface,
|
|
78
|
+
conversation_id, source_event_id, work_request_ids, created_at
|
|
79
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
80
|
+
`).run(p.kind,p.id,e.idempotencyKey,r,a,f.id,k.get(f.id),JSON.stringify(I),g),e.beforeCommit?.(),{surface:a,conversationId:f.id,acceptedMessageId:k.get(f.id),requestIds:I,requests:_(I),replayed:!1}}).immediate()}(e,m)}catch(e){if(e instanceof o)throw e;if(e instanceof r.EngineStoreError&&"idempotency_conflict"===e.code)throw new o("idempotency_conflict","The idempotency key was already used with a different payload.");throw console.error("Conversation intake failed:",e),new o("intake_failed","The message could not be accepted.")}let g=e.dispatch;try{h=g(f)}catch(e){h=Promise.reject(e)}let y=Promise.resolve(h).catch(e=>{console.error("Intake dispatch failed:",e)});return{...f,dispatched:y}},"getAcceptedMessage",0,function(e){return n.default.prepare("SELECT * FROM messages WHERE id = ?").get(e)}])},71114,e=>{"use strict";var t=e.i(51749),n=e.i(29370);e.s(["createHermesAttemptAdapter",0,function(e={}){let r="hermes-gateway";return{name:r,async run(i,s){let a=Date.now(),o=(e,t=null)=>({status:"failed",adapter:r,externalRunId:null,externalSessionId:t,output:null,artifacts:[],startedAt:a,finishedAt:Date.now(),failure:e});if("readonly"!==i.toolProfile)return o((0,n.attemptFailure)("unsupported_authority",`The Hermes gateway does not support the ${i.toolProfile} tool profile.`));let d=(e.loadConfig??t.loadHermesConfig)();if(!d)return o((0,n.attemptFailure)("unavailable","The Hermes gateway is not configured."));let u=(0,n.preLaunchInterruption)(i);if(u)return o(u);if(i.freshSession&&i.sessionBinding)return o((0,n.attemptFailure)("session_mismatch","A fresh-session turn cannot resume a session."));let l=i.sessionBinding?.externalSessionId??(i.freshSession?(0,t.hermesFreshSessionIdForBot)(i.target.agentId,d):(0,t.hermesSessionIdForBot)(i.target.agentId,d)),c=new AbortController,_=(0,n.interruption)(i),p=null;_.promise.then(e=>{p=e,c.abort()}),s?.({type:"started",adapter:r,at:Date.now(),externalRunId:null,externalSessionId:l});try{var f;let n=await (0,t.hermesChat)({config:d,profilePath:i.target.hermesProfilePath||t.HERMES_DEFAULT_CHAT_PATH,sessionId:l,messages:(f=i.prompt,"text"===f.kind?[{role:"user",content:f.text}]:[{role:"system",content:f.system},...f.history.map(e=>e.fromAgent?{role:"assistant",content:e.content}:{role:"user",content:`[From ${e.speakerLabel}] ${e.content}`})]),signal:c.signal,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}});return{status:"completed",adapter:r,externalRunId:null,externalSessionId:l,output:n,artifacts:[],startedAt:a,finishedAt:Date.now(),failure:null}}catch(s){let e=s instanceof t.HermesError?s.code:"unknown";if(p)return o({...p,code:e},l);let r="timeout"===e?"timed_out":"runtime_failed",i=s instanceof t.HermesError&&void 0!==s.status?` ${s.status}`:"";return o((0,n.attemptFailure)(r,`The Hermes gateway did not complete the turn (${e}${i}).`,e),l)}finally{_.dispose()}}}}])},16789,81449,e=>{"use strict";e.s(["ProviderSessionError",()=>x,"agentProviderCapabilities",()=>V,"cancelProviderTurn",()=>ew,"getAgentSyncState",()=>et,"getProviderSessionRow",()=>F,"getProviderTurn",()=>ev,"observeProviderTurn",()=>ey,"privateProviderIds",()=>ek,"recordSyncCompleted",()=>Q,"recordSyncFailed",()=>ee,"refreshProviderSession",()=>er,"sendProviderTurn",()=>ef,"startProviderSession",()=>ep,"syncAgentSessionHistory",()=>Z,"syncHistoryAtRegistration",()=>en,"warmAgentProvider",()=>z],16789),e.s(["SESSION_CONTEXT_PRINCIPAL",()=>p,"SESSION_CONTEXT_REASONS",()=>f,"SESSION_CONTEXT_SERVICE_ID",()=>_,"attachSessionContextsToTurn",()=>E,"bindSessionContext",()=>k,"endSessionContext",()=>T,"endTurnSessionContexts",()=>S,"mintSessionContext",()=>v,"resolveSessionContext",()=>q,"revokeAgentSessionContexts",()=>I,"sessionContextHeader",()=>A],81449);var t=e.i(54799),n=e.i(18966),r=e.i(99446),i=e.i(91466),s=e.i(27776);e.i(96474);var a=e.i(40596),o=e.i(28420),d=e.i(73688),u=e.i(62294),l=e.i(35034),c=e.i(49066);let _="botmancers-session-context",p=Object.freeze({kind:"service",id:_}),f=["missing","ambiguous","unsupported","unknown","stale","revoked"],h=/^bmsc_[A-Za-z0-9_-]{43}$/;function m(){return`${process.pid}:${Math.round(performance.timeOrigin)}`}u.default.exec(`
|
|
81
|
+
CREATE TABLE IF NOT EXISTS session_contexts (
|
|
82
|
+
id TEXT PRIMARY KEY CHECK (id LIKE 'sctx_%'),
|
|
83
|
+
token_sha256 TEXT NOT NULL UNIQUE CHECK (length(token_sha256) = 64),
|
|
84
|
+
agent_id TEXT NOT NULL,
|
|
85
|
+
-- The public session_ref the context names; null until a started
|
|
86
|
+
-- session is recorded (then bound once).
|
|
87
|
+
session_ref TEXT,
|
|
88
|
+
-- The registry row whose turns keep the context live (the same ref, or
|
|
89
|
+
-- the provider row behind a binding).
|
|
90
|
+
registry_ref TEXT,
|
|
91
|
+
launch_kind TEXT NOT NULL CHECK (launch_kind IN ('claude_turn', 'codex_thread_load', 'codex_exec')),
|
|
92
|
+
launch_digest TEXT NOT NULL,
|
|
93
|
+
-- Set for a launch that cannot outlive the Botmancers process (a thread
|
|
94
|
+
-- load in its app-server child).
|
|
95
|
+
process_ref TEXT,
|
|
96
|
+
-- The Botmancers turn whose launch this is (a Claude turn process, a
|
|
97
|
+
-- codex exec run); null for a Codex thread load, which outlives a turn.
|
|
98
|
+
turn_ref TEXT,
|
|
99
|
+
state TEXT NOT NULL CHECK (state IN ('live', 'ended', 'revoked')),
|
|
100
|
+
end_reason TEXT,
|
|
101
|
+
created_at INTEGER NOT NULL,
|
|
102
|
+
ended_at INTEGER,
|
|
103
|
+
updated_at INTEGER NOT NULL
|
|
104
|
+
);
|
|
105
|
+
CREATE INDEX IF NOT EXISTS idx_session_contexts_launch ON session_contexts(launch_digest, state);
|
|
106
|
+
CREATE INDEX IF NOT EXISTS idx_session_contexts_agent ON session_contexts(agent_id, state);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_session_contexts_turn ON session_contexts(turn_ref, state);
|
|
108
|
+
`);let g=e=>(0,t.createHash)("sha256").update(e,"utf8").digest("hex");function y(e){let t=u.default.prepare("SELECT id FROM provider_sessions WHERE id = ?").get(e);if(t)return t.id;let n=u.default.prepare("SELECT id FROM provider_sessions WHERE binding_id = ?").get(e);return n?.id??null}function w(e){let t=u.default.prepare("SELECT agent_id FROM session_bindings WHERE id = ?").get(e);if(t)return t.agent_id;let n=u.default.prepare("SELECT agent_id FROM provider_sessions WHERE id = ?").get(e);return n?.agent_id??null}function v(e){var n,r;if(R(),!u.bots.getById(e.agentId)||!(0,l.shareFromTurnEnabled)(e.agentId)||null!==e.sessionRef&&w(e.sessionRef)!==e.agentId)return null;let i=`bmsc_${(0,t.randomBytes)(32).toString("base64url")}`,s=`sctx_${(0,t.randomBytes)(16).toString("base64url")}`,a=Date.now();return u.default.prepare(`
|
|
109
|
+
INSERT INTO session_contexts (id, token_sha256, agent_id, session_ref, registry_ref, launch_kind, launch_digest, process_ref, state, created_at, updated_at)
|
|
110
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'live', ?, ?)
|
|
111
|
+
`).run(s,g(i),e.agentId,e.sessionRef,null===e.sessionRef?null:y(e.sessionRef),e.launch.kind,(n=e.launch.kind,r=e.launch.ref,g(`botmancers-session-launch
|
|
112
|
+
${n}
|
|
113
|
+
${r}`)),e.processBound?m():null,a,a),{id:s,token:i,url:function(e=process.env){let t=(e.BOTMANCERS_SESSION_CONTEXT_URL||"").trim();if(t)return t;let n=/^\d{1,5}$/.test((e.PORT||"").trim())?e.PORT.trim():"3333";return`http://127.0.0.1:${n}/api/v0/mcp`}(e.env)}}function k(e,t){return u.default.transaction(()=>{var n;let r=(n=e,u.default.prepare("SELECT * FROM session_contexts WHERE id = ?").get(n));return!!r&&"live"===r.state&&(null!==r.session_ref?r.session_ref===t:w(t)!==r.agent_id?(b(r.id,"ended","session_changed"),!1):(u.default.prepare("UPDATE session_contexts SET session_ref = ?, registry_ref = ?, updated_at = ? WHERE id = ? AND session_ref IS NULL").run(t,y(t),Date.now(),e),!0))}).immediate()}function E(e,t){let n=u.default.prepare("UPDATE session_contexts SET turn_ref = ?, updated_at = ? WHERE id = ? AND state = 'live' AND turn_ref IS NULL"),r=Date.now();for(let i of e)n.run(t,r,i)}function b(e,t,n){let r=Date.now();return u.default.prepare("UPDATE session_contexts SET state = ?, end_reason = ?, ended_at = ?, updated_at = ? WHERE id = ? AND state = 'live'").run(t,n,r,r,e).changes}function S(e,t="turn_end"){let n=Date.now();return u.default.prepare(`
|
|
114
|
+
UPDATE session_contexts SET state = 'ended', end_reason = ?, ended_at = ?, updated_at = ?
|
|
115
|
+
WHERE turn_ref = ? AND state = 'live' AND launch_kind IN ('claude_turn', 'codex_exec')
|
|
116
|
+
`).run(t,n,n,e).changes}function T(e,t){return 1===b(e,"ended",t)}function I(e){let t=Date.now();return u.default.prepare("UPDATE session_contexts SET state = 'revoked', end_reason = 'owner_off', ended_at = ?, updated_at = ? WHERE agent_id = ? AND state = 'live'").run(t,t,e).changes}function R(){let e=u.default.prepare("SELECT DISTINCT agent_id FROM session_contexts WHERE state = 'live'").all(),t=0;for(let{agent_id:n}of e)u.bots.getById(n)&&(0,l.shareFromTurnEnabled)(n)||(t+=I(n));return t}function A(e){return e.get(c.SESSION_CONTEXT_HEADER)}function q(e){let t=e=>({ok:!1,reason:e});if(R(),null==e)return t("missing");if(e.length>4096)return t("unsupported");let n=e.split(/[\s,]+/).filter(Boolean);if(0===n.length)return t("missing");if(n.length>1)return t("ambiguous");if(!h.test(n[0]))return t("unsupported");let r=u.default.prepare("SELECT * FROM session_contexts WHERE token_sha256 = ?").get(g(n[0]));if(!r)return t("unknown");if("revoked"===r.state)return t("revoked");if(!u.bots.getById(r.agent_id)||!(0,l.shareFromTurnEnabled)(r.agent_id))return"live"===r.state&&I(r.agent_id),t("revoked");if("live"!==r.state||null===r.session_ref)return t("stale");if(null!==r.process_ref&&r.process_ref!==m())return b(r.id,"ended","restart"),t("stale");if(w(r.session_ref)!==r.agent_id)return b(r.id,"ended","session_changed"),t("stale");let i=r.registry_ref?function(e){if(!u.default.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'provider_session_turns'").get())return{running:!1,at:null};let t=u.default.prepare(`
|
|
117
|
+
SELECT MAX(CASE WHEN state = 'running' THEN 1 ELSE 0 END) AS running, MAX(COALESCE(finished_at, created_at)) AS at
|
|
118
|
+
FROM provider_session_turns WHERE session_ref = ?
|
|
119
|
+
`).get(e);return{running:1===t.running,at:t.at}}(r.registry_ref):{running:!1,at:null};return!i.running&&Date.now()-Math.max(r.created_at,i.at??0)>9e5?(b(r.id,"ended","idle_timeout"),t("stale")):{ok:!0,contextId:r.id,agentId:r.agent_id,sessionRef:r.session_ref}}(0,r.registerBuiltinSessionProvider)("claude",()=>(0,i.createClaudeSessionProvider)()),(0,r.registerSessionProvider)({provider:d.CURSOR_PROVIDER_KIND},d.cursorSessionProviderFactory),(0,r.registerBuiltinSessionProvider)("muse",e=>(0,s.createMuseSessionProvider)(e.id));class x extends Error{code;constructor(e,t){super(t),this.name="ProviderSessionError",this.code=e}}function N(e,t){let i=e.prepare(`
|
|
120
|
+
SELECT id, runtime_connection_id, session_scope_kind, session_scope_items, policy_mode, allow_new_sessions, allow_resume_with_edits
|
|
121
|
+
FROM bots WHERE id = ?
|
|
122
|
+
`).get(t);if(!i)throw new x("agent_not_found","No such Agent.");let s=i.runtime_connection_id?e.prepare("SELECT id, provider FROM runtime_connections WHERE id = ?").get(i.runtime_connection_id):void 0,a=s?(0,r.sessionProviderFor)(s):null;if(!s||!a)throw new x("provider_unavailable","The Agent's runtime connection has no session provider.");return{agentId:t,connection:s,provider:a,capabilities:(0,r.normalizeCapabilities)(a.capabilities()),scope:(0,n.readStoredScope)(i),policy:(0,n.readStoredPolicy)(i)}}async function C(e,t,n={}){let i=N(e,t);if(!i.provider.ready)return i;let s=await i.provider.ready(M(n));return s.ok||D(s.error),{...i,capabilities:(0,r.normalizeCapabilities)(i.provider.capabilities())}}function O(e,t){if(!e.capabilities[t])throw new x("unsupported",`The session provider does not support ${t}.`)}function L(e){if(!e.scope)throw new x("scope_missing","The Agent has no session scope.");return e.scope}function D(e,t="provider_failed"){throw new x("unsupported"===e.code?"unsupported":"unsupported_authority"===e.code?"authority_not_allowed":"not_found"===e.code?"session_missing":"busy"===e.code?"busy":"not_resumable"===e.code?"not_resumable":"invalid_input"===e.code?"invalid_input":"unavailable"===e.code?"provider_unavailable":"auth_required"===e.code||"permission_denied"===e.code||"incompatible_version"===e.code||"usage_limit"===e.code?e.code:t,`The session provider refused the call (${e.code}).`)}function M(e){return{correlation:{...e.correlation??{}},signal:e.signal??null,deadline_at:e.deadlineAt??null}}function $(e,t){let n=[];return{minted:n,minter:{mint:r=>{let i=v({agentId:e,sessionRef:t,launch:{kind:r.kind,ref:r.ref},processBound:!0===r.processBound});if(!i)return null;n.push(i.id);let s=i.id;return{token:i.token,url:i.url,end:e=>{T(s,e)}}}},record:(e,t)=>{for(let t of n)k(t,e);E(n,t)},abandon:()=>{for(let e of n)T(e,"launch_failed")}}}let W="SELECT * FROM provider_sessions";function F(e,t,n){return e.prepare(`${W} WHERE id = ? AND agent_id = ?`).get(n,t)}function P(e,t,n){let r=F(e,t,n);if(!r)throw new x("session_not_found","No session with that reference.");return r}function H(e,n){e.prepare("INSERT INTO provider_session_events (id, agent_id, session_ref, turn_id, type, detail, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)").run((0,t.randomUUID)(),n.agentId,n.sessionRef??null,n.turnId??null,n.type,JSON.stringify(n.detail??{}),n.now)}function U(e){let t=(e??"").split("\n").map(e=>e.trim()).find(e=>e.length>0);return t?t.length>80?`${t.slice(0,79).trimEnd()}…`:t:null}function j(e){return"string"==typeof e&&e.startsWith("/")?e:null}function B(e,t,r){if("all_provider_sessions"===e.kind)return!0;if("sessions"===e.kind)return r.has(t.provider_session_id);let i=j(t.workspace);return null!==i&&e.workspaces.some(e=>(0,n.workspaceContains)(e,i))}function K(e,t,n){return"sessions"!==n.kind||0===n.sessions.length?new Set:new Set(e.prepare(`
|
|
123
|
+
SELECT provider_session_id FROM provider_sessions
|
|
124
|
+
WHERE agent_id = ? AND runtime_connection_id = ? AND id IN (SELECT value FROM json_each(?))
|
|
125
|
+
`).all(t.agentId,t.connection.id,JSON.stringify(n.sessions)).map(e=>e.provider_session_id))}function X(e,n,r,i,s,a=null){var o;let d=(o=r.provider_session_id,e.prepare(`
|
|
126
|
+
${W} WHERE agent_id = ? AND runtime_connection_id = ? AND provider_session_id = ?
|
|
127
|
+
ORDER BY (binding_id IS NULL) DESC, created_at DESC, id DESC LIMIT 1
|
|
128
|
+
`).get(n.agentId,n.connection.id,o));if(d)return G(e,n,d.id,r,s),{ref:d.id,created:!1};let u=(0,t.randomUUID)();return e.prepare(`
|
|
129
|
+
INSERT INTO provider_sessions (
|
|
130
|
+
id, agent_id, runtime_connection_id, provider_kind, provider_session_id, binding_id, origin, title, workspace,
|
|
131
|
+
provider_created_at, provider_updated_at, availability, lifecycle, resumable, busy, capabilities, last_synced_at, created_at, updated_at
|
|
132
|
+
) VALUES (?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, 'available', ?, ?, ?, ?, ?, ?, ?)
|
|
133
|
+
`).run(u,n.agentId,n.connection.id,n.provider.kind,r.provider_session_id,i,U(r.title)??a,j(r.workspace),r.created_at,r.updated_at,"archived"===r.lifecycle?"archived":"open",+!!r.resumable,+!!r.busy,JSON.stringify(n.capabilities),s,s,s),{ref:u,created:!0}}function G(e,t,n,r,i){e.prepare(`
|
|
134
|
+
UPDATE provider_sessions SET title = COALESCE(?, title), workspace = COALESCE(?, workspace),
|
|
135
|
+
provider_created_at = COALESCE(?, provider_created_at), provider_updated_at = COALESCE(?, provider_updated_at),
|
|
136
|
+
availability = 'available', lifecycle = ?, resumable = ?, busy = ?, capabilities = ?, last_synced_at = ?, updated_at = ?
|
|
137
|
+
WHERE id = ?
|
|
138
|
+
`).run(U(r.title),j(r.workspace),r.created_at,r.updated_at,"archived"===r.lifecycle?"archived":"open",+!!r.resumable,+!!r.busy,JSON.stringify(t.capabilities),i,i,n)}function J(e,t,n){"missing"===t.availability?e.prepare("UPDATE provider_sessions SET last_synced_at = ? WHERE id = ?").run(n,t.id):(e.prepare("UPDATE provider_sessions SET availability = 'missing', busy = 0, last_synced_at = ?, updated_at = ? WHERE id = ?").run(n,n,t.id),H(e,{agentId:t.agent_id,sessionRef:t.id,type:"session_missing",now:n}))}async function z(e,t,n={}){let r;if(!n.onlyWithSessions||e.prepare("SELECT 1 FROM provider_sessions WHERE agent_id = ? LIMIT 1").get(t)){try{r=N(e,t)}catch{return}if(r.provider.ready)try{await r.provider.ready(M({deadlineAt:Date.now()+1e4}))}catch{}}}function V(e,t){try{let n=N(e,t);return{provider_kind:n.provider.kind,...n.capabilities,explicit_import:"function"==typeof n.provider.importSession}}catch(e){if(e instanceof x&&"provider_unavailable"===e.code)return null;throw e}}async function Y(e,t,n={}){let r=await C(e,t,n);O(r,"list");let i="string"==typeof n.query&&n.query.trim()?n.query.trim().slice(0,200):null;i&&O(r,"search");let s=L(r),a=K(e,r,s),o=function(e,t){let n=Number(t??e.capabilities.max_page_size);if(!Number.isInteger(n)||n<1)throw new x("invalid_input","limit must be a positive integer.");return Math.min(n,e.capabilities.max_page_size)}(r,n.limit),d=await r.provider.listSessions({...M(n),scope:{kind:s.kind,workspaces:[...s.workspaces],provider_session_ids:[...a]},query:i,cursor:n.cursor??null,limit:o});d.ok||D(d.error);let u=n.now??Date.now(),l=d.value.items.slice(0,o);return e.transaction(()=>{let i={imported:[],updated:[],rejected_out_of_scope:0,next_cursor:d.value.next_cursor??null};for(let o of l){if(!o||"string"!=typeof o.provider_session_id||!o.provider_session_id)continue;if(n.seenCollector&&n.seenCollector.add(o.provider_session_id),!B(s,o,a)){i.rejected_out_of_scope++;continue}let{ref:d,created:l}=X(e,r,o,"discovered",u);(l?i.imported:i.updated).push(d),H(e,{agentId:t,sessionRef:d,type:l?"session_imported":"session_synced",now:u})}return i.rejected_out_of_scope>0&&H(e,{agentId:t,type:"sync_rejected_out_of_scope",detail:{count:i.rejected_out_of_scope},now:u}),i}).immediate()}async function Z(e,t,n={}){let r=[],i=[],s=0,a=n.cursor??null,o=a,d="string"==typeof n.query&&n.query.trim().length>0,u=0,l=new Set,c=new Set,_=n.now??Date.now();for(;u<1e3;){let p;if(null!==a){if(l.has(a))return H(e,{agentId:t,type:"sync_incomplete_guarded",detail:{pages:u,reason:"cursor_loop"},now:_}),{imported:r,updated:i,rejected_out_of_scope:s,next_cursor:a,pages:u,complete:!1};l.add(a)}try{p=await Y(e,t,{...n,cursor:a,seenCollector:c})}catch(r){if(r instanceof x){if("agent_not_found"===r.code||"scope_missing"===r.code||"unsupported"===r.code)throw r;if("provider_unavailable"===r.code)try{N(e,t)}catch{throw r}else if("invalid_input"===r.code&&void 0!==n.limit&&null!==n.limit){let e=Number(n.limit);if(!Number.isInteger(e)||e<1)throw r}}throw H(e,{agentId:t,type:"sync_error_guarded",detail:{error_code:r instanceof x?r.code:"provider_failed",pages:u},now:_}),r}if(r.push(...p.imported),i.push(...p.updated),s+=p.rejected_out_of_scope,u++,null===(a=p.next_cursor))return function(e,t,n){let r;if(n.hasQuery||null!==n.initialCursor)return;try{r=N(e,t)}catch{return}let i=r.scope;if(!i||"sessions"===i.kind)return;let s=e.prepare(`
|
|
139
|
+
SELECT COUNT(*) AS n FROM provider_sessions
|
|
140
|
+
WHERE agent_id = ? AND runtime_connection_id = ? AND origin = 'discovered' AND binding_id IS NULL AND availability = 'available'
|
|
141
|
+
`).get(t,r.connection.id).n;if(0===n.seenProviderIds.size){s>0&&H(e,{agentId:t,type:"sync_empty_guarded",detail:{stored:s},now:n.now});return}if(0===s)return;let a=K(e,r,i),o=e.prepare(`
|
|
142
|
+
SELECT * FROM provider_sessions
|
|
143
|
+
WHERE agent_id = ? AND runtime_connection_id = ? AND origin = 'discovered' AND binding_id IS NULL AND availability = 'available'
|
|
144
|
+
`).all(t,r.connection.id);e.transaction(()=>{for(let t of o)B(i,{workspace:t.workspace,provider_session_id:t.provider_session_id},a)&&(n.seenProviderIds.has(t.provider_session_id)||J(e,t,n.now))}).immediate()}(e,t,{seenProviderIds:c,hasQuery:d,initialCursor:o,now:_}),{imported:r,updated:i,rejected_out_of_scope:s,next_cursor:null,pages:u,complete:!0}}return H(e,{agentId:t,type:"sync_incomplete_guarded",detail:{pages:u,reason:"page_cap"},now:_}),{imported:r,updated:i,rejected_out_of_scope:s,next_cursor:a,pages:u,complete:!1}}function Q(e,t,n){H(e,{agentId:t,type:"sync_completed",detail:{imported:n.imported,rejected_out_of_scope:n.rejected_out_of_scope,complete:n.complete},now:n.now})}function ee(e,t,n){H(e,{agentId:t,type:"sync_failed",detail:{error_code:n.error_code},now:n.now})}function et(e,t){let n=e.prepare(`
|
|
145
|
+
SELECT type, detail FROM provider_session_events
|
|
146
|
+
WHERE agent_id = ? AND type IN ('sync_completed', 'sync_failed')
|
|
147
|
+
ORDER BY created_at DESC, rowid DESC LIMIT 1
|
|
148
|
+
`).get(t),r=e.prepare(`
|
|
149
|
+
SELECT detail, created_at FROM provider_session_events
|
|
150
|
+
WHERE agent_id = ? AND type = 'sync_completed'
|
|
151
|
+
ORDER BY created_at DESC, rowid DESC LIMIT 1
|
|
152
|
+
`).get(t),i=null,s=null;if(r){i=r.created_at;try{let e=JSON.parse(r.detail);"number"==typeof e.rejected_out_of_scope&&(s=e.rejected_out_of_scope)}catch{}}else{let n=e.prepare("SELECT MAX(last_synced_at) AS synced_at FROM provider_sessions WHERE agent_id = ?").get(t);i=n?.synced_at??null}let a=null;if(n?.type==="sync_failed")try{let e=JSON.parse(n.detail);a="string"==typeof e.error_code?e.error_code:"provider_failed"}catch{a="provider_failed"}return{synced_at:i,last_error_code:a,out_of_scope_count:s}}async function en(e,t,n={}){let r,i=n.now??Date.now();try{N(e,t)}catch(n){if(n instanceof x&&"provider_unavailable"===n.code)return Q(e,t,{imported:0,rejected_out_of_scope:0,complete:!0,now:i}),{outcome:"unsupported",imported:0,rejected_out_of_scope:0,complete:!0};return{outcome:"failed",imported:0,rejected_out_of_scope:0,complete:!1,error_code:n instanceof x?n.code:"provider_failed"}}try{r=await C(e,t,n)}catch(r){if(r instanceof x&&"unsupported"===r.code)return Q(e,t,{imported:0,rejected_out_of_scope:0,complete:!0,now:i}),{outcome:"unsupported",imported:0,rejected_out_of_scope:0,complete:!0};let n=r instanceof x?r.code:"provider_failed";return ee(e,t,{error_code:n,now:i}),{outcome:"failed",imported:0,rejected_out_of_scope:0,complete:!1,error_code:n}}if(!r.capabilities.list)return Q(e,t,{imported:0,rejected_out_of_scope:0,complete:!0,now:i}),{outcome:"unsupported",imported:0,rejected_out_of_scope:0,complete:!0};try{let r=await Z(e,t,n);return Q(e,t,{imported:r.imported.length,rejected_out_of_scope:r.rejected_out_of_scope,complete:r.complete,now:i}),{outcome:"synced",imported:r.imported.length,rejected_out_of_scope:r.rejected_out_of_scope,complete:r.complete}}catch(r){if(r instanceof x&&"unsupported"===r.code)return Q(e,t,{imported:0,rejected_out_of_scope:0,complete:!0,now:i}),{outcome:"unsupported",imported:0,rejected_out_of_scope:0,complete:!0};let n=r instanceof x?r.code:"provider_failed";return ee(e,t,{error_code:n,now:i}),{outcome:"failed",imported:0,rejected_out_of_scope:0,complete:!1,error_code:n}}}async function er(e,t,n,r={}){let i=await C(e,t,r),s=P(e,t,n);if(s.runtime_connection_id!==i.connection.id)throw new x("provider_unavailable","The session belongs to another runtime connection.");let a=await i.provider.getSession({...M(r),provider_session_id:s.provider_session_id});a.ok||D(a.error);let o=r.now??Date.now();return e.transaction(()=>{null===a.value?J(e,s,o):(G(e,i,s.id,a.value,o),H(e,{agentId:t,sessionRef:s.id,type:"session_synced",now:o}))}).immediate(),P(e,t,n)}function ei(e){if("string"!=typeof e.prompt||!e.prompt.trim())throw new x("invalid_input","prompt is required.");if(e.prompt.length>2e4)throw new x("invalid_input","prompt is longer than 20000 characters.");if("read_only"!==e.authority&&"workspace_write"!==e.authority)throw new x("invalid_input","authority must be read_only or workspace_write.");if("string"!=typeof e.idempotencyKey||!e.idempotencyKey.trim()||e.idempotencyKey.length>200)throw new x("invalid_input","idempotencyKey is required.");if(!e.requester||!["person","bot","service"].includes(e.requester.kind)||!e.requester.id)throw new x("invalid_input","requester is required.")}function es(e,t,n){if(!e.capabilities.authorities.includes(t))throw new x("authority_not_allowed",`The session provider cannot enforce ${t}.`);if(!e.policy)throw new x("authority_not_allowed","The Agent has no launch policy.");if("workspace_write"===t){if("workspace_write"!==e.policy.mode)throw new x("authority_not_allowed","The Agent's policy is read only.");if("send"===n&&!e.policy.allow_resume_with_edits)throw new x("authority_not_allowed","The Agent's policy does not allow resuming with edits.")}}function ea(e){return(0,t.createHash)("sha256").update(JSON.stringify(e)).digest("hex")}function eo(e,n,r){return`bm-${(0,t.createHash)("sha256").update(`${e}
|
|
153
|
+
${n.kind}
|
|
154
|
+
${n.id}
|
|
155
|
+
${r}`).digest("hex").slice(0,32)}`}function ed(e,t,n){return e.prepare("SELECT * FROM provider_session_turns WHERE agent_id = ? AND requester_kind = ? AND requester_id = ? AND idempotency_key = ?").get(t,n.requester.kind,n.requester.id,n.idempotencyKey)}function eu(e,t){if(e){if(e.request_hash!==t)throw new x("idempotency_conflict","That idempotency key was used for a different turn.");return e}}function el(e,t){let n=function(e,t=[]){let n=[e.provider_session_id,...t].filter(e=>e.length>0).sort((e,t)=>t.length-e.length);return e=>n.reduce((e,t)=>e.split(t).join("[redacted]"),e)}(e.prepare(`${W} WHERE id = ?`).get(t.session_ref),[t.provider_turn_id]);return{turn_ref:t.id,session_ref:t.session_ref,kind:t.kind,authority:t.authority,state:t.state,output:null===t.output?null:n(t.output),failure_code:t.failure_code,usage:"running"===t.state?null:{input_tokens:t.input_tokens??null,output_tokens:t.output_tokens??null,total_cost_usd:t.total_cost_usd??null},created_at:t.created_at,finished_at:t.finished_at}}function ec(e,t){return e.prepare(`
|
|
156
|
+
INSERT INTO provider_session_turns (
|
|
157
|
+
id, session_ref, agent_id, kind, authority, requester_kind, requester_id, idempotency_key, request_hash,
|
|
158
|
+
provider_turn_id, state, output, failure_code, correlation, created_at, finished_at
|
|
159
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', NULL, NULL, ?, ?, NULL)
|
|
160
|
+
`).run(t.id,t.session_ref,t.agent_id,t.kind,t.authority,t.requester_kind,t.requester_id,t.idempotency_key,t.request_hash,t.provider_turn_id,t.correlation,t.created_at),e.prepare("UPDATE provider_sessions SET busy = 1, updated_at = ? WHERE id = ?").run(t.created_at,t.session_ref),H(e,{agentId:t.agent_id,sessionRef:t.session_ref,turnId:t.id,type:"turn_started",detail:{kind:t.kind,authority:t.authority},now:t.created_at}),e.prepare("SELECT * FROM provider_session_turns WHERE id = ?").get(t.id)}function e_(e){return e instanceof Error&&/UNIQUE constraint failed: provider_session_turns/.test(e.message)}async function ep(e,r,i){ei(i);let s=j(i.workspace);if(!s)throw new x("invalid_input","workspace must be an absolute path.");N(e,r);let a=ea({kind:"start",workspace:s,prompt:i.prompt,authority:i.authority}),o=eu(ed(e,r,i),a);if(o)return{turn:el(e,o),replayed:!0};let d=await C(e,r,i);O(d,"start");let u=L(d);if("sessions"===u.kind)throw new x("out_of_scope","The Agent is scoped to selected sessions; it cannot start new ones.");if("workspaces"===u.kind&&!u.workspaces.some(e=>(0,n.workspaceContains)(e,s)))throw new x("out_of_scope","The workspace is outside the Agent's session scope.");if(!d.policy?.allow_new_sessions)throw new x("new_sessions_not_allowed","The Agent's policy does not allow new sessions.");es(d,i.authority,"start");let l=$(r,null),c=await d.provider.startSession({...M(i),workspace:s,prompt:i.prompt,authority:i.authority,idempotency_key:eo(r,i.requester,i.idempotencyKey),session_context:l.minter});c.ok||(l.abandon(),D(c.error));let _=c.value,p=await d.provider.getSession({...M(i),provider_session_id:_.provider_session_id}),f=i.now??Date.now();try{let n=e.transaction(()=>{let n=p.ok&&p.value?{...p.value,provider_session_id:_.provider_session_id,workspace:p.value.workspace??s}:{provider_session_id:_.provider_session_id,title:null,workspace:s,created_at:f,updated_at:f,lifecycle:"open",resumable:!1,busy:!0},{ref:o,created:u}=X(e,d,n,"started",f,U(i.prompt));return u&&H(e,{agentId:r,sessionRef:o,type:"session_started",detail:{authority:i.authority},now:f}),ec(e,{id:(0,t.randomUUID)(),session_ref:o,agent_id:r,kind:"start",authority:i.authority,requester_kind:i.requester.kind,requester_id:i.requester.id,idempotency_key:i.idempotencyKey,request_hash:a,provider_turn_id:_.provider_turn_id,correlation:JSON.stringify(i.correlation??{}),created_at:f})}).immediate();return l.record(n.session_ref,n.id),{turn:el(e,n),replayed:!1}}catch(t){if(l.abandon(),e_(t))return{turn:el(e,eu(ed(e,r,i),a)),replayed:!0};throw t}}async function ef(e,r,i,s){ei(s),N(e,r);let a=P(e,r,i),o=ea({kind:"send",ref:i,prompt:s.prompt,authority:s.authority}),d=eu(ed(e,r,s),o);if(d)return{turn:el(e,d),replayed:!0};let u=await C(e,r,s);if(O(u,"resume"),a.runtime_connection_id!==u.connection.id)throw new x("provider_unavailable","The session belongs to another runtime connection.");let l=L(u);if("binding"!==a.origin&&!("all_provider_sessions"===l.kind||"sessions"===l.kind&&l.sessions.includes(a.id)||"workspaces"===l.kind&&null!==a.workspace&&l.workspaces.some(e=>(0,n.workspaceContains)(e,a.workspace))))throw new x("out_of_scope","The session is outside the Agent's session scope.");es(u,s.authority,"send");let c=await er(e,r,i,s);if("missing"===c.availability)throw new x("session_missing","The provider no longer has this session.");if(1!==c.resumable)throw new x("not_resumable","The provider cannot resume this session.");let _=e.prepare("SELECT 1 FROM provider_session_turns WHERE session_ref = ? AND state = 'running'").get(i);if(1===c.busy||_)throw new x("busy","The session has a turn in flight.");let p=$(r,i),f=await u.provider.sendTurn({...M(s),provider_session_id:a.provider_session_id,prompt:s.prompt,authority:s.authority,idempotency_key:eo(r,s.requester,s.idempotencyKey),session_context:p.minter});f.ok||(p.abandon(),D(f.error));let h=s.now??Date.now();try{let n=e.transaction(()=>ec(e,{id:(0,t.randomUUID)(),session_ref:i,agent_id:r,kind:"send",authority:s.authority,requester_kind:s.requester.kind,requester_id:s.requester.id,idempotency_key:s.idempotencyKey,request_hash:o,provider_turn_id:f.value.provider_turn_id,correlation:JSON.stringify(s.correlation??{}),created_at:h})).immediate();return p.record(i,n.id),{turn:el(e,n),replayed:!1}}catch(t){if(p.abandon(),e_(t))return{turn:el(e,eu(ed(e,r,s),o)),replayed:!0};throw t}}function eh(e,t,n){let r=e.prepare("SELECT * FROM provider_session_turns WHERE id = ? AND agent_id = ?").get(n,t);if(!r)throw new x("turn_not_found","No turn with that reference.");return r}function em(e){return"number"==typeof e&&Number.isInteger(e)&&e>=0?e:null}function eg(e,t,n,i){e.transaction(()=>{var s;let d="completed"===n.status?"completed":"cancelled"===n.status?"cancelled":"failed",u=n.usage??null;if(0===e.prepare(`
|
|
161
|
+
UPDATE provider_session_turns SET state = ?, output = ?, failure_code = ?, finished_at = ?, input_tokens = ?, output_tokens = ?, total_cost_usd = ?
|
|
162
|
+
WHERE id = ? AND state = 'running'
|
|
163
|
+
`).run(d,"string"==typeof n.output?n.output:null,n.failure?String(n.failure.code).slice(0,100):null,"number"==typeof n.finished_at?n.finished_at:i,em(u?.input_tokens),em(u?.output_tokens),"number"==typeof(s=u?.total_cost_usd)&&Number.isFinite(s)&&s>=0?s:null,t.id).changes)return;if(S(t.id),n.failure?.code==="session_missing"){let n=e.prepare(`${W} WHERE id = ?`).get(t.session_ref);J(e,n,i)}let l=e.prepare("SELECT provider_kind FROM provider_sessions WHERE id = ?").get(t.session_ref);(0,o.recordTurnUsageSample)(e,t.id,t.session_ref,{agentId:t.agent_id,provider:l?.provider_kind??"unknown",usage:function(e){try{return(0,a.usageFromEvent)(e)}catch{return null}}(n.usage),observedAt:"number"==typeof n.finished_at?n.finished_at:i,now:i}),e.prepare(`
|
|
164
|
+
UPDATE provider_sessions SET busy = CASE WHEN EXISTS (
|
|
165
|
+
SELECT 1 FROM provider_session_turns WHERE session_ref = ? AND state = 'running') THEN 1 ELSE 0 END,
|
|
166
|
+
provider_updated_at = ?, updated_at = ? WHERE id = ?
|
|
167
|
+
`).run(t.session_ref,i,i,t.session_ref);let c=(0,r.normalizeUsage)(u&&void 0===u.cost_usd&&"total_cost_usd"in u?{...u,cost_usd:u.total_cost_usd}:u);H(e,{agentId:t.agent_id,sessionRef:t.session_ref,turnId:t.id,type:`turn_${d}`,detail:c?{usage:c}:{},now:i})}).immediate()}async function ey(e,t,n,r={}){let i=eh(e,t,n);if("running"!==i.state)return el(e,i);let s=await C(e,t,r),a=await s.provider.observeTurn({...M(r),provider_turn_id:i.provider_turn_id});if(!a.ok){if("cancelled"===a.error.code||"timed_out"===a.error.code)return el(e,eh(e,t,n));D(a.error)}return eg(e,i,a.value,r.now??Date.now()),el(e,eh(e,t,n))}async function ew(e,t,n,r={}){let i=eh(e,t,n);if("running"!==i.state)return{turn:el(e,i),outcome:"already_terminal"};let s=await C(e,t,r);O(s,"cancel");let a=r.now??Date.now();H(e,{agentId:t,sessionRef:i.session_ref,turnId:i.id,type:"cancel_requested",now:a});let o=await s.provider.cancelTurn({...M(r),provider_turn_id:i.provider_turn_id});return(o.ok||D(o.error),"cancelled"===o.value)?(eg(e,i,{status:"cancelled",provider_session_id:"",output:null,failure:{code:"cancelled",message:""},finished_at:a},a),{turn:el(e,eh(e,t,n)),outcome:"cancelled"}):{turn:await ey(e,t,n,r),outcome:"already_terminal"}}function ev(e,t,n){let r=e.prepare("SELECT * FROM provider_session_turns WHERE id = ? AND agent_id = ?").get(n,t);return r?el(e,r):void 0}function ek(e){return e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'provider_sessions'").get()?[...e.prepare("SELECT provider_session_id AS id FROM provider_sessions").all(),...e.prepare("SELECT provider_turn_id AS id FROM provider_session_turns").all()].map(e=>e.id):[]}},93399,e=>{"use strict";e.s(["serviceRedactor",()=>c]);var t=e.i(46786),n=e.i(62294),r=e.i(16789);let i=/^(cwd|working_directory|workspace|default_workspace|workspaces|deck|deck_id|deck_name|hermes_profile|hermes_profile_path)$/,s=/(KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL)/i,a=/^(id|ref|session_ref|sessionRef|kind)$|(request|conversation|agent|message|attempt|exchange|event|wake|grant|binding|finalization|bot|participant|sender|requester|origin|group)_?id$/i;function o(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function d(e){try{return JSON.parse(e)}catch{return null}}function u(e,t,n=!1){if("string"==typeof e)n&&t.add(e);else if(Array.isArray(e))for(let r of e)u(r,t,n);else if(o(e))for(let[r,s]of Object.entries(e))u(s,t,n||i.test(r))}function l(e,t,n){return t.reduce((e,t)=>t.length>=6?e.includes(t)?e.split(t).join(n):e:e.includes(t)?e.replace(RegExp(`(?<![A-Za-z0-9])${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?![A-Za-z0-9])`,"g"),n):e,e)}function c(){let e,i=function(){let e=new Set;for(let t of n.default.prepare("SELECT external_session_id AS id FROM session_bindings").all())e.add(t.id);for(let t of(0,r.privateProviderIds)(n.default))e.add(t);for(let t of n.default.prepare("SELECT external_session_id, external_run_id FROM work_attempts WHERE external_session_id IS NOT NULL OR external_run_id IS NOT NULL").all())t.external_session_id&&e.add(t.external_session_id),t.external_run_id&&e.add(t.external_run_id);return[...e].filter(e=>e.length>0).sort((e,t)=>t.length-e.length)}(),c=function(){let e=new Set;for(let t of n.bots.getAll())u(t,e),"string"==typeof t.session_scope_items&&u(d(t.session_scope_items),e,!0);if(n.default.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'provider_sessions'").get())for(let t of n.default.prepare("SELECT workspace FROM provider_sessions WHERE workspace IS NOT NULL").all())e.add(t.workspace);for(let n of[...e]){var r;let i="~"===(r=n)?t.default.homedir():r.startsWith("~/")?`${t.default.homedir()}/${r.slice(2)}`:null;i&&e.add(i),n.length>1&&n.endsWith("/")&&e.add(n.replace(/\/+$/,""))}for(let t of n.default.prepare(`
|
|
168
|
+
SELECT launch_snapshot AS snapshot FROM work_attempts WHERE launch_snapshot IS NOT NULL
|
|
169
|
+
UNION ALL SELECT snapshot FROM launch_snapshots
|
|
170
|
+
`).all())u(d(t.snapshot),e);return[...new Set([...[...e].filter(e=>e.trim().length>=4),...Object.entries(process.env).filter(([e,t])=>s.test(e)&&"string"==typeof t).flatMap(([,e])=>[e,...e.split(/[\s,=]+/)]).filter(e=>e.length>=8)])].sort((e,t)=>t.length-e.length)}(),_=(e=t.default.homedir().replace(/\/+$/,"")).length<4?null:RegExp(`${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?=$|[/\\s"'\`)\\]}>,;:])[^\\s"'\`)\\]}>,;]*`,"g"),p=e=>{let t=l(l(e,i,"[redacted runtime id]"),c,"[redacted]");return _?t.replace(_,"[redacted]"):t},f=(e,t)=>"string"==typeof e?null!==t&&a.test(t)?e:p(e):Array.isArray(e)?e.map(e=>f(e,null)):o(e)?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,f(t,e)])):e;return{text:p,deep:e=>f(e,null)}}},63020,e=>{"use strict";var t=e.i(54799),n=e.i(62349),r=e.i(35613),i=e.i(64974),s=e.i(11626),a=e.i(142);let o=Object.freeze({kind:"service",id:"botmancers-exchanges"}),d=["ask","continue"],u={invalid_request:400,authority_not_allowed:403,recursive_exchange:403,conversation_not_found:404,agent_not_found:404,session_not_found:404,session_ended:409,session_not_resumable:409,source_session_busy:409,agent_unavailable:409,destination_invalid:400,idempotency_conflict:409,exchange_not_found:404,exchange_terminal:409,invalid_transition:409};class l extends Error{code;constructor(e,t){super(t),this.name="ExchangeError",this.code=e}get status(){return u[this.code]}}let c=["decisions","constraints","artifacts","open_questions"];function _(e){return"string"==typeof e&&e.trim().length>0}function p(e,...t){return t.reduce((e,t)=>t?e.split(t).join("[redacted session id]"):e,e)}let f="\n[truncated]";function h(e,t){return e.length<=t?{content:e,truncated:!1}:t<=f.length?{content:e.slice(0,t),truncated:!0}:{content:`${e.slice(0,t-f.length)}${f}`,truncated:!0}}let m="This is a read-only turn: do not edit files, change state, start other work, or emit Wakes.";function g(e,t){return`${e}:
|
|
171
|
+
${t.length>0?t.map(e=>`- ${e}`).join("\n"):"(none)"}`}function y(e){let t;if(e.requester_kind!==o.kind||e.requester_id!==o.id)return null;try{t=JSON.parse(e.policy_snapshot)}catch{return null}return t&&"session_exchange"===t.source&&"string"==typeof t.exchange_id&&("ask"===t.hop||"extract"===t.hop||"deliver"===t.hop)?{exchangeId:t.exchange_id,hop:t.hop,resumeBindingId:"string"==typeof t.resume_session_binding?t.resume_session_binding:null}:null}let w=new Set(["mode","idempotency_key","origin_conversation_id","source","destination","instruction","execution_kind","tool_profile"]),v=["exchange_id","parent_exchange_id"];function k(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}e.s(["ExchangeError",0,l,"cancelReasonFromBody",0,function(e){let t;if(0===e.trim().length)return null;try{t=JSON.parse(e)}catch{throw new l("invalid_request","The body must be a JSON object.")}if(!k(t))throw new l("invalid_request","The body must be a JSON object.");let n=Object.keys(t).filter(e=>"reason"!==e);if(n.length>0)throw new l("invalid_request",`Unknown field ${n[0]}.`);let r=t.reason;if(null!=r&&("string"!=typeof r||r.length>500))throw new l("invalid_request","reason must be a string of at most 500 characters.");return"string"==typeof r?r:null},"createExchangeStore",0,function(e,u){let f=e.prepare("SELECT * FROM session_exchanges WHERE id = ?"),w=e.prepare("SELECT * FROM session_exchanges WHERE requester_kind = ? AND requester_id = ? AND idempotency_key = ?"),v=e.prepare("SELECT * FROM session_exchanges WHERE source_request_id = ? OR destination_request_id = ?"),k=e.prepare("SELECT * FROM session_bindings WHERE id = ?"),E=e.prepare("SELECT * FROM bots WHERE id = ?"),b=e.prepare(`
|
|
172
|
+
INSERT INTO session_exchange_events (id, exchange_id, sequence, type, data, created_at)
|
|
173
|
+
SELECT ?, ?, COALESCE(MAX(sequence), 0) + 1, ?, ?, ? FROM session_exchange_events WHERE exchange_id = ?
|
|
174
|
+
`);function S(e){let t=f.get(e);if(!t)throw new l("exchange_not_found",`No exchange ${e}.`);return t}function T(e,n,r,i){b.run((0,t.randomUUID)(),e,n,null==r?null:JSON.stringify(r),i,e)}function I(e){return e?E.get(e)?.name??null:null}function R(e){return r.EXCHANGE_TERMINAL_STATES.includes(e)}function A(t,n,i,s={}){if(!r.EXCHANGE_TRANSITIONS[t.state].includes(n))throw new l("invalid_transition",`Cannot move an exchange from ${t.state} to ${n}.`);let a=R(n);if(1!==e.prepare(`
|
|
175
|
+
UPDATE session_exchanges SET state = ?, version = version + 1, updated_at = ?, terminal_at = ?,
|
|
176
|
+
failure_code = ?, failure_message = ?
|
|
177
|
+
WHERE id = ? AND state = ? AND version = ?
|
|
178
|
+
`).run(n,i,a?i:null,"failed"===n?s.failureCode??"failed":t.failure_code,"failed"===n?s.failureMessage??"The exchange failed.":t.failure_message,t.id,t.state,t.version).changes)throw new l("invalid_transition",`Exchange ${t.id} changed concurrently.`);return T(t.id,"state_changed",{from:t.state,to:n,reason:s.reason??null,..."failed"===n?{failure_code:s.failureCode??"failed"}:{}},i),S(t.id)}function q(t,n,r){let i=Object.keys(n);if(0===i.length)return t;if(1!==e.prepare(`UPDATE session_exchanges SET ${i.map(e=>`${e} = ?`).join(", ")}, version = version + 1, updated_at = ? WHERE id = ? AND version = ?`).run(...i.map(e=>n[e]??null),r,t.id,t.version).changes)throw new l("invalid_transition",`Exchange ${t.id} changed concurrently.`);return S(t.id)}function x(e,t,n){let d,c={kind:e.requester_kind,id:e.requester_id},_=`exchange:${e.id}:${t}`;if(n.intent.length>r.EXCHANGE_LIMITS.promptChars)throw new l("invalid_request",`The ${t} prompt exceeds ${r.EXCHANGE_LIMITS.promptChars} characters.`);return u.createOrGetWorkRequest({sourceConversationId:n.conversationId,sourceEventId:_,requester:o,targetAgentId:n.targetAgentId,intent:n.intent,executionKind:"conversation",toolProfile:"readonly",idempotencyKey:_,parentRequestId:n.parentRequestId,policy:{source:"session_exchange",exchange_id:e.id,hop:t,...n.resumeBindingId?{resume_session_binding:n.resumeBindingId}:{}},executionPolicy:function(){let e=(0,i.selectExecutionPolicy)({entryPoint:"exchange",executionKind:"conversation"});if(!e.ok)throw Error(e.reason);return e.policy}(),rootPrincipal:c,retryPolicy:{...s.DEFAULT_RETRY_POLICY},...{safetySnapshot:d={safety_version:a.WAKE_SAFETY_VERSION,root_principal:{kind:c.kind,id:c.id},grant_rule:"readonly_default",grant_id:null,exchange:!0},safety:{principalType:"service"===c.kind?"api_principal":"human_owner",principal:c,decision:"allowed",grantRule:"readonly_default",snapshot:d}},now:n.now}).request}function N(e,t){let r=E.get(e);if(!r)throw new l("agent_not_found",`No ${t} Agent ${e}.`);let i=(0,n.resolveAgent)(r);if(!i.launchable){let e="connection"===i.launch_blocker?"has no runtime connection":"session_scope"===i.launch_blocker?"has no session scope":"has an unsupported Agent type";throw new l("agent_unavailable",`The ${t} Agent ${r.name} ${e}.`)}return{id:r.id,name:r.name,agent:i.agent}}function C(t,n,r){if(!e.prepare("SELECT 1 FROM conversations WHERE id = ?").get(t)||!e.prepare("SELECT 1 FROM conversation_participants WHERE conversation_id = ? AND participant_kind = ? AND participant_id = ?").get(t,n.kind,n.id))throw new l("conversation_not_found",`No ${r} conversation ${t} is visible to the owner.`)}let O={create(n){var s;if(!n.requester||!_(n.requester.id)||!["person","bot","service"].includes(n.requester.kind))throw new l("invalid_request","A requester principal is required.");let a="service"===n.requester.kind&&!0===n.serviceGrant&&n.requester.id!==o.id;if("person"!==n.requester.kind&&!a)throw new l("recursive_exchange","Exchanges are started by the owner; an Agent or exchange hop cannot start another exchange.");if(!_(n.idempotencyKey)||n.idempotencyKey.length>200)throw new l("invalid_request","An idempotency key (1-200 characters) is required.");if(!d.includes(n.mode))throw new l("invalid_request",'mode must be "ask" or "continue".');if(!_(n.originConversationId))throw new l("invalid_request","origin_conversation_id is required.");if(!_(n.sourceAgentId))throw new l("invalid_request","source.agent_id is required.");if(!_(n.sessionRef))throw new l("invalid_request","source.session_ref is required.");if(!_(n.instruction))throw new l("invalid_request","instruction is required.");if(n.instruction.length>r.EXCHANGE_LIMITS.instructionChars)throw new l("invalid_request",`instruction exceeds ${r.EXCHANGE_LIMITS.instructionChars} characters.`);if(void 0!==n.executionKind){let e=(0,i.selectExecutionPolicy)({entryPoint:"exchange",executionKind:n.executionKind});if(!e.ok)throw new l("authority_not_allowed",`${e.reason} An exchange never requests edit authority.`)}if("ask"===n.mode&&(null!=n.destinationAgentId||null!=n.destinationConversationId))throw new l("destination_invalid","An Ask returns to the origin conversation and takes no destination.");if("continue"===n.mode){if(!_(n.destinationAgentId))throw new l("destination_invalid","A Continue names destination.agent_id.");if(n.destinationAgentId===n.sourceAgentId)throw new l("destination_invalid","A Continue hands off to another Agent; the destination cannot be the source Agent.");if(null!=n.destinationConversationId&&!_(n.destinationConversationId))throw new l("destination_invalid","destination.conversation_id must be a non-empty string when present.")}let c=(s=JSON.stringify([n.mode,n.originConversationId,n.sourceAgentId,n.sessionRef,n.destinationAgentId??null,n.destinationConversationId??null,n.instruction]),(0,t.createHash)("sha256").update(s).digest("hex"));return e.transaction(()=>{var i,s;let a=w.get(n.requester.kind,n.requester.id,n.idempotencyKey);if(a){if(a.request_hash!==c)throw new l("idempotency_conflict","The idempotency key was already used with a different exchange.");return{exchange:a,created:!1}}let o=n.now??Date.now();if(C(n.originConversationId,n.requester,"origin"),!E.get(n.sourceAgentId))throw new l("agent_not_found",`No source Agent ${n.sourceAgentId}.`);let d=k.get(n.sessionRef);if(!d||d.agent_id!==n.sourceAgentId)throw new l("session_not_found",`Session ${n.sessionRef} is not a session of Agent ${n.sourceAgentId}.`);if(null!==d.released_at)throw new l("session_ended",`Session ${d.id} has ended and cannot be resumed.`);let _=N(n.sourceAgentId,"source");if(d.adapter!==_.agent)throw new l("session_not_resumable",`Session ${d.id} was bound under ${d.adapter}; ${_.name} now runs ${_.agent}.`);let p=d.conversation_id?d.conversation_id:d.request_id?u.getWorkRequest(d.request_id)?.source_conversation_id??null:null;if(!p)throw new l("session_not_resumable",`Session ${d.id} has no conversation to resume in.`);if(e.prepare("SELECT 1 FROM session_exchanges WHERE source_binding_id = ? AND terminal_at IS NULL").get(d.id))throw new l("source_session_busy",`Session ${d.id} already has an exchange in progress; wait for it or cancel it.`);let f=null,h=null;if("continue"===n.mode)if(f=N(n.destinationAgentId,"destination"),n.destinationConversationId)C(n.destinationConversationId,n.requester,"destination"),h=n.destinationConversationId;else if("service"===n.requester.kind)throw new l("destination_invalid","A service-started Continue names destination.conversation_id.");else{let t=e.prepare("SELECT id FROM conversations WHERE bot_id = ?").get(f.id);if(!t)throw new l("destination_invalid",`${f.name} has no direct thread; name destination.conversation_id.`);h=t.id}let g=(0,t.randomUUID)();e.prepare(`
|
|
179
|
+
INSERT INTO session_exchanges (
|
|
180
|
+
id, requester_kind, requester_id, idempotency_key, request_hash, mode, origin_conversation_id,
|
|
181
|
+
source_agent_id, source_binding_id, destination_agent_id, destination_conversation_id, instruction,
|
|
182
|
+
state, created_at, updated_at
|
|
183
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)
|
|
184
|
+
`).run(g,n.requester.kind,n.requester.id,n.idempotencyKey,c,n.mode,n.originConversationId,n.sourceAgentId,d.id,f?.id??null,h,n.instruction,o,o),T(g,"created",{mode:n.mode,source_agent_id:n.sourceAgentId,source_binding_id:d.id,destination_agent_id:f?.id??null,destination_conversation_id:h},o);let y=S(g),v="ask"===n.mode?"ask":"extract",b=x(y,v,{conversationId:p,targetAgentId:n.sourceAgentId,intent:"ask"===v?function(e,t,n="the owner"){return`[Session Ask from ${n}] Exchange: ${e}
|
|
185
|
+
|
|
186
|
+
Answer one question from the context of this session. ${m} Reply with the answer only.
|
|
187
|
+
|
|
188
|
+
Question:
|
|
189
|
+
${t}`}(g,n.instruction,"service"===y.requester_kind?`service ${y.requester_id}`:"the owner"):(i=f?.name??"another Agent",s=n.instruction,`[Session Continue handoff from the owner] Exchange: ${g}
|
|
190
|
+
|
|
191
|
+
The owner is handing this session's work to ${i}, who starts a fresh session and cannot see this one. ${m}
|
|
192
|
+
|
|
193
|
+
Reply with exactly one JSON object and nothing else:
|
|
194
|
+
|
|
195
|
+
{"objective": string, "decisions": [string], "constraints": [string], "artifacts": [string], "open_questions": [string]}
|
|
196
|
+
|
|
197
|
+
objective: what ${i} should achieve. decisions: what was decided and why. constraints: requirements and limits to respect. artifacts: files, branches, Work Requests, and other references. open_questions: what is still unresolved.
|
|
198
|
+
|
|
199
|
+
Limits: objective at most ${r.EXCHANGE_LIMITS.packetObjectiveChars} characters; each list at most ${r.EXCHANGE_LIMITS.packetListItems} entries of at most ${r.EXCHANGE_LIMITS.packetItemChars} characters.
|
|
200
|
+
|
|
201
|
+
Owner instruction:
|
|
202
|
+
${s}`),parentRequestId:d.request_id,resumeBindingId:d.id,now:o}),I=q(y,{source_request_id:b.id},o);return T(g,"hop_queued",{hop:v,request_id:b.id},o),{exchange:I,created:!0}}).immediate()},get:e=>f.get(e),require:S,listEvents:t=>e.prepare("SELECT * FROM session_exchange_events WHERE exchange_id = ? ORDER BY sequence ASC").all(t),forHopRequest:e=>v.get(e,e),resumeFor(e,t){let n=y(e);if(!n)return null;if("deliver"===n.hop)return{ok:!0,binding:null,freshSession:!0};let r=O.get(n.exchangeId),i=n.resumeBindingId?k.get(n.resumeBindingId):void 0;return r&&i&&r.source_binding_id===i.id&&r.source_request_id===e.id?null!==i.released_at?{ok:!1,reason:"The selected session has ended."}:i.agent_id!==e.target_agent_id||i.adapter!==t?{ok:!1,reason:"The selected session belongs to another Agent or runtime."}:{ok:!0,binding:i}:{ok:!1,reason:"The exchange does not name this session."}},turnContext:e=>y(e)?[{speakerLabel:"Botmancers",fromAgent:!1,content:e.intent}]:null,hopClaimed(e,t,n){let r=O.forHopRequest(e);if(!(!r||R(r.state))){if(r.source_request_id===e){let i=r.source_attempt_id?r:q(r,{source_attempt_id:t},n);"queued"===i.state&&A(i,"extracting",n,{reason:"hop_started"}),T(r.id,"hop_started",{hop:"ask"===r.mode?"ask":"extract",request_id:e,attempt_id:t},n);return}r.destination_attempt_id||q(r,{destination_attempt_id:t},n),T(r.id,"hop_started",{hop:"deliver",request_id:e,attempt_id:t},n)}},sanitizeHopResult(e,t){let n=y(e),i=n?O.get(n.exchangeId):void 0;if(!n||!i)return t;let s=k.get(i.source_binding_id)?.external_session_id??null,a="ask"===n.hop?r.EXCHANGE_LIMITS.answerChars:"extract"===n.hop?r.EXCHANGE_LIMITS.extractionOutputChars:r.EXCHANGE_LIMITS.replyChars,o=t.externalSessionId??null,d=null===t.output?null:h(p(t.output,s,o),a);return{...t,output:d?d.content:null,outputTruncated:!0===t.outputTruncated||d?.truncated===!0,failure:t.failure?{...t.failure,message:p(t.failure.message,s,o)}:null}},commitHop(n,i,s,a){let o=y(n),d=o?O.get(o.exchangeId):void 0;if(!o||!d)return{exchange_id:o?.exchangeId??null,discarded:"exchange_missing"};if(R(d.state)||null!==d.cancel_requested_at)return T(d.id,"hop_result_discarded",{hop:o.hop,request_id:n.id,reason:R(d.state)?d.state:"cancel_requested"},a),{exchange_id:d.id,discarded:"cancel_requested"};let l=s.output??"",f=k.get(d.source_binding_id)?.external_session_id??null;if("ask"===o.hop){let o=h(p(l,f),r.EXCHANGE_LIMITS.answerChars),{content:u}=o,c=o.truncated||!0===s.outputTruncated,_=(0,t.randomUUID)();return e.prepare("INSERT INTO messages (id, conversation_id, sender_type, sender_id, sender_kind, request_id, content, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run(_,d.origin_conversation_id,"bot",d.source_agent_id,"bot",n.id,u,a),q(d,{answer_message_id:_},a),T(d.id,"answer_returned",{request_id:n.id,attempt_id:i.id,message_id:_,conversation_id:d.origin_conversation_id,truncated:c},a),{exchange_id:d.id,answer_message_id:_}}if("extract"===o.hop){var m;let e=s.outputTruncated?{ok:!1,reason:`The extraction output exceeds ${r.EXCHANGE_LIMITS.extractionOutputChars} characters.`}:function(e){let t;if(e.length>r.EXCHANGE_LIMITS.extractionOutputChars)return{ok:!1,reason:`The extraction output exceeds ${r.EXCHANGE_LIMITS.extractionOutputChars} characters.`};let n=/```(?:json)?\s*([\s\S]*?)```/.exec(e),i=(n?n[1]:e).trim(),s=i.indexOf("{"),a=i.lastIndexOf("}");if(s<0||a<s)return{ok:!1,reason:"The handoff packet is not a JSON object."};try{t=JSON.parse(i.slice(s,a+1))}catch{return{ok:!1,reason:"The handoff packet is not valid JSON."}}if(!t||"object"!=typeof t||Array.isArray(t))return{ok:!1,reason:"The handoff packet is not a JSON object."};let o=t;if(!_(o.objective))return{ok:!1,reason:"The handoff packet has no objective."};if(o.objective.length>r.EXCHANGE_LIMITS.packetObjectiveChars)return{ok:!1,reason:`The handoff packet objective exceeds ${r.EXCHANGE_LIMITS.packetObjectiveChars} characters.`};let d={objective:o.objective.trim(),decisions:[],constraints:[],artifacts:[],open_questions:[]};for(let e of c){let t=o[e]??[];if(!Array.isArray(t)||t.some(e=>"string"!=typeof e))return{ok:!1,reason:`The handoff packet field ${e} must be a list of strings.`};if(t.length>r.EXCHANGE_LIMITS.packetListItems)return{ok:!1,reason:`The handoff packet field ${e} has ${t.length} entries (limit ${r.EXCHANGE_LIMITS.packetListItems}).`};if(t.some(e=>e.length>r.EXCHANGE_LIMITS.packetItemChars))return{ok:!1,reason:`An entry of the handoff packet field ${e} exceeds ${r.EXCHANGE_LIMITS.packetItemChars} characters.`};d[e]=t.map(e=>e.trim()).filter(e=>e.length>0)}return JSON.stringify(d).length>r.EXCHANGE_LIMITS.packetChars?{ok:!1,reason:`The handoff packet exceeds ${r.EXCHANGE_LIMITS.packetChars} characters.`}:{ok:!0,packet:d}}(l);if(!e.ok)return T(d.id,"packet_rejected",{request_id:n.id,attempt_id:i.id,reason:e.reason},a),A(d,"failed",a,{reason:"packet_invalid",failureCode:"packet_invalid",failureMessage:e.reason}),{exchange_id:d.id,packet:"rejected"};let t=(m=e.packet,{objective:p(m.objective,f),decisions:m.decisions.map(e=>p(e,f)),constraints:m.constraints.map(e=>p(e,f)),artifacts:m.artifacts.map(e=>p(e,f)),open_questions:m.open_questions.map(e=>p(e,f))});return q(d,{packet:JSON.stringify(t)},a),T(d.id,"packet_extracted",{request_id:n.id,attempt_id:i.id,size:JSON.stringify(t).length,counts:Object.fromEntries(c.map(e=>[e,t[e].length]))},a),{exchange_id:d.id,packet:"stored"}}let g=s.externalSessionId??null,w=!1;try{w=!0===JSON.parse(i.launch_snapshot).fresh_session}catch{w=!1}if(!(w&&g&&g!==f&&!e.prepare("SELECT 1 FROM session_bindings WHERE external_session_id = ?").get(g)&&!e.prepare("SELECT 1 FROM work_attempts WHERE external_session_id = ? AND id != ?").get(g,i.id))){let e=w?g?"reused":"not_reported":"not_fresh_launch";return T(d.id,"destination_session_rejected",{request_id:n.id,attempt_id:i.id,reason:e},a),A(d,"failed",a,{reason:"destination_session_invalid",failureCode:"destination_session_invalid",failureMessage:g?"The destination Agent reported a session that is not new; the hand-off needs a fresh destination-owned session.":"The destination Agent reported no session; the hand-off needs a fresh destination-owned session."}),{exchange_id:d.id,destination_session:"rejected"}}let v=(0,t.randomUUID)(),E=d.destination_conversation_id,b=h(p(l,f,g),r.EXCHANGE_LIMITS.replyChars),{content:S}=b,I=b.truncated||!0===s.outputTruncated;e.prepare("INSERT INTO messages (id, conversation_id, sender_type, sender_id, sender_kind, request_id, content, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run(v,E,"bot",n.target_agent_id,"bot",n.id,S,a);let x=u.bindSession({agentId:n.target_agent_id,adapter:i.adapter,externalSessionId:g,conversationId:E,requestId:n.id,sourceAttemptId:i.id,now:a}).id;return q(d,{destination_binding_id:x},a),T(d.id,"destination_replied",{request_id:n.id,attempt_id:i.id,message_id:v,conversation_id:E,session_ref:x,truncated:I},a),{exchange_id:d.id,destination_message_id:v}},advance:(t,n=Date.now())=>e.transaction(()=>{let i=O.get(t);if(!i||R(i.state))return[];if("queued"===i.state||"extracting"===i.state){var s,a,o,d;let t=i.source_request_id?u.getWorkRequest(i.source_request_id):void 0;if(!t)return A(i,"failed",n,{reason:"hop_missing",failureCode:"hop_missing",failureMessage:"The source session turn is missing."}),[];if(!r.TERMINAL_STATES.includes(t.state))return"queued"!==t.state&&"queued"===i.state&&A(i,"extracting",n,{reason:"hop_started"}),"queued"===t.state&&null===i.cancel_requested_at?[t.id]:[];if(null!==i.cancel_requested_at||"cancelled"===t.state)return A(i,"cancelled",n,{reason:null!==i.cancel_requested_at?"cancel_requested":"hop_cancelled"}),[];if("failed"===t.state)return A(i,"failed",n,{reason:"hop_failed",failureCode:"source_turn_failed",failureMessage:`The source session turn failed (${t.error_code??"failed"}): ${t.error_message??"no detail"}`}),[];if("queued"===i.state&&(i=A(i,"extracting",n,{reason:"hop_started"})),"ask"===i.mode)return i.answer_message_id?A(i,"completed",n,{reason:"answered"}):A(i,"failed",n,{reason:"answer_missing",failureCode:"answer_missing",failureMessage:"The source session turn returned no answer."}),[];if(!i.packet)return A(i,"failed",n,{reason:"packet_missing",failureCode:"packet_missing",failureMessage:"The source session turn returned no handoff packet."}),[];let l=JSON.parse(i.packet),c=i.destination_conversation_id,_=i.destination_agent_id;s={kind:"bot",id:_},e.prepare("INSERT OR IGNORE INTO conversation_participants (conversation_id, participant_kind, participant_id, joined_at) VALUES (?, ?, ?, ?)").run(c,s.kind,s.id,n);let p=x(i,"deliver",{conversationId:c,targetAgentId:_,intent:(a=i.id,o=I(i.source_agent_id)??"the source Agent",d=i.instruction,[`Continue from ${o}: ${function(e,t=80){let n=e.split("\n").map(e=>e.trim()).find(e=>e.length>0)??"";return n.length>t?`${n.slice(0,t-1).trimEnd()}…`:n}(l.objective)}`,`[Session Continue] Exchange: ${a}`,`The owner handed you this work from ${o}'s session. You start a fresh session of your own: ${o}'s session is not available to you, and this handoff packet is everything carried over.`,`Objective:
|
|
203
|
+
${l.objective}`,g("Decisions",l.decisions),g("Constraints",l.constraints),g("Artifacts and references",l.artifacts),g("Open questions",l.open_questions),`Owner instruction:
|
|
204
|
+
${d}`].join("\n\n")),parentRequestId:null,resumeBindingId:null,now:n});return T((i=q(i,{destination_request_id:p.id},n)).id,"hop_queued",{hop:"deliver",request_id:p.id},n),A(i,"delivering",n,{reason:"packet_extracted"}),[p.id]}let l=i.destination_request_id?u.getWorkRequest(i.destination_request_id):void 0;return l?r.TERMINAL_STATES.includes(l.state)?(null!==i.cancel_requested_at||"cancelled"===l.state?A(i,"cancelled",n,{reason:null!==i.cancel_requested_at?"cancel_requested":"hop_cancelled"}):"failed"===l.state?A(i,"failed",n,{reason:"hop_failed",failureCode:"destination_turn_failed",failureMessage:`The destination turn failed (${l.error_code??"failed"}): ${l.error_message??"no detail"}`}):i.destination_binding_id?A(i,"completed",n,{reason:"delivered"}):A(i,"failed",n,{reason:"destination_session_missing",failureCode:"destination_session_invalid",failureMessage:"The destination turn bound no fresh destination-owned session."}),[]):"queued"===l.state&&null===i.cancel_requested_at?[l.id]:[]:(A(i,"failed",n,{reason:"hop_missing",failureCode:"hop_missing",failureMessage:"The destination turn is missing."}),[])}).immediate(),requestCancel:(t,n,r,i=Date.now())=>e.transaction(()=>{let s=S(t);if(R(s.state))throw new l("exchange_terminal",`Exchange ${t} is already ${s.state}; it cannot be cancelled.`);let a="delivering"===s.state?s.destination_request_id:s.source_request_id;return null!==s.cancel_requested_at?{exchange:s,hopRequestId:a,replayed:!0}:(e.prepare("UPDATE session_exchanges SET cancel_requested_at = ?, cancel_requested_by = ?, cancel_reason = ?, version = version + 1, updated_at = ? WHERE id = ? AND cancel_requested_at IS NULL").run(i,`${n.kind}:${n.id}`,r,i,t),T(t,"cancel_requested",{by:`${n.kind}:${n.id}`,reason:r,state:s.state,request_id:a},i),{exchange:S(t),hopRequestId:a,replayed:!1})}).immediate(),openIds:()=>e.prepare("SELECT id FROM session_exchanges WHERE terminal_at IS NULL ORDER BY created_at ASC, id ASC").all().map(e=>e.id),view(t){let n=S(t),i=(e,t)=>{let n=e?u.getWorkRequest(e):void 0;return n?{request_id:n.id,attempt_id:t,state:n.state,execution_kind:n.execution_kind,tool_profile:n.tool_profile}:null},s=n.answer_message_id?e.prepare("SELECT id, conversation_id, content FROM messages WHERE id = ?").get(n.answer_message_id):void 0;return{id:n.id,mode:n.mode,state:n.state,requester:{kind:n.requester_kind,id:n.requester_id},origin_conversation_id:n.origin_conversation_id,instruction:n.instruction,source:{agent_id:n.source_agent_id,agent_name:I(n.source_agent_id),session_ref:n.source_binding_id},destination:n.destination_agent_id&&n.destination_conversation_id?{agent_id:n.destination_agent_id,agent_name:I(n.destination_agent_id),conversation_id:n.destination_conversation_id,session_ref:n.destination_binding_id}:null,hops:{source:i(n.source_request_id,n.source_attempt_id),destination:i(n.destination_request_id,n.destination_attempt_id)},answer:s?{message_id:s.id,conversation_id:s.conversation_id,content:s.content}:null,packet:n.packet?JSON.parse(n.packet):null,failure:"failed"===n.state?{code:n.failure_code??"failed",message:n.failure_message??""}:null,cancel:null!==n.cancel_requested_at?{requested_at:n.cancel_requested_at,reason:n.cancel_reason}:null,events:O.listEvents(n.id).map(e=>({sequence:e.sequence,type:e.type,at:e.created_at,data:e.data?JSON.parse(e.data):null})),limits:r.EXCHANGE_LIMITS,created_at:n.created_at,updated_at:n.updated_at,terminal_at:n.terminal_at}}};return O},"exchangeErrorBody",0,function(e){return{error:{code:e.code,message:e.message}}},"exchangeInputFromBody",0,function(e,t){if(!k(e))throw new l("invalid_request","The body must be a JSON object.");for(let t of v)if(t in e)throw new l("recursive_exchange","An exchange cannot be started from another exchange.");let n=Object.keys(e).filter(e=>!w.has(e));if(n.length>0)throw new l("invalid_request",`Unknown field ${n[0]}.`);if(void 0!==e.tool_profile&&"readonly"!==e.tool_profile)throw new l("authority_not_allowed","An exchange runs read-only; it never requests edit authority.");if(!k(e.source))throw new l("invalid_request","source must be one object { agent_id, session_ref }.");if(void 0!==e.destination&&null!==e.destination&&!k(e.destination))throw new l("destination_invalid","destination must be one object { agent_id, conversation_id? }.");let r=k(e.destination)?e.destination:null,i=(e,t)=>{if("string"!=typeof e)throw new l("invalid_request",`${t} must be a string.`);return e},s=(e,t)=>null==e?null:i(e,t);return{requester:t,mode:i(e.mode,"mode"),idempotencyKey:i(e.idempotency_key,"idempotency_key"),originConversationId:i(e.origin_conversation_id,"origin_conversation_id"),sourceAgentId:i(e.source.agent_id,"source.agent_id"),sessionRef:i(e.source.session_ref,"source.session_ref"),destinationAgentId:r?s(r.agent_id,"destination.agent_id"):null,destinationConversationId:r?s(r.conversation_id,"destination.conversation_id"):null,instruction:i(e.instruction,"instruction"),...void 0!==e.execution_kind?{executionKind:e.execution_kind}:{}}},"hopOf",0,y])},674,50081,e=>{"use strict";e.s(["PinError",()=>y,"createPin",()=>K,"detachPin",()=>en,"messageAgent",()=>ee,"pinErrorBody",()=>w,"pinView",()=>U,"readPin",()=>et,"requirePin",()=>q,"sendPinTurn",()=>Z,"sessionOwner",()=>x,"sessionsWithActions",()=>D],674);var t=e.i(46786),n=e.i(54799),r=e.i(62294),i=e.i(18966),s=e.i(35613),a=e.i(90027),o=e.i(16789),d=e.i(63020),u=e.i(45383);let l={ask:"Ask from this context",resume:"Resume work here",handoff:"Hand off to…"},c={session_missing:"choose_session",session_ended:"choose_session",session_not_resumable:"choose_session",source_session_busy:"retry_later",action_unavailable:"choose_action",authority_not_allowed:"ask_owner"},_={...c,workspace_required:"ask_owner",no_eligible_session:"ask_owner",grant_required:"ask_owner",agent_unavailable:"ask_owner",approval_required:"approve_write",pin_not_found:"pin_again",pin_detached:"pin_again",provider_failed:"retry_later",rate_limited:"retry_later",session_context_required:"choose_session"};function p(e){return Object.prototype.hasOwnProperty.call(_,e)?_[e]:null}function f(e,t,n){return{available:!1,code:t,reason:`${l[e]} is unavailable: ${n}`,recovery:c[t]}}function h(e,t,n){if(null===n)return f(e,"session_not_resumable",`nothing can reach this session under ${t.agent.name}’s current runtime. Its history stays here.`);if("provider"===n){if("missing"===t.state.availability)return f(e,"session_missing","the runtime no longer has this session. Its history stays here; choose another session.");if(!1===t.state.resumable)return f(e,"session_not_resumable","the runtime says this session can’t be resumed. Choose another session.")}else{if("ended"===t.status)return f(e,"session_ended","this session has ended. Its history stays here.");if(!t.resumable)return f(e,"session_not_resumable",`Botmancers can’t resume this session under ${t.agent.name}’s current runtime.`)}return t.state.busy?f(e,"source_session_busy","a turn is running in this session. Try again when it finishes."):{available:!0}}function m(e,t){let n=h("ask",e,t.route),r=h("resume",e,t.route);return r.available&&("provider"!==t.route?r=f("resume","action_unavailable","this runtime can’t resume a session with edits. Ask from this context, or hand off to another Agent."):t.provider?.authorities.includes("workspace_write")?t.policy&&"workspace_write"===t.policy.mode?t.policy.allow_resume_with_edits||(r=f("resume","authority_not_allowed",`${e.agent.name}’s policy doesn’t allow resuming with edits. The owner can allow it in Config.`)):r=f("resume","authority_not_allowed",`${e.agent.name}’s policy is read only. The owner can allow workspace write in Config.`):r=f("resume","action_unavailable","this runtime can’t enforce edit access in a resumed session. Ask from this context instead.")),{ask:n,resume:r,handoff:"botmancers"!==e.source?f("handoff","action_unavailable","hand off starts from a Botmancers-launched session. Ask from this context or resume this one instead."):h("handoff",e,"engine")}}e.s(["recoveryFor",0,p,"sessionActions",0,m],50081);let g={invalid_request:400,agent_not_found:404,session_not_found:404,conversation_not_found:404,pin_not_found:404,pin_detached:409,workspace_required:409,no_eligible_session:409,session_missing:410,session_ended:409,session_not_resumable:409,source_session_busy:409,action_unavailable:409,approval_required:403,authority_not_allowed:403,agent_unavailable:409,grant_required:403,provider_failed:502,idempotency_conflict:409};class y extends Error{code;recovery;constructor(e,t){super(t),this.name="PinError",this.code=e,this.recovery=p(e)}get status(){return g[this.code]}}function w(e){return{error:{code:e.code,message:e.message,...e.recovery?{recovery:e.recovery}:{}}}}function v(e){return(0,n.createHash)("sha256").update(JSON.stringify(e)).digest("hex")}function k(e){return"string"==typeof e&&e.trim().length>0}function E(e){if(!k(e)||e.length>200)throw new y("invalid_request","An idempotency key (1-200 characters) is required.");return e}function b(e){if(!k(e))throw new y("invalid_request","content is required.");if(e.length>s.EXCHANGE_LIMITS.instructionChars)throw new y("invalid_request",`content exceeds ${s.EXCHANGE_LIMITS.instructionChars} characters.`);return e}function S(e){if(e instanceof y)throw e;if(e instanceof o.ProviderSessionError)throw function(e){switch(e.code){case"agent_not_found":return new y("agent_not_found","No such Agent.");case"session_not_found":return new y("session_not_found","No session with that reference.");case"session_missing":return new y("session_missing","The runtime no longer has this session. The pin stays on it; detach it or switch to another session.");case"not_resumable":return new y("session_not_resumable","The runtime cannot resume this session now. The pin stays on it; detach it or switch to another session.");case"out_of_scope":return new y("session_not_resumable","The session is outside the Agent’s session scope.");case"busy":return new y("source_session_busy","A turn is already running in this session; wait for it, then send again.");case"authority_not_allowed":return new y("authority_not_allowed",`The Agent’s policy or runtime refused this authority: ${e.message}`);case"new_sessions_not_allowed":return new y("no_eligible_session","The Agent’s policy does not allow new sessions.");case"unsupported":return new y("action_unavailable","The Agent’s runtime does not support this action.");case"scope_missing":return new y("agent_unavailable","The Agent has no session scope; the owner must choose one.");case"provider_unavailable":return new y("agent_unavailable","The Agent’s runtime connection is not available.");case"idempotency_conflict":return new y("idempotency_conflict","That idempotency key was used for a different turn.");case"invalid_input":return new y("invalid_request",e.message);default:return new y("provider_failed","The runtime failed this turn. The pin stays on the same session; retry later.")}}(e);if(e instanceof d.ExchangeError)throw function(e){switch(e.code){case"session_not_found":return new y("session_not_found","No session with that reference.");case"agent_not_found":return new y("agent_not_found","No such Agent.");case"conversation_not_found":return new y("conversation_not_found","No conversation with that id is visible.");case"session_ended":return new y("session_ended","This session has ended. The pin stays on it; detach it or switch to another session.");case"session_not_resumable":return new y("session_not_resumable","Botmancers cannot resume this session under the Agent’s current runtime.");case"source_session_busy":return new y("source_session_busy","This session already has a turn in progress; wait for it, then send again.");case"agent_unavailable":return new y("agent_unavailable",e.message);case"idempotency_conflict":return new y("idempotency_conflict","That idempotency key was used for a different turn.");default:return new y("invalid_request",e.message)}}(e);throw e}function T(e,t,i,s){r.default.prepare(`
|
|
205
|
+
INSERT INTO session_pin_events (id, pin_id, sequence, type, data, created_at)
|
|
206
|
+
SELECT ?, ?, COALESCE(MAX(sequence), 0) + 1, ?, ?, ? FROM session_pin_events WHERE pin_id = ?
|
|
207
|
+
`).run((0,n.randomUUID)(),e,t,JSON.stringify(i),s,e)}function I(e){return r.default.prepare("SELECT * FROM session_pins WHERE id = ?").get(e)}function R(e,t){return r.default.prepare("SELECT * FROM session_pins WHERE requester_kind = ? AND requester_id = ? AND idempotency_key = ?").get(e.kind,e.id,t)}function A(e,t){return r.default.prepare("SELECT * FROM session_pin_turns WHERE requester_kind = ? AND requester_id = ? AND idempotency_key = ?").get(e.kind,e.id,t)}function q(e,t){let n="string"==typeof t&&t.length<=200?I(t):void 0;if(!n||n.requester_kind!==e.kind||n.requester_id!==e.id)throw new y("pin_not_found","No pin with that reference is visible to this requester.");return n}function x(e){if("string"!=typeof e||0===e.length||e.length>200)return null;let t=r.default.prepare("SELECT agent_id FROM session_bindings WHERE id = ?").get(e);if(t)return t.agent_id;let n=r.default.prepare("SELECT agent_id FROM provider_sessions WHERE id = ?").get(e);return n?.agent_id??null}function N(e){return e?"~"===e?t.default.homedir():e.startsWith("~/")?`${t.default.homedir()}/${e.slice(2)}`:e.startsWith("/")?e:null:null}function C(e){let t=r.bots.getById(e);if(!t)throw new y("agent_not_found","No such Agent.");return{bot:t,provider:(0,o.agentProviderCapabilities)(r.default,e),connectionId:t.runtime_connection_id??null,policy:(0,i.readStoredPolicy)(t)}}function O(e,t){if(e.provider?.resume){let n=(0,o.getProviderSessionRow)(r.default,e.bot.id,t.ref);if(n&&n.runtime_connection_id===e.connectionId)return"provider"}return"botmancers"===t.source?"engine":null}function L(e,t){return{route:O(e,t),provider:e.provider?{resume:e.provider.resume,authorities:[...e.provider.authorities]}:null,policy:e.policy?{mode:e.policy.mode,allow_resume_with_edits:e.policy.allow_resume_with_edits}:null}}function D(e,t){let n=C(e);return t.map(e=>{let t=L(n,e);return{...e,route:t.route,home:n.bot.home_session_id===e.ref,actions:m(e,t)}})}async function M(e,t){let n=(0,a.getAgentSession)(r.default,e.bot.id,t);if(!n||"provider"!==O(e,n))return n;try{await (0,o.refreshProviderSession)(r.default,e.bot.id,t)}catch(e){S(e)}return(0,a.getAgentSession)(r.default,e.bot.id,t)}function $(e,t,i){let s=(0,n.randomUUID)();r.default.prepare("INSERT INTO conversations (id, type, origin_kind, origin_id, created_at) VALUES (?, ?, ?, ?, ?)").run(s,"agent",e.kind,e.id,i);let a=r.default.prepare("INSERT OR IGNORE INTO conversation_participants (conversation_id, participant_kind, participant_id, joined_at) VALUES (?, ?, ?, ?)");return a.run(s,e.kind,e.id,i),a.run(s,"bot",t,i),s}function W(e,t){if(!r.default.prepare(`
|
|
208
|
+
SELECT 1 FROM conversations c JOIN conversation_participants p ON p.conversation_id = c.id
|
|
209
|
+
WHERE c.id = ? AND p.participant_kind = ? AND p.participant_id = ?
|
|
210
|
+
`).get(t,e.kind,e.id))throw new y("conversation_not_found","No conversation with that id is visible to this requester.")}function F(e,t,i,s){let a=(0,n.randomUUID)();return r.default.prepare("INSERT INTO messages (id, conversation_id, sender_type, sender_id, sender_kind, request_id, content, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run(a,e,t.type,t.id,t.kind,null,i,s),a}function P(e){if(e.provider_turn_ref){let t=I(e.pin_id),n=(0,o.getProviderTurn)(r.default,t.agent_id,e.provider_turn_ref);return n?{state:n.state,answer:"completed"===n.state?n.output:null,failure:"failed"===n.state||"cancelled"===n.state?{code:n.failure_code??n.state}:null,finished_at:n.finished_at}:{state:"failed",answer:null,failure:{code:"turn_missing"},finished_at:null}}let t=u.exchanges.get(e.exchange_id);if(!t)return{state:"failed",answer:null,failure:{code:"turn_missing"},finished_at:null};let n="completed"===t.state?"completed":"failed"===t.state?"failed":"cancelled"===t.state?"cancelled":"running",i=t.answer_message_id?r.default.prepare("SELECT content FROM messages WHERE id = ?").get(t.answer_message_id)?.content??null:null;return{state:n,answer:"completed"===n?i:null,failure:"failed"===n?{code:t.failure_code??"failed"}:"cancelled"===n?{code:"cancelled"}:null,finished_at:t.terminal_at}}function H(e,t){let n=P(t);return{turn_ref:t.id,seq:t.seq,state:n.state,authority:e.authority,content:t.content,answer:n.answer,failure:n.failure,exchange_id:t.exchange_id,created_at:t.created_at,finished_at:n.finished_at}}function U(e){let t=(0,a.getAgentSession)(r.default,e.agent_id,e.session_ref),n=r.default.prepare("SELECT COUNT(*) AS n FROM session_pin_turns WHERE pin_id = ?").get(e.id).n;return{pin_ref:e.id,agent:{id:e.agent_id,name:r.bots.getById(e.agent_id)?.name??null},session:{ref:e.session_ref,title:t?.title??null},action:e.action,authority:e.authority,resolution:e.resolution,state:e.state,conversation_id:e.conversation_id,approved:null!==e.approved_at,replaced_by:e.replaced_by,turn_count:n,created_at:e.created_at,updated_at:e.updated_at,detached_at:e.detached_at}}function j(e){let t=(0,n.randomUUID)();return r.default.prepare(`
|
|
211
|
+
INSERT INTO session_pins (
|
|
212
|
+
id, requester_kind, requester_id, idempotency_key, request_hash, agent_id, session_ref, action, authority, resolution, route,
|
|
213
|
+
conversation_id, approved_at, state, created_at, updated_at
|
|
214
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'attached', ?, ?)
|
|
215
|
+
`).run(t,e.requester.kind,e.requester.id,e.key,e.hash,e.agentId,e.sessionRef,e.action,"ask"===e.action?"read_only":"workspace_write",e.resolution,e.route,e.conversationId,e.approved?e.now:null,e.now,e.now),T(t,"created",{agent_id:e.agentId,session_ref:e.sessionRef,action:e.action,resolution:e.resolution,route:e.route,authority:"ask"===e.action?"read_only":"workspace_write",approved:e.approved},e.now),I(t)}function B(e,t,n,i){r.default.prepare("UPDATE session_pins SET state = 'detached', detach_reason = ?, replaced_by = ?, detached_at = ?, updated_at = ? WHERE id = ? AND state = 'attached'").run(t,n,i,i,e.id),T(e.id,t,n?{replaced_by:n}:{},i)}async function K(e){let t=`pin:${E(e.idempotencyKey)}`;if("ask"!==e.action&&"resume"!==e.action)throw new y("invalid_request",'action must be "ask" or "resume".');let n=v(["pin",e.sessionRef,e.agentId??null,e.action,!0===e.approveWrite,e.conversationId??null,e.replacePinRef??null]),i=R(e.requester,t);if(i){if(i.request_hash!==n)throw new y("idempotency_conflict","That idempotency key was used for a different pin.");return{pin:i,created:!1,replaced:null}}let s=x(e.sessionRef);if(!s||e.agentId&&e.agentId!==s)throw new y("session_not_found","No session with that reference.");await (0,o.warmAgentProvider)(r.default,s,{onlyWithSessions:!0});let a=C(s),d=await M(a,e.sessionRef);if(!d)throw new y("session_not_found","No session with that reference.");let u=function(e,t,n){let r=L(e,t),i=m(t,r)[n];if(!i.available&&"source_session_busy"!==i.code)throw new y(i.code,i.reason);return r.route}(a,d,e.action);if("resume"===e.action&&!0!==e.approveWrite)throw new y("approval_required","Resume work here runs with workspace-write authority. Ask the person you act for to approve edits, then pin again with approve_write: true.");let l=e.replacePinRef?q(e.requester,e.replacePinRef):null;if(l&&"attached"!==l.state)throw new y("pin_detached","The pin to replace is already detached.");if(e.conversationId)W(e.requester,e.conversationId);else if("service"!==e.requester.kind)throw new y("invalid_request","conversation_id is required: the thread that holds this conversation.");return r.default.transaction(()=>{let r=R(e.requester,t);if(r)return{pin:r,created:!1,replaced:null};let i=e.now??Date.now(),a=j({requester:e.requester,key:t,hash:n,agentId:s,sessionRef:d.ref,action:e.action,resolution:"exact",route:u,conversationId:e.conversationId??$(e.requester,s,i),approved:"resume"===e.action,now:i});return l&&B(l,"switched",a.id,i),e.onCommit?.(a),{pin:a,created:!0,replaced:l?I(l.id):null}}).immediate()}function X(e,t,n){let i=t;try{S(t)}catch(e){i=e}if(i instanceof y){let t=i.code;r.default.transaction(()=>T(e.id,"turn_refused",{code:t,session_ref:e.session_ref},n)).immediate()}throw i}function G(e,t){return`pin-${(0,n.createHash)("sha256").update(`${e}
|
|
216
|
+
${t}`).digest("hex").slice(0,40)}`}function J(e,t,i,s,a,o,d){var u;let l=(0,n.randomUUID)(),c=o.exchangeId?null:F(e.conversation_id,{type:"user",id:t.id,kind:t.kind},a,d);return r.default.prepare(`
|
|
217
|
+
INSERT INTO session_pin_turns (
|
|
218
|
+
id, pin_id, seq, requester_kind, requester_id, idempotency_key, request_hash, content, exchange_id, provider_turn_ref,
|
|
219
|
+
question_message_id, answer_message_id, created_at
|
|
220
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?)
|
|
221
|
+
`).run(l,e.id,(u=e.id,(r.default.prepare("SELECT MAX(seq) AS n FROM session_pin_turns WHERE pin_id = ?").get(u).n??0)+1),t.kind,t.id,i,s,a,o.exchangeId??null,o.providerTurnRef??null,c,d),r.default.prepare("UPDATE session_pins SET updated_at = ? WHERE id = ?").run(d,e.id),T(e.id,"turn_sent",{turn_ref:l,session_ref:e.session_ref,authority:e.authority,route:e.route},d),r.default.prepare("SELECT * FROM session_pin_turns WHERE id = ?").get(l)}function z(e){r.default.transaction(()=>{let t=r.default.prepare("SELECT * FROM session_pin_turns WHERE id = ?").get(e);if(!t||!t.provider_turn_ref||t.answer_message_id)return;let n=I(t.pin_id),i=(0,o.getProviderTurn)(r.default,n.agent_id,t.provider_turn_ref);if(i&&"running"!==i.state&&"completed"===i.state&&null!==i.output){let e=Date.now(),s=F(n.conversation_id,{type:"bot",id:n.agent_id,kind:"bot"},i.output,e);r.default.prepare("UPDATE session_pin_turns SET answer_message_id = ? WHERE id = ? AND answer_message_id IS NULL").run(s,t.id),T(n.id,"turn_answered",{turn_ref:t.id},e)}}).immediate()}async function V(e,t,n){if(t.provider_turn_ref)try{let i=await (0,o.observeProviderTurn)(r.default,e.agent_id,t.provider_turn_ref,null===n?{}:{deadlineAt:Date.now()+n});"running"!==i.state&&z(t.id)}catch(e){console.error("Pin turn observe failed:",e instanceof Error?e.message:"unknown error")}}async function Y(e,t,i,s,a,d,l){let c;if("provider"===e.route){let n;try{n=await (0,o.sendProviderTurn)(r.default,e.agent_id,e.session_ref,{prompt:a,authority:e.authority,idempotencyKey:G(e.id,i),requester:t})}catch(t){X(e,t,d)}let u=r.default.transaction(()=>{let r=A(t,i);if(r)return r;let o=J(e,t,i,s,a,{providerTurnRef:n.turn.turn_ref},d);return l?.(e,o),o}).immediate();return{pin:I(e.id),turn:H(e,u),replayed:!1,settled:V(e,u,null)}}try{c=r.default.transaction(()=>{let o=A(t,i);if(o)return o;let{exchange:c}=u.exchanges.create({requester:t,serviceGrant:"service"===t.kind,idempotencyKey:G(e.id,i),mode:"ask",originConversationId:e.conversation_id,sourceAgentId:e.agent_id,sessionRef:e.session_ref,instruction:a,now:d});r.default.prepare("INSERT INTO messages (id, conversation_id, sender_type, sender_id, sender_kind, request_id, content, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run((0,n.randomUUID)(),e.conversation_id,"user",t.id,t.kind,c.source_request_id,a,d);let _=J(e,t,i,s,a,{exchangeId:c.id},d);return l?.(e,_),_}).immediate()}catch(t){X(e,t,d)}return{pin:I(e.id),turn:H(e,c),replayed:!1,settled:(0,u.dispatchExchange)(c.exchange_id)}}async function Z(e){let t=`turn:${E(e.idempotencyKey)}`,n=b(e.content),r=q(e.requester,e.pinRef),i=v(["turn",r.id,n]),s=A(e.requester,t);if(s){if(s.request_hash!==i)throw new y("idempotency_conflict","That idempotency key was used for a different turn.");return{pin:r,turn:H(r,s),replayed:!0,settled:Promise.resolve()}}if("attached"!==r.state)throw new y("pin_detached",`This pin was ${"switched"===r.detach_reason?"switched to another pin":"detached"}; it no longer sends. Pin a session again.`);return Y(r,e.requester,t,i,n,e.now??Date.now(),e.onCommit)}async function Q(e,t){let n=e.bot.id,s=!1,o=async t=>{let n=await M(e,t);if(!n)return null;let r=L(e,n),i=m(n,r).ask;return i.available?{summary:n,route:r.route}:"source_session_busy"===i.code?"busy":null},d=e.bot.home_session_id;if(d&&(0,a.getAgentSession)(r.default,n,d)){let e=await o(d);if("busy"===e)throw new y("source_session_busy","The Agent’s home session has a turn in progress; send again when it finishes.");if(e)return{kind:"session",...e,resolution:"home"}}for(let t of(0,a.listAgentSessions)(r.default,n,"all").filter(e=>e.ref!==d).filter(t=>{let n=L(e,t),r=m(t,n).ask;return r.available||"source_session_busy"===r.code||"provider"===n.route&&null===t.state.resumable}).slice(0,10)){let e=await o(t.ref);if("busy"===e)s=!0;else if(e)return{kind:"session",...e,resolution:"newest"}}if(s)throw new y("source_session_busy","Every eligible session of this Agent has a turn in progress; send again when one finishes.");if(!e.policy?.allow_new_sessions)throw new y("no_eligible_session","This Agent has no session that can take a message, and its policy does not allow new sessions. Pin one of its sessions, or ask the owner to allow new sessions.");if(!e.provider?.start)throw new y("no_eligible_session","This Agent has no session that can take a message, and its runtime cannot start a new one from here.");let u=(0,i.readStoredScope)(e.bot);if(!u)throw new y("agent_unavailable","The Agent has no session scope; the owner must choose one.");if("sessions"===u.kind)throw new y("no_eligible_session","This Agent is limited to selected sessions and none can take a message now; it cannot start a new one.");let l=N(e.bot.default_workspace)??("workspaces"===u.kind&&1===u.workspaces.length?N(u.workspaces[0]):null);if(!l)throw new y("workspace_required","This Agent has no session that can take a message, and no default workspace for a new one. Ask the owner to set a default workspace, or pin one of its sessions.");if(!t)throw new y("grant_required","Starting a new session for this Agent needs the sessions:start grant, which only the Botmancers owner can give. Pin one of its sessions instead.");return{kind:"start",workspace:l}}async function ee(e){let t,n=E(e.idempotencyKey),i=`agent:${n}`,s=`agent:${n}`,a=b(e.content),d=v(["agent",e.agentId,a,e.conversationId??null]),u=R(e.requester,i);if(u){if(u.request_hash!==d)throw new y("idempotency_conflict","That idempotency key was used for a different message.");e.onResolved?.({agentId:u.agent_id,sessionRef:u.session_ref,resolution:u.resolution});let t=A(e.requester,s);if(t)return{pin:u,turn:H(u,t),replayed:!0,resolution:u.resolution,settled:Promise.resolve()};if("attached"!==u.state)throw new y("pin_detached","This pin was detached before its first turn ran. Message the Agent again with a new key.");return{...await Y(u,e.requester,s,v(["turn",u.id,a]),a,e.now??Date.now()),resolution:u.resolution}}if(e.conversationId)W(e.requester,e.conversationId);else if("service"!==e.requester.kind)throw new y("invalid_request","conversation_id is required: the thread that holds this conversation.");r.bots.getById(e.agentId)&&await (0,o.warmAgentProvider)(r.default,e.agentId);let l=C(e.agentId),c=await Q(l,e.mayStart),_=e.now??Date.now();if("session"===c.kind){e.onResolved?.({agentId:e.agentId,sessionRef:c.summary.ref,resolution:c.resolution});let t=r.default.transaction(()=>{let t=R(e.requester,i);if(t)return t;let n=j({requester:e.requester,key:i,hash:d,agentId:e.agentId,sessionRef:c.summary.ref,action:"ask",resolution:c.resolution,route:c.route,conversationId:e.conversationId??$(e.requester,e.agentId,_),approved:!1,now:_});return e.onCommit?.(n),n}).immediate();return{...await Y(t,e.requester,s,v(["turn",t.id,a]),a,_),resolution:c.resolution}}e.onResolved?.({agentId:e.agentId,sessionRef:null,resolution:"started"});try{t=await (0,o.startProviderSession)(r.default,e.agentId,{workspace:c.workspace,prompt:a,authority:"read_only",idempotencyKey:G(e.agentId,s),requester:e.requester})}catch(e){S(e)}e.onResolved?.({agentId:e.agentId,sessionRef:t.turn.session_ref,resolution:"started"});let{pin:p,turn:f}=r.default.transaction(()=>{let n=R(e.requester,i);if(n)return{pin:n,turn:A(e.requester,s)};let r=j({requester:e.requester,key:i,hash:d,agentId:e.agentId,sessionRef:t.turn.session_ref,action:"ask",resolution:"started",route:"provider",conversationId:e.conversationId??$(e.requester,e.agentId,_),approved:!1,now:_}),o=J(r,e.requester,s,v(["turn",r.id,a]),a,{providerTurnRef:t.turn.turn_ref},_);return e.onCommit?.(r),{pin:r,turn:o}}).immediate();return{pin:p,turn:H(p,f),replayed:!1,resolution:"started",settled:V(p,f,null)}}async function et(e,t){let n=q(e,t),i=r.default.prepare("SELECT * FROM session_pin_turns WHERE pin_id = ? ORDER BY seq DESC LIMIT ?").all(n.id,20).reverse();for(let e of i)e.provider_turn_ref&&!e.answer_message_id&&("running"===P(e).state?await V(n,e,25):z(e.id));return{pin:n,turns:i.map(e=>H(n,r.default.prepare("SELECT * FROM session_pin_turns WHERE id = ?").get(e.id)))}}function en(e,t,n={}){return r.default.transaction(()=>{let r=q(e,t);if("detached"===r.state)return n.onCommit?.(r),{pin:r,replayed:!0};B(r,"detached",null,n.now??Date.now());let i=I(r.id);return n.onCommit?.(i),{pin:i,replayed:!1}}).immediate()}},6200,e=>{"use strict";e.s(["createSessionProviderAttemptAdapter",()=>g]);var t=e.i(54799),n=e.i(62294),r=e.i(29370),i=e.i(12227),s=e.i(16789),a=e.i(40596);let o="session-provider",d="\n[truncated]",u=Object.freeze({kind:"service",id:"botmancers-attempt"});function l(e){let n=e.correlation?.attemptId;if("string"==typeof n&&n)return`botmancers-attempt-${n}`;let r=(0,t.createHash)("sha256").update(JSON.stringify({requestId:e.correlation?.requestId??null,conversationId:e.correlation?.conversationId??null,agentId:e.target.agentId,prompt:e.prompt,cwd:e.cwd,toolProfile:e.toolProfile,binding:e.sessionBinding?.externalSessionId??null})).digest("hex").slice(0,32);return`botmancers-direct-${r}`}function c(e){var t;if(e.freshSession&&e.sessionBinding)return{ok:!1,failure:(0,r.attemptFailure)("session_mismatch","A fresh-session turn cannot resume a session.")};let n="readonly"===(t=e.toolProfile)?"read_only":"edit"===t?"workspace_write":null;if(!n)return{ok:!1,failure:(0,r.attemptFailure)("unsupported_authority",`Unsupported tool profile: ${JSON.stringify(String(e.toolProfile))}.`)};let s=(0,i.attemptPromptText)(e.prompt);if(!s.trim())return{ok:!1,failure:(0,r.attemptFailure)("launch_failed","The attempt prompt is empty.")};if(e.sessionBinding){let t=e.sessionBinding.externalSessionId;return"string"==typeof t&&t?{ok:!0,plan:{kind:"send",agentId:e.target.agentId,workspace:null,sessionRef:t,prompt:s,authority:n}}:{ok:!1,failure:(0,r.attemptFailure)("launch_failed","The session binding names no session.")}}return"string"==typeof e.cwd&&e.cwd.startsWith("/")?{ok:!0,plan:{kind:"start",agentId:e.target.agentId,workspace:e.cwd,sessionRef:null,prompt:s,authority:n}}:{ok:!1,failure:(0,r.attemptFailure)("unavailable","A session provider start requires an absolute working directory.")}}function _(e){return"unavailable"===e?"The session provider is not available.":"unsupported_authority"===e?"The session provider cannot honor the requested authority.":"launch_failed"===e?"The session provider did not start the turn.":"The session provider did not complete the turn."}function p(e,t){try{let n=e.prepare("SELECT agent_id FROM provider_session_turns WHERE id = ?").get(t);return n?.agent_id??null}catch{return null}}function f(e){let t=t=>({adapter:o,externalRunId:null,externalSessionId:null,output:null,artifacts:[],startedAt:e,finishedAt:Date.now(),failure:null,...t});return{result:t,failed:(e,n={})=>t({status:"failed",failure:e,...n})}}async function h(e,t,n,i,o){let{failed:u}=f(o),l=(0,r.interruption)({signal:i.signal??null,deadlineAt:i.deadlineAt??null}),c=(0,s.observeProviderTurn)(e,n,t,{signal:i.signal??null,deadlineAt:i.deadlineAt??null,correlation:i.correlation??{}});c.catch(()=>{});try{let h=await Promise.race([c.then(e=>({view:e}),e=>({error:e})),l.promise.then(e=>({interrupted:e}))]);if("interrupted"in h){let r="requested";try{await (0,s.cancelProviderTurn)(e,n,t,{correlation:i.correlation??{}})}catch{r="failed"}let a=await m(e,n,t);return u(h.interrupted,{...a,externalCancel:r})}if("error"in h){var p;let a="requested";try{await (0,s.cancelProviderTurn)(e,n,t,{correlation:i.correlation??{}})}catch{a="failed"}let o=await m(e,n,t);return u((p=h.error)instanceof s.ProviderSessionError?"provider_unavailable"===p.code||"auth_required"===p.code?(0,r.attemptFailure)("unavailable",`[${p.code}] ${_("unavailable")}`,p.code):(0,r.attemptFailure)("runtime_failed",`[${p.code}] ${_("runtime_failed")}`,p.code):(0,r.attemptFailure)("runtime_failed","The session provider did not complete the turn."),{...o,externalCancel:a})}let g=h.view;if("running"===g.state){let a=i.signal?.aborted?(0,r.attemptFailure)("cancelled","The attempt was cancelled."):(0,r.attemptFailure)("timed_out","The attempt passed its deadline."),o="requested";try{await (0,s.cancelProviderTurn)(e,n,t,{correlation:i.correlation??{}})}catch{o="failed"}return u(a,{externalRunId:g.turn_ref,externalSessionId:g.session_ref,externalCancel:o})}return function(e,t,n){var i;let{result:s,failed:o}=f(n),u={externalRunId:e.turn_ref,externalSessionId:e.session_ref},l=(0,a.usageFromEvent)(e.usage??null),c=Date.now();if("cancelled"===e.state)return o((0,r.attemptFailure)("cancelled","The provider turn was cancelled."),{...u,usage:l,finishedAt:c});if("failed"===e.state){let t="string"==typeof e.failure_code&&e.failure_code?e.failure_code.slice(0,100):"provider_failed";return o((0,r.attemptFailure)("runtime_failed",`[${t}] ${_("runtime_failed")}`,t),{...u,usage:l,finishedAt:c})}if("completed"!==e.state)return o((0,r.attemptFailure)("runtime_failed",_("runtime_failed")),{...u,usage:l,finishedAt:c});if("string"!=typeof e.output||!e.output)return o((0,r.attemptFailure)("result_contract",`Provider turn ${e.turn_ref} result contract mismatch: expected a non-empty string output.`),{...u,usage:l,finishedAt:c});if(null!==t&&e.session_ref!==t)return o((0,r.attemptFailure)("session_mismatch",`Resume turn ${e.turn_ref} forked the session; failing closed.`),{...u,usage:l,finishedAt:c});let p=(i=e.output).length<=32e3?{content:i,truncated:!1}:32e3<=d.length?{content:i.slice(0,32e3),truncated:!0}:{content:`${i.slice(0,32e3-d.length)}${d}`,truncated:!0};return s({status:"completed",...u,output:p.content,...p.truncated?{outputTruncated:!0}:{},usage:l,finishedAt:c})}(g,i.resumeSessionId,o)}finally{l.dispose()}}async function m(e,t,n){try{let r=(0,s.getProviderTurn)(e,t,n);return{externalRunId:n,externalSessionId:r?.session_ref??null}}catch{return{externalRunId:n,externalSessionId:null}}}function g(e={}){let t=e.db??n.default;return{name:o,reconciler:{currentGrantFingerprint:()=>null,async inspect(e){try{let n=p(t,e);if(!n)return{kind:"not_found"};let r=(0,s.getProviderTurn)(t,n,e);if(!r)return{kind:"not_found"};if("running"===r.state)return{kind:"run",state:"running"};if("completed"===r.state)return{kind:"run",state:"ended"};if("cancelled"===r.state)return{kind:"run",state:"canceled"};return{kind:"run",state:"error"}}catch{return{kind:"unreachable"}}},async repost(e){let n=function(e){let t;try{t=JSON.parse(e)}catch{return null}if(!t||"object"!=typeof t)return null;let n=t;if("string"!=typeof n.agentId||!n.agentId||"start"!==n.kind&&"send"!==n.kind||"start"===n.kind&&("string"!=typeof n.workspace||!n.workspace.startsWith("/"))||"send"===n.kind&&("string"!=typeof n.sessionRef||!n.sessionRef)||"string"!=typeof n.prompt||!n.prompt.trim()||"read_only"!==n.authority&&"workspace_write"!==n.authority)return null;let r=n.requester;return r&&["person","bot","service"].includes(String(r.kind))&&"string"==typeof r.id&&r.id?n:null}(e.body);if(!n)return{kind:"rejected",status:null,code:"INTENT_UNREADABLE"};try{let r="start"===n.kind?await (0,s.startProviderSession)(t,n.agentId,{workspace:n.workspace,prompt:n.prompt,authority:n.authority,idempotencyKey:e.idempotencyKey,requester:n.requester,correlation:{}}):await (0,s.sendProviderTurn)(t,n.agentId,n.sessionRef,{prompt:n.prompt,authority:n.authority,idempotencyKey:e.idempotencyKey,requester:n.requester,correlation:{}});return{kind:"accepted",runId:r.turn.turn_ref}}catch(e){if(e instanceof s.ProviderSessionError){if("idempotency_conflict"===e.code)return{kind:"rejected",status:409,code:"IDEMPOTENCY_CONFLICT"};if(["invalid_input","out_of_scope","scope_missing","authority_not_allowed","new_sessions_not_allowed","not_resumable","session_missing","session_not_found","agent_not_found","unsupported"].includes(e.code))return{kind:"rejected",status:400,code:e.code.toUpperCase()};if("provider_unavailable"===e.code)return{kind:"unreachable"};return{kind:"rejected",status:null,code:e.code.toUpperCase().slice(0,64)}}return{kind:"rejected",status:null,code:null}}},async follow(e,n){let i=Date.now(),{failed:s}=f(i),a=p(t,e);return a?h(t,e,a,{resumeSessionId:n.resumeSessionId,deadlineAt:n.deadlineAt??null,signal:n.signal??null,correlation:{}},i):s((0,r.attemptFailure)("runtime_failed","The provider turn was not found."),{externalRunId:e})},async cancel(e){try{let n=p(t,e);if(!n)return"failed";return await (0,s.cancelProviderTurn)(t,n,e,{correlation:{}}),"requested"}catch{return"failed"}}},externalCancel:!0,launchIntent(e){var t;let n=c(e);return n.ok?{idempotencyKey:l(e),body:JSON.stringify({agentId:(t=n.plan).agentId,kind:t.kind,workspace:t.workspace,sessionRef:t.sessionRef,prompt:t.prompt,authority:t.authority,requester:{...u}}),grantFingerprint:null}:null},async run(e,n){let i,a=Date.now(),{failed:d}=f(a),p=c(e);if(!p.ok)return d(p.failure);let m=(0,r.preLaunchInterruption)(e);if(m)return d(m);let g=p.plan,y=l(e),w={...u};try{i="start"===g.kind?(await (0,s.startProviderSession)(t,g.agentId,{workspace:g.workspace,prompt:g.prompt,authority:g.authority,idempotencyKey:y,requester:w,correlation:{...e.correlation}})).turn:(await (0,s.sendProviderTurn)(t,g.agentId,g.sessionRef,{prompt:g.prompt,authority:g.authority,idempotencyKey:y,requester:w,correlation:{...e.correlation}})).turn}catch(e){return d(function(e){if(e instanceof s.ProviderSessionError){var t;let n="authority_not_allowed"===(t=e.code)||"new_sessions_not_allowed"===t?"unsupported_authority":"provider_unavailable"===t||"auth_required"===t||"permission_denied"===t||"incompatible_version"===t||"usage_limit"===t||"unsupported"===t||"agent_not_found"===t?"unavailable":"launch_failed";return(0,r.attemptFailure)(n,`[${e.code}] ${_(n)}`,e.code)}return(0,r.attemptFailure)("launch_failed",e instanceof Error?`The session provider did not start the turn (${e.name}).`:"The session provider did not start the turn.")}(e))}return n?.({type:"started",adapter:o,at:Date.now(),externalRunId:i.turn_ref,externalSessionId:i.session_ref}),h(t,i.turn_ref,g.agentId,{resumeSessionId:g.sessionRef,deadlineAt:e.deadlineAt??null,signal:e.signal??null,correlation:{...e.correlation}},a)}}}},99446,49066,91466,27776,96474,73688,e=>{"use strict";let t=["read_only","workspace_write"];function n(e){let t;if(!e||"object"!=typeof e)return null;let n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0?e:null;return{input_tokens:n(e.input_tokens),output_tokens:n(e.output_tokens),..."cached_input_tokens"in e?{cached_input_tokens:n(e.cached_input_tokens)}:{},cost_usd:"number"==typeof(t=e.cost_usd)&&Number.isFinite(t)&&t>=0?t:null}}function r(e,t){return{ok:!1,error:{code:e,message:t.slice(0,500)}}}function i(e){return{ok:!0,value:e}}let s=new Map,a=new Map,o=new Map;function d(e,t){o.set(e,t)}e.s(["normalizeCapabilities",0,function(e){let n=Number(e?.max_page_size);return{list:!0===e?.list,search:!0===e?.search,read:!0===e?.read,resume:!0===e?.resume,start:!0===e?.start,cancel:!0===e?.cancel,usage:!0===e?.usage,authorities:t.filter(t=>Array.isArray(e?.authorities)&&e.authorities.includes(t)),max_page_size:Number.isInteger(n)&&n>0?Math.min(n,100):25}},"normalizeUsage",0,n,"providerError",0,r,"providerOk",0,i,"registerBuiltinSessionProvider",0,d,"registerSessionProvider",0,function(e,t){let n="connectionId"in e?s:a,r="connectionId"in e?e.connectionId:e.provider;t?n.set(r,t):n.delete(r)},"sessionProviderFor",0,function(e){if(!e)return null;let t=s.get(e.id)??a.get(e.provider)??o.get(e.provider);return t?t(e):null}],99446);var u=e.i(33405),l=e.i(54799),c=e.i(22734),_=e.i(14747),p=e.i(52036);let f="Botmancers-Session-Context",h="BOTMANCERS_SESSION_CONTEXT",m="BOTMANCERS_SESSION_CONTEXT_TOKEN",g="botmancers",y="botmancers_share_current_session",w=`mcp__${g}__${y}`;function v(e){let t={};for(let[n,r]of Object.entries(e))void 0!==r&&n!==h&&n!==m&&(t[n]=r);return t}function k(e){return{mcpServers:{[g]:{type:"http",url:e,headers:{[f]:`\${${h}}`}}}}}let E={enabled_tools:[y],tools:{[y]:{approval_mode:"approve"}}};function b(e){return{mcp_servers:{[g]:{url:e.url,http_headers:{[f]:e.token},...E}}}}function S(e){let t=`mcp_servers.${g}`;return["-c",`${t}.url=${JSON.stringify(e.url)}`,"-c",`${t}.env_http_headers={ ${JSON.stringify(f)} = ${JSON.stringify(m)} }`,"-c",`${t}.enabled_tools=[${JSON.stringify(y)}]`,"-c",`${t}.tools.${y}.approval_mode="approve"`]}e.s(["SESSION_CONTEXT_ENV",0,h,"SESSION_CONTEXT_EXEC_ENV",0,m,"SESSION_CONTEXT_HEADER",0,f,"SHARE_CURRENT_CLAUDE_TOOL",0,w,"SHARE_CURRENT_TOOL",0,y,"claudeMcpConfig",0,k,"codexExecMcpArgs",0,S,"codexThreadMcpConfig",0,b,"withoutSessionContextEnv",0,v],49066);var T=e.i(46786);let I=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function R(e){return"string"==typeof e&&I.test(e)}function A(e){return e.replace(/[^a-zA-Z0-9]/g,"-")}function q(e){return _.default.join(e,"projects")}function x(e){try{return c.default.readdirSync(e)}catch{return[]}}function N(e){let t=new Set([A(e.replace(/\/+$/,""))]);try{t.add(A(c.default.realpathSync(e)))}catch{}return[...t]}function C(e,t){if(!R(t))return null;for(let n of x(q(e))){let r=_.default.join(q(e),n,`${t}.jsonl`);try{if(c.default.statSync(r).isFile())return r}catch{}}return null}function O(e){let t;try{t=c.default.readFileSync(e,"utf8")}catch{return null}let n=[],r=0;for(let e of t.split("\n"))if(e.trim())try{let t=JSON.parse(e);t&&"object"==typeof t&&!Array.isArray(t)?n.push(t):r++}catch{r++}return{records:n,malformed:r}}function L(e){let t="string"==typeof e.timestamp?Date.parse(e.timestamp):NaN;return Number.isFinite(t)?t:null}function D(e){let t=e.message;if(!t||"object"!=typeof t)return null;let n=t.content;return"string"==typeof n||Array.isArray(n)?n:null}function M(e){return("user"===e.type||"assistant"===e.type)&&!0!==e.isSidechain&&!0!==e.isMeta}function $(e){let t=O(e.file);if(!t)return null;let{records:n,malformed:r}=t,i=null,s=null,a=null,o=null,d=null,u=null,l=null,c=0;for(let t of n){if(void 0!==t.sessionId&&t.sessionId!==e.id)continue;null===i&&"string"==typeof t.cwd&&t.cwd.startsWith("/")&&(i=t.cwd),"string"==typeof t.version&&(l=t.version);let n=L(t);null!==n&&(d=null===d?n:Math.min(d,n),u=null===u?n:Math.max(u,n)),"custom-title"===t.type&&"string"==typeof t.customTitle&&(s=t.customTitle),"ai-title"===t.type&&"string"==typeof t.aiTitle&&(a=t.aiTitle),"summary"===t.type&&"string"==typeof t.summary&&(o=t.summary),M(t)&&c++}return null===i?null:{id:e.id,workspace:i,title:s??a??o??function(e){for(let t of e){if("user"!==t.type||!M(t))continue;let e=D(t),n="string"==typeof e?e:Array.isArray(e)?e.map(e=>e&&"object"==typeof e&&"text"===e.type?String(e.text??""):"").join(""):"";if(n.trim()&&!n.trim().startsWith("<"))return n.trim()}return null}(n),created_at:d,updated_at:u??Math.floor(e.mtime_ms),messages:c,claude_code_version:l,malformed:r}}function W(e){try{let t=JSON.parse(c.default.readFileSync(_.default.join(e,"settings.json"),"utf8")),n=Number(t.cleanupPeriodDays);return Number.isFinite(n)&&n>0?n:30}catch{return 30}}function F(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function P(e){let{events:t,malformed:n}=function(e){let t=[],n=0;for(let r of(e.endsWith("\n")?e:e.slice(0,e.lastIndexOf("\n")+1)).split("\n"))if(r.trim())try{let e=JSON.parse(r);F(e)&&"string"==typeof e.type?t.push(e):n++}catch{n++}return{events:t,malformed:n}}(e),r={session_id:null,claude_code_version:null,result:null,rate_limit_rejected:!1,malformed:n};for(let e of t)"system"===e.type&&"init"===e.subtype&&null===r.session_id?("string"==typeof e.session_id&&(r.session_id=e.session_id),"string"==typeof e.claude_code_version&&(r.claude_code_version=e.claude_code_version)):"result"===e.type&&null===r.result?r.result=e:"rate_limit_event"===e.type&&F(e.rate_limit_info)&&"rejected"===e.rate_limit_info.status&&(r.rate_limit_rejected=!0);return r}let H=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0?e:null,U=/no conversation found/i,j=/not logged in|please run \/login|\/login|invalid api key|authentication|unauthori[sz]ed|oauth token|credentials? (?:expired|missing|invalid)/i,B=/usage limit|rate limit|limit reached|quota|credit balance/i;function K(e){return!0!==e.is_error&&"success"===e.subtype}function X(e,t){let n=function(e){let t=[];if(Array.isArray(e.errors))for(let n of e.errors)"string"==typeof n&&t.push(n);return!0===e.is_error&&"string"==typeof e.result&&t.push(e.result),t.join("\n").slice(0,2e3)}(e),r="number"==typeof e.api_error_status?e.api_error_status:null,i=Array.isArray(e.permission_denials)?e.permission_denials.length:0;return{code:U.test(n)?"session_missing":401===r||403===r||j.test(n)?"auth_required":429===r||t.rate_limit_rejected||B.test(n)?"usage_limit":i>0?"permission_denied":"runtime_error",message:n||`Claude Code reported ${String(e.subtype??"an error")}.`}}let G="2.1.0",J={read_only:{permission_mode:"dontAsk",tools:["Read","Glob","Grep"]},workspace_write:{permission_mode:"acceptEdits",tools:["Read","Glob","Grep","Edit","Write","NotebookEdit"]}},z={list:!0,search:!0,read:!0,resume:!0,start:!0,cancel:!0,usage:!0,authorities:["read_only","workspace_write"],max_page_size:25},V=new Map;function Y(e){try{return process.kill(e,0),!0}catch(e){return"EPERM"===e.code}}function Z(e,t=null){let n={};for(let[t,r]of Object.entries(v(e)))void 0!==r&&(n[t]=r);return null!==t&&(n[h]=t),n}let Q={session_missing:"not_found",auth_required:"auth_required",permission_denied:"permission_denied",usage_limit:"usage_limit",incompatible_version:"incompatible_version",session_mismatch:"not_resumable",process_exited:"unavailable",cancelled:"cancelled",runtime_error:"unavailable"};e.s(["createClaudeSessionProvider",0,function(e={}){let t=e.env??process.env,n=e.bin??((t.BOTMANCERS_CLAUDE_BIN||"").trim()||"claude"),s=e.configDir??function(e=process.env){let t=(e.CLAUDE_CONFIG_DIR||"").trim();return t?_.default.resolve(t):_.default.join(T.default.homedir(),".claude")}(t),a=e.stateDir??function(e=process.env){let t=(e.BOTMANCERS_CLAUDE_STATE_DIR||"").trim();return t?_.default.resolve(t):_.default.join(_.default.dirname(_.default.resolve((0,p.dbPath)(e))),"claude-provider")}(t),o=e.spawn??u.spawn,d=e.isPidAlive??Y,f=e.startupTimeoutMs??6e4,h=e.exitGraceMs??1e4,m=e.pollMs??100,g=e.now??Date.now,y=_.default.join(a,"turns"),v=_.default.join(a,"keys"),E=(e,t)=>_.default.join(y,`${e}.${t}`),b=e=>{if(!/^ct-[0-9a-f-]{36}$/.test(e))return null;try{return JSON.parse(c.default.readFileSync(E(e,"json"),"utf8"))}catch{return null}},S=e=>{let t=E(e.id,`json.${process.pid}.tmp`);c.default.writeFileSync(t,JSON.stringify(e)),c.default.renameSync(t,E(e.id,"json"))},I=e=>{try{return c.default.readFileSync(e,"utf8")}catch{return""}};function A(e,t,n,r){return{provider_session_id:e.id,title:e.title,workspace:e.workspace,created_at:e.created_at,updated_at:e.updated_at,lifecycle:null!==e.updated_at&&n-e.updated_at>r?"archived":"open",resumable:e.messages>0,busy:t.has(e.id)}}function U(){return new Set([...function(e,t){let n=new Set,r=_.default.join(e,"sessions");for(let e of x(r))if(/^\d+\.json$/.test(e))try{let i=JSON.parse(c.default.readFileSync(_.default.join(r,e),"utf8"));R(i.sessionId)&&"number"==typeof i.pid&&t(i.pid)&&n.add(i.sessionId)}catch{}return n}(s,d),...function(){let e=new Set;for(let t of c.default.existsSync(y)?c.default.readdirSync(y):[]){if(!t.endsWith(".json"))continue;let n=b(t.slice(0,-5));n&&"running"===n.state&&!j(n)&&e.add(n.session_id)}return e}()])}function j(e){var t;let n,r,i=P(I(E(e.id,"out.jsonl"))),s=e.finished_at??Date.now(),a={provider_session_id:e.session_id,usage:{input_tokens:H((n=(t=i.result)&&F(t.usage)?t.usage:{}).input_tokens)??H(n.inputTokens),output_tokens:H(n.output_tokens)??H(n.outputTokens),total_cost_usd:t&&"number"==typeof(r=t.total_cost_usd)&&Number.isFinite(r)&&r>=0?r:null},finished_at:s};if(null!==i.session_id&&i.session_id!==e.session_id)return{...a,status:"failed",output:null,failure:{code:"session_mismatch",message:"Claude Code ran a different session than the one requested."}};if(i.result)return K(i.result)?{...a,status:"completed",output:"string"==typeof i.result.result?i.result.result:null,failure:null}:{...a,status:"failed",output:null,failure:X(i.result,i)};if("cancelled"===e.state)return{...a,status:"cancelled",output:null,failure:{code:"cancelled",message:"Cancelled."}};if(!("exited"===e.state||"spawn_failed"===e.state||null===e.pid||!d(e.pid)))return null;let o=I(E(e.id,"err.log")),u=/unknown option|unrecognized option|invalid option/i.test(o);return{...a,status:"failed",output:null,failure:u?{code:"incompatible_version",message:"The installed Claude Code rejected the non-interactive flag set."}:{code:"process_exited",message:`Claude Code exited without a result${null===e.exit_code?"":` (exit ${e.exit_code})`}.`}}}let B=e=>_.default.join(v,e.replace(/[^a-zA-Z0-9_-]/g,"_"));async function ee(e,i,s,a){let d,u=`ct-${(0,l.randomUUID)()}`;c.default.mkdirSync(y,{recursive:!0});let _=i.session_context?.mint({kind:"claude_turn",ref:u})??null,p=_?E(u,"mcp.json"):null;_&&p&&function(e,t){c.default.rmSync(e,{force:!0});let n=c.default.openSync(e,"wx",384);try{c.default.writeFileSync(n,JSON.stringify(k(t)))}finally{c.default.closeSync(n)}c.default.chmodSync(e,384)}(p,_.url);let h={id:u,session_id:s,kind:e,authority:i.authority,workspace:a,pid:null,state:"running",exit_code:null,created_at:Date.now(),finished_at:null},g=c.default.openSync(E(u,"out.jsonl"),"a"),v=c.default.openSync(E(u,"err.log"),"a"),T=null;try{d=o(n,function(e,t,n=null){let r=J[e],i=n?[...r.tools,w]:r.tools;return["-p","--output-format","stream-json","--verbose","--input-format","text","--permission-mode",r.permission_mode,"--permission-prompts","none","--tools",r.tools.join(","),"--allowedTools",i.join(","),"--strict-mcp-config",...n?["--mcp-config",n]:[],..."resume"in t?["--resume",t.resume]:["--session-id",t.sessionId]]}(i.authority,"send"===e?{resume:s}:{sessionId:s},p),{cwd:a,env:Z(t,_?.token??null),stdio:["pipe",g,v],detached:!0})}finally{c.default.closeSync(g),c.default.closeSync(v)}d.on("error",e=>{T=e}),h.pid=d.pid??null,S(h),d.on("exit",e=>{let t=b(u);t&&"running"===t.state&&S({...t,state:"exited",exit_code:e,finished_at:Date.now()})}),d.stdin?.on("error",()=>{}),d.stdin?.end(i.prompt),d.unref();let R=Date.now()+f;for(;;){let e=b(u),t=P(I(E(u,"out.jsonl")));if(T)return S({...e,state:"spawn_failed",finished_at:Date.now()}),{turn:null,error:r("unavailable",`Claude Code could not start: ${T.message}`)};if(null!==t.session_id&&t.session_id!==s)return et(e),S({...e,state:"cancelled",finished_at:Date.now()}),{turn:null,error:r("not_resumable","Claude Code started a different session; it was stopped.")};if(null===t.session_id&&t.result&&!K(t.result)){let e=X(t.result,t);return{turn:null,error:r(Q[e.code],e.message)}}if(null!==t.session_id||t.result)return{turn:e,error:null};let n=j(e);if(n){let e=n.failure?.code;return{turn:null,error:r(e?Q[e]??"unavailable":"unavailable",n.failure?.message??"Claude Code exited.")}}if(Date.now()>=R)return{turn:e,error:null};await new Promise(e=>setTimeout(e,Math.min(m,25)))}}function et(e){if(null!==e.pid)for(let t of[-e.pid,e.pid])try{process.kill(t,"SIGTERM");return}catch{}}async function en(e,s,a,o){if(!J[s.authority])return r("unsupported_authority",`No Claude Code mode for ${String(s.authority)}.`);let d=function(e){c.default.mkdirSync(v,{recursive:!0});let t=_.default.join(v,e.replace(/[^a-zA-Z0-9_-]/g,"_"));try{return c.default.writeFileSync(t,"",{flag:"wx"}),{existing:null,claimed:!0}}catch{let e=I(t).trim();return{existing:e?b(e):null,claimed:!1}}}(s.idempotency_key);if(!d.claimed)return d.existing?i({provider_turn_id:d.existing.id,provider_session_id:d.existing.session_id}):r("busy","A turn with this idempotency key is starting.");let l=()=>c.default.rmSync(B(s.idempotency_key),{force:!0}),p=function(){let e,r=V.get(n);if(r)return r;try{let r=(0,u.execFileSync)(n,["--version"],{env:Z(t),encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","pipe"]}),i=/(\d+\.\d+\.\d+)/.exec(r)?.[1]??null;e=i?0>function(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number);for(let e=0;e<3;e++)if((n[e]??0)!==(r[e]??0))return(n[e]??0)-(r[e]??0);return 0}(i,G)?{ok:!1,code:"incompatible_version",message:`Claude Code ${i} is older than ${G}.`}:{ok:!0,version:i}:{ok:!1,code:"incompatible_version",message:"Claude Code did not report a version."}}catch(e){return{ok:!1,code:"unavailable",message:`Claude Code is not runnable: ${e.message}`}}return V.set(n,e),e}();if(!p.ok)return l(),r(p.code,p.message);let f=await ee(e,s,a,o);return f.turn?(c.default.writeFileSync(B(s.idempotency_key),f.turn.id),i({provider_turn_id:f.turn.id,provider_session_id:a})):(l(),f.error)}return{kind:"claude-code",capabilities:()=>({...z,authorities:[...z.authorities]}),async listSessions(e){let t=e.scope;if("workspaces"===t.kind&&0===t.workspaces.length)return i({items:[],next_cursor:null});let n="sessions"===t.kind?t.provider_session_ids.map(e=>C(s,e)).filter(e=>!!e).map(e=>({id:_.default.basename(e,".jsonl"),file:e,mtime_ms:c.default.statSync(e).mtimeMs})):function(e,t){let n=t?t.flatMap(N):null,r=[];for(let t of x(q(e))){if(n&&!n.some(e=>t===e||t.startsWith(`${e}-`)))continue;let i=_.default.join(q(e),t);for(let e of x(i)){if(!e.endsWith(".jsonl"))continue;let t=e.slice(0,-6);if(R(t))try{let n=c.default.statSync(_.default.join(i,e));n.isFile()&&r.push({id:t,file:_.default.join(i,e),mtime_ms:n.mtimeMs})}catch{}}}return r.sort((e,t)=>t.mtime_ms-e.mtime_ms||e.id.localeCompare(t.id))}(s,"workspaces"===t.kind?t.workspaces:null),a=Math.max(0,Number(e.cursor??0)||0),o=(e.query??"").trim().toLowerCase(),d=U(),u=g(),l=864e5*W(s),p=[],f=20*e.limit,h=a;for(;h<n.length&&p.length<e.limit&&h-a<f;h++){if(e.signal?.aborted)return r("cancelled","list aborted");let i=$(n[h]);i&&function(e,t){return"all_provider_sessions"===e.kind||("sessions"===e.kind?e.provider_session_ids.includes(t.id):null!==t.workspace&&e.workspaces.some(e=>{var n;let r;return n=t.workspace,n===(r=e.replace(/\/+$/,"")||"/")||n.startsWith("/"===r?"/":`${r}/`)}))}(t,i)&&(!o||`${i.title??""}
|
|
222
|
+
${i.workspace??""}`.toLowerCase().includes(o))&&p.push(A(i,d,u,l))}return i({items:p,next_cursor:h<n.length?String(h):null})},async getSession(e){let t=C(s,e.provider_session_id);if(!t)return i(null);let n=$({id:e.provider_session_id,file:t,mtime_ms:c.default.statSync(t).mtimeMs});return i(n?A(n,U(),g(),864e5*W(s)):null)},async readTranscript(e){let t=C(s,e.provider_session_id),n=t?function(e,t){let n=O(e);if(!n)return null;let r=[],i=(e,t,n)=>{t.trim()&&r.push({seq:r.length+1,role:e,text:t.length>4e3?`${t.slice(0,3999)}…`:t,at:n})};for(let e of n.records){if(!M(e)||void 0!==e.sessionId&&e.sessionId!==t)continue;let n=L(e),r=D(e),s="user"===e.type?"user":"assistant";if("string"==typeof r){i(s,r,n);continue}for(let e of r??[])if(e&&"object"==typeof e){if("text"===e.type)i(s,String(e.text??""),n);else if("tool_use"===e.type)i("tool",`tool call: ${String(e.name??"unknown")}`,n);else if("tool_result"===e.type){let t="string"==typeof e.content?e.content:Array.isArray(e.content)?e.content.map(e=>e&&"object"==typeof e&&"text"===e.type?String(e.text??""):"").join("\n"):"";i("tool",`tool result: ${t||"(no text)"}`,n)}}}return r}(t,e.provider_session_id):null;if(!n)return r("not_found","Claude Code has no such session.");let a=Math.max(0,Number(e.cursor??0)||0);return i({items:n.slice(a,a+e.limit),next_cursor:a+e.limit<n.length?String(a+e.limit):null})},async startSession(e){let t=null;try{t=c.default.statSync(e.workspace)}catch{t=null}return t?.isDirectory()?en("start",e,(0,l.randomUUID)(),e.workspace):r("invalid_input","The workspace is not a directory here.")},async sendTurn(e){if(!R(e.provider_session_id))return r("not_found","Not a Claude Code session id.");let t=C(s,e.provider_session_id);if(!t)return r("not_found","Claude Code has no such session.");let n=$({id:e.provider_session_id,file:t,mtime_ms:c.default.statSync(t).mtimeMs});if(!n||0===n.messages||!n.workspace)return r("not_resumable","The session has no conversation to resume.");if(U().has(n.id)){let t,n=(t=I(B(e.idempotency_key)).trim())?b(t):null;return n?i({provider_turn_id:n.id,provider_session_id:n.session_id}):r("busy","The session is open in a running Claude Code process.")}return en("send",e,n.id,n.workspace)},async observeTurn(e){let t=null;for(;;){let n=b(e.provider_turn_id);if(!n)return r("not_found","No such turn.");let s=j(n);if(s&&"running"===n.state&&null!==n.pid&&d(n.pid)&&(t??=Date.now(),Date.now()-t<h&&!e.signal?.aborted&&!("number"==typeof e.deadline_at&&Date.now()>=e.deadline_at))){await new Promise(e=>setTimeout(e,m));continue}if(s)return"running"===n.state&&S({...n,state:"exited",finished_at:s.finished_at}),c.default.rmSync(E(n.id,"mcp.json"),{force:!0}),i(s);if(e.signal?.aborted)return r("cancelled","observe aborted");if("number"==typeof e.deadline_at&&Date.now()>=e.deadline_at)return r("timed_out","observe deadline");await new Promise(e=>setTimeout(e,m))}},async cancelTurn(e){let t=b(e.provider_turn_id);return t?j(t)?i("already_terminal"):(et(t),S({...t,state:"cancelled",finished_at:Date.now()}),c.default.rmSync(E(t.id,"mcp.json"),{force:!0}),i("cancelled")):r("not_found","No such turn.")}}}],91466);let ee={name:"botmancers",version:"1"},et={list:!0,search:!0,read:!0,resume:!0,start:!0,cancel:!0,usage:!0,authorities:["read_only","workspace_write"],max_page_size:50},en={list:!1,search:!1,read:!1,resume:!1,start:!1,cancel:!1,usage:!1,authorities:[],max_page_size:50};function er(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:null}function ei(e){return"string"==typeof e&&e.length>0?e:null}function es(e){return"number"==typeof e&&Number.isFinite(e)&&e>=0?e:null}function ea(e){if("string"!=typeof e)return null;let t=Date.parse(e);return Number.isFinite(t)?t:null}function eo(e,t="durable"){let n=er(e),r=ei(n?.sessionId);if(!n||!r||"subagent"===n.kind)return null;let i=ei(n.workspaceRoot),s=ei(n.status);return{provider_session_id:r,title:ei(n.title)??ei(n.firstUserPrompt)??ei(n.name),workspace:i&&i.startsWith("/")?i:null,created_at:ea(n.createdAt),updated_at:ea(n.lastActivityAt)??ea(n.updatedAt),lifecycle:"open",resumable:"durable"===t&&"string"==typeof n.path&&n.path.length>0,busy:"running"===s||null!==ei(n.activeTurnId)}}function ed(e,t){if(!Array.isArray(e))return null;let n=e.map(er).filter(e=>!!e&&"agentMessage"===e.kind&&e.turnId===t&&!0!==e.retracted).map(e=>ei(e.text)).filter(e=>null!==e);return n.length>0?n.join("\n"):null}function eu(e){return 0===e.length||e.some(e=>null===e)?null:e.reduce((e,t)=>e+t,0)}function el(e){let t="string"==typeof e?/^(\d+)\.(\d+)\.(\d+)/.exec(e.trim()):null;return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}let ec=/login is no longer valid|authentication failed|missing \w+ credentials|api key .*rejected|unauthenticated|unauthori[sz]ed|not (signed|logged) in|\b401\b|\b403\b|forbidden|authRequired/i,e_=/rate[\s_-]*limit|usage[\s_-]*limit|quota|\b429\b|rate_limited/i;function ep(e=Date.now()){let t=Buffer.alloc(16),n=Math.floor(e);for(let e=5;e>=0;e--)t[e]=n%256,n=Math.floor(n/256);(0,l.randomBytes)(10).copy(t,6),t[6]=112|15&t[6],t[8]=128|63&t[8];let r=t.toString("hex");return`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`}function ef(e){let t=e.lastIndexOf(":");return t<=0||t===e.length-1?null:{sessionId:e.slice(0,t),turnId:e.slice(t+1)}}class eh{options;authority;child;buffer;seq;pending;listeners;ready;loaded;turns;info;constructor(e,t){this.options=e,this.authority=t,this.child=null,this.buffer="",this.seq=0,this.pending=new Map,this.listeners=new Set,this.ready=null,this.loaded=new Set,this.turns=new Map,this.info=null}alive(){return null!==this.child}start(){return this.ready&&this.child||(this.ready=this.spawnAndInitialize()),this.ready}async spawnAndInitialize(){let e,t="read_only"===this.authority?["--disable-write","--disable-shell"]:[];try{e=(0,u.spawn)(this.options.command,[...this.options.commandArgs,"serve",...t,...this.options.serveArgs],{cwd:T.default.homedir(),stdio:["pipe","pipe","pipe"],env:{...process.env,...this.options.env}})}catch{return{code:"unavailable",message:"spawn_failed"}}this.child=e;let n=null,r="";e.on("error",t=>{n="ENOENT"===t.code?"binary_missing":"spawn_failed",this.drop(e)}),e.stdin.on("error",()=>this.drop(e)),e.stderr.on("data",e=>{r=`${r}${e.toString()}`.slice(-2e3)}),e.stdout.on("data",t=>this.onData(e,t)),e.on("close",()=>this.drop(e));let i=await this.request("initialize",{clientInfo:{...ee}});if(!i.ok)return(this.close(),n)?{code:"unavailable",message:n}:ec.test(r)?{code:"unavailable",message:"auth_required (host exited)"}:i.error;let s=er(i.result.serverInfo),a=er(i.result.schema);this.info={muse_version:ei(s?.version),schema_version:"number"==typeof a?.version?a.version:null,schema_fingerprint:ei(a?.fingerprint),durability:ei(i.result.sessionDurability)??"durable"};try{e.stdin.write(`${JSON.stringify({jsonrpc:"2.0",method:"initialized",params:{}})}
|
|
223
|
+
`)}catch{return this.close(),{code:"unavailable",message:"transport_error"}}return null}onData(e,t){let n;if(e===this.child){if(this.buffer+=t.toString(),this.buffer.length>0x1000000)return void this.close();for(;(n=this.buffer.indexOf("\n"))>=0;){let e=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.onLine(e)}}}onLine(e){let t=null;try{t=er(JSON.parse(e))}catch{return}if(!t)return;if("number"==typeof t.id&&this.pending.has(t.id)){let e,n,r,i=this.pending.get(t.id);this.pending.delete(t.id);let s=er(t.error);i(s?{ok:!1,error:(e="number"==typeof s.code?s.code:null,n=ei(er(s.data)?.kind)??"unknown",r=`${n} ${"string"==typeof s.message?s.message:""}`,ec.test(r)||401===e||403===e?{code:"unavailable",message:`auth_required (${n})`}:-32601===e||"methodNotFound"===n||"experimentalRequired"===n||"capabilityRequired"===n||-32010===e?{code:"unsupported",message:`unsupported (${n})`}:-32020===e||-32011===e||"sessionNotFound"===n||"notFound"===n?{code:"not_found",message:`not_found (${n})`}:-32021===e||"sessionInUse"===n?{code:"busy",message:`busy (${n})`}:-32602===e||-32002===e||"invalidParams"===n||"inputTooLarge"===n?{code:"invalid_input",message:`invalid_input (${n})`}:{code:"unavailable",message:`provider_error (${n})`})}:{ok:!0,result:er(t.result)??{}});return}if("string"!=typeof t.method||void 0!==t.id||"turn/completed"!==t.method&&"session/tokenUsage"!==t.method)return;let n=er(t.params),r=ei(n?.turnId),i=ei(n?.sessionId);if(!n||!r||!i)return;let s=this.turns.get(r);s||(s={sessionId:i,completed:null,usageRecords:[]},this.turns.set(r,s)),"turn/completed"===t.method?(s.completed=n,this.notify()):"session/tokenUsage"===t.method&&s.usageRecords.push(n.usage)}notify(){for(let e of[...this.listeners])e()}async waitFor(e,t,n){for(;;){if(e())return"done";if(!this.alive())return"dead";if(t?.aborted)return"cancelled";let r="number"==typeof n?n-Date.now():1e3;if(r<=0)return"timed_out";await new Promise(e=>{let n=()=>{clearTimeout(i),t?.removeEventListener("abort",n),this.listeners.delete(n),e()},i=setTimeout(n,Math.min(r,1e3));this.listeners.add(n),t?.addEventListener("abort",n,{once:!0})})}}request(e,t){let n=this.child;if(!n)return Promise.resolve({ok:!1,error:{code:"unavailable",message:"host_not_running"}});let r=++this.seq;return new Promise(i=>{let s=setTimeout(()=>{this.pending.delete(r),i({ok:!1,error:{code:"unavailable",message:`rpc_timeout (${e})`}})},this.options.rpcTimeoutMs);this.pending.set(r,e=>{clearTimeout(s),i(e)});try{n.stdin.write(`${JSON.stringify({jsonrpc:"2.0",id:r,method:e,params:t})}
|
|
224
|
+
`)}catch{this.pending.delete(r),clearTimeout(s),i({ok:!1,error:{code:"unavailable",message:"transport_error"}})}})}drop(e){if(e===this.child){for(let e of(this.child=null,this.ready=null,this.loaded.clear(),this.pending.values()))e({ok:!1,error:{code:"unavailable",message:"host_exited"}});this.pending.clear(),this.notify()}}close(){let e=this.child;if(e){this.drop(e);try{e.kill("SIGTERM")}catch{}}}runningTurns(){let e=0;for(let t of this.turns.values())!t.completed&&e++;return e}}let em=new Map;function eg(e,t){let n=e??{muse_version:null,schema_version:null,schema_fingerprint:null,durability:null};if(t){let e=/^auth_required/.test(t.message)?"auth_required":"unsupported"===t.code?"unsupported":"unavailable";return{...n,status:e,reason:t.message,capabilities:{...en}}}let r=el(n.muse_version);if(1!==n.schema_version)return{...n,status:"unsupported",reason:`msp_schema_${n.schema_version??"unknown"}`,capabilities:{...en}};if(!r||!function(e,t){for(let n=0;n<3;n++)if(e[n]!==t[n])return e[n]>t[n];return!0}(r,el("1.4.0")))return{...n,status:"unsupported",reason:`muse_version_${n.muse_version??"unknown"}`,capabilities:{...en}};let i="durable"===n.durability;return{...n,status:"ready",reason:null,capabilities:i?{...et,authorities:[...et.authorities]}:{...et,list:!1,search:!1,read:!1,resume:!1,authorities:[...et.authorities]}}}process.once("exit",()=>(function(){for(let e of em.values())for(let t of Object.values(e.hosts))t?.close();em.clear()})()),e.s(["createMuseSessionProvider",0,function(e,t={}){let n,s=((n=em.get(e))||(n={hosts:{},probe:null,startKeys:new Map},em.set(e,n)),n),a={command:t.command??process.env.BOTMANCERS_MUSE_BIN??"muse",commandArgs:t.commandArgs??[],serveArgs:t.serveArgs??function(){let e=process.env.BOTMANCERS_MUSE_SERVE_ARGS;if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}(),env:t.env??{},rpcTimeoutMs:t.rpcTimeoutMs??3e4},o=t.cancelSettleMs??1e4;async function d(e){let t=s.hosts[e];t||(t=new eh(a,e),s.hosts[e]=t);let n=await t.start();return(s.probe=eg(t.info,n),n)?{ok:!1,error:n}:"ready"!==s.probe.status?(t.close(),{ok:!1,error:{code:"unsupported",message:s.probe.reason??"unsupported"}}):{ok:!0,host:t}}function u(){return d(["read_only","workspace_write"].find(e=>s.hosts[e]?.alive())??"read_only")}async function l(e,t,n){return e.request(t,n)}async function c(e,t){let n=await u();return n.ok?l(n.host,"session/read",{sessionId:e,excludeItems:!t}):n}function _(){return s.probe?.durability??"durable"}async function p(e,t){for(let n of Object.values(s.hosts))if(n&&n!==e&&n.loaded.has(t)){if(n.runningTurns()>0)return{ok:!1,error:{code:"busy",message:"busy (loaded by another host)"}};n.close()}if(e.loaded.has(t)){let n=await l(e,"session/read",{sessionId:t,excludeItems:!0});return n.ok?{ok:!0,session:er(n.result.session)??{}}:n}let n=await l(e,"session/resume",{commandId:ep(),sessionId:t,excludeItems:!0});return n.ok?(e.loaded.add(t),{ok:!0,session:er(n.result.session)??{}}):n}async function f(e,t,n){let s=await l(e,"turn/start",{commandId:ep(),sessionId:t,input:[{type:"text",text:n}]});if(!s.ok)return s;let a=ei(s.result.turnId);return a?(e.turns.has(a)||e.turns.set(a,{sessionId:t,completed:null,usageRecords:[]}),i(a)):r("unavailable","provider_error (turn/start without turnId)")}async function h(e,t,n,r,i,s,a){let o,d,u,l,_=a;if(void 0===_){let t=await c(e,!0);_=t.ok?er(t.result.history)?.items:null}let p="completed"===n?"completed":"cancelled"===n?"cancelled":"failed";return{status:p,provider_session_id:e,output:ed(_,t),failure:"completed"===p?null:"cancelled"===p?{code:"cancelled",message:ei(i)??"cancelled"}:(o=er(r),d=ei(o?.kind)??"",u=(ei(o?.message)??ei(i)??d)||"turn failed",l=`${d} ${u}`,{code:ec.test(l)?"auth":e_.test(l)||o?.quota?"usage_cap":d||"failed",message:u.slice(0,500)}),usage:s?{input_tokens:s.input_tokens,output_tokens:s.output_tokens}:null,finished_at:Date.now()}}function m(e){for(let t of Object.values(s.hosts)){let n=t?.alive()?t.turns.get(e):void 0;if(t&&n)return{host:t,track:n}}return null}async function g(e,t,n,s){for(;;){let a=await c(e,!0);if(!a.ok)return a;let o=er(a.result.session),d=er(a.result.lastTurn),u=er(a.result.history)?.items;if(d&&d.turnId===t)return i(await h(e,t,d.terminal,d.error,d.reason,null,u));if(o?.activeTurnId!==t)return i({status:"failed",provider_session_id:e,output:ed(u,t),failure:{code:"host_lost",message:"The Muse host running this turn exited before it finished."},usage:null,finished_at:Date.now()});if(n?.aborted)return r("cancelled","observe aborted");if("number"==typeof s&&Date.now()>=s)return r("timed_out","observe deadline");await new Promise(e=>setTimeout(e,500))}}return{kind:"muse-msp",capabilities(){let e=s.probe?.capabilities??et;return{...e,authorities:[...e.authorities]}},async probe(){let e=await u();return s.probe??eg(null,e.ok?null:e.error)},async listSessions(e){let t=await u();if(!t.ok)return t;let n={},s="sessions"===e.scope.kind?e.scope.provider_session_ids:null;if(s){if(0===s.length)return i({items:[],next_cursor:null});n.sessionId={anyOf:s.slice(0,200)}}let a=(e.query??"").trim().split(/\s+/).filter(Boolean).slice(0,16);a.length>0&&(n.text={allOf:a,fields:["name","title"]});let o=await l(t.host,"session/list",{limit:Math.min(Math.max(1,e.limit),50),...e.cursor?{cursor:e.cursor}:{},...Object.keys(n).length>0?{filter:n}:{}});if(!o.ok)return o;let d=er(o.result.appliedFilter);return n.text&&!er(d?.text)?r("unsupported","unsupported (session/list text filter)"):i({items:(Array.isArray(o.result.sessions)?o.result.sessions:[]).map(e=>eo(e,_())).filter(e=>null!==e).filter(e=>!s||s.includes(e.provider_session_id)),next_cursor:ei(o.result.nextCursor)})},async getSession(e){let t=await c(e.provider_session_id,!1);if(!t.ok)return"not_found"===t.error.code?i(null):t;let n=eo(t.result.session,_());return i(n&&n.provider_session_id===e.provider_session_id?n:null)},async readTranscript(e){let t=await c(e.provider_session_id,!0);if(!t.ok)return t;let n=er(t.result.history);if(n?.mode!=="inline")return r("unavailable",`history_${ei(n?.mode)??"missing"}`);let s=function(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=er(n);if(!e||!0===e.retracted)continue;let r="userMessage"===e.kind?"user":"agentMessage"===e.kind?"assistant":null,i=ei(e.text)??("user"===r?ei(e.displayText):null);r&&i&&t.push({seq:t.length+1,role:r,text:i,at:ea(e.recordedAt)})}return t}(n.items),a=e.cursor&&/^\d+$/.test(e.cursor)?Number(e.cursor):0;return i({items:s.slice(a,a+e.limit),next_cursor:a+e.limit<s.length?String(a+e.limit):null})},async startSession(e){var t;let n=s.startKeys.get(e.idempotency_key);if(n)return i(n);let a=await d(e.authority);if(!a.ok)return a;let o=await l(a.host,"session/start",{commandId:ep(),workspaceRoot:e.workspace,approvalMode:"denyUnmatched"});if(!o.ok)return o;let u=ei(er(o.result.session)?.sessionId);if(!u)return r("unavailable","provider_error (session/start without sessionId)");a.host.loaded.add(u);let c=await f(a.host,u,e.prompt);if(!c.ok)return c;let _={provider_session_id:u,provider_turn_id:(t=c.value,`${u}:${t}`)};return s.startKeys.set(e.idempotency_key,_),i(_)},async sendTurn(e){var t,n;let a=s.startKeys.get(e.idempotency_key);if(a)return i(a);let o=await d(e.authority);if(!o.ok)return o;let u=await p(o.host,e.provider_session_id);if(!u.ok)return u;if("running"===u.session.status||ei(u.session.activeTurnId))return r("busy","busy (turn in flight)");let l=await f(o.host,e.provider_session_id,e.prompt);if(!l.ok)return l;let c={provider_session_id:e.provider_session_id,provider_turn_id:(t=e.provider_session_id,n=l.value,`${t}:${n}`)};return s.startKeys.set(e.idempotency_key,c),i(c)},async observeTurn(e){let t=ef(e.provider_turn_id);if(!t)return r("not_found","not_found (turn handle)");let n=m(t.turnId);if(n){let s=await n.host.waitFor(()=>null!==n.track.completed,e.signal,e.deadline_at);if("cancelled"===s)return r("cancelled","observe aborted");if("timed_out"===s)return r("timed_out","observe deadline");let a=n.track.completed;if(a)return i(await h(t.sessionId,t.turnId,a.terminal,a.error,a.reason,function(e,t=[]){let n=er(e);if(n)return{input_tokens:es(n.inputTokens),output_tokens:es(n.outputTokens),cost_usd:null};let r=t.map(er).filter(e=>null!==e);return 0===r.length?null:{input_tokens:eu(r.map(e=>es(e.inputTokens))),output_tokens:eu(r.map(e=>es(e.outputTokens))),cost_usd:null}}(a.usage,n.track.usageRecords)))}return g(t.sessionId,t.turnId,e.signal,e.deadline_at)},async cancelTurn(e){let t=ef(e.provider_turn_id);if(!t)return r("not_found","not_found (turn handle)");let n=m(t.turnId);if(!n){let e=await c(t.sessionId,!1);return e.ok?er(e.result.session)?.activeTurnId===t.turnId?r("unavailable","turn runs in another Muse host"):i("already_terminal"):e}if(n.track.completed)return i("already_terminal");let s=await l(n.host,"turn/cancel",{commandId:ep(),sessionId:t.sessionId,turnId:t.turnId});if(!s.ok)return s;await n.host.waitFor(()=>null!==n.track.completed,null,Date.now()+o);let a=n.track.completed?.terminal;return i(void 0===a||"cancelled"===a?"cancelled":"already_terminal")}}}],27776);class ey{defaultTimeoutMs;transport;pending;listeners;closeListeners;nextId;serverRequestHandler;closed;closeReason;constructor(e,t=3e4){this.defaultTimeoutMs=t,this.pending=new Map,this.listeners=new Set,this.closeListeners=new Set,this.nextId=1,this.serverRequestHandler=null,this.closed=!1,this.closeReason=null,this.transport=e,e.onLine(e=>this.receive(e)),e.onClose(e=>{for(let[t,n]of(this.closed=!0,this.closeReason=e,this.pending))this.pending.delete(t),n.cleanup(),n.resolve({ok:!1,kind:"closed",error:{code:-1,message:e}});for(let t of this.closeListeners)t(e)})}request(e,t,n={}){if(this.closed)return Promise.resolve({ok:!1,kind:"closed",error:{code:-1,message:this.closeReason??"closed"}});let r=this.nextId++;return new Promise(i=>{let s=n.signal??null,a=()=>l({ok:!1,kind:"aborted",error:{code:-1,message:"aborted"}}),o=n.timeoutMs??this.defaultTimeoutMs,d=o>0?setTimeout(()=>l({ok:!1,kind:"timeout",error:{code:-1,message:`${e} timed out`}}),o):null,u=()=>{d&&clearTimeout(d),s?.removeEventListener("abort",a)},l=e=>{this.pending.has(r)&&(this.pending.delete(r),u(),i(e))};if(this.pending.set(r,{resolve:e=>i(e),timer:d,cleanup:u}),s?.aborted)return a();s?.addEventListener("abort",a,{once:!0}),this.transport.send(JSON.stringify({id:r,method:e,params:t}))})}notify(e,t){this.transport.send(JSON.stringify(void 0===t?{method:e}:{method:e,params:t}))}onNotification(e){return this.listeners.add(e),()=>this.listeners.delete(e)}onClose(e){return this.closeListeners.add(e),()=>this.closeListeners.delete(e)}handleServerRequests(e){this.serverRequestHandler=e}close(){this.transport.close()}receive(e){let t;try{t=JSON.parse(e)}catch{return}if(!t||"object"!=typeof t)return;let n="number"==typeof t.id||"string"==typeof t.id;if(n&&"string"==typeof t.method){let e=this.serverRequestHandler?this.serverRequestHandler(t.method,t.params??{}):{error:{code:-32601,message:"not handled"}};this.transport.send(JSON.stringify({id:t.id,...e}));return}if(n){let e=this.pending.get(Number(t.id));if(!e)return;if(this.pending.delete(Number(t.id)),e.cleanup(),t.error&&"object"==typeof t.error){let n=t.error;e.resolve({ok:!1,kind:"rpc",error:{code:Number(n.code??-32603),message:String(n.message??"")}})}else e.resolve({ok:!0,result:t.result});return}if("string"==typeof t.method){let e={method:t.method,params:t.params??{}};for(let t of this.listeners)t(e)}}}function ew(e){let t=[];for(let n of e.split("\n")){let e=n.trim();if(e)try{let n=JSON.parse(e);n&&"object"==typeof n&&!Array.isArray(n)&&t.push(n)}catch{}}return t}let ev=e=>"number"==typeof e&&Number.isFinite(e)&&e>=0?Math.trunc(e):null;function ek(e,t,n){return null===e&&null===n?null:{input_tokens:e,output_tokens:n,cached_input_tokens:t,cost_usd:null}}function eE(e){let t=null,n=null,r=null,i=null;for(let s of e)if("thread.started"===s.type&&"string"==typeof s.thread_id)t=s.thread_id;else if("item.completed"===s.type&&s.item&&"object"==typeof s.item){let e=s.item;"agent_message"===e.type&&"string"==typeof e.text&&e.text&&(n=e.text)}else if("turn.completed"===s.type)r="completed";else if("turn.failed"===s.type||"error"===s.type){r="failed";let e=s.error;i="string"==typeof e?e:e&&"object"==typeof e&&"string"==typeof e.message?e.message:"string"==typeof s.message?s.message:"codex turn failed"}return{thread_id:t,terminal:r,output:n,error:i,usage:function(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if("turn.completed"!==n.type)continue;let r=n.usage;if(!r||"object"!=typeof r)break;return ek(ev(r.input_tokens),ev(r.cached_input_tokens),ev(r.output_tokens))}return null}(e)}}var eb=e.i(18966);let eS=["cli","vscode","exec","appServer"],eT=["thread/list","thread/read","thread/items/list","thread/turns/list","thread/start","thread/resume","turn/start","turn/interrupt"],eI={"thread/list":{limit:"probe"},"thread/read":{threadId:0},"thread/items/list":{threadId:0},"thread/turns/list":{threadId:0},"thread/start":{cwd:0},"thread/resume":{threadId:0},"turn/start":{threadId:0},"turn/interrupt":{threadId:0}},eR=Object.fromEntries(eT.map(e=>[e,!1]));function eA(e,t,n){return`codex:${e}:${t}:${n}`}function eq(e){let t=e.split(":");return 4===t.length&&"codex"===t[0]&&("as"===t[1]||"ex"===t[1])&&t[2]&&t[3]?{kind:t[1],threadId:t[2],id:t[3]}:null}function ex(e){return Buffer.from(JSON.stringify(e)).toString("base64url")}function eN(e){if(!e)return null;try{let t=JSON.parse(Buffer.from(e,"base64url").toString("utf8"));return t&&"object"==typeof t?t:null}catch{return null}}let eC=e=>"number"==typeof e&&Number.isFinite(e)?Math.round(1e3*e):null;function eO(e,t){let n="string"==typeof e.cwd&&e.cwd.startsWith("/")?e.cwd:null,r=e.status?.type,i="string"==typeof e.name&&e.name.trim()?e.name:null,s="string"==typeof e.preview&&e.preview.trim()?e.preview:null;return{provider_session_id:e.id,title:i??s,workspace:n,created_at:eC(e.createdAt),updated_at:eC(e.updatedAt),lifecycle:t??("string"==typeof e.path&&e.path.split(/[\\/]/).includes("archived_sessions")?"archived":"open"),resumable:!0!==e.ephemeral&&"systemError"!==r&&null!==n&&c.default.existsSync(n),busy:"active"===r}}function eL(e,t,n){if("userMessage"===e.type)return{seq:t,role:"user",text:(Array.isArray(e.content)?e.content:[]).map(e=>e&&"object"==typeof e&&"text"===e.type?String(e.text??""):"").join("").trim(),at:n};return"agentMessage"===e.type&&"string"==typeof e.text?{seq:t,role:"assistant",text:e.text,at:n}:"commandExecution"===e.type&&"string"==typeof e.command?{seq:t,role:"tool",text:`$ ${e.command}`,at:n}:null}function eD(e){let t=null,n=null;for(let r of e??[])r?.type==="agentMessage"&&"string"==typeof r.text&&r.text&&(t=r.text,"final_answer"===r.phase&&(n=r.text));return n??t}function eM(e){return"workspace_write"===e?"workspace-write":"read-only"}function e$(e){return!e.ok&&"rpc"===e.kind&&/thread not (found|loaded)|no rollout|invalid thread id|not found/i.test(e.error.message)}function eW(e,t){return"timeout"===e.kind?r("timed_out",`${t} timed out`):"aborted"===e.kind?r("cancelled",`${t} aborted`):"closed"===e.kind?r("unavailable",`${t}: app-server closed`):r("invalid_input",`${t} refused (${e.error.code})`)}class eF{options;client;connecting;probe;trackers;keys;idleTimer;loads;command;env;constructor(e={}){this.options=e,this.client=null,this.connecting=null,this.probe=null,this.trackers=new Map,this.keys=new Map,this.idleTimer=null,this.loads=new Map,this.command=e.command??[process.env.BOTMANCERS_CODEX_BIN||"codex"],this.env=e.env??process.env}get runsDir(){return this.options.runsDir??_.default.join(_.default.dirname(_.default.resolve((0,p.dbPath)(this.env))),"codex-exec-runs")}capabilities(){let e=this.probe?.status==="ready"?this.probe:null,t=e?.methods??eR,n=!!e?.exec_fallback,r=t["thread/start"]&&t["turn/start"],i=t["thread/resume"]&&t["turn/start"];return{list:t["thread/list"],search:t["thread/list"],read:t["thread/items/list"]||t["thread/turns/list"],resume:i||n&&t["thread/read"],start:r||n,cancel:t["turn/interrupt"]||n&&(!r||!i),usage:!!e,authorities:e?["read_only","workspace_write"]:[],max_page_size:25}}selection(){let e=this.capabilities(),t=this.probe?.methods??eR;return{start:e.start?t["thread/start"]&&t["turn/start"]?"app-server":"exec":null,resume:e.resume?t["thread/resume"]&&t["turn/start"]?"app-server":"exec":null}}async ready(){let e=await this.connect();return"ready"===e.status?i(void 0):r("auth_required"===e.status?"auth_required":"unsupported"===e.status?"unsupported":"unavailable",e.detail)}async connect(){return this.client&&!this.client.closed&&this.probe?.status==="ready"?this.probe:(this.connecting||(this.connecting=this.doConnect().finally(()=>{this.connecting=null})),this.connecting)}cliVersion(){return new Promise(e=>{(0,u.execFile)(this.command[0],[...this.command.slice(1),"--version"],{env:this.env,timeout:1e4},(t,n)=>{if(t)return e(null);let r=/(\d+\.\d+\.\d+[0-9A-Za-z.+-]*)/.exec(String(n));e(r?r[1]:null)})})}async doConnect(){let e=await this.cliVersion(),t=(t,n)=>(this.probe={status:t,cli_version:e,methods:{...eR},exec_fallback:!1,detail:n},this.probe);this.client?.close(),this.client=null;let n=new ey((this.options.transport??((e,t)=>(function(e,t={}){let n,r=[],i=[],s=!1,a=e=>{if(!s)for(let t of(s=!0,i))t(e)};try{n=(0,u.spawn)(e[0],e.slice(1),{stdio:["pipe","pipe","pipe"],env:t.env??process.env,cwd:t.cwd})}catch(e){return queueMicrotask(()=>a(`spawn failed: ${e.message}`)),{send:()=>{},onLine:e=>r.push(e),onClose:e=>i.push(e),close:()=>{}}}let o="";return n.stdout?.setEncoding("utf8"),n.stdout?.on("data",e=>{let t;for(o+=e;(t=o.indexOf("\n"))>=0;){let e=o.slice(0,t).trim();if(o=o.slice(t+1),e)for(let t of r)t(e)}}),n.stderr?.resume(),n.stdin?.on("error",()=>{}),n.on("error",e=>a(`spawn failed: ${e.code??e.message}`)),n.on("exit",(e,t)=>a(`exited (${t??e})`)),{send(e){!s&&n.stdin?.writable&&n.stdin.write(`${e}
|
|
225
|
+
`)},onLine:e=>r.push(e),onClose:e=>i.push(e),close(){s||(n.stdin?.end(),n.kill("SIGTERM"))}}})([...e,"app-server"],{env:v(t)})))(this.command,this.env),this.options.requestTimeoutMs??3e4),r=await n.request("initialize",{clientInfo:{name:"botmancers",title:"Botmancers",version:"1"},capabilities:null},{timeoutMs:2e4});if(!r.ok)return(n.close(),null===e)?t("unavailable",`codex is not installed or did not start (${r.error.message})`):t("rpc"===r.kind?"unsupported":"unavailable",`codex ${e}: app-server initialize failed (${r.error.message})`);n.notify("initialized");let i=await Promise.all(eT.map(e=>n.request(e,eI[e],{timeoutMs:1e4}))),s={...eR};if(eT.forEach((e,t)=>{var n;let r=i[t];s[e]=r.ok||"rpc"===r.kind&&(n=r.error,!(!(-32601!==n.code||/not supported yet/i.test(n.message))||n.message.includes(`unknown variant \`${e}\``)))}),!s["thread/list"])return n.close(),t("unsupported",`codex ${e??"unknown"}: app-server has no thread/list`);let a=await n.request("account/read",{},{timeoutMs:1e4});return a.ok&&a.result&&null==a.result.account&&!0===a.result.requiresOpenaiAuth?(n.close(),t("auth_required","codex is not signed in")):(this.attach(n),this.probe={status:"ready",cli_version:e,methods:s,exec_fallback:!1!==this.options.execFallback&&null!==e,detail:`codex ${e??"unknown"} app-server`},this.probe)}attach(e){this.client=e;let t=new Map;this.loads=t,e.onClose(()=>{for(let e of t.values())e?.end("app_server_exit");t.clear()}),e.handleServerRequests(e=>"item/commandExecution/requestApproval"===e||"item/fileChange/requestApproval"===e?{result:{decision:"decline"}}:"applyPatchApproval"===e||"execCommandApproval"===e?{result:{decision:{denied:{rejection:"Botmancers turns run with a fixed authority."}}}}:{error:{code:-32601,message:"not supported by Botmancers"}}),e.onNotification(({method:e,params:n})=>{if("thread/closed"===e&&"string"==typeof n.threadId){t.get(n.threadId)?.end("thread_unload"),t.delete(n.threadId);return}let r="string"==typeof n.turnId?n.turnId:n.turn&&"string"==typeof n.turn.id?n.turn.id:null;if(!r||"string"!=typeof n.threadId)return;let i=this.tracker(r,n.threadId);if("item/completed"===e){let e=n.item;e?.type==="agentMessage"&&"string"==typeof e.text&&e.text&&(i.output=e.text,"final_answer"===e.phase&&(i.finalOutput=e.text))}else if("thread/tokenUsage/updated"===e){var s;i.usage=function(e,t){if(!e)return t;if(!t)return e;let n=(e,t)=>null==e&&null==t?null:(e??0)+(t??0);return{input_tokens:n(e.input_tokens,t.input_tokens),output_tokens:n(e.output_tokens,t.output_tokens),cached_input_tokens:n(e.cached_input_tokens,t.cached_input_tokens),cost_usd:null}}(i.usage,(s=n.tokenUsage?.last)&&"object"==typeof s?ek(ev(s.inputTokens),ev(s.cachedInputTokens),ev(s.outputTokens)):null)}else if("turn/completed"===e){let e=n.turn;this.settle(i,e)}}),e.onClose(()=>{for(let e of this.trackers.values())"inProgress"===e.status&&(e.status="lost",e.error="the Codex app-server exited during the turn",e.finishedAt=Date.now(),e.waiters.splice(0).forEach(e=>e()))})}tracker(e,t){let n=this.trackers.get(e);return n||(n={threadId:t,status:"inProgress",output:null,finalOutput:null,usage:null,error:null,finishedAt:null,waiters:[]},this.trackers.set(e,n)),n}settle(e,t){"inProgress"!==t.status&&"inProgress"===e.status&&(e.status="completed"===t.status?"completed":"interrupted"===t.status?"interrupted":"failed",e.output=e.finalOutput??e.output??eD(t.items),e.error=t.error?.message??("failed"===e.status?"codex turn failed":null),e.finishedAt=eC(t.completedAt)??Date.now(),e.waiters.splice(0).forEach(e=>e()),this.scheduleIdle())}scheduleIdle(){this.idleTimer&&clearTimeout(this.idleTimer);let e=this.options.idleMs??3e5;this.idleTimer=setTimeout(()=>{if([...this.trackers.values()].some(e=>"inProgress"===e.status))return this.scheduleIdle();this.client?.close()},e),this.idleTimer.unref?.()}async rpc(e,t,n){let r=await this.connect();return"ready"===r.status&&this.client?(this.scheduleIdle(),this.client.request(e,t,{signal:n.signal??null})):{ok:!1,kind:"closed",error:{code:-1,message:r.detail}}}isLoaded(e){return!!this.client&&!this.client.closed&&this.loads.has(e)}markLoaded(e,t){this.loads.has(e)?t?.end("launch_failed"):this.loads.set(e,t)}mintLoad(e){return e?.mint({kind:"codex_thread_load",ref:`load-${(0,l.randomUUID)()}`,processBound:!0})??null}has(e){return!!this.probe?.methods[e]}shutdown(){this.idleTimer&&clearTimeout(this.idleTimer),this.client?.close(),this.client=null,this.probe=null}async listSessions(e){let t=eN(e.cursor);if("sessions"===e.scope.kind){let n=Number(t?.i??0),r=e.scope.provider_session_ids.slice(n,n+e.limit),s=[];for(let t of r){let n=await this.getSession({...e,provider_session_id:t});if(!n.ok)return n;n.value&&s.push(n.value)}return i({items:s,next_cursor:n+e.limit<e.scope.provider_session_ids.length?ex({i:n+e.limit}):null})}let n=t?.phase==="archived"?"archived":"open",r=await this.rpc("thread/list",{limit:e.limit,cursor:"string"==typeof t?.c?t.c:null,archived:"archived"===n,sourceKinds:eS,sortKey:"updated_at",...e.query?{searchTerm:e.query}:{}},e);if(!r.ok)return eW(r,"thread/list");let s=(Array.isArray(r.result?.data)?r.result.data:[]).filter(e=>e&&"string"==typeof e.id&&!0!==e.ephemeral&&!e.parentThreadId).map(e=>eO(e,n)).filter(t=>"all_provider_sessions"===e.scope.kind||null!==t.workspace&&e.scope.workspaces.some(e=>(0,eb.workspaceContains)(e,t.workspace))),a=r.result?.nextCursor??null;return i({items:s,next_cursor:a?ex({phase:n,c:a}):"open"===n?ex({phase:"archived"}):null})}async getSession(e){let t=await this.rpc("thread/read",{threadId:e.provider_session_id},e);if(!t.ok)return e$(t)?i(null):eW(t,"thread/read");let n=t.result?.thread;return i(n&&"string"==typeof n.id?eO(n):null)}async readTranscript(e){let t=eN(e.cursor)??{},n=Number(t.n??0),s=e.provider_session_id;if("turns"!==t.mode&&this.has("thread/items/list")){let a=await this.rpc("thread/items/list",{threadId:s,cursor:"string"==typeof t.c?t.c:null,limit:e.limit,sortDirection:"asc"},e);if(a.ok){let t=(a.result?.data??[]).slice(0,e.limit);return i({items:t.map((e,t)=>eL(e.item??{},n+t+1,e.completedAtMs??e.startedAtMs??null)).filter(e=>null!==e),next_cursor:a.result?.nextCursor?ex({c:a.result.nextCursor,n:n+t.length}):null})}if(e$(a))return r("not_found","no such thread");if("rpc"!==a.kind||-32601!==a.error.code)return eW(a,"thread/items/list")}if(!this.has("thread/turns/list"))return r("unsupported","no transcript method");let a="string"==typeof t.c?t.c:null,o=Number(t.skip??0),d=await this.rpc("thread/turns/list",{threadId:s,cursor:a,limit:1,sortDirection:"asc",itemsView:"full"},e);if(!d.ok)return e$(d)?r("not_found","no such thread"):eW(d,"thread/turns/list");let u=(d.result?.data??[])[0];if(!u)return i({items:[],next_cursor:null});let l=Array.isArray(u.items)?u.items:[],c=l.slice(o,o+e.limit),_=c.map((e,t)=>eL(e,n+t+1,null)).filter(e=>null!==e),p=n+c.length;return i({items:_,next_cursor:o+e.limit<l.length?ex({mode:"turns",c:a,skip:o+e.limit,n:p}):d.result?.nextCursor?ex({mode:"turns",c:d.result.nextCursor,skip:0,n:p}):null})}turnInput(e){return[{type:"text",text:e,text_elements:[]}]}async beginTurn(e,t,n){var s;let a=await this.rpc("turn/start",{threadId:e,input:this.turnInput(n.prompt),cwd:t,approvalPolicy:"never",sandboxPolicy:(s=n.authority,"workspace_write"===s?{type:"workspaceWrite",writableRoots:[t],networkAccess:!1,excludeTmpdirEnvVar:!1,excludeSlashTmp:!1}:{type:"readOnly",networkAccess:!1}),clientUserMessageId:n.idempotency_key},n);if(!a.ok)return e$(a)?r("not_found","no such thread"):eW(a,"turn/start");let o=a.result?.turn;if(!o||"string"!=typeof o.id)return r("unavailable","turn/start returned no turn");let d=this.tracker(o.id,e);this.settle(d,o);let u={provider_turn_id:eA("as",e,o.id),provider_session_id:e};return this.keys.set(n.idempotency_key,u),i(u)}async startSession(e){let t=this.keys.get(e.idempotency_key)??this.execRunByKey(e.idempotency_key);if(t)return i(t);let n=this.selection().start;if(null===n)return r("unsupported","this Codex cannot start sessions");if("exec"===n)return this.execStart(null,e.workspace,e);let s=this.mintLoad(e.session_context),a=await this.rpc("thread/start",{cwd:e.workspace,approvalPolicy:"never",sandbox:eM(e.authority),ephemeral:!1,...s?{config:b(s)}:{}},e),o=a.ok?a.result?.thread?.id:void 0;return("string"!=typeof o&&s?.end("launch_failed"),a.ok)?"string"!=typeof o?r("unavailable","thread/start returned no thread"):(this.markLoaded(o,s),this.beginTurn(o,e.workspace,e)):eW(a,"thread/start")}async findKeyedTurn(e,t,n){if(!this.has("thread/turns/list"))return null;let r=await this.rpc("thread/turns/list",{threadId:e,limit:5,sortDirection:"desc",itemsView:"full"},n);if(!r.ok)return null;for(let e of r.result?.data??[])if((e.items??[]).some(e=>e?.type==="userMessage"&&e.clientId===t))return e.id;return null}async sendTurn(e){let t=this.keys.get(e.idempotency_key)??this.execRunByKey(e.idempotency_key);if(t)return i(t);let n=e.provider_session_id,s=this.selection().resume;if(null===s)return r("unsupported","this Codex cannot resume sessions");if("exec"===s){let t=await this.getSession(e);return t.ok?t.value?t.value.resumable&&t.value.workspace?this.execStart(n,t.value.workspace,e):r("not_resumable","the thread cannot be resumed"):r("not_found","no such thread"):t}await this.connect();let a=this.isLoaded(n)?null:this.mintLoad(e.session_context),o=await this.rpc("thread/resume",{threadId:n,approvalPolicy:"never",sandbox:eM(e.authority),excludeTurns:!0,...a?{config:b(a)}:{}},e);if(!o.ok)return a?.end("launch_failed"),e$(o)?r("not_found","no such thread"):eW(o,"thread/resume");this.isLoaded(n)||this.markLoaded(n,a);let d="string"==typeof o.result?.cwd?o.result.cwd:o.result?.thread?.cwd;if(!d||!c.default.existsSync(d))return r("not_resumable","the thread workspace no longer exists");let u=await this.findKeyedTurn(n,e.idempotency_key,e);if(u){let t={provider_turn_id:eA("as",n,u),provider_session_id:n};return this.keys.set(e.idempotency_key,t),i(t)}return o.result?.thread?.status?.type==="active"?r("busy","the thread has a turn in flight"):this.beginTurn(n,d,e)}result(e){let t="completed"===e.status?"completed":"interrupted"===e.status?"cancelled":"failed";return{status:t,provider_session_id:e.threadId,output:e.output,failure:"completed"===t?null:"cancelled"===t?{code:"cancelled",message:"interrupted"}:{code:"lost"===e.status?"interrupted":"codex_turn_failed",message:e.error??"codex turn failed"},usage:e.usage,finished_at:e.finishedAt??Date.now()}}async recover(e,t,n){let s=null;for(let a=0;a<10;a++){let a=await this.rpc("thread/turns/list",{threadId:e,cursor:s,limit:10,sortDirection:"desc",itemsView:"full"},n);if(!a.ok)return e$(a)?r("not_found","no such thread"):eW(a,"thread/turns/list");let o=(a.result?.data??[]).find(e=>e.id===t);if(o){let r=this.tracker(t,e);if("inProgress"!==o.status)return this.settle(r,o),i(r);let s=await this.rpc("thread/read",{threadId:e},n);if(s.ok&&s.result?.thread?.status?.type==="active")return(await this.rpc("thread/resume",{threadId:e,excludeTurns:!0},n)).ok&&!this.isLoaded(e)&&this.markLoaded(e,null),i(r);return r.status="lost",r.output=eD(o.items),r.error="the turn ended without a result (its Codex app-server exited)",r.finishedAt=Date.now(),i(r)}if(!(s=a.result?.nextCursor??null))break}return r("not_found","no such turn")}async liveTracker(e,t,n){let s=this.trackers.get(t);return s&&("inProgress"!==s.status||this.client&&!this.client.closed)?i(s):this.has("thread/turns/list")||(await this.connect(),this.has("thread/turns/list"))?this.recover(e,t,n):r("unsupported","cannot read turn history")}async observeTurn(e){let t=eq(e.provider_turn_id);if(!t)return r("not_found","unknown turn handle");if("ex"===t.kind)return this.execObserve(t.threadId,t.id,e);let n=await this.liveTracker(t.threadId,t.id,e);if(!n.ok)return n;let s=n.value;for(;"inProgress"===s.status;){let t=await new Promise(t=>{let n=()=>o("done"),r=()=>o("aborted"),i="number"==typeof e.deadline_at?Math.max(0,e.deadline_at-Date.now()):null,a=null===i?null:setTimeout(()=>o("deadline"),i);function o(i){a&&clearTimeout(a),e.signal?.removeEventListener("abort",r);let o=s.waiters.indexOf(n);o>=0&&s.waiters.splice(o,1),t(i)}if(e.signal?.aborted)return o("aborted");s.waiters.push(n),e.signal?.addEventListener("abort",r,{once:!0})});if("aborted"===t)return r("cancelled","observe aborted");if("deadline"===t)return r("timed_out","observe deadline")}return i(this.result(s))}async cancelTurn(e){let t=eq(e.provider_turn_id);if(!t)return r("not_found","unknown turn handle");if("ex"===t.kind)return this.execCancel(t.id);let n=await this.liveTracker(t.threadId,t.id,e);if(!n.ok)return n;let s=n.value;if("inProgress"!==s.status)return i("already_terminal");if(!this.has("turn/interrupt"))return r("unsupported","this Codex cannot interrupt turns");let a=await this.rpc("turn/interrupt",{threadId:t.threadId,turnId:t.id},e);if(!a.ok)return"inProgress"!==s.status?i("already_terminal"):eW(a,"turn/interrupt");let o=Date.now()+1e4;for(;"inProgress"===s.status&&Date.now()<o;)await new Promise(e=>setTimeout(e,20));return"inProgress"===s.status||"interrupted"===s.status?(s.status="interrupted",s.finishedAt=s.finishedAt??Date.now(),s.waiters.splice(0).forEach(e=>e()),i("cancelled")):i("already_terminal")}runPath(e,t){return _.default.join(this.runsDir,`${e.replace(/[^A-Za-z0-9-]/g,"")}.${t}`)}readMeta(e){try{return JSON.parse(c.default.readFileSync(this.runPath(e,"json"),"utf8"))}catch{return null}}execRunByKey(e){if(!c.default.existsSync(this.runsDir))return null;for(let t of c.default.readdirSync(this.runsDir)){if(!t.endsWith(".json"))continue;let n=this.readMeta(t.slice(0,-5));if(n?.key===e&&"string"==typeof n.thread_id)return{provider_turn_id:eA("ex",n.thread_id,String(n.run_id)),provider_session_id:n.thread_id}}return null}async execStart(e,t,n){let s;c.default.mkdirSync(this.runsDir,{recursive:!0});let a=(0,l.randomUUID)(),o=n.session_context?.mint({kind:"codex_exec",ref:a})??null,d=["-c",`sandbox_mode="${eM(n.authority)}"`,"-c",'approval_policy="never"',...o?S(o):[]],_=v(this.env);o&&(_[m]=o.token);let p=e?[...this.command.slice(1),"exec","resume","--json",...d,e,"-"]:[...this.command.slice(1),"exec","--json","-C",t,...d,"-"],f=c.default.openSync(this.runPath(a,"jsonl"),"a");try{s=(0,u.spawn)(this.command[0],p,{cwd:t,env:_,detached:!0,stdio:["pipe",f,"ignore"]})}catch(e){return c.default.closeSync(f),o?.end("launch_failed"),r("unavailable",`codex exec did not start: ${e.message}`)}c.default.closeSync(f);let h=new Promise(e=>s.once("error",t=>e(t.message)));s.stdin?.on("error",()=>{}),s.stdin?.end(n.prompt);let g={run_id:a,pid:s.pid??null,thread_id:e,key:n.idempotency_key,authority:n.authority,cwd:t,correlation:n.correlation??{},cancelled:!1,started_at:Date.now()};if(c.default.writeFileSync(this.runPath(a,"json"),JSON.stringify(g)),s.unref(),!e){let e=Date.now()+3e4,t=null;for(h.then(e=>{t=e});;){let n=eE(ew(this.readLog(a)));if(n.thread_id){g.thread_id=n.thread_id,c.default.writeFileSync(this.runPath(a,"json"),JSON.stringify(g));break}if(t||n.terminal||Date.now()>e||g.pid&&!eP(g.pid))return r("unavailable",`codex exec reported no thread${t?`: ${t}`:""}`);await new Promise(e=>setTimeout(e,25))}}return i({provider_turn_id:eA("ex",g.thread_id,a),provider_session_id:g.thread_id})}readLog(e){try{return c.default.readFileSync(this.runPath(e,"jsonl"),"utf8")}catch{return""}}execResult(e,t){let n=this.readMeta(t);if(!n)return null;let r=eE(ew(this.readLog(t))),i="number"==typeof n.pid&&eP(n.pid);if(!r.terminal&&i&&!n.cancelled)return null;let s=n.cancelled&&"completed"!==r.terminal?"cancelled":"completed"===r.terminal?"completed":"failed";return{status:s,provider_session_id:e,output:r.output,failure:"completed"===s?null:"cancelled"===s?{code:"cancelled",message:"interrupted"}:{code:r.terminal?"codex_turn_failed":"interrupted",message:r.error??"codex exec ended without a result"},usage:r.usage,finished_at:Number(n.finished_at??Date.now())}}async execObserve(e,t,n){if(!this.readMeta(t))return r("not_found","no such run");for(;;){let s=this.execResult(e,t);if(s)return i(s);if(n.signal?.aborted)return r("cancelled","observe aborted");if("number"==typeof n.deadline_at&&Date.now()>=n.deadline_at)return r("timed_out","observe deadline");await new Promise(e=>setTimeout(e,25))}}execCancel(e){let t=this.readMeta(e);if(!t)return r("not_found","no such run");let n=eE(ew(this.readLog(e)));if(t.cancelled||n.terminal||"number"!=typeof t.pid||!eP(t.pid))return i("already_terminal");try{process.kill(t.pid,"SIGINT")}catch{return i("already_terminal")}return c.default.writeFileSync(this.runPath(e,"json"),JSON.stringify({...t,cancelled:!0,finished_at:Date.now()})),i("cancelled")}}function eP(e){try{return process.kill(e,0),!0}catch{return!1}}let eH=null;"off"!==process.env.BOTMANCERS_CODEX_PROVIDER&&d("codex",()=>{var e;return eH||(eH=new eF),e=eH,{kind:"codex-direct",capabilities:()=>e.capabilities(),ready:()=>e.ready(),listSessions:t=>e.listSessions(t),getSession:t=>e.getSession(t),readTranscript:t=>e.readTranscript(t),startSession:t=>e.startSession(t),sendTurn:t=>e.sendTurn(t),observeTurn:t=>e.observeTurn(t),cancelTurn:t=>e.cancelTurn(t)}}),e.s([],96474);let eU="cursor",ej=/^[A-Za-z0-9][A-Za-z0-9._-]{0,199}$/,eB=new Map,eK=`
|
|
226
|
+
import { createRequire } from 'module';
|
|
227
|
+
import { pathToFileURL } from 'url';
|
|
228
|
+
import path from 'path';
|
|
229
|
+
const [op, spec, ...rest] = process.argv.slice(1);
|
|
230
|
+
const out = value => process.stdout.write(JSON.stringify(value) + '\\n');
|
|
231
|
+
async function load() {
|
|
232
|
+
const abs = path.isAbsolute(spec) ? spec : createRequire(path.join(process.cwd(), 'package.json')).resolve(spec);
|
|
233
|
+
const mod = await import(pathToFileURL(abs).href);
|
|
234
|
+
return mod.default && mod.default.Agent ? mod.default : mod;
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
const sdk = await load();
|
|
238
|
+
const Agent = sdk.Agent;
|
|
239
|
+
if (op === 'probe') {
|
|
240
|
+
out({ resume: typeof Agent?.resume === 'function', create: typeof Agent?.create === 'function', list: typeof Agent?.list === 'function', version: typeof sdk.version === 'string' ? sdk.version : null });
|
|
241
|
+
} else if (op === 'create') {
|
|
242
|
+
const chat = await Agent.create({ cwd: rest[0] });
|
|
243
|
+
out({ id: chat && chat.id });
|
|
244
|
+
} else if (op === 'list') {
|
|
245
|
+
out(await Agent.list({}));
|
|
246
|
+
} else if (op === 'turn') {
|
|
247
|
+
const [id, cwd, mode, prompt] = rest;
|
|
248
|
+
const agent = await Agent.resume(id, { cwd, mode: mode === '-' ? null : mode });
|
|
249
|
+
for await (const event of agent.stream(prompt)) out(event);
|
|
250
|
+
} else {
|
|
251
|
+
process.exit(2);
|
|
252
|
+
}
|
|
253
|
+
} catch (error) {
|
|
254
|
+
if (op === 'turn') out({ type: 'result', subtype: 'sdk_error', is_error: true, result: null });
|
|
255
|
+
process.exit(op === 'probe' ? 3 : 1);
|
|
256
|
+
}
|
|
257
|
+
`;function eX(e,t,n){return["--input-type=module","-e",eK,e,t.sdkModule,...n]}function eG(e){return"string"==typeof e?e:null}function eJ(e,t){let n=e.env??process.env,r=e.stateDir??(n.BOTMANCERS_CURSOR_STATE_DIR?.trim()||_.default.join(_.default.dirname(_.default.resolve((0,p.dbPath)(n))),"providers","cursor"));return{cliPath:e.cliPath??(n.BOTMANCERS_CURSOR_CLI?.trim()||"cursor-agent"),sdkModule:e.sdkModule??(n.BOTMANCERS_CURSOR_SDK_MODULE?.trim()||"@cursor/sdk"),stateDir:_.default.join(r,t.replace(/[^A-Za-z0-9._-]/g,"_")),pollMs:e.pollMs??100,env:void 0!==n[h]||void 0!==n[m]?v(n):n}}function ez(e){return _.default.join(e.stateDir,"state.json")}function eV(e,t,n){return _.default.join(e.stateDir,"turns",`${t}.${n}`)}function eY(e){try{let t=JSON.parse(c.default.readFileSync(ez(e),"utf8"));if(t&&1===t.version)return t}catch{}return{version:1,chats:{},turns:{},keys:{}}}function eZ(e,t){c.default.mkdirSync(_.default.join(e.stateDir,"turns"),{recursive:!0});let n=`${ez(e)}.${process.pid}.${(0,l.randomUUID)()}.tmp`;c.default.writeFileSync(n,JSON.stringify(t)),c.default.renameSync(n,ez(e))}function eQ(e){try{return c.default.readFileSync(e,"utf8")}catch{return null}}function e0(e){if(!e)return!1;try{return process.kill(e,0),!0}catch(e){return"EPERM"===e.code}}function e1(e){try{return c.default.realpathSync(e)}catch{return _.default.resolve(e)}}function e4(e){try{return c.default.statSync(e).isDirectory()}catch{return!1}}function e2(e,t,n,r){return{state:"terminal",parsed:n,result:{status:"failed",provider_session_id:e.chat,output:null,failure:{code:t,message:t},usage:n.result?.usage??null,finished_at:r}}}function e6(e,t){let r=eQ(eV(e,t.id,"exit")),i=null!==r||!e0(t.pid),s=function(e,t=!1){let r={init:null,steps:[],result:null,result_events:0,malformed:0},i=e.split("\n");for(let e of(t||i.pop(),i)){let t,i=e.trim();if(!i)continue;try{let e=JSON.parse(i);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("not an object");t=e}catch{r.malformed++;continue}let s="number"==typeof t.timestamp_ms?t.timestamp_ms:null;if("system"!==t.type||"init"!==t.subtype||r.init)if("assistant"===t.type){let e=function(e){let t=e?.content;if("string"==typeof t)return t;if(!Array.isArray(t))return null;let n=t.map(e=>e&&"text"===e.type?eG(e.text):null).filter(e=>null!==e);return n.length?n.join(""):null}(t.message);e&&r.steps.push({role:"assistant",text:e,at:s})}else"tool_call"===t.type&&"completed"===t.subtype?r.steps.push({role:"tool",text:`${function(e){let t=Object.keys(e.tool_call&&"object"==typeof e.tool_call?e.tool_call:{}).find(e=>/ToolCall$/.test(e));return t?t.replace(/ToolCall$/,""):"tool"}(t)} (completed)`,at:s}):"result"===t.type&&(r.result_events++,r.result||(r.result={ok:!1===t.is_error&&"success"===t.subtype,subtype:eG(t.subtype),text:eG(t.result),usage:function(e){let t=e.usage&&"object"==typeof e.usage?e.usage:null,r=e.total_cost_usd??t?.costUsd??t?.cost_usd;return t||void 0!==r?n({input_tokens:t?.inputTokens??t?.input_tokens,output_tokens:t?.outputTokens??t?.output_tokens,cost_usd:r}):null}(t)}));else r.init={session_id:eG(t.session_id),cwd:eG(t.cwd)}}return r}(eQ(eV(e,t.id,"out"))??"",i),a=Date.now();if(s.init){if(s.init.session_id!==t.chat)return e2(t,"session_mismatch",s,a);if(null!==s.init.cwd&&e1(s.init.cwd)!==e1(t.workspace))return e2(t,"workspace_mismatch",s,a)}if(s.result){if(!s.result.ok)return e2(t,`cursor_${(s.result.subtype??"error").replace(/[^A-Za-z0-9_]/g,"_").slice(0,40)}`,s,a);let e=s.result.text??(s.steps.filter(e=>"assistant"===e.role).map(e=>e.text).join("\n")||null);return{state:"terminal",parsed:s,result:{status:"completed",provider_session_id:t.chat,output:e,failure:null,usage:s.result.usage,finished_at:a}}}return null!==t.cancel_requested_at?{state:"terminal",parsed:s,result:{status:"cancelled",provider_session_id:t.chat,output:null,failure:{code:"cancelled",message:"cancelled"},usage:null,finished_at:t.cancel_requested_at}}:null!==r?e2(t,`exit_${String(Number.parseInt(r,10))}`,s,a):e0(t.pid)?{state:"running",parsed:s}:e2(t,"process_lost",s,a)}function e9(e,t,n,r,i){return new Promise(s=>{let a=(0,u.spawn)(e,t,{cwd:n,env:r.env,stdio:["ignore","pipe","ignore"]}),o="",d=setTimeout(()=>a.kill("SIGKILL"),i);a.stdout?.on("data",e=>{o+=String(e)}),a.on("error",()=>{clearTimeout(d),s({status:null,stdout:o})}),a.on("close",e=>{clearTimeout(d),s({status:e,stdout:o})})})}async function e3(e,t,n){let r="cli"===t?await e9(e.cliPath,["create-chat"],n,e,6e4):await e9(process.execPath,eX("create",e,[n]),n,e,6e4);if(0!==r.status)return null;let i=r.stdout.trim().split("\n").pop()?.trim()??"",s=i;if("sdk"===t)try{s=JSON.parse(i).id}catch{s=null}return"string"==typeof s&&ej.test(s)?s:null}function e5(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"==typeof e){let t=Date.parse(e);return Number.isFinite(t)?t:null}return null}async function e7(e,t){let n;c.default.mkdirSync(e.stateDir,{recursive:!0});let r="cli"===t?await e9(e.cliPath,["ls","--output-format","json"],e.stateDir,e,6e4):await e9(process.execPath,eX("list",e,[]),e.stateDir,e,6e4);if(0!==r.status)return null;try{n=JSON.parse(r.stdout.trim())}catch{return null}let i=Array.isArray(n)?n:n?.sessions??n?.chats;if(!Array.isArray(i))return null;let s=[];for(let e of i){if(!e||"object"!=typeof e)continue;let t=eG(e.id)??eG(e.chatId)??eG(e.session_id);if(!t||!ej.test(t))continue;let n=eG(e.cwd)??eG(e.workspace);s.push({id:t,workspace:n&&_.default.isAbsolute(n)?n:null,title:eG(e.title)??eG(e.name),created_at:e5(e.createdAt??e.created_at),updated_at:e5(e.updatedAt??e.updated_at)})}return s}e.s(["CURSOR_PROVIDER_KIND",0,eU,"cursorSessionProviderFactory",0,function(e){return function(e,t={}){let n=eJ(t,e.id),s=()=>(function(e={}){let t=eJ(e,"probe"),n=`${t.cliPath}
|
|
258
|
+
${t.sdkModule}
|
|
259
|
+
${t.env===process.env?"":JSON.stringify(t.env)}`,r=eB.get(n);if(r&&Date.now()-r.at<3e5)return r.probe;let i=function(e){let t=(0,u.spawnSync)(e.cliPath,["--version"],{encoding:"utf8",timeout:15e3,env:e.env,stdio:["ignore","pipe","pipe"]}),n=0===t.status?String(t.stdout??"").trim().split("\n").pop()?.trim()??"":"";if(!/^[0-9][\w.+-]{0,80}$/.test(n))return{available:!1,version:null,list:!1};let r=(0,u.spawnSync)(e.cliPath,["ls","--help"],{encoding:"utf8",timeout:15e3,env:e.env,stdio:["ignore","pipe","pipe"]});return{available:!0,version:n,list:0===r.status&&/--output-format\b[^\n]*\bjson\b/.test(String(r.stdout??""))}}(t),s=i.available?{available:!1,version:null,list:!1}:function(e){let t=(0,u.spawnSync)(process.execPath,eX("probe",e,[]),{encoding:"utf8",timeout:15e3,env:e.env,stdio:["ignore","pipe","pipe"]});if(0!==t.status)return{available:!1,version:null,list:!1};try{let e=JSON.parse(String(t.stdout).trim().split("\n").pop()??""),n=!0===e.resume&&!0===e.create;return{available:n,version:n&&"string"==typeof e.version?e.version.slice(0,80):null,list:n&&!0===e.list}}catch{return{available:!1,version:null,list:!1}}}(t),a={backend:i.available?"cli":s.available?"sdk":null,cli:i,sdk:s};return eB.set(n,{at:Date.now(),probe:a}),a})(t),a=()=>{var e;let t;return t=null!==(e=s()).backend,{list:"cli"===e.backend?e.cli.list:"sdk"===e.backend&&e.sdk.list,search:!1,read:t,resume:t,start:t,cancel:t,usage:t,authorities:t?["read_only","workspace_write"]:[],max_page_size:50}},o=e=>r(null===s().backend?"unavailable":"unsupported",`Cursor ${e} is not available.`);function d(e,t,r){let i=r.turns.some(t=>e.turns[t]&&"running"===e6(n,e.turns[t]).state),s=r.turns.length?e.turns[r.turns[r.turns.length-1]]?.started_at??r.updated_at:r.updated_at;return{provider_session_id:t,title:r.title,workspace:r.workspace,created_at:r.created_at,updated_at:Math.max(r.updated_at,s),lifecycle:"open",resumable:!0,busy:i}}async function p(e){let t=await e7(n,e);return t?i(t):r("unavailable","Cursor session listing failed.")}function f(e,t,r,s){let a=e.chats[r],o={id:`ct-${(0,l.randomUUID)()}`,chat:r,workspace:a.workspace,prompt:s.prompt,authority:s.authority,backend:t,pid:null,started_at:Date.now(),cancel_requested_at:null,correlation:{...s.correlation}};return e.turns[o.id]=o,e.keys[s.idempotency_key]=o.id,a.turns.push(o.id),eZ(n,e),o.pid=function(e,t){c.default.mkdirSync(_.default.join(e.stateDir,"turns"),{recursive:!0});let[n,r]="cli"===t.backend?[e.cliPath,["--print","--output-format","stream-json","--trust","--workspace",t.workspace,..."read_only"===t.authority?["--mode","ask"]:[],"--resume",t.chat,t.prompt]]:[process.execPath,eX("turn",e,[t.chat,t.workspace,"read_only"===t.authority?"ask":"-",t.prompt])];try{let i=(0,u.spawn)("/bin/sh",["-c",'"$@" >"$BM_OUT" 2>"$BM_ERR" </dev/null; echo $? >"$BM_EXIT.tmp" && mv "$BM_EXIT.tmp" "$BM_EXIT"',"sh",n,...r],{cwd:t.workspace,detached:!0,stdio:"ignore",env:{...e.env,BM_OUT:eV(e,t.id,"out"),BM_ERR:eV(e,t.id,"err"),BM_EXIT:eV(e,t.id,"exit"),BOTMANCERS_CORRELATION:JSON.stringify(t.correlation)}});return i.on("error",()=>{}),i.unref(),i.pid??null}catch{return null}}(n,o),eZ(n,e),i({provider_turn_id:o.id,provider_session_id:r})}function h(e,t){let n=e.keys[t];return n&&e.turns[n]?i({provider_turn_id:n,provider_session_id:e.turns[n].chat}):null}return{kind:eU,probe:s,capabilities:a,async listSessions(e){let t=s().backend;if(!t||!a().list)return o("session listing");let r=await p(t);if(!r.ok)return r;let u=eY(n),l=r.value.filter(t=>{var n,r,i;return n=e.scope,r=t.id,i=t.workspace,"all_provider_sessions"===n.kind||("sessions"===n.kind?n.provider_session_ids.includes(r):null!==i&&n.workspaces.some(e=>i===e||i.startsWith(`${e.replace(/\/+$/,"")}/`)))}),c=e.cursor&&/^\d+$/.test(e.cursor)?Number(e.cursor):0,_=l.slice(c,c+Math.min(e.limit,50)),f=Date.now();for(let e of _)!u.chats[e.id]&&e.workspace&&(u.chats[e.id]={workspace:e.workspace,title:e.title,origin:"listed",created_at:e.created_at??f,updated_at:e.updated_at??f,turns:[]});return eZ(n,u),i({items:_.map(e=>u.chats[e.id]?{...d(u,e.id,u.chats[e.id]),title:e.title??u.chats[e.id].title}:{provider_session_id:e.id,title:e.title,workspace:null,created_at:e.created_at,updated_at:e.updated_at,lifecycle:"open",resumable:!1,busy:!1}),next_cursor:c+_.length<l.length?String(c+_.length):null})},async getSession(e){let t=s().backend;if(!t)return o("sessions");let r=eY(n),u=r.chats[e.provider_session_id];if(!u)return i(null);if(a().list){let n=await p(t);if(!n.ok)return n;if(!n.value.some(t=>t.id===e.provider_session_id))return i(null)}return i(d(r,e.provider_session_id,u))},async importSession(e){let t=s().backend;if(!t)return o("sessions");if(!ej.test(e.provider_session_id))return r("invalid_input","Not a Cursor session id.");if(!_.default.isAbsolute(e.workspace)||!e4(e.workspace))return r("invalid_input","workspace must be an existing absolute directory.");let u=eY(n),l=u.chats[e.provider_session_id];if(l)return i(d(u,e.provider_session_id,l));let c=e.workspace,f=null;if(a().list){let n=await p(t);if(!n.ok)return n;let i=n.value.find(t=>t.id===e.provider_session_id);if(!i)return r("not_found","Cursor does not list that session.");c=i.workspace??c,f=i.title}let h=Date.now();return u.chats[e.provider_session_id]={workspace:c,title:f,origin:a().list?"listed":"imported",created_at:h,updated_at:h,turns:[]},eZ(n,u),i(d(u,e.provider_session_id,u.chats[e.provider_session_id]))},async readTranscript(e){if(!s().backend)return o("transcripts");let t=eY(n),a=t.chats[e.provider_session_id];if(!a)return r("not_found","Unknown Cursor session.");let d=[];for(let e of a.turns){let r=t.turns[e];if(r)for(let e of(d.push({seq:d.length+1,role:"user",text:r.prompt,at:r.started_at}),e6(n,r).parsed.steps))d.push({seq:d.length+1,role:e.role,text:e.text,at:e.at})}let u=e.cursor&&/^\d+$/.test(e.cursor)?Number(e.cursor):0,l=d.slice(u,u+Math.min(e.limit,50));return i({items:l,next_cursor:u+l.length<d.length?String(u+l.length):null})},async startSession(e){let t=s().backend;if(!t)return o("sessions");let i=h(eY(n),e.idempotency_key);if(i)return i;if(!_.default.isAbsolute(e.workspace)||!e4(e.workspace))return r("invalid_input","workspace must be an existing absolute directory.");let a=await e3(n,t,e.workspace);if(!a)return r("unavailable","Cursor did not create a chat.");let d=eY(n),u=Date.now();return d.chats[a]={workspace:e.workspace,title:null,origin:"created",created_at:u,updated_at:u,turns:[]},f(d,t,a,e)},async sendTurn(e){let t=s().backend;if(!t)return o("sessions");let i=eY(n),a=h(i,e.idempotency_key);if(a)return a;let d=i.chats[e.provider_session_id];return d?d.turns.some(e=>i.turns[e]&&"running"===e6(n,i.turns[e]).state)?r("busy","A turn is in flight."):f(i,t,e.provider_session_id,e):r("not_found","Unknown Cursor session.")},async observeTurn(e){for(;;){let t=eY(n).turns[e.provider_turn_id];if(!t)return r("not_found","Unknown Cursor turn.");let s=e6(n,t);if("terminal"===s.state)return i(s.result);if(e.signal?.aborted)return r("cancelled","observe aborted");if("number"==typeof e.deadline_at&&Date.now()>=e.deadline_at)return r("timed_out","observe deadline");await new Promise(e=>setTimeout(e,n.pollMs))}},async cancelTurn(e){let t=eY(n),s=t.turns[e.provider_turn_id];if(!s)return r("not_found","Unknown Cursor turn.");if("terminal"===e6(n,s).state)return i("already_terminal");if(s.cancel_requested_at=Date.now(),eZ(n,t),s.pid){try{process.kill(-s.pid,"SIGTERM")}catch{}let e=s.pid;setTimeout(()=>{try{process.kill(-e,"SIGKILL")}catch{}},2e3).unref()}return i("cancelled")}}}(e)}],73688)},35034,e=>{"use strict";e.s(["SESSION_SHARES_VERSION",()=>p,"SHARE_LIMITS",()=>d,"SessionSharesConfigError",()=>g,"ShareError",()=>l,"createShare",()=>O,"isSlackAudience",()=>v,"loadSessionSharesConfig",()=>S,"parseSessionSharesConfig",()=>k,"resetSessionSharesConfigCache",()=>T,"revokeShare",()=>L,"sessionSharesPath",()=>E,"shareFromTurnEnabled",()=>I,"shareInflight",()=>M,"shareRow",()=>R,"shareState",()=>A,"shareView",()=>q,"sharesCreatedBy",()=>N,"sweepExpiredShares",()=>D]);var t=e.i(22734),n=e.i(14747),r=e.i(54799),i=e.i(62294),s=e.i(52036);e.i(93399);var a=e.i(674);let o=Object.freeze({kind:"service",id:"botmancers-session-share"}),d=Object.freeze({ttl:Object.freeze({min:300,default:3600,max:86400}),turns:Object.freeze({min:1,default:20,max:100}),questionChars:4e3,replyChars:3e3}),u={invalid_request:400,session_not_found:404,share_not_found:404,share_expired:410,share_revoked:410,share_turn_in_progress:409,share_turn_limit:409,audience_not_allowed:403,idempotency_conflict:409};class l extends Error{code;constructor(e,t){super(t),this.name="ShareError",this.code=e}get status(){return u[this.code]}}i.default.exec(`
|
|
260
|
+
CREATE TABLE IF NOT EXISTS session_shares (
|
|
261
|
+
id TEXT PRIMARY KEY CHECK (id LIKE 'shr_%'),
|
|
262
|
+
creator_kind TEXT NOT NULL,
|
|
263
|
+
creator_id TEXT NOT NULL,
|
|
264
|
+
idempotency_key TEXT NOT NULL,
|
|
265
|
+
request_hash TEXT NOT NULL,
|
|
266
|
+
agent_id TEXT NOT NULL,
|
|
267
|
+
session_ref TEXT NOT NULL,
|
|
268
|
+
pin_ref TEXT NOT NULL UNIQUE,
|
|
269
|
+
authority TEXT NOT NULL CHECK (authority = 'ask'),
|
|
270
|
+
audience_kind TEXT NOT NULL CHECK (audience_kind = 'slack'),
|
|
271
|
+
audience_team_id TEXT NOT NULL,
|
|
272
|
+
audience_channel_id TEXT NOT NULL,
|
|
273
|
+
created_via TEXT NOT NULL CHECK (created_via IN ('session_ref', 'current_session')),
|
|
274
|
+
ttl_seconds INTEGER NOT NULL CHECK (ttl_seconds BETWEEN 300 AND 86400),
|
|
275
|
+
max_turns INTEGER NOT NULL CHECK (max_turns BETWEEN 1 AND 100),
|
|
276
|
+
turns_used INTEGER NOT NULL DEFAULT 0 CHECK (turns_used >= 0 AND turns_used <= max_turns),
|
|
277
|
+
state TEXT NOT NULL CHECK (state IN ('active', 'revoked')),
|
|
278
|
+
inflight_key TEXT,
|
|
279
|
+
inflight_owner TEXT,
|
|
280
|
+
inflight_turn_ref TEXT,
|
|
281
|
+
created_at INTEGER NOT NULL,
|
|
282
|
+
expires_at INTEGER NOT NULL,
|
|
283
|
+
revoked_at INTEGER,
|
|
284
|
+
updated_at INTEGER NOT NULL,
|
|
285
|
+
UNIQUE (creator_kind, creator_id, idempotency_key)
|
|
286
|
+
);
|
|
287
|
+
CREATE INDEX IF NOT EXISTS idx_session_shares_creator ON session_shares(creator_kind, creator_id, created_at);
|
|
288
|
+
CREATE TABLE IF NOT EXISTS session_share_events (
|
|
289
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
290
|
+
share_ref TEXT NOT NULL REFERENCES session_shares(id),
|
|
291
|
+
sequence INTEGER NOT NULL,
|
|
292
|
+
type TEXT NOT NULL CHECK (type IN ('created', 'revoked', 'turn_sent', 'turn_refused')),
|
|
293
|
+
turn_ref TEXT,
|
|
294
|
+
code TEXT,
|
|
295
|
+
at INTEGER NOT NULL,
|
|
296
|
+
UNIQUE (share_ref, sequence)
|
|
297
|
+
);
|
|
298
|
+
-- Idempotent turn accounting: a turn is counted once, whatever replays it.
|
|
299
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_session_share_turn_sent ON session_share_events(share_ref, turn_ref) WHERE type = 'turn_sent';
|
|
300
|
+
CREATE TRIGGER IF NOT EXISTS trg_session_share_events_no_update BEFORE UPDATE ON session_share_events
|
|
301
|
+
BEGIN
|
|
302
|
+
SELECT RAISE(ABORT, 'session_share_events are append-only');
|
|
303
|
+
END;
|
|
304
|
+
CREATE TRIGGER IF NOT EXISTS trg_session_share_events_no_delete BEFORE DELETE ON session_share_events
|
|
305
|
+
BEGIN
|
|
306
|
+
SELECT RAISE(ABORT, 'session_share_events are append-only');
|
|
307
|
+
END;
|
|
308
|
+
`);let c=(0,r.randomBytes)(9).toString("base64url"),_=new Set,p=1,f=/^T[A-Z0-9]{2,20}$/,h=/^[CG][A-Z0-9]{2,20}$/,m=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;class g extends Error{constructor(e){super(e),this.name="SessionSharesConfigError"}}function y(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function w(e,t,n){let r=Object.keys(e).find(e=>!t.includes(e));if(void 0!==r)throw new g(`${n} has an unknown field "${r}".`)}function v(e){return y(e)&&Object.keys(e).every(e=>["kind","team_id","channel_id"].includes(e))&&"slack"===e.kind&&"string"==typeof e.team_id&&f.test(e.team_id)&&"string"==typeof e.channel_id&&h.test(e.channel_id)}function k(e,t){let n;try{n=JSON.parse(e)}catch{throw new g("The document is not valid JSON.")}if(!y(n))throw new g("The document must be a JSON object.");if(w(n,["version","audiences","agents"],"The document"),n.version!==p)throw new g(`version must be ${p}.`);let r=n.audiences??[],i=n.agents??[];if(!Array.isArray(r))throw new g("audiences must be a list.");if(!Array.isArray(i))throw new g("agents must be a list.");if(r.length>512||i.length>512)throw new g("A list has more than 512 entries.");let s=new Set,a=r.map((e,t)=>{let n=`audiences[${t}]`;if(!y(e))throw new g(`${n} must be an object.`);if(w(e,["kind","team_id","channel_id"],n),!v(e))throw new g(`${n} must be { kind: "slack", team_id: "T…", channel_id: "C…" } with exact ids; wildcards are not allowed.`);let r=`${e.team_id}:${e.channel_id}`;if(s.has(r))throw new g(`${n} repeats an audience.`);return s.add(r),Object.freeze({kind:"slack",team_id:e.team_id,channel_id:e.channel_id})}),o=new Set,d=new Set;return i.forEach((e,n)=>{let r=`agents[${n}]`;if(!y(e))throw new g(`${r} must be an object.`);if(w(e,["agent","share_from_turn"],r),"string"!=typeof e.agent||!m.test(e.agent))throw new g(`${r}.agent must be one Agent id; wildcards are not allowed.`);if(t&&!t.has(e.agent))throw new g(`${r}.agent is not a registered Agent.`);if("boolean"!=typeof e.share_from_turn)throw new g(`${r}.share_from_turn must be true or false.`);if(d.has(e.agent))throw new g(`${r} repeats that Agent.`);d.add(e.agent),e.share_from_turn&&o.add(e.agent)}),{audiences:Object.freeze(a),shareFromTurn:o}}function E(e=process.env){let t=(e.BOTMANCERS_SESSION_SHARES_PATH||"").trim();if(t)return n.default.resolve(t);let r=(0,s.botmancersHome)(e);return r?n.default.join(r,"config/session-shares.json"):null}let b=null;function S(e=process.env){let n,s=E(e);if(!s)return{state:"absent",path:null};try{n=t.default.statSync(s)}catch(e){if("ENOENT"===e.code)return{state:"absent",path:s};return{state:"invalid",path:s,reason:"The document cannot be read."}}let a=new Set(i.default.prepare("SELECT id FROM bots").all().map(e=>e.id)),o=(0,r.createHash)("sha256").update([...a].sort().join("\n"),"utf8").digest("hex"),d=[s,n.ino,n.size,n.mode,n.uid,n.mtimeMs,o].join(":");if(b&&b.key===d)return b.state;let u=function(e,n,r){let i;if(!n.isFile())return{state:"invalid",path:e,reason:"The document is not a regular file."};if("function"==typeof process.getuid&&n.uid!==process.getuid())return{state:"invalid",path:e,reason:"The document must be owned by the user running Botmancers."};if((63&n.mode)!=0)return{state:"invalid",path:e,reason:"The document must not be readable or writable by group or others (chmod 600)."};if(n.size>65536)return{state:"invalid",path:e,reason:"The document exceeds 65536 bytes."};try{i=t.default.readFileSync(e,"utf8")}catch{return{state:"invalid",path:e,reason:"The document cannot be read."}}try{return{state:"loaded",path:e,config:k(i,r)}}catch(t){if(t instanceof g)return{state:"invalid",path:e,reason:t.message};throw t}}(s,n,a);return b={key:d,state:u},u}function T(){b=null}function I(e){let t=S();return"loaded"===t.state&&t.config.shareFromTurn.has(e)}function R(e){if("string"==typeof e&&0!==e.length&&!(e.length>200))return i.default.prepare("SELECT * FROM session_shares WHERE id = ?").get(e)}function A(e,t=Date.now()){return"revoked"===e.state?"revoked":t>=e.expires_at?"expired":"active"}function q(e,t=Date.now()){return{share_ref:e.id,agent_id:e.agent_id,session_ref:e.session_ref,authority:"ask",state:A(e,t),audience:{kind:"slack",team_id:e.audience_team_id,channel_id:e.audience_channel_id},created_via:e.created_via,created_at:e.created_at,expires_at:e.expires_at,revoked_at:e.revoked_at,max_turns:e.max_turns,turns_used:e.turns_used}}function x(e,t,n,r={}){i.default.prepare(`
|
|
309
|
+
INSERT INTO session_share_events (share_ref, sequence, type, turn_ref, code, at)
|
|
310
|
+
SELECT ?, COALESCE(MAX(sequence), 0) + 1, ?, ?, ?, ? FROM session_share_events WHERE share_ref = ?
|
|
311
|
+
`).run(e,t,r.turnRef??null,r.code??null,n,e)}function N(e,t={}){return t.sessionRef?i.default.prepare("SELECT * FROM session_shares WHERE creator_kind = ? AND creator_id = ? AND session_ref = ? ORDER BY created_at DESC, id ASC").all(e.kind,e.id,t.sessionRef):i.default.prepare("SELECT * FROM session_shares WHERE creator_kind = ? AND creator_id = ? ORDER BY created_at DESC, id ASC").all(e.kind,e.id)}function C(e,t,n){let r=e??t.default;if(!Number.isInteger(r)||r<t.min||r>t.max)throw new l("invalid_request",`${n} must be an integer from ${t.min} to ${t.max}.`);return r}async function O(e){var t,n,s,u;let c,_=e.idempotencyKey;if("string"!=typeof _||0===_.trim().length||_.length>200)throw new l("invalid_request","An idempotency key (1-200 characters) is required.");if(!v(e.audience))throw new l("invalid_request",'audience must be { kind: "slack", team_id: "T…", channel_id: "C…" }.');let p=C(e.ttlSeconds,d.ttl,"ttl_seconds"),f=C(e.maxTurns,d.turns,"max_turns"),h=e.createdVia??"session_ref",m=(t=["share",e.sessionRef,e.agentId??null,e.audience.team_id,e.audience.channel_id,p,f,h],(0,r.createHash)("sha256").update(JSON.stringify(t)).digest("hex")),g=(n=e.creator,i.default.prepare("SELECT * FROM session_shares WHERE creator_kind = ? AND creator_id = ? AND idempotency_key = ?").get(n.kind,n.id,_));if(g){if(g.request_hash!==m)throw new l("idempotency_conflict","That idempotency key was used for a different share.");return i.default.transaction(()=>e.onCommit?.(g)).immediate(),{share:g,created:!1}}if(s=e.audience,!("loaded"===(c=S()).state&&c.config.audiences.some(e=>e.team_id===s.team_id&&e.channel_id===s.channel_id)))throw new l("audience_not_allowed","That audience is not on the owner's share allowlist (session-shares.json).");let y=(0,a.sessionOwner)(e.sessionRef);if(!y||e.agentId&&e.agentId!==y)throw new l("session_not_found","No session with that reference.");let w=null,{pin:k}=await (0,a.createPin)({requester:o,sessionRef:e.sessionRef,agentId:y,action:"ask",idempotencyKey:(u=e.creator,`share-${(0,r.createHash)("sha256").update(`${u.kind}:${u.id}
|
|
312
|
+
${_}`).digest("hex").slice(0,40)}`),onCommit:t=>{let n=Date.now(),s=`shr_${(0,r.randomBytes)(16).toString("base64url")}`;i.default.prepare(`
|
|
313
|
+
INSERT INTO session_shares (
|
|
314
|
+
id, creator_kind, creator_id, idempotency_key, request_hash, agent_id, session_ref, pin_ref, authority,
|
|
315
|
+
audience_kind, audience_team_id, audience_channel_id, created_via, ttl_seconds, max_turns, turns_used, state,
|
|
316
|
+
created_at, expires_at, updated_at
|
|
317
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'ask', 'slack', ?, ?, ?, ?, ?, 0, 'active', ?, ?, ?)
|
|
318
|
+
`).run(s,e.creator.kind,e.creator.id,_,m,y,t.session_ref,t.id,e.audience.team_id,e.audience.channel_id,h,p,f,n,n+1e3*p,n),x(s,"created",n),w=R(s),e.onCommit?.(w)}});if(w)return{share:w,created:!0};let E=i.default.prepare("SELECT * FROM session_shares WHERE pin_ref = ?").get(k.id);if(!E)throw new l("idempotency_conflict","That idempotency key is being used by a concurrent request; retry it.");if(E.request_hash!==m)throw new l("idempotency_conflict","That idempotency key was used for a different share.");return i.default.transaction(()=>e.onCommit?.(E)).immediate(),{share:E,created:!1}}function L(e,t={}){return i.default.transaction(()=>{let n=R(e);if(!n)throw new l("share_not_found","No share with that reference.");if("revoked"===n.state)return t.onCommit?.(n),{share:n,replayed:!0};let r=Date.now();i.default.prepare("UPDATE session_shares SET state = 'revoked', revoked_at = ?, updated_at = ? WHERE id = ? AND state = 'active'").run(r,r,n.id),x(n.id,"revoked",r),(0,a.detachPin)(o,n.pin_ref,{now:r});let s=R(n.id);return t.onCommit?.(s),{share:s,replayed:!1}}).immediate()}function D(){let e=Date.now(),t=i.default.prepare(`
|
|
319
|
+
SELECT s.id FROM session_shares s JOIN session_pins p ON p.id = s.pin_ref
|
|
320
|
+
WHERE s.state = 'active' AND s.expires_at <= ? AND p.state = 'attached'
|
|
321
|
+
ORDER BY s.expires_at, s.id LIMIT 500
|
|
322
|
+
`).all(e),n=[];for(let{id:r}of t)i.default.transaction(()=>{let t=R(r);if(!t||"expired"!==A(t,e))return;let{replayed:s}=(0,a.detachPin)(o,t.pin_ref,{now:e});s||(i.serviceAudit.append({principal:o,operation:"shares.expire",capability:"shares:ask",targetKind:"session",targetRef:t.session_ref,agentId:t.agent_id,outcome:"allowed",code:"expired"}),n.push(r))}).immediate();return{swept:n}}function M(e){return e.inflight_turn_ref?"answering":e.inflight_key?e.inflight_owner===c&&_.has(e.id)?"answering":"recovering":"none"}},142,e=>{"use strict";var t=e.i(54799),n=e.i(62294);let r=Object.freeze({maxWakeDepth:3,rootBudget:12,maxContinuations:24,globalConcurrency:4,perTargetConcurrency:1}),i={maxWakeDepth:"BOTMANCERS_WAKE_MAX_DEPTH",rootBudget:"BOTMANCERS_WAKE_ROOT_BUDGET"},s=Object.freeze({kind:"person",id:"local-owner"});function a(e){return!!e&&e.kind===s.kind&&e.id===s.id}let o={owner_required:403,not_found:404,not_pending:409};class d extends Error{code;constructor(e,t){super(t),this.name="WakeSafetyError",this.code=e}get status(){return o[this.code]}}function u(e){if("human_owner"!==e)throw new d("owner_required","Only the owner can allow, deny, or revoke Wake grants.")}function l(e,t){return n.default.prepare("SELECT * FROM wake_grants WHERE caller_agent_id = ? AND target_agent_id = ? AND authority = 'edit' AND revoked_at IS NULL").get(e,t)}function c(e){return n.default.prepare("SELECT * FROM wake_grants WHERE id = ?").get(e)}e.s(["WAKE_SAFETY_VERSION",0,1,"WakeSafetyError",0,d,"activeEditGrant",0,l,"assertOwner",0,u,"categorizeIntakeCaller",0,function(e,t){return t&&["person","bot","service"].includes(t.kind)&&"string"==typeof t.id&&t.id.trim()?"ui"===e?a(t)?"human_owner":"unknown":"api"===e?"api_principal":"unknown":"unknown"},"ensureEditGrant",0,function(e){let r=l(e.callerAgentId,e.targetAgentId);if(r)return{grant:r,created:!1};let i=(0,t.randomUUID)();return n.default.prepare(`
|
|
323
|
+
INSERT INTO wake_grants (id, caller_agent_id, target_agent_id, authority, granted_by_kind, granted_by_id, source_wake_id, created_at)
|
|
324
|
+
VALUES (?, ?, ?, 'edit', ?, ?, ?, ?)
|
|
325
|
+
`).run(i,e.callerAgentId,e.targetAgentId,e.grantedBy.kind,e.grantedBy.id,e.sourceWakeId,e.now),{grant:c(i),created:!0}},"isOwnerPrincipal",0,a,"needsEditGrant",0,function(e){return"implementation"===e||"revision"===e},"revokeWakeGrant",0,function(e,r,i=Date.now()){return u(r.category),n.default.transaction(()=>{let s=c(e);if(!s)throw new d("not_found",`No Wake grant ${e}.`);if(null!==s.revoked_at)return{grant:s,revoked:!1};n.default.prepare("UPDATE wake_grants SET revoked_at = ?, revoked_by_kind = ?, revoked_by_id = ? WHERE id = ? AND revoked_at IS NULL").run(i,r.principal.kind,r.principal.id,e);let a=s.source_wake_id?n.default.prepare("SELECT work_request_id FROM wakes WHERE id = ?").get(s.source_wake_id):void 0;return a?.work_request_id&&n.default.prepare(`
|
|
326
|
+
INSERT INTO engine_events (id, request_id, sequence, attempt_id, type, data, created_at)
|
|
327
|
+
SELECT ?, ?, COALESCE(MAX(sequence), 0) + 1, NULL, 'grant_revoked', ?, ? FROM engine_events WHERE request_id = ?
|
|
328
|
+
`).run((0,t.randomUUID)(),a.work_request_id,JSON.stringify({grant_id:s.id,wake_id:s.source_wake_id,caller_agent_id:s.caller_agent_id,target_agent_id:s.target_agent_id,decided_by:{kind:r.principal.kind,id:r.principal.id}}),i,a.work_request_id),{grant:c(e),revoked:!0}}).immediate()},"wakeSafetyLimits",0,function(e=process.env){let t=(t,n)=>{let s=e[i[t]]?.trim(),a=s&&/^\d+$/.test(s)?Number(s):NaN;return Number.isSafeInteger(a)&&a>=n&&a<r[t]?a:r[t]},n=t("rootBudget",1);return{...r,maxWakeDepth:t("maxWakeDepth",0),rootBudget:n,maxContinuations:2*n}}])}];
|
|
329
|
+
|
|
330
|
+
//# sourceMappingURL=lib_0iujsdg._.js.map
|