botmancers 0.10.1 → 0.10.2
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 +24 -1
- package/README.md +17 -15
- package/app/.next/BUILD_ID +1 -1
- package/app/.next/build-manifest.json +3 -3
- package/app/.next/prerender-manifest.json +3 -3
- package/app/.next/required-server-files.json +2 -2
- 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.html +1 -1
- package/app/.next/server/app/_not-found.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/api/bots/[id]/activity/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/[id]/config/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/[id]/conversations/[conversationId]/route.js +3 -3
- package/app/.next/server/app/api/bots/[id]/conversations/[conversationId]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/[id]/conversations/route.js +3 -3
- package/app/.next/server/app/api/bots/[id]/conversations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/[id]/overview/route.js +2 -2
- package/app/.next/server/app/api/bots/[id]/overview/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 +2 -2
- 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 +2 -2
- 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.js +1 -1
- package/app/.next/server/app/api/bots/[id]/sessions/sync/route.js.nft.json +1 -1
- package/app/.next/server/app/api/bots/[id]/share-policy/route.js +2 -2
- 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.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 +3 -3
- 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 +4 -4
- 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 +1 -1
- package/app/.next/server/app/api/exchanges/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/exchanges/route.js +4 -4
- 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 +3 -3
- 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-capacity/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 +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 +2 -2
- package/app/.next/server/app/api/shares/[shareRef]/revoke/route.js.nft.json +1 -1
- package/app/.next/server/app/api/shares/route.js +2 -2
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- package/app/.next/server/app/api/v0/agents/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v0/capabilities/route.js +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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/exchanges.html +1 -1
- package/app/.next/server/app/exchanges.rsc +1 -1
- package/app/.next/server/app/exchanges.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/exchanges.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/exchanges.segments/exchanges/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/index.html +1 -1
- package/app/.next/server/app/index.rsc +1 -1
- package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/settings.html +1 -1
- package/app/.next/server/app/settings.rsc +1 -1
- package/app/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/threads/[id]/route.js.nft.json +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__1273j55._.js +52 -0
- package/app/.next/server/chunks/[root-of-the-server]__1fdy1d8._.js +3 -0
- package/app/.next/server/chunks/[root-of-the-server]__1n7hlu8._.js +46 -0
- package/app/.next/server/chunks/_0061c2q._.js +1 -1
- package/app/.next/server/chunks/_031id45._.js +3 -0
- package/app/.next/server/chunks/_04o493a._.js +3 -0
- package/app/.next/server/chunks/_06yp-l-._.js +3 -0
- package/app/.next/server/chunks/_0bl1uw-._.js +3 -0
- package/app/.next/server/chunks/_0gh03eo._.js +3 -0
- package/app/.next/server/chunks/_0h0j5ta._.js +3 -0
- package/app/.next/server/chunks/_0hzb8hh._.js +3 -0
- package/app/.next/server/chunks/_0oodw7g._.js +3 -0
- package/app/.next/server/chunks/_0owd_4q._.js +3 -0
- package/app/.next/server/chunks/_0venewj._.js +3 -0
- package/app/.next/server/chunks/_0wzia1p._.js +3 -0
- package/app/.next/server/chunks/_1-5mthb._.js +1 -1
- package/app/.next/server/chunks/_1-8493l._.js +3 -0
- package/app/.next/server/chunks/_1bvoyii._.js +3 -0
- package/app/.next/server/chunks/_1gyq3w2._.js +3 -0
- package/app/.next/server/chunks/_1j3c311._.js +3 -0
- package/app/.next/server/chunks/{_1ey6l4p._.js → _1k74ggt._.js} +2 -2
- package/app/.next/server/chunks/_1l_t4_r._.js +3 -0
- package/app/.next/server/chunks/_1lac7c3._.js +3 -0
- package/app/.next/server/chunks/_1mlmzwb._.js +3 -0
- package/app/.next/server/chunks/_1rg79tr._.js +3 -0
- package/app/.next/server/chunks/_1s5qnlr._.js +3 -0
- package/app/.next/server/chunks/{_1x4dqzv._.js → _1u-wiq_._.js} +2 -2
- package/app/.next/server/chunks/_1xaqb38._.js +3 -0
- package/app/.next/server/chunks/_1zw-w5h._.js +3 -0
- package/app/.next/server/chunks/lib_0-opbv7._.js +30 -30
- package/app/.next/server/chunks/lib_0aejojj._.js +30 -30
- package/app/.next/server/chunks/lib_0al5wbc._.js +30 -30
- package/app/.next/server/chunks/lib_0il0ml1._.js +30 -30
- package/app/.next/server/chunks/lib_0iujsdg._.js +30 -30
- package/app/.next/server/chunks/lib_15a9ejf._.js +35 -28
- package/app/.next/server/chunks/lib_19pzc33._.js +35 -28
- package/app/.next/server/chunks/lib_1a4ucxv._.js +30 -30
- package/app/.next/server/chunks/lib_1dehbst._.js +30 -30
- package/app/.next/server/chunks/lib_1h919zb._.js +3 -0
- package/app/.next/server/chunks/lib_1z4vnh4._.js +30 -30
- package/app/.next/server/chunks/lib_1z7d95m._.js +35 -28
- package/app/.next/server/chunks/lib_db_ts_1ttuckb._.js +9 -2
- package/app/.next/server/chunks/lib_service-api-http_ts_0xzqhny._.js +1 -1
- package/app/.next/server/chunks/lib_service-api_ts_18eok4w._.js +5 -5
- package/app/.next/server/chunks/lib_slack-runtime_ts_0fgsejy._.js +6 -6
- 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/BUILD_INFO.json +2 -2
- package/app/package.json +1 -1
- package/app/server.js +1 -1
- package/dist/contract.js +2 -2
- package/package.json +1 -1
- package/schemas/botmancers.mcp.v2.tools.json +15 -50
- package/skills/botmancers-collaboration/SKILL.md +10 -10
- package/skills/botmancers-collaboration/references/workflows.md +20 -14
- package/app/.next/server/chunks/[root-of-the-server]__07q5mnr._.js +0 -3
- package/app/.next/server/chunks/[root-of-the-server]__1280ke1._.js +0 -46
- package/app/.next/server/chunks/[root-of-the-server]__1jxwu9_._.js +0 -52
- package/app/.next/server/chunks/_04e2bgj._.js +0 -3
- package/app/.next/server/chunks/_05po7b4._.js +0 -3
- package/app/.next/server/chunks/_06sxx0e._.js +0 -3
- package/app/.next/server/chunks/_0ar2ooe._.js +0 -3
- package/app/.next/server/chunks/_0fmotaz._.js +0 -3
- package/app/.next/server/chunks/_0kpfto_._.js +0 -3
- package/app/.next/server/chunks/_0lm6uis._.js +0 -3
- package/app/.next/server/chunks/_0mpu5tl._.js +0 -3
- package/app/.next/server/chunks/_0u9cfq9._.js +0 -3
- package/app/.next/server/chunks/_0ul8k7g._.js +0 -3
- package/app/.next/server/chunks/_1-60d3o._.js +0 -3
- package/app/.next/server/chunks/_11-q8k1._.js +0 -3
- package/app/.next/server/chunks/_133y3b0._.js +0 -3
- package/app/.next/server/chunks/_167960a._.js +0 -3
- package/app/.next/server/chunks/_17vgjlt._.js +0 -3
- package/app/.next/server/chunks/_1amx9_4._.js +0 -3
- package/app/.next/server/chunks/_1b01v-_._.js +0 -3
- package/app/.next/server/chunks/_1c-g4gq._.js +0 -3
- package/app/.next/server/chunks/_1ess5if._.js +0 -3
- package/app/.next/server/chunks/_1i0zod4._.js +0 -3
- package/app/.next/server/chunks/_1nlg4x_._.js +0 -3
- package/app/.next/server/chunks/_1z0qbzc._.js +0 -3
- package/app/.next/server/chunks/lib_0i8cm07._.js +0 -3
- /package/app/.next/static/{eBmHBBldHWytVvYPu0zHc → 45V8A9u4-Y-aZNxovpZCu}/_buildManifest.js +0 -0
- /package/app/.next/static/{eBmHBBldHWytVvYPu0zHc → 45V8A9u4-Y-aZNxovpZCu}/_clientMiddlewareManifest.js +0 -0
- /package/app/.next/static/{eBmHBBldHWytVvYPu0zHc → 45V8A9u4-Y-aZNxovpZCu}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
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(`
|
|
1
|
+
module.exports=[45383,17834,e=>{"use strict";e.s(["AgentApiError",()=>ei,"MCP_IDEMPOTENCY_PREFIX",()=>en,"acceptAgentMessage",()=>ep,"apiStateOf",()=>eu,"cancelExchangeCommand",()=>eU,"createExchangeCommand",()=>eF,"decideWakeGrantCommand",()=>eC,"dispatchExchange",()=>eP,"exchanges",()=>eW,"getAgentRequest",()=>eJ,"getAuthorizedWorkRequest",()=>eK,"getConversation",()=>eV,"getExchangeView",()=>eH,"isPrincipalKind",()=>es,"recoverCoordinatorLoops",()=>e$,"retryWakeCommand",()=>eO,"revokeWakeGrantCommand",()=>eL,"samePrincipal",()=>ea,"startAgentDispatch",()=>eM,"sweepDispatch",()=>eq],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 x(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 q(e){let{rootBudget:t}=(0,k.wakeSafetyLimits)(),n=x(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:"edit_approval_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?x(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"edit_approval_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}).`}:q(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
2
|
INSERT INTO wakes (
|
|
3
3
|
id, idempotency_key, source_conversation_id, source_event_id, position, syntax, payload,
|
|
4
4
|
requester_agent_id, requested_target, target_agent_id, target_name_snapshot, execution_kind,
|
|
@@ -9,30 +9,30 @@ module.exports=[45383,17834,e=>{"use strict";e.s(["AgentApiError",()=>es,"MCP_ID
|
|
|
9
9
|
UPDATE wakes SET status = ?, reason_code = ?, reason = ?, target_agent_id = ?, target_name_snapshot = ?,
|
|
10
10
|
work_request_id = ?, root_request_id = ?, limit_value = ?, observed_value = ?, updated_at = ?
|
|
11
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?
|
|
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?q(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)),"edit_approval_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||"edit_approval_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
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)
|
|
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);let et=["person","bot","service"],en="mcp:",er={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 ei extends Error{code;constructor(e,t){super(t),this.name="AgentApiError",this.code=e}get status(){return er[this.code]}}function es(e){return"string"==typeof e&&et.includes(e)}function ea(e,t){return e.kind===t.kind&&e.id===t.id}function eo(e){return"string"==typeof e&&e.trim().length>0}function ed(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 eu(e){switch(e){case"running":case"waiting":return"dispatched";case"completed":return"completed";case"failed":case"cancelled":return"failed";default:return"accepted"}}function el(e){if(!es(e.kind)||!eo(e.id)||"bot"===e.kind&&!n.bots.getById(e.id))throw new ei("unauthenticated","Authentication failed.")}let ec={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 e_(e){return Promise.all(e.requestIds.map(eM)).then(()=>void 0)}function ep(e,t,n){let r;if(el(e),!eo(t.agentId))throw new ei("invalid_request","agentId is required.");if(!eo(t.content))throw new ei("invalid_request","content is required.");if(!eo(t.idempotencyKey)||t.idempotencyKey.length>200)throw new ei("invalid_request","An idempotency key (1-200 characters) is required.");if(void 0!==t.conversationId&&null!==t.conversationId&&!eo(t.conversationId))throw new ei("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:e_})}catch(e){if(e instanceof u.IntakeError)throw new ei(ec[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?eB(i):r.requestIds[0],conversationId:r.conversationId,acceptedMessageId:r.acceptedMessageId,state:i?eu(i.state):"accepted",replayed:r.replayed},dispatched:r.dispatched}}function ef(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 eh=(0,o.createDispatcher)(n.default,n.engine);class em extends Error{reason;constructor(e){super(`Commit deferred: ${e}`),this.reason=e}}async function eg(e){let t=await ev(e);ey(e,t||n.engine.getWorkRequest(e)?.state!=="queued")}function ey(e,t){for(let t of Z(e))eM(t);(function(e){let t=eW.forHopRequest(e);if(t)try{for(let e of eW.advance(t.id))eM(e)}catch(e){console.error("Exchange advance failed:",e instanceof Error?e.message:"unknown error")}})(e),t&&ew()}function ew(){for(let e of eh.deferredRequestIds())eD.has(e)||eM(e)}async function ev(e){let t,a,u=n.engine.getWorkRequest(e);if(!u||"queued"!==u.state||null!==u.next_eligible_at&&eh.now()<u.next_eligible_at)return!1;let l=n.bots.getById(u.target_agent_id);if(!l)return ef(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=eW.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
15
|
AND rowid <= (SELECT rowid FROM messages WHERE id = ?)
|
|
16
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
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(`
|
|
18
|
+
${X(t)}`)}return[{speakerLabel:U,fromAgent:!1,content:i.join("\n\n")}]}(u),...eW.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=eh.claim(e,{expectedVersion:u.version,data:{agent:p}});if(!t.ok)return a=t.blockedBy,null;if(h){let r=eh.now(),s=eh.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 eh.recordLaunchIntent(t.lease,o.attempt.id,h.adapter.name,h.adapter.launchIntent?.(o.input)??null),eW.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 eW.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&&eM(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(()=>{eh.assertHeld(w),ef(e,s,i.code,i.message),eh.release(w,"failed")}),!0}let v=t.attempt.attempt.id;return ek.set(e,{attemptId:v,controller:y}),await eT(w,async()=>{(0,o.dispatchFault)("before_launch",e);try{let r=await (0,i.runAttempt)(n.engine,t.attempt,h.adapter,{fence:()=>eh.holds(w),onEvent:t=>{"started"===t.type&&(0,o.dispatchFault)("after_run_id_persisted",e)},sanitize:e=>eW.sanitizeHopResult(u,e),project:(e,t)=>eR(w,u,t,e)});r.abandoned&&await eS(r.abandoned,{localSignalled:!0,launched:!0}),r.projected?.retryAt!=null&&eE(e,r.projected.retryAt)}catch(e){eI(w,v,e)}},y),ek.get(e)?.attemptId===v&&ek.delete(e),!0}let ek=new Map;function eE(e,t){let n=setTimeout(()=>{eM(e)},Math.max(0,t-eh.now()));n.unref&&n.unref()}async function eb(e){let t=ek.get(e.requestId);if(t&&t.attemptId===e.attemptId){t.controller.abort();let n=eD.get(e.requestId);if(n){let t=`abandoned:${e.attemptId}`;eD.delete(e.requestId),eD.set(t,n),n.finally(()=>{eD.get(t)===n&&eD.delete(t)})}}await eS(e,{localSignalled:!!t&&t.attemptId===e.attemptId,launched:e.launched})}async function eS(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:eh.now()})}async function eT(e,t,r){let i=setInterval(()=>{try{eh.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)}},eh.config.heartbeatMs);i.unref&&i.unref();try{return await t()}finally{clearInterval(i)}}function eI(e,t,n){if(!(n instanceof o.LeaseLostError)){if(n instanceof em){try{eh.defer(e,n.reason,t)}catch(e){if(!(e instanceof o.LeaseLostError))throw e}return}throw n}}function eR(e,s,a,d){if((0,o.dispatchFault)("before_terminal_commit",s.id),eh.assertHeld(e),"failed"===d.status&&d.launchUnconfirmed&&!a.external_run_id)throw new em("launch_unconfirmed");let u=s.id,l=eh.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),eh.release(e,_?"cancelled":"timed_out"),{retryAt:null};if("completed"!==d.status||null===d.output){let t=(0,r.dispatchFailureFor)(d),n=eh.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 eh.release(e,n.outcome),{retryAt:"retry"===n.decision.action?n.decision.nextEligibleAt:null}}let p=(0,Q.hopOf)(s);if(p){let t=eW.commitHop(s,a,d,l);return n.engine.transitionWorkRequest(u,{from:"running",to:"completed",result:t,now:l}),eh.release(e,"completed"),eW.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}),eh.release(e,"completed"),{retryAt:null}}function eA(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 eh.release(e,"stale");let s=async(r,i)=>{let s=n.engine.transaction(()=>{eh.assertHeld(e);let n=eh.control.enforceRequest(t.id,eh.now(),{force:!0});return n?(i?.(),{enforced:n}):{value:r()}});return"enforced"in s?(s.enforced.abandoned&&await eb(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(()=>{eh.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."}),eh.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:eA(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=eh.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 eh.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 eS(i,{localSignalled:!1,launched:!0});w=r}}if(!await y("launch",p,v,w))return}switch(p.action){case"defer":await s(()=>eh.defer(e,p.reason,f.id));return;case"attention":await s(()=>eh.setAttention(e,{attemptId:f.id,reason:p.reason,detail:v?JSON.stringify(eA(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.`}),eh.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."}),eh.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."}),eh.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(()=>ek.set(t.id,{attemptId:f.id,controller:S}))).won)return;await eT(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=eW.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,eh.now()),{retryAt:null};eh.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 eR(e,t,o,s)});a&&await eS(a,{localSignalled:!0,launched:!0}),null!==o.retryAt&&eE(t.id,o.retryAt)},S).finally(()=>{ek.get(t.id)?.attemptId===f.id&&ek.delete(t.id)})}catch(t){eI(e,a,t)}}function eq(){let e=[];for(let t of eh.control.enforceDue())e.push((t.abandoned?eb(t.abandoned):Promise.resolve()).then(()=>ey(t.requestId,!0)).catch(e=>{console.error("Request enforcement follow-up failed:",e)}));for(let t of eh.recoverable()){let n=`reconcile:${t.requestId}`;if(eD.has(n)||eD.has(t.requestId))continue;let r=eh.takeOver(t);if(!r)continue;let i=ex(r).then(()=>ey(t.requestId,!eh.holds(r))).catch(e=>{console.error("Dispatch reconciliation failed unexpectedly:",e)}).finally(()=>{eD.delete(n)});eD.set(n,i),e.push(i)}for(let e of(ew(),n.default.prepare(`
|
|
19
19
|
SELECT id FROM work_requests
|
|
20
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
21
|
ORDER BY next_eligible_at ASC, id ASC
|
|
22
|
-
`).all(
|
|
22
|
+
`).all(eh.now()).map(e=>e.id)))eD.has(e)||eM(e);return Promise.all(e).then(()=>void 0)}async function eN(e,t={}){let n=eh.control.cancel(e,t);return"cancel_requested"!==n.outcome||n.replayed||ek.get(e)?.controller.abort(),n.abandoned&&await eb(n.abandoned),"cancelled"!==n.outcome||n.replayed||ey(e,!0),n}function eC(e,t,n){let r=P({wakeId:e,decision:t,caller:n});if(r.request&&r.runnable&&eM(r.request.id),r.request&&r.ended)for(let e of Z(r.request.id))eM(e);return r}function eO(e){let t=W(e);return t.request?.state==="queued"&&eM(t.request.id),t}function eL(e,t){return(0,k.revokeWakeGrant)(e,t)}let eD=new Map;function eM(e){let t=eD.get(e);if(t)return t;let n=eg(e).catch(e=>{console.error("Agent dispatch failed unexpectedly:",e)}).finally(()=>{eD.get(e)===n&&eD.delete(e)});return eD.set(e,n),n}function e$(){return Promise.all([eq(),...(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
23
|
SELECT w.id FROM work_requests w JOIN terminal_followups f ON f.request_id = w.parent_request_id
|
|
24
24
|
WHERE w.state = 'queued' AND (w.wake_event_id IS NOT NULL OR (w.requester_kind = ? AND w.requester_id = ?))
|
|
25
25
|
ORDER BY w.created_at ASC, w.id ASC
|
|
26
|
-
`).all(H.kind,H.id))r.add(e.id);return[...r]})().map(
|
|
26
|
+
`).all(H.kind,H.id))r.add(e.id);return[...r]})().map(eM),...(function(){let e=[];for(let t of eW.openIds())try{e.push(...eW.advance(t))}catch(e){console.error("Exchange recovery failed:",e instanceof Error?e.message:"unknown error")}return e})().map(eM)]).then(()=>void 0)}let eW=(0,Q.createExchangeStore)(n.default,n.engine);function eF(e){let{exchange:t,created:n}=eW.create(e),r=eP(t.id);return{exchange:eW.view(t.id),created:n,dispatched:r}}function eP(e){return Promise.all(eW.advance(e).map(eM)).then(()=>void 0)}function eH(e){return eW.view(e)}async function eU(e,t,r=null,i){let{hopRequestId:o,replayed:d}=n.default.transaction(()=>{let n=eW.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 eN(o,{actor:t,reason:r??"The exchange was cancelled."})}catch(e){if(!(e instanceof a.ControlError))throw e}}return eW.advance(e),{exchange:eW.view(e),replayed:d}}let ej=["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 eB(e){return e.legacy_agent_request_id??e.id}function eK(e,t){el(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?eX(e,i):ed(i.source_conversation_id,e)||eX(e,i)))throw new ei("request_not_found","No request with that id is visible to this principal.");return i}function eX(e,t){if(!(0,Q.hopOf)(t))return!1;let n=eW.forHopRequest(t.id);return!!n&&n.requester_kind===e.kind&&n.requester_id===e.id&&("service"!==e.kind||eG(e,n))}function eG(e,t){let r=e=>!!n.bots.getById(e);return r(t.source_agent_id)&&(null===t.destination_agent_id||r(t.destination_agent_id))}function eJ(e,t){var r;let i,s,a,o,d,u,l=(i=(r=eK(e,t)).result?JSON.parse(r.result):null,o=(a=(s=(0,Q.hopOf)(r)?.hop==="ask"?eW.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:eB(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:eu(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 ej.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 ez={agent:"agent",bot:"direct",group:"group"};function eV(e,t){el(e);let r=n.default.prepare("SELECT * FROM conversations WHERE id = ?").get(t);if(!r||!ed(r.id,e))throw new ei("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=eW.forHopRequest(n);r=!!i&&!(i.requester_kind===e.kind&&i.requester_id===e.id&&eG(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:ez[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
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
28
|
SELECT id FROM work_requests
|
|
29
29
|
WHERE state IN ('queued', 'blocked', 'running', 'waiting') AND legacy_agent_request_id IS NULL AND executor = 'dispatcher'
|
|
30
30
|
AND ((deadline_at IS NOT NULL AND deadline_at <= ?) OR state = 'running')
|
|
31
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
|
|
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 x=e.i(46786);let q="'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??`${x.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 (${q}) ORDER BY sequence DESC LIMIT 1`),c=e.prepare(`
|
|
33
33
|
SELECT w.id FROM work_requests w
|
|
34
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 (${
|
|
35
|
+
AND (SELECT e.type FROM engine_events e WHERE e.request_id = w.id AND e.type NOT IN (${q}) ORDER BY e.sequence DESC LIMIT 1) = 'dispatch_deferred'
|
|
36
36
|
ORDER BY w.created_at ASC, w.id ASC
|
|
37
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
38
|
SELECT w.id FROM work_requests w
|
|
@@ -56,7 +56,7 @@ ${a.description}`),history:e.history},toolProfile:e.toolProfile??d.TOOL_PROFILE_
|
|
|
56
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
57
|
INSERT INTO attempt_launch_intents (attempt_id, request_id, transport, idempotency_key, body, body_hash, grant_fingerprint, owner, created_at)
|
|
58
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]!==
|
|
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]!==x.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
60
|
SELECT w.id FROM work_requests w
|
|
61
61
|
WHERE w.state = 'running' AND w.legacy_agent_request_id IS NULL AND w.executor = 'dispatcher'
|
|
62
62
|
AND NOT EXISTS (SELECT 1 FROM dispatch_leases l WHERE l.request_id = w.id)
|
|
@@ -77,7 +77,7 @@ ${t}`}])},76459,e=>{"use strict";var t=e.i(54799),n=e.i(62294),r=e.i(35613),i=e.
|
|
|
77
77
|
requester_kind, requester_id, idempotency_key, request_hash, surface,
|
|
78
78
|
conversation_id, source_event_id, work_request_ids, created_at
|
|
79
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",()=>
|
|
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",()=>q,"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",()=>x,"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
81
|
CREATE TABLE IF NOT EXISTS session_contexts (
|
|
82
82
|
id TEXT PRIMARY KEY CHECK (id LIKE 'sctx_%'),
|
|
83
83
|
token_sha256 TEXT NOT NULL UNIQUE CHECK (length(token_sha256) = 64),
|
|
@@ -113,13 +113,13 @@ ${n}
|
|
|
113
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
114
|
UPDATE session_contexts SET state = 'ended', end_reason = ?, ended_at = ?, updated_at = ?
|
|
115
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
|
|
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 x(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
117
|
SELECT MAX(CASE WHEN state = 'running' THEN 1 ELSE 0 END) AS running, MAX(COALESCE(finished_at, created_at)) AS at
|
|
118
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
|
|
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 q extends Error{code;constructor(e,t){super(t),this.name="ProviderSessionError",this.code=e}}function N(e,t){let i=e.prepare(`
|
|
120
120
|
SELECT id, runtime_connection_id, session_scope_kind, session_scope_items, policy_mode, allow_new_sessions, allow_resume_with_edits
|
|
121
121
|
FROM bots WHERE id = ?
|
|
122
|
-
`).get(t);if(!i)throw new
|
|
122
|
+
`).get(t);if(!i)throw new q("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 q("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 q("unsupported",`The session provider does not support ${t}.`)}function L(e){if(!e.scope)throw new q("scope_missing","The Agent has no session scope.");return e.scope}function D(e,t="provider_failed"){throw new q("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 q("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
123
|
SELECT provider_session_id FROM provider_sessions
|
|
124
124
|
WHERE agent_id = ? AND runtime_connection_id = ? AND id IN (SELECT value FROM json_each(?))
|
|
125
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(`
|
|
@@ -135,7 +135,7 @@ ${r}`)),e.processBound?m():null,a,a),{id:s,token:i,url:function(e=process.env){l
|
|
|
135
135
|
provider_created_at = COALESCE(?, provider_created_at), provider_updated_at = COALESCE(?, provider_updated_at),
|
|
136
136
|
availability = 'available', lifecycle = ?, resumable = ?, busy = ?, capabilities = ?, last_synced_at = ?, updated_at = ?
|
|
137
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
|
|
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 q&&"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 q("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 q){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 q?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
139
|
SELECT COUNT(*) AS n FROM provider_sessions
|
|
140
140
|
WHERE agent_id = ? AND runtime_connection_id = ? AND origin = 'discovered' AND binding_id IS NULL AND availability = 'available'
|
|
141
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(`
|
|
@@ -149,15 +149,15 @@ ${r}`)),e.processBound?m():null,a,a),{id:s,token:i,url:function(e=process.env){l
|
|
|
149
149
|
SELECT detail, created_at FROM provider_session_events
|
|
150
150
|
WHERE agent_id = ? AND type = 'sync_completed'
|
|
151
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
|
|
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 q&&"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 q?n.code:"provider_failed"}}try{r=await C(e,t,n)}catch(r){if(r instanceof q&&"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 q?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 q&&"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 q?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 q("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 q("invalid_input","prompt is required.");if(e.prompt.length>2e4)throw new q("invalid_input","prompt is longer than 20000 characters.");if("read_only"!==e.authority&&"workspace_write"!==e.authority)throw new q("invalid_input","authority must be read_only or workspace_write.");if("string"!=typeof e.idempotencyKey||!e.idempotencyKey.trim()||e.idempotencyKey.length>200)throw new q("invalid_input","idempotencyKey is required.");if(!e.requester||!["person","bot","service"].includes(e.requester.kind)||!e.requester.id)throw new q("invalid_input","requester is required.")}function es(e,t,n){if(!e.capabilities.authorities.includes(t))throw new q("authority_not_allowed",`The session provider cannot enforce ${t}.`);if(!e.policy)throw new q("authority_not_allowed","The Agent has no launch policy.");if("workspace_write"===t){if("workspace_write"!==e.policy.mode)throw new q("authority_not_allowed","The Agent's policy is read only.");if("send"===n&&!e.policy.allow_resume_with_edits)throw new q("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
153
|
${n.kind}
|
|
154
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
|
|
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 q("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
156
|
INSERT INTO provider_session_turns (
|
|
157
157
|
id, session_ref, agent_id, kind, authority, requester_kind, requester_id, idempotency_key, request_hash,
|
|
158
158
|
provider_turn_id, state, output, failure_code, correlation, created_at, finished_at
|
|
159
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
|
|
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 q("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 q("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 q("out_of_scope","The workspace is outside the Agent's session scope.");if(!d.policy?.allow_new_sessions)throw new q("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 q("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 q("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 q("session_missing","The provider no longer has this session.");if(1!==c.resumable)throw new q("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 q("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 q("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
161
|
UPDATE provider_session_turns SET state = ?, output = ?, failure_code = ?, finished_at = ?, input_tokens = ?, output_tokens = ?, total_cost_usd = ?
|
|
162
162
|
WHERE id = ? AND state = 'running'
|
|
163
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(`
|
|
@@ -175,13 +175,13 @@ ${t.length>0?t.map(e=>`- ${e}`).join("\n"):"(none)"}`}function y(e){let t;if(e.r
|
|
|
175
175
|
UPDATE session_exchanges SET state = ?, version = version + 1, updated_at = ?, terminal_at = ?,
|
|
176
176
|
failure_code = ?, failure_message = ?
|
|
177
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
|
|
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 x(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 q(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
179
|
INSERT INTO session_exchanges (
|
|
180
180
|
id, requester_kind, requester_id, idempotency_key, request_hash, mode, origin_conversation_id,
|
|
181
181
|
source_agent_id, source_binding_id, destination_agent_id, destination_conversation_id, instruction,
|
|
182
182
|
state, created_at, updated_at
|
|
183
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=
|
|
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=q(y,v,{conversationId:p,targetAgentId:n.sourceAgentId,intent:"ask"===v?function(e,t,n="the owner"){return`[Session Ask from ${n}] Exchange: ${e}
|
|
185
185
|
|
|
186
186
|
Answer one question from the context of this session. ${m} Reply with the answer only.
|
|
187
187
|
|
|
@@ -199,12 +199,12 @@ objective: what ${i} should achieve. decisions: what was decided and why. constr
|
|
|
199
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
200
|
|
|
201
201
|
Owner instruction:
|
|
202
|
-
${s}`),parentRequestId:d.request_id,resumeBindingId:d.id,now:o}),I=
|
|
202
|
+
${s}`),parentRequestId:d.request_id,resumeBindingId:d.id,now:o}),I=x(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:x(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||x(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),x(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 x(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 q=u.bindSession({agentId:n.target_agent_id,adapter:i.adapter,externalSessionId:g,conversationId:E,requestId:n.id,sourceAttemptId:i.id,now:a}).id;return x(d,{destination_binding_id:q},a),T(d.id,"destination_replied",{request_id:n.id,attempt_id:i.id,message_id:v,conversation_id:E,session_ref:q,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=q(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
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(`
|
|
204
|
+
${d}`].join("\n\n")),parentRequestId:null,resumeBindingId:null,now:n});return T((i=x(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",()=>x,"sendPinTurn",()=>Z,"sessionOwner",()=>q,"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",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,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
205
|
INSERT INTO session_pin_events (id, pin_id, sequence, type, data, created_at)
|
|
206
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
|
|
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 x(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 q(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
208
|
SELECT 1 FROM conversations c JOIN conversation_participants p ON p.conversation_id = c.id
|
|
209
209
|
WHERE c.id = ? AND p.participant_kind = ? AND p.participant_id = ?
|
|
210
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(`
|
|
@@ -212,17 +212,17 @@ ${d}`].join("\n\n")),parentRequestId:null,resumeBindingId:null,now:n});return T(
|
|
|
212
212
|
id, requester_kind, requester_id, idempotency_key, request_hash, agent_id, session_ref, action, authority, resolution, route,
|
|
213
213
|
conversation_id, approved_at, state, created_at, updated_at
|
|
214
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=
|
|
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=q(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?x(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
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
217
|
INSERT INTO session_pin_turns (
|
|
218
218
|
id, pin_id, seq, requester_kind, requester_id, idempotency_key, request_hash, content, exchange_id, provider_turn_ref,
|
|
219
219
|
question_message_id, answer_message_id, created_at
|
|
220
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??""}
|
|
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=x(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("no_eligible_session","This Agent has no session that can take a message, and this caller does not start new sessions. 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=x(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=x(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 x(e){return _.default.join(e,"projects")}function q(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 q(x(e))){let r=_.default.join(x(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 q(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 q(x(e))){if(n&&!n.some(e=>t===e||t.startsWith(`${e}-`)))continue;let i=_.default.join(x(e),t);for(let e of q(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
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
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=`
|
|
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 ex(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 eq(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?eq({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?eq({phase:n,c:a}):"open"===n?eq({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?eq({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?eq({mode:"turns",c:a,skip:o+e.limit,n:p}):d.result?.nextCursor?eq({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=ex(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=ex(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
226
|
import { createRequire } from 'module';
|
|
227
227
|
import { pathToFileURL } from 'url';
|
|
228
228
|
import path from 'path';
|
|
@@ -256,7 +256,7 @@ try {
|
|
|
256
256
|
}
|
|
257
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
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",()=>
|
|
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",()=>x,"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
260
|
CREATE TABLE IF NOT EXISTS session_shares (
|
|
261
261
|
id TEXT PRIMARY KEY CHECK (id LIKE 'shr_%'),
|
|
262
262
|
creator_kind TEXT NOT NULL,
|
|
@@ -305,17 +305,17 @@ ${t.env===process.env?"":JSON.stringify(t.env)}`,r=eB.get(n);if(r&&Date.now()-r.
|
|
|
305
305
|
BEGIN
|
|
306
306
|
SELECT RAISE(ABORT, 'session_share_events are append-only');
|
|
307
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
|
|
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 x(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 q(e,t,n,r={}){i.default.prepare(`
|
|
309
309
|
INSERT INTO session_share_events (share_ref, sequence, type, turn_ref, code, at)
|
|
310
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
|
|
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 Slack channel is not on the share allowlist. Add it in Agent Config, under Session sharing.");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
312
|
${_}`).digest("hex").slice(0,40)}`),onCommit:t=>{let n=Date.now(),s=`shr_${(0,r.randomBytes)(16).toString("base64url")}`;i.default.prepare(`
|
|
313
313
|
INSERT INTO session_shares (
|
|
314
314
|
id, creator_kind, creator_id, idempotency_key, request_hash, agent_id, session_ref, pin_ref, authority,
|
|
315
315
|
audience_kind, audience_team_id, audience_channel_id, created_via, ttl_seconds, max_turns, turns_used, state,
|
|
316
316
|
created_at, expires_at, updated_at
|
|
317
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),
|
|
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),q(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),q(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
319
|
SELECT s.id FROM session_shares s JOIN session_pins p ON p.id = s.pin_ref
|
|
320
320
|
WHERE s.state = 'active' AND s.expires_at <= ? AND p.state = 'attached'
|
|
321
321
|
ORDER BY s.expires_at, s.id LIMIT 500
|