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=[99904,89965,98307,76422,34923,98596,46632,94057,99684,74455,71711,23325,78636,48758,e=>{"use strict";let t;var n=e.i(85148),r=e.i(22734),i=e.i(14747),s=e.i(54799);let a=["hermes","cursor","claude","codex","muse"],o={hermes:"Hermes",cursor:"Cursor",claude:"Claude",codex:"Codex",muse:"Muse Code"},d="hermes",u={hermes:"hermes-gateway",cursor:"session-provider",claude:"session-provider",codex:"session-provider",muse:"session-provider"};class l extends Error{code="invalid-agent";constructor(e){super(`Invalid agent: ${JSON.stringify(String(e))}. Expected one of ${a.join("|")}.`)}}function _(e){if(null==e)return null;let t=String(e).trim();if(!t)return null;if(a.includes(t))return t;throw new l(e)}function c(e){return null==e?null:String(e).trim()||null}a.join("|");let E=["codex","claude","cursor","muse"];function p(e){let t=c(e);return t&&E.includes(t)?t:null}function T(e){try{let t=_(e.agent);if(t)return{agent:t,migrated:!1}}catch{}let t=c(e.runtime),n=d;if("agent-deck"===t)n=p(e.agent_client)??d;else if("hermes"!==t){let t=p(e.coding_runtime),r=c(e.deck_name),i=c(e.working_directory);t&&r&&i&&(n=t)}return{agent:n,migrated:!0}}e.s(["AGENTS",0,a,"AGENT_LABELS",0,o,"DEFAULT_AGENT",0,d,"agentTransport",0,function(e){return u[e]},"migrateLegacyAgentFields",0,T,"normalizeAgent",0,_,"resolveAgent",0,function(e){let t=d,n=!0;try{t=_(e.agent)??d}catch{n=!1}let r=c(e.runtime_connection_id),i=null;return n?r?!function(e){if(!("session_scope_kind"in e))return!0;let t=e.session_scope_kind,n=[];try{n=e.session_scope_items?JSON.parse(e.session_scope_items):[]}catch{return!1}if(!Array.isArray(n))return!1;let r=n.filter(e=>"string"==typeof e&&e.trim()).length;return"all_provider_sessions"===t?0===r:("workspaces"===t||"sessions"===t)&&r>0}(e)&&(i="session_scope"):i="connection":i="agent",{agent:t,runtime_connection_id:r,launchable:null===i,launch_blocker:i}}],89965);let m=["read_only","workspace_write"],f=["workspaces","sessions","all_provider_sessions"],g="This computer";function h(e){return`rc-local-${e}`}function N(e){return`${o[e]} on ${g.toLowerCase()}`}function R(e){return e.length>1?e.replace(/\/+$/,""):e}function v(e,t){let n=R(e),r=R(t);return n===r||r.startsWith("/"===n?"/":`${n}/`)}function y(e,t){let n="string"==typeof e?e.trim():"";if(!n)return null;let r=t&&t.trim()?t:(process.env.HOME??"").trim(),i="~"===n?r:n.startsWith("~/")?`${r}/${n.slice(2)}`:n;return i.startsWith("/")?i:null}function L(e){let t=e.session_scope_kind;if(!("string"==typeof t&&f.includes(t)))return null;let n=[];if(e.session_scope_items)try{let t=function(e){if(null==e)return[];if(!Array.isArray(e))return null;let t=[];for(let n of e){if("string"!=typeof n)return null;let e=n.trim();e&&!t.includes(e)&&t.push(e)}return t}(JSON.parse(e.session_scope_items));if(null===t)return null;n=t}catch{return null}return"all_provider_sessions"===t?0===n.length?{kind:t,workspaces:[],sessions:[]}:null:0===n.length?null:"workspaces"===t?{kind:t,workspaces:n,sessions:[]}:{kind:t,workspaces:[],sessions:n}}function w(e){return!0===e||1===e||"1"===e}function O(e){var t;return{runtime_connection_id:e.runtime_connection_id,launch_profile:"direct",deck_id:null,working_directory:null,session_scope_kind:e.session_scope.kind,session_scope_items:JSON.stringify("workspaces"===(t=e.session_scope).kind?t.workspaces:"sessions"===t.kind?t.sessions:[]),default_workspace:e.default_workspace,policy_mode:e.policy.mode,allow_new_sessions:+!!e.policy.allow_new_sessions,allow_resume_with_edits:+!!e.policy.allow_resume_with_edits,home_session_id:e.home_session_id,needs_deck_selection:0}}function k(e){var t;let n="hermes";try{n=_(e.agent)??"hermes"}catch{n="hermes"}let r=(null==(t=e.working_directory)?null:String(t).trim()||null)??`~/.botmancers/${e.id}`;return{runtime_connection_id:h(n),provider:n,session_scope_kind:"workspaces",session_scope_items:JSON.stringify([r]),policy_mode:"read_only",allow_new_sessions:1,allow_resume_with_edits:0}}function I(e){return"chief-of-staff"===String(e??"").trim().toLowerCase()}a.join("|"),e.s(["LOCAL_HOST",0,g,"directLaunchWorkspace",0,function(e,t){let n=y(e.default_workspace,t);if(n)return n;let r=L(e);return r?.kind==="workspaces"&&1===r.workspaces.length?y(r.workspaces[0],t):null},"localConnectionId",0,h,"localConnectionLabel",0,N,"migrateRegistration",0,k,"readStoredPolicy",0,function(e){var t;return"string"==typeof(t=e.policy_mode)&&m.includes(t)?{mode:e.policy_mode,allow_new_sessions:w(e.allow_new_sessions),allow_resume_with_edits:w(e.allow_resume_with_edits)}:null},"readStoredScope",0,L,"registrationColumns",0,O,"workspaceContains",0,v],98307);let S=Object.freeze(["conversation","implementation","review","revision"]),A=Object.freeze(["readonly","edit"]);Object.freeze(["ui","api","wake","continuation","exchange"]);let b=Object.freeze({conversation:"readonly",implementation:"edit",review:"readonly",revision:"edit"});function q(e){return"string"==typeof e&&S.includes(e)}function C(e,t){return{ok:!1,code:e,reason:t}}function x(e){var t,n,r,i;if(!q(e.executionKind))return C("unknown_execution_kind",`Unknown execution kind ${JSON.stringify(String(e.executionKind))}.`);let s=e.executionKind,a=(t=e.entryPoint,n=s,r=e.wakeSyntax,i=!0===e.resumesWorkRequest,"ui"===t||"api"===t?"conversation"!==n?{code:"unsupported_authority",reason:`A direct message runs as a read-only conversation turn, not ${n}.`}:"direct_message_conversation":"continuation"===t?"conversation"!==n?{code:"unsupported_authority",reason:`A coordinator continuation runs as a read-only conversation turn, not ${n}.`}:"coordinator_continuation":"exchange"===t?"conversation"!==n?{code:"unsupported_authority",reason:`A session exchange runs as a read-only conversation turn, not ${n}.`}:"session_exchange_conversation":"wake"!==t?{code:"unsupported_authority",reason:"Unknown policy entry point."}:"legacy"===r?"conversation"!==n?{code:"unsupported_authority",reason:`A legacy WAKE directive runs as a conversation turn, not ${n}.`}:"legacy_wake_conversation":"structured"!==r?{code:"unsupported_authority",reason:"Unknown Wake syntax."}:"revision"===n!==i?{code:"unsupported_authority",reason:"revision"===n?"A revision names the Work Request it resumes.":"Only a revision resumes a Work Request."}:"structured_wake");return"string"!=typeof a?C(a.code,a.reason):{ok:!0,policy:Object.freeze({policy_version:1,execution_kind:s,tool_profile:b[s],entry_point:e.entryPoint,rule:a})}}let D=new Set(["policy_version","execution_kind","tool_profile","entry_point","rule"]);function U(e){if(!e||"object"!=typeof e||Array.isArray(e))return C("malformed_policy","The execution policy snapshot is missing.");let t=Object.keys(e);if(t.length!==D.size||t.some(e=>!D.has(e)))return C("malformed_policy","The execution policy snapshot has unexpected fields.");if(1!==e.policy_version)return C("malformed_policy","Unsupported execution policy version.");if(!q(e.execution_kind))return C("unknown_execution_kind",`Unknown execution kind ${JSON.stringify(String(e.execution_kind))}.`);if(!A.includes(e.tool_profile))return C("unsupported_authority",`Unsupported tool profile ${JSON.stringify(String(e.tool_profile))}.`);if(b[e.execution_kind]!==e.tool_profile)return C("unsupported_authority",`Execution kind ${e.execution_kind} requires the ${b[e.execution_kind]} tool profile.`);let n={direct_message_conversation:{entry:["ui","api"],kinds:["conversation"]},legacy_wake_conversation:{entry:["wake"],kinds:["conversation"]},coordinator_continuation:{entry:["continuation"],kinds:["conversation"]},session_exchange_conversation:{entry:["exchange"],kinds:["conversation"]},structured_wake:{entry:["wake"],kinds:[...S]}},r="string"==typeof e.rule?n[e.rule]:void 0;return r&&r.entry.includes(e.entry_point)?r.kinds.includes(e.execution_kind)?{ok:!0,policy:Object.freeze({...e})}:C("unsupported_authority",`Rule ${e.rule} does not grant ${e.execution_kind}.`):C("malformed_policy","The execution policy rule does not match its entry point.")}e.s(["TOOL_PROFILE_FOR_KIND",0,b,"authorizeWorkRequest",0,function(e){let t;if(!q(e.execution_kind))return C("unknown_execution_kind",`Unknown execution kind ${JSON.stringify(String(e.execution_kind))}.`);try{t="string"==typeof e.policy_snapshot?JSON.parse(e.policy_snapshot):null}catch{return C("malformed_policy","The policy snapshot is not valid JSON.")}let n=U(t&&"object"==typeof t&&!Array.isArray(t)?t.execution_policy:void 0);return n.ok?n.policy.execution_kind!==e.execution_kind||n.policy.tool_profile!==e.tool_profile?C("unsupported_authority","The Work Request authority does not match its policy snapshot."):t.tool_profile!==e.tool_profile?C("malformed_policy","The policy snapshot tool profile does not match the Work Request."):n:n},"isExecutionKind",0,q,"selectExecutionPolicy",0,x,"validateExecutionPolicy",0,U],76422);let F=Object.freeze({max_attempts:1,base_delay_ms:1e3,max_delay_ms:6e4,attempt_timeout_ms:null});function W(e){if(void 0===e||!/^\d+$/.test(e.trim()))return null;let t=Number(e.trim());return Number.isSafeInteger(t)&&t>0?t:null}function M(e=process.env){let t=W(e.BOTMANCERS_RETRY_MAX_ATTEMPTS),n=W(e.BOTMANCERS_RETRY_BASE_DELAY_MS)??F.base_delay_ms,r=W(e.BOTMANCERS_RETRY_MAX_DELAY_MS)??F.max_delay_ms,i=H({max_attempts:null===t?F.max_attempts:Math.min(t,10),base_delay_ms:n,max_delay_ms:Math.max(r,n),attempt_timeout_ms:W(e.BOTMANCERS_ATTEMPT_TIMEOUT_MS)});return{deadlineMs:W(e.BOTMANCERS_REQUEST_DEADLINE_MS),retryPolicy:i.ok?i.policy:{...F}}}function H(e){if(!e||"object"!=typeof e||Array.isArray(e))return{ok:!1,reason:"A retry policy is an object."};let t=e=>"number"==typeof e&&Number.isSafeInteger(e);if(!t(e.max_attempts)||e.max_attempts<1||e.max_attempts>10)return{ok:!1,reason:"max_attempts must be an integer from 1 to 10."};if(!t(e.base_delay_ms)||e.base_delay_ms<0)return{ok:!1,reason:"base_delay_ms must be a non-negative integer."};if(!t(e.max_delay_ms)||e.max_delay_ms<e.base_delay_ms)return{ok:!1,reason:"max_delay_ms must be an integer no smaller than base_delay_ms."};let n=e.attempt_timeout_ms??null;return null!==n&&(!t(n)||n<1)?{ok:!1,reason:"attempt_timeout_ms must be a positive integer or null."}:{ok:!0,policy:{max_attempts:e.max_attempts,base_delay_ms:e.base_delay_ms,max_delay_ms:e.max_delay_ms,attempt_timeout_ms:n}}}let X=["unavailable","provider_unavailable","agent_not_found","auth_required","permission_denied","incompatible_version","usage_limit"],G={unavailable:"retryable",runtime_failed:"retryable",timed_out:"retryable",launch_failed:"terminal",unsupported_authority:"terminal",result_contract:"terminal",cancelled:"terminal",session_mismatch:"manual_attention"};e.s(["DEFAULT_RETRY_POLICY",0,F,"attemptDeadline",0,function(e,t,n){let r=null===e.attempt_timeout_ms?null:n+e.attempt_timeout_ms;return null===r?t:null===t?r:Math.min(r,t)},"classifyFailure",0,function(e,t=null){return t&&X.includes(t)?"manual_attention":G[e??"runtime_failed"]??"terminal"},"decideRetry",0,function(e){var t;let n;if("terminal"===e.disposition)return{action:"fail",disposition:"terminal"};let r=e.attemptCount<e.policy.max_attempts;if("manual_attention"===e.disposition)return r?{action:"attention"}:{action:"fail",disposition:"terminal"};if(!r)return{action:"exhausted"};let i=e.attemptCount,s=(t=e.policy,n=Math.max(0,i-1),Math.min(t.max_delay_ms,t.base_delay_ms*2**Math.min(n,30))),a=e.now+s;return null!==e.deadlineAt&&a>=e.deadlineAt?{action:"deadline"}:{action:"retry",nextEligibleAt:a,delayMs:s,retry:i}},"requestControlDefaultsFromEnv",0,M,"storedRetryPolicy",0,function(e){if(!e)return{...F};try{let t=H(JSON.parse(e));return t.ok?t.policy:{...F}}catch{return{...F}}},"validateRetryPolicy",0,H],34923);let B={cached_input_tokens:"cached_input_tokens",cachedInputTokens:"cached_input_tokens",cache_read_input_tokens:"cache_read_input_tokens",cacheReadInputTokens:"cache_read_input_tokens",cacheReadTokens:"cache_read_input_tokens",cache_creation_input_tokens:"cache_creation_input_tokens",cacheCreationInputTokens:"cache_creation_input_tokens",cacheWriteTokens:"cache_creation_input_tokens",reasoning_output_tokens:"reasoning_output_tokens",reasoningOutputTokens:"reasoning_output_tokens",reasoningTokens:"reasoning_output_tokens"};function $(e){return null===e||"object"!=typeof e||Array.isArray(e)?null:e}function K(e){return"number"==typeof e&&Number.isInteger(e)&&e>=0&&e<=Number.MAX_SAFE_INTEGER?e:null}function P(e){return"number"==typeof e&&Number.isFinite(e)&&e>=0&&e<1e9?e:null}function j(e,t,n){for(let r of t)if(r in e){let t=n(e[r]);if(null!==t)return t}return null}function Y(e,t,n){let r=e?j(e,["input_tokens","inputTokens"],K):null,i=e?j(e,["output_tokens","outputTokens"],K):null;return null===r&&null===i&&null===t?null:{input_tokens:r,output_tokens:i,cost_usd:t,source:n,breakdown:e?function(e){let t={};for(let[n,r]of Object.entries(B)){let i=K(e[n]);null!==i&&void 0===t[r]&&(t[r]=i)}return Object.keys(t).length>0?t:null}(e):null}}function z(e){let t=$(e);if(!t)return null;let n="codex.turn_completed"===t.source||"result"===t.source||"normalized"===t.source?t.source:"normalized",r=K(t.input_tokens),i=K(t.output_tokens),s=P(t.cost_usd);if(null===r&&null===i&&null===s)return null;let a=$(t.breakdown),o={};if(a)for(let e of new Set(Object.values(B))){let t=K(a[e]);null!==t&&(o[e]=t)}return{input_tokens:r,output_tokens:i,cost_usd:s,source:n,breakdown:Object.keys(o).length>0?o:null}}function J(e,t,n,r){if(!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'usage_samples'").get())return;let i=z(r.usage),a=r.now??Date.now();e.prepare(`
|
|
1
|
+
module.exports=[99904,89965,98307,76422,34923,98596,46632,94057,99684,74455,71711,23325,78636,48758,e=>{"use strict";let t;var n=e.i(85148),r=e.i(22734),i=e.i(14747),s=e.i(54799);let a=["hermes","cursor","claude","codex","muse"],o={hermes:"Hermes",cursor:"Cursor",claude:"Claude",codex:"Codex",muse:"Muse Code"},d="hermes",u={hermes:"hermes-gateway",cursor:"session-provider",claude:"session-provider",codex:"session-provider",muse:"session-provider"};class l extends Error{code="invalid-agent";constructor(e){super(`Invalid agent: ${JSON.stringify(String(e))}. Expected one of ${a.join("|")}.`)}}function _(e){if(null==e)return null;let t=String(e).trim();if(!t)return null;if(a.includes(t))return t;throw new l(e)}function c(e){return null==e?null:String(e).trim()||null}a.join("|");let E=["codex","claude","cursor","muse"];function p(e){let t=c(e);return t&&E.includes(t)?t:null}function T(e){try{let t=_(e.agent);if(t)return{agent:t,migrated:!1}}catch{}let t=c(e.runtime),n=d;if("agent-deck"===t)n=p(e.agent_client)??d;else if("hermes"!==t){let t=p(e.coding_runtime),r=c(e.deck_name),i=c(e.working_directory);t&&r&&i&&(n=t)}return{agent:n,migrated:!0}}e.s(["AGENTS",0,a,"AGENT_LABELS",0,o,"DEFAULT_AGENT",0,d,"agentTransport",0,function(e){return u[e]},"migrateLegacyAgentFields",0,T,"normalizeAgent",0,_,"resolveAgent",0,function(e){let t=d,n=!0;try{t=_(e.agent)??d}catch{n=!1}let r=c(e.runtime_connection_id),i=null;return n?r?!function(e){if(!("session_scope_kind"in e))return!0;let t=e.session_scope_kind,n=[];try{n=e.session_scope_items?JSON.parse(e.session_scope_items):[]}catch{return!1}if(!Array.isArray(n))return!1;let r=n.filter(e=>"string"==typeof e&&e.trim()).length;return"all_provider_sessions"===t?0===r:("workspaces"===t||"sessions"===t)&&r>0}(e)&&(i="session_scope"):i="connection":i="agent",{agent:t,runtime_connection_id:r,launchable:null===i,launch_blocker:i}}],89965);let m=["read_only","workspace_write"],f=["workspaces","sessions","all_provider_sessions"],g="This computer";function h(e){return`rc-local-${e}`}function N(e){return`${o[e]} on ${g.toLowerCase()}`}function R(e){return e.length>1?e.replace(/\/+$/,""):e}function v(e,t){let n=R(e),r=R(t);return n===r||r.startsWith("/"===n?"/":`${n}/`)}function y(e,t){let n="string"==typeof e?e.trim():"";if(!n)return null;let r=t&&t.trim()?t:(process.env.HOME??"").trim(),i="~"===n?r:n.startsWith("~/")?`${r}/${n.slice(2)}`:n;return i.startsWith("/")?i:null}function w(e){let t=e.session_scope_kind;if(!("string"==typeof t&&f.includes(t)))return null;let n=[];if(e.session_scope_items)try{let t=function(e){if(null==e)return[];if(!Array.isArray(e))return null;let t=[];for(let n of e){if("string"!=typeof n)return null;let e=n.trim();e&&!t.includes(e)&&t.push(e)}return t}(JSON.parse(e.session_scope_items));if(null===t)return null;n=t}catch{return null}return"all_provider_sessions"===t?0===n.length?{kind:t,workspaces:[],sessions:[]}:null:0===n.length?null:"workspaces"===t?{kind:t,workspaces:n,sessions:[]}:{kind:t,workspaces:[],sessions:n}}function L(e){return!0===e||1===e||"1"===e}function O(e){var t;return{runtime_connection_id:e.runtime_connection_id,launch_profile:"direct",deck_id:null,working_directory:null,session_scope_kind:e.session_scope.kind,session_scope_items:JSON.stringify("workspaces"===(t=e.session_scope).kind?t.workspaces:"sessions"===t.kind?t.sessions:[]),default_workspace:e.default_workspace,policy_mode:e.policy.mode,allow_new_sessions:+!!e.policy.allow_new_sessions,allow_resume_with_edits:+!!e.policy.allow_resume_with_edits,home_session_id:e.home_session_id,needs_deck_selection:0}}function k(e){var t;let n="hermes";try{n=_(e.agent)??"hermes"}catch{n="hermes"}let r=(null==(t=e.working_directory)?null:String(t).trim()||null)??`~/.botmancers/${e.id}`;return{runtime_connection_id:h(n),provider:n,session_scope_kind:"workspaces",session_scope_items:JSON.stringify([r]),policy_mode:"read_only",allow_new_sessions:1,allow_resume_with_edits:0}}function I(e){return"chief-of-staff"===String(e??"").trim().toLowerCase()}a.join("|"),e.s(["LOCAL_HOST",0,g,"directLaunchWorkspace",0,function(e,t){let n=y(e.default_workspace,t);if(n)return n;let r=w(e);return r?.kind==="workspaces"&&1===r.workspaces.length?y(r.workspaces[0],t):null},"localConnectionId",0,h,"localConnectionLabel",0,N,"migrateRegistration",0,k,"readStoredPolicy",0,function(e){var t;return"string"==typeof(t=e.policy_mode)&&m.includes(t)?{mode:e.policy_mode,allow_new_sessions:L(e.allow_new_sessions),allow_resume_with_edits:L(e.allow_resume_with_edits)}:null},"readStoredScope",0,w,"registrationColumns",0,O,"workspaceContains",0,v],98307);let S=Object.freeze(["conversation","implementation","review","revision"]),A=Object.freeze(["readonly","edit"]);Object.freeze(["ui","api","wake","continuation","exchange"]);let b=Object.freeze({conversation:"readonly",implementation:"edit",review:"readonly",revision:"edit"});function q(e){return"string"==typeof e&&S.includes(e)}function C(e,t){return{ok:!1,code:e,reason:t}}function x(e){var t,n,r,i;if(!q(e.executionKind))return C("unknown_execution_kind",`Unknown execution kind ${JSON.stringify(String(e.executionKind))}.`);let s=e.executionKind,a=(t=e.entryPoint,n=s,r=e.wakeSyntax,i=!0===e.resumesWorkRequest,"ui"===t||"api"===t?"conversation"!==n?{code:"unsupported_authority",reason:`A direct message runs as a read-only conversation turn, not ${n}.`}:"direct_message_conversation":"continuation"===t?"conversation"!==n?{code:"unsupported_authority",reason:`A coordinator continuation runs as a read-only conversation turn, not ${n}.`}:"coordinator_continuation":"exchange"===t?"conversation"!==n?{code:"unsupported_authority",reason:`A session exchange runs as a read-only conversation turn, not ${n}.`}:"session_exchange_conversation":"wake"!==t?{code:"unsupported_authority",reason:"Unknown policy entry point."}:"legacy"===r?"conversation"!==n?{code:"unsupported_authority",reason:`A legacy WAKE directive runs as a conversation turn, not ${n}.`}:"legacy_wake_conversation":"structured"!==r?{code:"unsupported_authority",reason:"Unknown Wake syntax."}:"revision"===n!==i?{code:"unsupported_authority",reason:"revision"===n?"A revision names the Work Request it resumes.":"Only a revision resumes a Work Request."}:"structured_wake");return"string"!=typeof a?C(a.code,a.reason):{ok:!0,policy:Object.freeze({policy_version:1,execution_kind:s,tool_profile:b[s],entry_point:e.entryPoint,rule:a})}}let D=new Set(["policy_version","execution_kind","tool_profile","entry_point","rule"]);function U(e){if(!e||"object"!=typeof e||Array.isArray(e))return C("malformed_policy","The execution policy snapshot is missing.");let t=Object.keys(e);if(t.length!==D.size||t.some(e=>!D.has(e)))return C("malformed_policy","The execution policy snapshot has unexpected fields.");if(1!==e.policy_version)return C("malformed_policy","Unsupported execution policy version.");if(!q(e.execution_kind))return C("unknown_execution_kind",`Unknown execution kind ${JSON.stringify(String(e.execution_kind))}.`);if(!A.includes(e.tool_profile))return C("unsupported_authority",`Unsupported tool profile ${JSON.stringify(String(e.tool_profile))}.`);if(b[e.execution_kind]!==e.tool_profile)return C("unsupported_authority",`Execution kind ${e.execution_kind} requires the ${b[e.execution_kind]} tool profile.`);let n={direct_message_conversation:{entry:["ui","api"],kinds:["conversation"]},legacy_wake_conversation:{entry:["wake"],kinds:["conversation"]},coordinator_continuation:{entry:["continuation"],kinds:["conversation"]},session_exchange_conversation:{entry:["exchange"],kinds:["conversation"]},structured_wake:{entry:["wake"],kinds:[...S]}},r="string"==typeof e.rule?n[e.rule]:void 0;return r&&r.entry.includes(e.entry_point)?r.kinds.includes(e.execution_kind)?{ok:!0,policy:Object.freeze({...e})}:C("unsupported_authority",`Rule ${e.rule} does not grant ${e.execution_kind}.`):C("malformed_policy","The execution policy rule does not match its entry point.")}e.s(["TOOL_PROFILE_FOR_KIND",0,b,"authorizeWorkRequest",0,function(e){let t;if(!q(e.execution_kind))return C("unknown_execution_kind",`Unknown execution kind ${JSON.stringify(String(e.execution_kind))}.`);try{t="string"==typeof e.policy_snapshot?JSON.parse(e.policy_snapshot):null}catch{return C("malformed_policy","The policy snapshot is not valid JSON.")}let n=U(t&&"object"==typeof t&&!Array.isArray(t)?t.execution_policy:void 0);return n.ok?n.policy.execution_kind!==e.execution_kind||n.policy.tool_profile!==e.tool_profile?C("unsupported_authority","The Work Request authority does not match its policy snapshot."):t.tool_profile!==e.tool_profile?C("malformed_policy","The policy snapshot tool profile does not match the Work Request."):n:n},"isExecutionKind",0,q,"selectExecutionPolicy",0,x,"validateExecutionPolicy",0,U],76422);let F=Object.freeze({max_attempts:1,base_delay_ms:1e3,max_delay_ms:6e4,attempt_timeout_ms:null});function W(e){if(void 0===e||!/^\d+$/.test(e.trim()))return null;let t=Number(e.trim());return Number.isSafeInteger(t)&&t>0?t:null}function M(e=process.env){let t=W(e.BOTMANCERS_RETRY_MAX_ATTEMPTS),n=W(e.BOTMANCERS_RETRY_BASE_DELAY_MS)??F.base_delay_ms,r=W(e.BOTMANCERS_RETRY_MAX_DELAY_MS)??F.max_delay_ms,i=H({max_attempts:null===t?F.max_attempts:Math.min(t,10),base_delay_ms:n,max_delay_ms:Math.max(r,n),attempt_timeout_ms:W(e.BOTMANCERS_ATTEMPT_TIMEOUT_MS)});return{deadlineMs:W(e.BOTMANCERS_REQUEST_DEADLINE_MS),retryPolicy:i.ok?i.policy:{...F}}}function H(e){if(!e||"object"!=typeof e||Array.isArray(e))return{ok:!1,reason:"A retry policy is an object."};let t=e=>"number"==typeof e&&Number.isSafeInteger(e);if(!t(e.max_attempts)||e.max_attempts<1||e.max_attempts>10)return{ok:!1,reason:"max_attempts must be an integer from 1 to 10."};if(!t(e.base_delay_ms)||e.base_delay_ms<0)return{ok:!1,reason:"base_delay_ms must be a non-negative integer."};if(!t(e.max_delay_ms)||e.max_delay_ms<e.base_delay_ms)return{ok:!1,reason:"max_delay_ms must be an integer no smaller than base_delay_ms."};let n=e.attempt_timeout_ms??null;return null!==n&&(!t(n)||n<1)?{ok:!1,reason:"attempt_timeout_ms must be a positive integer or null."}:{ok:!0,policy:{max_attempts:e.max_attempts,base_delay_ms:e.base_delay_ms,max_delay_ms:e.max_delay_ms,attempt_timeout_ms:n}}}let X=["unavailable","provider_unavailable","agent_not_found","auth_required","permission_denied","incompatible_version","usage_limit"],G={unavailable:"retryable",runtime_failed:"retryable",timed_out:"retryable",launch_failed:"terminal",unsupported_authority:"terminal",result_contract:"terminal",cancelled:"terminal",session_mismatch:"manual_attention"};e.s(["DEFAULT_RETRY_POLICY",0,F,"attemptDeadline",0,function(e,t,n){let r=null===e.attempt_timeout_ms?null:n+e.attempt_timeout_ms;return null===r?t:null===t?r:Math.min(r,t)},"classifyFailure",0,function(e,t=null){return t&&X.includes(t)?"manual_attention":G[e??"runtime_failed"]??"terminal"},"decideRetry",0,function(e){var t;let n;if("terminal"===e.disposition)return{action:"fail",disposition:"terminal"};let r=e.attemptCount<e.policy.max_attempts;if("manual_attention"===e.disposition)return r?{action:"attention"}:{action:"fail",disposition:"terminal"};if(!r)return{action:"exhausted"};let i=e.attemptCount,s=(t=e.policy,n=Math.max(0,i-1),Math.min(t.max_delay_ms,t.base_delay_ms*2**Math.min(n,30))),a=e.now+s;return null!==e.deadlineAt&&a>=e.deadlineAt?{action:"deadline"}:{action:"retry",nextEligibleAt:a,delayMs:s,retry:i}},"requestControlDefaultsFromEnv",0,M,"storedRetryPolicy",0,function(e){if(!e)return{...F};try{let t=H(JSON.parse(e));return t.ok?t.policy:{...F}}catch{return{...F}}},"validateRetryPolicy",0,H],34923);let B={cached_input_tokens:"cached_input_tokens",cachedInputTokens:"cached_input_tokens",cache_read_input_tokens:"cache_read_input_tokens",cacheReadInputTokens:"cache_read_input_tokens",cacheReadTokens:"cache_read_input_tokens",cache_creation_input_tokens:"cache_creation_input_tokens",cacheCreationInputTokens:"cache_creation_input_tokens",cacheWriteTokens:"cache_creation_input_tokens",reasoning_output_tokens:"reasoning_output_tokens",reasoningOutputTokens:"reasoning_output_tokens",reasoningTokens:"reasoning_output_tokens"};function $(e){return null===e||"object"!=typeof e||Array.isArray(e)?null:e}function K(e){return"number"==typeof e&&Number.isInteger(e)&&e>=0&&e<=Number.MAX_SAFE_INTEGER?e:null}function P(e){return"number"==typeof e&&Number.isFinite(e)&&e>=0&&e<1e9?e:null}function j(e,t,n){for(let r of t)if(r in e){let t=n(e[r]);if(null!==t)return t}return null}function Y(e,t,n){let r=e?j(e,["input_tokens","inputTokens"],K):null,i=e?j(e,["output_tokens","outputTokens"],K):null;return null===r&&null===i&&null===t?null:{input_tokens:r,output_tokens:i,cost_usd:t,source:n,breakdown:e?function(e){let t={};for(let[n,r]of Object.entries(B)){let i=K(e[n]);null!==i&&void 0===t[r]&&(t[r]=i)}return Object.keys(t).length>0?t:null}(e):null}}function z(e){let t=$(e);if(!t)return null;let n="codex.turn_completed"===t.source||"result"===t.source||"normalized"===t.source?t.source:"normalized",r=K(t.input_tokens),i=K(t.output_tokens),s=P(t.cost_usd);if(null===r&&null===i&&null===s)return null;let a=$(t.breakdown),o={};if(a)for(let e of new Set(Object.values(B))){let t=K(a[e]);null!==t&&(o[e]=t)}return{input_tokens:r,output_tokens:i,cost_usd:s,source:n,breakdown:Object.keys(o).length>0?o:null}}function J(e,t,n,r){if(!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'usage_samples'").get())return;let i=z(r.usage),a=r.now??Date.now();e.prepare(`
|
|
2
2
|
INSERT INTO usage_samples (
|
|
3
3
|
id, sample_key, agent_id, attempt_id, session_ref, turn_id, provider, source,
|
|
4
4
|
input_tokens, output_tokens, cost_usd, breakdown, observed_at, created_at, updated_at
|
|
@@ -1569,7 +1569,14 @@ module.exports=[99904,89965,98307,76422,34923,98596,46632,94057,99684,74455,7171
|
|
|
1569
1569
|
BEGIN
|
|
1570
1570
|
SELECT RAISE(ABORT, 'session_pin_events are append-only');
|
|
1571
1571
|
END;
|
|
1572
|
-
`)}}
|
|
1572
|
+
`)}},{version:21,name:"wake_edit_approval_reason_code",up:e=>{let t=["invalid_envelope","invalid_reference","unsupported_policy","target_is_group","target_not_found","target_ambiguous","target_unconfigured","target_unavailable","limit_exceeded","reviewer_not_independent","depth_exceeded","root_budget_exhausted","untracked_lineage","grant_denied","edit_approval_required"],n=t.map(()=>"?").join(", "),r=e.prepare(`SELECT id, work_request_id, reason FROM wakes WHERE reason_code IS NOT NULL AND reason_code NOT IN (${n})`).all(...t);if(0===r.length)return;let i=Date.now(),a=e.prepare("UPDATE wakes SET reason_code = 'edit_approval_required', updated_at = ? WHERE id = ?"),o=e.prepare(`
|
|
1573
|
+
UPDATE work_requests SET state_reason = 'edit_approval_required' || substr(state_reason, instr(state_reason, ':')),
|
|
1574
|
+
version = version + 1, updated_at = ?
|
|
1575
|
+
WHERE id = ? AND state = 'blocked' AND instr(state_reason, ':') > 0
|
|
1576
|
+
`),d=e.prepare(`
|
|
1577
|
+
INSERT INTO engine_events (id, request_id, sequence, attempt_id, type, data, created_at)
|
|
1578
|
+
SELECT ?, ?, COALESCE(MAX(sequence), 0) + 1, NULL, 'wake_reblocked', ?, ? FROM engine_events WHERE request_id = ?
|
|
1579
|
+
`);for(let e of r)if(a.run(i,e.id),e.work_request_id&&1===o.run(i,e.work_request_id).changes){let t=JSON.stringify({reason_code:"edit_approval_required",reason:e.reason});d.run((0,s.randomUUID)(),e.work_request_id,t,i,e.work_request_id)}}}];function el(e){return e.prepare("PRAGMA table_info(bots)").all().some(e=>"runtime_connection_id"===e.name)?"COALESCE(bot.runtime_connection_id, 'rc-local-' || b.adapter)":"'rc-local-' || b.adapter"}let e_=new WeakMap;function ec(e){let t=e_.get(e);if(!t){t=new Set,e_.set(e,t);let n=t;e.function("engine_event_purge_authorized",{deterministic:!1},e=>"string"==typeof e&&n.has(e)?1:0)}return t}function eE(e,t={}){ec(e),e.exec(`
|
|
1573
1580
|
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
1574
1581
|
version INTEGER PRIMARY KEY,
|
|
1575
1582
|
name TEXT NOT NULL,
|
|
@@ -1627,10 +1634,10 @@ module.exports=[99904,89965,98307,76422,34923,98596,46632,94057,99684,74455,7171
|
|
|
1627
1634
|
`).get(t.agentId,t.adapter,t.conversationId??"",t.requestId??"")};return _}function ey(e,t){let n=(t,...n)=>e.prepare(t).all(...n).map(e=>e.id),r=new Set(n(t.requests,t.arg)),i=new Set,s=new Set(n(t.bindings,t.arg)),a=new Set,o=(e,t)=>{let n=!1;for(let r of t)e.has(r)||(e.add(r),n=!0);return n},d=e=>JSON.stringify([...e]),u="(SELECT value FROM json_each(?))";for(;;){let e=o(i,n(`SELECT id FROM session_exchanges WHERE (${t.exchanges})
|
|
1628
1635
|
OR source_request_id IN ${u} OR destination_request_id IN ${u} OR source_attempt_id IN ${u}
|
|
1629
1636
|
OR destination_attempt_id IN ${u} OR source_binding_id IN ${u} OR destination_binding_id IN ${u}`,t.arg,t.arg,d(r),d(r),d(a),d(a),d(s),d(s))),l=o(r,n(`SELECT source_request_id AS id FROM session_exchanges WHERE id IN ${u} AND source_request_id IS NOT NULL
|
|
1630
|
-
UNION SELECT destination_request_id AS id FROM session_exchanges WHERE id IN ${u} AND destination_request_id IS NOT NULL`,d(i),d(i))),_=o(r,n(`SELECT id FROM work_requests WHERE parent_request_id IN ${u} OR root_request_id IN ${u}`,d(r),d(r))),c=o(r,n(`SELECT request_id AS id FROM work_attempts WHERE id IN ${u}`,d(a))),E=o(a,n(`SELECT id FROM work_attempts WHERE request_id IN ${u} OR resumed_session_binding_id IN ${u}`,d(r),d(s))),p=o(s,n(`SELECT id FROM session_bindings WHERE request_id IN ${u} OR source_attempt_id IN ${u}`,d(r),d(a)));if(!e&&!l&&!_&&!c&&!E&&!p)break}(function(e,t,...n){let r=e.prepare(`SELECT id FROM session_exchanges WHERE ${t}`).all(...n).map(e=>e.id);if(0===r.length)return;let i=ec(e);for(let e of r)i.add(e);try{e.prepare("DELETE FROM session_exchange_events WHERE exchange_id IN (SELECT value FROM json_each(?))").run(JSON.stringify(r))}finally{i.clear()}e.prepare("DELETE FROM session_exchanges WHERE id IN (SELECT value FROM json_each(?))").run(JSON.stringify(r))})(e,`id IN ${u}`,d(i)),e.prepare(`DELETE FROM conversation_events WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM finalizations WHERE implementation_request_id IN ${u} OR review_request_id IN ${u} OR decision_request_id IN ${u}`).run(d(r),d(r),d(r)),e.prepare(`DELETE FROM candidate_manifests WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM attempt_finalization_baselines WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM conversation_projection_cursors WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM wake_safety_decisions WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM dispatch_leases WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM attempt_launch_intents WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM dispatch_attention WHERE request_id IN ${u}`).run(d(r));let l=ec(e);for(let e of r)l.add(e);try{e.prepare(`DELETE FROM engine_events WHERE request_id IN ${u}`).run(d(r))}finally{l.clear()}for(
|
|
1637
|
+
UNION SELECT destination_request_id AS id FROM session_exchanges WHERE id IN ${u} AND destination_request_id IS NOT NULL`,d(i),d(i))),_=o(r,n(`SELECT id FROM work_requests WHERE parent_request_id IN ${u} OR root_request_id IN ${u}`,d(r),d(r))),c=o(r,n(`SELECT request_id AS id FROM work_attempts WHERE id IN ${u}`,d(a))),E=o(a,n(`SELECT id FROM work_attempts WHERE request_id IN ${u} OR resumed_session_binding_id IN ${u}`,d(r),d(s))),p=o(s,n(`SELECT id FROM session_bindings WHERE request_id IN ${u} OR source_attempt_id IN ${u}`,d(r),d(a)));if(!e&&!l&&!_&&!c&&!E&&!p)break}(function(e,t,...n){let r=e.prepare(`SELECT id FROM session_exchanges WHERE ${t}`).all(...n).map(e=>e.id);if(0===r.length)return;let i=ec(e);for(let e of r)i.add(e);try{e.prepare("DELETE FROM session_exchange_events WHERE exchange_id IN (SELECT value FROM json_each(?))").run(JSON.stringify(r))}finally{i.clear()}e.prepare("DELETE FROM session_exchanges WHERE id IN (SELECT value FROM json_each(?))").run(JSON.stringify(r))})(e,`id IN ${u}`,d(i)),e.prepare(`DELETE FROM conversation_events WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM finalizations WHERE implementation_request_id IN ${u} OR review_request_id IN ${u} OR decision_request_id IN ${u}`).run(d(r),d(r),d(r)),e.prepare(`DELETE FROM candidate_manifests WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM attempt_finalization_baselines WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM conversation_projection_cursors WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM wake_safety_decisions WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM dispatch_leases WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM attempt_launch_intents WHERE request_id IN ${u}`).run(d(r)),e.prepare(`DELETE FROM dispatch_attention WHERE request_id IN ${u}`).run(d(r));let l=ec(e);for(let e of r)l.add(e);try{e.prepare(`DELETE FROM engine_events WHERE request_id IN ${u}`).run(d(r))}finally{l.clear()}for(ew(e,`origin = 'binding' AND binding_id IN ${u}`,d(s)),e.prepare(`UPDATE provider_sessions SET binding_id = NULL WHERE binding_id IN ${u}`).run(d(s)),e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'usage_samples'").get()&&e.prepare(`DELETE FROM usage_samples WHERE attempt_id IN ${u}`).run(d(a));a.size>0||s.size>0;){let t=n(`SELECT id FROM session_bindings WHERE id IN ${u}
|
|
1631
1638
|
AND NOT EXISTS (SELECT 1 FROM work_attempts a WHERE a.resumed_session_binding_id = session_bindings.id)`,d(s));for(let n of t)e.prepare("DELETE FROM session_bindings WHERE id = ?").run(n),s.delete(n);let r=n(`SELECT id FROM work_attempts WHERE id IN ${u}
|
|
1632
|
-
AND NOT EXISTS (SELECT 1 FROM session_bindings b WHERE b.source_attempt_id = work_attempts.id)`,d(a));for(let t of r)e.prepare("DELETE FROM work_attempts WHERE id = ?").run(t),a.delete(t);if(0===t.length&&0===r.length)throw Error("Engine records could not be removed: unexpected attempt/binding reference cycle.")}for(let t of(e.prepare(`DELETE FROM conversation_events WHERE request_id IS NULL AND wake_id IN (SELECT id FROM wakes WHERE work_request_id IN ${u} OR parent_request_id IN ${u} OR root_request_id IN ${u})`).run(d(r),d(r),d(r)),e.prepare(`DELETE FROM wakes WHERE work_request_id IN ${u} OR parent_request_id IN ${u} OR root_request_id IN ${u}`).run(d(r),d(r),d(r)),e.prepare(`DELETE FROM terminal_followups WHERE request_id IN ${u}`).run(d(r)),n(`SELECT id FROM work_requests WHERE id IN ${u} ORDER BY depth DESC`,d(r))))e.prepare("DELETE FROM work_requests WHERE id = ?").run(t)}function
|
|
1633
|
-
SELECT id FROM wakes WHERE target_agent_id = ? OR (requester_agent_id = ? AND work_request_id IS NULL))`).run(t,t),e.prepare("DELETE FROM wakes WHERE target_agent_id = ? OR (requester_agent_id = ? AND work_request_id IS NULL)").run(t,t),e.prepare("DELETE FROM wake_grants WHERE caller_agent_id = ? OR target_agent_id = ?").run(t,t),
|
|
1639
|
+
AND NOT EXISTS (SELECT 1 FROM session_bindings b WHERE b.source_attempt_id = work_attempts.id)`,d(a));for(let t of r)e.prepare("DELETE FROM work_attempts WHERE id = ?").run(t),a.delete(t);if(0===t.length&&0===r.length)throw Error("Engine records could not be removed: unexpected attempt/binding reference cycle.")}for(let t of(e.prepare(`DELETE FROM conversation_events WHERE request_id IS NULL AND wake_id IN (SELECT id FROM wakes WHERE work_request_id IN ${u} OR parent_request_id IN ${u} OR root_request_id IN ${u})`).run(d(r),d(r),d(r)),e.prepare(`DELETE FROM wakes WHERE work_request_id IN ${u} OR parent_request_id IN ${u} OR root_request_id IN ${u}`).run(d(r),d(r),d(r)),e.prepare(`DELETE FROM terminal_followups WHERE request_id IN ${u}`).run(d(r)),n(`SELECT id FROM work_requests WHERE id IN ${u} ORDER BY depth DESC`,d(r))))e.prepare("DELETE FROM work_requests WHERE id = ?").run(t)}function ew(e,t,...n){if(!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'provider_sessions'").get())return;let r=JSON.stringify(e.prepare(`SELECT id FROM provider_sessions WHERE ${t}`).all(...n).map(e=>e.id));e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'usage_samples'").get()&&e.prepare("DELETE FROM usage_samples WHERE session_ref IN (SELECT value FROM json_each(?))").run(r),e.prepare("DELETE FROM provider_session_events WHERE session_ref IN (SELECT value FROM json_each(?))").run(r),e.prepare("DELETE FROM provider_session_turns WHERE session_ref IN (SELECT value FROM json_each(?))").run(r),e.prepare("DELETE FROM provider_sessions WHERE id IN (SELECT value FROM json_each(?))").run(r)}function eL(e,t,...n){if(!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'session_pins'").get())return;let r=JSON.stringify(e.prepare(`SELECT id FROM session_pins WHERE ${t}`).all(...n).map(e=>e.id));e.prepare("DELETE FROM session_pin_events WHERE pin_id IN (SELECT value FROM json_each(?))").run(r),e.prepare("DELETE FROM session_pin_turns WHERE pin_id IN (SELECT value FROM json_each(?))").run(r),e.prepare("DELETE FROM session_pins WHERE id IN (SELECT value FROM json_each(?))").run(r)}function eO(e,t){e.prepare("DELETE FROM conversation_intakes WHERE conversation_id = ?").run(t),e.prepare("DELETE FROM delegation_chains WHERE conversation_id = ?").run(t),e.prepare("DELETE FROM conversation_events WHERE conversation_id = ? AND request_id IS NULL").run(t),e.prepare("DELETE FROM wakes WHERE source_conversation_id = ?").run(t),eL(e,"conversation_id = ?",t),ey(e,{requests:"SELECT id FROM work_requests WHERE source_conversation_id = ?",bindings:"SELECT id FROM session_bindings WHERE conversation_id = ?",exchanges:"origin_conversation_id = ? OR destination_conversation_id = ?",arg:t})}function ek(e,t){e.prepare(`DELETE FROM conversation_events WHERE request_id IS NULL AND wake_id IN (
|
|
1640
|
+
SELECT id FROM wakes WHERE target_agent_id = ? OR (requester_agent_id = ? AND work_request_id IS NULL))`).run(t,t),e.prepare("DELETE FROM wakes WHERE target_agent_id = ? OR (requester_agent_id = ? AND work_request_id IS NULL)").run(t,t),e.prepare("DELETE FROM wake_grants WHERE caller_agent_id = ? OR target_agent_id = ?").run(t,t),eL(e,"agent_id = ?",t),ew(e,"agent_id = ?",t),e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'usage_samples'").get()&&e.prepare("DELETE FROM usage_samples WHERE agent_id = ?").run(t),e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'provider_session_events'").get()&&e.prepare("DELETE FROM provider_session_events WHERE agent_id = ?").run(t),ey(e,{requests:"SELECT id FROM work_requests WHERE target_agent_id = ?",bindings:"SELECT id FROM session_bindings WHERE agent_id = ?",exchanges:"source_agent_id = ? OR destination_agent_id = ?",arg:t})}e.s(["EXCHANGE_LIMITS",0,et,"EXCHANGE_TERMINAL_STATES",0,Z,"EXCHANGE_TRANSITIONS",0,ee,"EngineStoreError",0,ea,"TERMINAL_STATES",0,er,"createEngineStore",0,ev,"deleteEngineRecordsForAgent",0,ek,"deleteEngineRecordsForConversation",0,eO,"migrateEngineSchema",0,eE],94057);let eI=/^[A-Za-z0-9][A-Za-z0-9._:@-]{0,127}$/,eS=/^[a-z][a-z0-9_.:-]{0,63}$/;function eA(e){return null==e||""===e?null:eI.test(e)?e:"[invalid]"}function eb(e,t){return e&&eS.test(e)?e:t}function eq(e){return String(e??"").trim()}function eC(e){return eq(e).normalize("NFC").toLowerCase().normalize("NFC")}class ex extends Error{code="agent_name_conflict";requestedName;conflictingAgentId;constructor(e,t){super(function(e){return`An Agent named "${eq(e)}" already exists. Agent names must be unique, ignoring case and surrounding spaces.`}(e)),this.name="AgentNameConflictError",this.requestedName=eq(e),this.conflictingAgentId=t}}function eD(e=process.env){let t=(e.BOTMANCERS_HOME||"").trim();return t?i.default.resolve(t):null}function eU(e=process.env){let t=(e.BOTMANCERS_DB_PATH||"").trim()||null;if(t)return t;let n=eD(e);return n?i.default.join(n,"data/botmancers.db"):"botmancers.db"}e.s(["botmancersHome",0,eD,"dbPath",0,eU],99684);let eF=eU();":memory:"!==eF&&r.default.mkdirSync(i.default.dirname(i.default.resolve(eF)),{recursive:!0});let eW=new n.default(eF);eW.pragma("journal_mode = WAL"),eW.exec(`
|
|
1634
1641
|
CREATE TABLE IF NOT EXISTS bots (
|
|
1635
1642
|
id TEXT PRIMARY KEY,
|
|
1636
1643
|
name TEXT NOT NULL,
|
|
@@ -1892,11 +1899,11 @@ module.exports=[99904,89965,98307,76422,34923,98596,46632,94057,99684,74455,7171
|
|
|
1892
1899
|
value TEXT NOT NULL,
|
|
1893
1900
|
updated_at INTEGER NOT NULL
|
|
1894
1901
|
);
|
|
1895
|
-
`),e.s(["bots",0,e2,"default",0,eW,"engine",0,eV,"resolveWakeTarget",0,function(e){let t=eC(e);if(!t)return{ok:!1,reason:"not_found",requested:String(e??"")};let n=eW.prepare("SELECT id, name FROM bots WHERE name_key = ? LIMIT 2").all(t);return 0===n.length?{ok:!1,reason:"not_found",requested:e}:n.length>1?{ok:!1,reason:"ambiguous",requested:e}:{ok:!0,agentId:n[0].id,displayName:n[0].name}},"serviceAudit",0,eQ],99904);let e7=["read_only","workspace_write"];function te(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 tt(e,t){return{ok:!1,error:{code:e,message:t.slice(0,500)}}}function tn(e){return{ok:!0,value:e}}let tr=new Map,ti=new Map,ts=new Map;function ta(e,t){ts.set(e,t)}e.s(["normalizeCapabilities",0,function(e){let t=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:e7.filter(t=>Array.isArray(e?.authorities)&&e.authorities.includes(t)),max_page_size:Number.isInteger(t)&&t>0?Math.min(t,100):25}},"normalizeUsage",0,te,"providerError",0,tt,"providerOk",0,tn,"registerBuiltinSessionProvider",0,ta,"registerSessionProvider",0,function(e,t){let n="connectionId"in e?tr:ti,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=tr.get(e.id)??ti.get(e.provider)??ts.get(e.provider);return t?t(e):null}],74455);var to=e.i(33405);let td="Botmancers-Session-Context",tu="BOTMANCERS_SESSION_CONTEXT",tl="BOTMANCERS_SESSION_CONTEXT_TOKEN",t_="botmancers",tc="botmancers_share_current_session",tE=`mcp__${t_}__${tc}`;function tp(e){let t={};for(let[n,r]of Object.entries(e))void 0!==r&&n!==tu&&n!==tl&&(t[n]=r);return t}let tT={enabled_tools:[tc],tools:{[tc]:{approval_mode:"approve"}}};function tm(e){return{mcp_servers:{[t_]:{url:e.url,http_headers:{[td]:e.token},...tT}}}}var tf=e.i(46786);let tg=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function th(e){return"string"==typeof e&&tg.test(e)}function tN(e){return e.replace(/[^a-zA-Z0-9]/g,"-")}function tR(e){return i.default.join(e,"projects")}function tv(e){try{return r.default.readdirSync(e)}catch{return[]}}function ty(e){let t=new Set([tN(e.replace(/\/+$/,""))]);try{t.add(tN(r.default.realpathSync(e)))}catch{}return[...t]}function tL(e,t){if(!th(t))return null;for(let n of tv(tR(e))){let s=i.default.join(tR(e),n,`${t}.jsonl`);try{if(r.default.statSync(s).isFile())return s}catch{}}return null}function tw(e){let t;try{t=r.default.readFileSync(e,"utf8")}catch{return null}let n=[],i=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):i++}catch{i++}return{records:n,malformed:i}}function tO(e){let t="string"==typeof e.timestamp?Date.parse(e.timestamp):NaN;return Number.isFinite(t)?t:null}function tk(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 tI(e){return("user"===e.type||"assistant"===e.type)&&!0!==e.isSidechain&&!0!==e.isMeta}function tS(e){let t=tw(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,_=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=tO(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),tI(t)&&_++}return null===i?null:{id:e.id,workspace:i,title:s??a??o??function(e){for(let t of e){if("user"!==t.type||!tI(t))continue;let e=tk(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:_,claude_code_version:l,malformed:r}}function tA(e){try{let t=JSON.parse(r.default.readFileSync(i.default.join(e,"settings.json"),"utf8")),n=Number(t.cleanupPeriodDays);return Number.isFinite(n)&&n>0?n:30}catch{return 30}}function tb(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function tq(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);tb(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&&tb(e.rate_limit_info)&&"rejected"===e.rate_limit_info.status&&(r.rate_limit_rejected=!0);return r}let tC=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0?e:null,tx=/no conversation found/i,tD=/not logged in|please run \/login|\/login|invalid api key|authentication|unauthori[sz]ed|oauth token|credentials? (?:expired|missing|invalid)/i,tU=/usage limit|rate limit|limit reached|quota|credit balance/i;function tF(e){return!0!==e.is_error&&"success"===e.subtype}function tW(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:tx.test(n)?"session_missing":401===r||403===r||tD.test(n)?"auth_required":429===r||t.rate_limit_rejected||tU.test(n)?"usage_limit":i>0?"permission_denied":"runtime_error",message:n||`Claude Code reported ${String(e.subtype??"an error")}.`}}let tM="2.1.0",tH={read_only:{permission_mode:"dontAsk",tools:["Read","Glob","Grep"]},workspace_write:{permission_mode:"acceptEdits",tools:["Read","Glob","Grep","Edit","Write","NotebookEdit"]}},tX={list:!0,search:!0,read:!0,resume:!0,start:!0,cancel:!0,usage:!0,authorities:["read_only","workspace_write"],max_page_size:25},tG=new Map;function tB(e){try{return process.kill(e,0),!0}catch(e){return"EPERM"===e.code}}function t$(e,t=null){let n={};for(let[t,r]of Object.entries(tp(e)))void 0!==r&&(n[t]=r);return null!==t&&(n[tu]=t),n}let tK={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"),a=e.configDir??function(e=process.env){let t=(e.CLAUDE_CONFIG_DIR||"").trim();return t?i.default.resolve(t):i.default.join(tf.default.homedir(),".claude")}(t),o=e.stateDir??function(e=process.env){let t=(e.BOTMANCERS_CLAUDE_STATE_DIR||"").trim();return t?i.default.resolve(t):i.default.join(i.default.dirname(i.default.resolve(eU(e))),"claude-provider")}(t),d=e.spawn??to.spawn,u=e.isPidAlive??tB,l=e.startupTimeoutMs??6e4,_=e.exitGraceMs??1e4,c=e.pollMs??100,E=e.now??Date.now,p=i.default.join(o,"turns"),T=i.default.join(o,"keys"),m=(e,t)=>i.default.join(p,`${e}.${t}`),f=e=>{if(!/^ct-[0-9a-f-]{36}$/.test(e))return null;try{return JSON.parse(r.default.readFileSync(m(e,"json"),"utf8"))}catch{return null}},g=e=>{let t=m(e.id,`json.${process.pid}.tmp`);r.default.writeFileSync(t,JSON.stringify(e)),r.default.renameSync(t,m(e.id,"json"))},h=e=>{try{return r.default.readFileSync(e,"utf8")}catch{return""}};function N(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 R(){return new Set([...function(e,t){let n=new Set,s=i.default.join(e,"sessions");for(let e of tv(s))if(/^\d+\.json$/.test(e))try{let a=JSON.parse(r.default.readFileSync(i.default.join(s,e),"utf8"));th(a.sessionId)&&"number"==typeof a.pid&&t(a.pid)&&n.add(a.sessionId)}catch{}return n}(a,u),...function(){let e=new Set;for(let t of r.default.existsSync(p)?r.default.readdirSync(p):[]){if(!t.endsWith(".json"))continue;let n=f(t.slice(0,-5));n&&"running"===n.state&&!v(n)&&e.add(n.session_id)}return e}()])}function v(e){var t;let n,r,i=tq(h(m(e.id,"out.jsonl"))),s=e.finished_at??Date.now(),a={provider_session_id:e.session_id,usage:{input_tokens:tC((n=(t=i.result)&&tb(t.usage)?t.usage:{}).input_tokens)??tC(n.inputTokens),output_tokens:tC(n.output_tokens)??tC(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 tF(i.result)?{...a,status:"completed",output:"string"==typeof i.result.result?i.result.result:null,failure:null}:{...a,status:"failed",output:null,failure:tW(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||!u(e.pid)))return null;let o=h(m(e.id,"err.log")),d=/unknown option|unrecognized option|invalid option/i.test(o);return{...a,status:"failed",output:null,failure:d?{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 y=e=>i.default.join(T,e.replace(/[^a-zA-Z0-9_-]/g,"_"));async function L(e,i,a,o){let u,_=`ct-${(0,s.randomUUID)()}`;r.default.mkdirSync(p,{recursive:!0});let E=i.session_context?.mint({kind:"claude_turn",ref:_})??null,T=E?m(_,"mcp.json"):null;E&&T&&function(e,t){r.default.rmSync(e,{force:!0});let n=r.default.openSync(e,"wx",384);try{r.default.writeFileSync(n,JSON.stringify({mcpServers:{[t_]:{type:"http",url:t,headers:{[td]:`\${${tu}}`}}}}))}finally{r.default.closeSync(n)}r.default.chmodSync(e,384)}(T,E.url);let N={id:_,session_id:a,kind:e,authority:i.authority,workspace:o,pid:null,state:"running",exit_code:null,created_at:Date.now(),finished_at:null},R=r.default.openSync(m(_,"out.jsonl"),"a"),y=r.default.openSync(m(_,"err.log"),"a"),L=null;try{u=d(n,function(e,t,n=null){let r=tH[e],i=n?[...r.tools,tE]: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:a}:{sessionId:a},T),{cwd:o,env:t$(t,E?.token??null),stdio:["pipe",R,y],detached:!0})}finally{r.default.closeSync(R),r.default.closeSync(y)}u.on("error",e=>{L=e}),N.pid=u.pid??null,g(N),u.on("exit",e=>{let t=f(_);t&&"running"===t.state&&g({...t,state:"exited",exit_code:e,finished_at:Date.now()})}),u.stdin?.on("error",()=>{}),u.stdin?.end(i.prompt),u.unref();let O=Date.now()+l;for(;;){let e=f(_),t=tq(h(m(_,"out.jsonl")));if(L)return g({...e,state:"spawn_failed",finished_at:Date.now()}),{turn:null,error:tt("unavailable",`Claude Code could not start: ${L.message}`)};if(null!==t.session_id&&t.session_id!==a)return w(e),g({...e,state:"cancelled",finished_at:Date.now()}),{turn:null,error:tt("not_resumable","Claude Code started a different session; it was stopped.")};if(null===t.session_id&&t.result&&!tF(t.result)){let e=tW(t.result,t);return{turn:null,error:tt(tK[e.code],e.message)}}if(null!==t.session_id||t.result)return{turn:e,error:null};let n=v(e);if(n){let e=n.failure?.code;return{turn:null,error:tt(e?tK[e]??"unavailable":"unavailable",n.failure?.message??"Claude Code exited.")}}if(Date.now()>=O)return{turn:e,error:null};await new Promise(e=>setTimeout(e,Math.min(c,25)))}}function w(e){if(null!==e.pid)for(let t of[-e.pid,e.pid])try{process.kill(t,"SIGTERM");return}catch{}}async function O(e,s,a,o){if(!tH[s.authority])return tt("unsupported_authority",`No Claude Code mode for ${String(s.authority)}.`);let d=function(e){r.default.mkdirSync(T,{recursive:!0});let t=i.default.join(T,e.replace(/[^a-zA-Z0-9_-]/g,"_"));try{return r.default.writeFileSync(t,"",{flag:"wx"}),{existing:null,claimed:!0}}catch{let e=h(t).trim();return{existing:e?f(e):null,claimed:!1}}}(s.idempotency_key);if(!d.claimed)return d.existing?tn({provider_turn_id:d.existing.id,provider_session_id:d.existing.session_id}):tt("busy","A turn with this idempotency key is starting.");let u=()=>r.default.rmSync(y(s.idempotency_key),{force:!0}),l=function(){let e,r=tG.get(n);if(r)return r;try{let r=(0,to.execFileSync)(n,["--version"],{env:t$(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,tM)?{ok:!1,code:"incompatible_version",message:`Claude Code ${i} is older than ${tM}.`}:{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 tG.set(n,e),e}();if(!l.ok)return u(),tt(l.code,l.message);let _=await L(e,s,a,o);return _.turn?(r.default.writeFileSync(y(s.idempotency_key),_.turn.id),tn({provider_turn_id:_.turn.id,provider_session_id:a})):(u(),_.error)}return{kind:"claude-code",capabilities:()=>({...tX,authorities:[...tX.authorities]}),async listSessions(e){let t=e.scope;if("workspaces"===t.kind&&0===t.workspaces.length)return tn({items:[],next_cursor:null});let n="sessions"===t.kind?t.provider_session_ids.map(e=>tL(a,e)).filter(e=>!!e).map(e=>({id:i.default.basename(e,".jsonl"),file:e,mtime_ms:r.default.statSync(e).mtimeMs})):function(e,t){let n=t?t.flatMap(ty):null,s=[];for(let t of tv(tR(e))){if(n&&!n.some(e=>t===e||t.startsWith(`${e}-`)))continue;let a=i.default.join(tR(e),t);for(let e of tv(a)){if(!e.endsWith(".jsonl"))continue;let t=e.slice(0,-6);if(th(t))try{let n=r.default.statSync(i.default.join(a,e));n.isFile()&&s.push({id:t,file:i.default.join(a,e),mtime_ms:n.mtimeMs})}catch{}}}return s.sort((e,t)=>t.mtime_ms-e.mtime_ms||e.id.localeCompare(t.id))}(a,"workspaces"===t.kind?t.workspaces:null),s=Math.max(0,Number(e.cursor??0)||0),o=(e.query??"").trim().toLowerCase(),d=R(),u=E(),l=864e5*tA(a),_=[],c=20*e.limit,p=s;for(;p<n.length&&_.length<e.limit&&p-s<c;p++){if(e.signal?.aborted)return tt("cancelled","list aborted");let r=tS(n[p]);r&&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,r)&&(!o||`${r.title??""}
|
|
1896
|
-
${r.workspace??""}`.toLowerCase().includes(o))&&_.push(N(r,d,u,l))}return tn({items:_,next_cursor:p<n.length?String(p):null})},async getSession(e){let t=
|
|
1902
|
+
`),e.s(["bots",0,e2,"default",0,eW,"engine",0,eV,"resolveWakeTarget",0,function(e){let t=eC(e);if(!t)return{ok:!1,reason:"not_found",requested:String(e??"")};let n=eW.prepare("SELECT id, name FROM bots WHERE name_key = ? LIMIT 2").all(t);return 0===n.length?{ok:!1,reason:"not_found",requested:e}:n.length>1?{ok:!1,reason:"ambiguous",requested:e}:{ok:!0,agentId:n[0].id,displayName:n[0].name}},"serviceAudit",0,eQ],99904);let e7=["read_only","workspace_write"];function te(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 tt(e,t){return{ok:!1,error:{code:e,message:t.slice(0,500)}}}function tn(e){return{ok:!0,value:e}}let tr=new Map,ti=new Map,ts=new Map;function ta(e,t){ts.set(e,t)}e.s(["normalizeCapabilities",0,function(e){let t=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:e7.filter(t=>Array.isArray(e?.authorities)&&e.authorities.includes(t)),max_page_size:Number.isInteger(t)&&t>0?Math.min(t,100):25}},"normalizeUsage",0,te,"providerError",0,tt,"providerOk",0,tn,"registerBuiltinSessionProvider",0,ta,"registerSessionProvider",0,function(e,t){let n="connectionId"in e?tr:ti,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=tr.get(e.id)??ti.get(e.provider)??ts.get(e.provider);return t?t(e):null}],74455);var to=e.i(33405);let td="Botmancers-Session-Context",tu="BOTMANCERS_SESSION_CONTEXT",tl="BOTMANCERS_SESSION_CONTEXT_TOKEN",t_="botmancers",tc="botmancers_share_current_session",tE=`mcp__${t_}__${tc}`;function tp(e){let t={};for(let[n,r]of Object.entries(e))void 0!==r&&n!==tu&&n!==tl&&(t[n]=r);return t}let tT={enabled_tools:[tc],tools:{[tc]:{approval_mode:"approve"}}};function tm(e){return{mcp_servers:{[t_]:{url:e.url,http_headers:{[td]:e.token},...tT}}}}var tf=e.i(46786);let tg=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function th(e){return"string"==typeof e&&tg.test(e)}function tN(e){return e.replace(/[^a-zA-Z0-9]/g,"-")}function tR(e){return i.default.join(e,"projects")}function tv(e){try{return r.default.readdirSync(e)}catch{return[]}}function ty(e){let t=new Set([tN(e.replace(/\/+$/,""))]);try{t.add(tN(r.default.realpathSync(e)))}catch{}return[...t]}function tw(e,t){if(!th(t))return null;for(let n of tv(tR(e))){let s=i.default.join(tR(e),n,`${t}.jsonl`);try{if(r.default.statSync(s).isFile())return s}catch{}}return null}function tL(e){let t;try{t=r.default.readFileSync(e,"utf8")}catch{return null}let n=[],i=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):i++}catch{i++}return{records:n,malformed:i}}function tO(e){let t="string"==typeof e.timestamp?Date.parse(e.timestamp):NaN;return Number.isFinite(t)?t:null}function tk(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 tI(e){return("user"===e.type||"assistant"===e.type)&&!0!==e.isSidechain&&!0!==e.isMeta}function tS(e){let t=tL(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,_=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=tO(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),tI(t)&&_++}return null===i?null:{id:e.id,workspace:i,title:s??a??o??function(e){for(let t of e){if("user"!==t.type||!tI(t))continue;let e=tk(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:_,claude_code_version:l,malformed:r}}function tA(e){try{let t=JSON.parse(r.default.readFileSync(i.default.join(e,"settings.json"),"utf8")),n=Number(t.cleanupPeriodDays);return Number.isFinite(n)&&n>0?n:30}catch{return 30}}function tb(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function tq(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);tb(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&&tb(e.rate_limit_info)&&"rejected"===e.rate_limit_info.status&&(r.rate_limit_rejected=!0);return r}let tC=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0?e:null,tx=/no conversation found/i,tD=/not logged in|please run \/login|\/login|invalid api key|authentication|unauthori[sz]ed|oauth token|credentials? (?:expired|missing|invalid)/i,tU=/usage limit|rate limit|limit reached|quota|credit balance/i;function tF(e){return!0!==e.is_error&&"success"===e.subtype}function tW(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:tx.test(n)?"session_missing":401===r||403===r||tD.test(n)?"auth_required":429===r||t.rate_limit_rejected||tU.test(n)?"usage_limit":i>0?"permission_denied":"runtime_error",message:n||`Claude Code reported ${String(e.subtype??"an error")}.`}}let tM="2.1.0",tH={read_only:{permission_mode:"dontAsk",tools:["Read","Glob","Grep"]},workspace_write:{permission_mode:"acceptEdits",tools:["Read","Glob","Grep","Edit","Write","NotebookEdit"]}},tX={list:!0,search:!0,read:!0,resume:!0,start:!0,cancel:!0,usage:!0,authorities:["read_only","workspace_write"],max_page_size:25},tG=new Map;function tB(e){try{return process.kill(e,0),!0}catch(e){return"EPERM"===e.code}}function t$(e,t=null){let n={};for(let[t,r]of Object.entries(tp(e)))void 0!==r&&(n[t]=r);return null!==t&&(n[tu]=t),n}let tK={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"),a=e.configDir??function(e=process.env){let t=(e.CLAUDE_CONFIG_DIR||"").trim();return t?i.default.resolve(t):i.default.join(tf.default.homedir(),".claude")}(t),o=e.stateDir??function(e=process.env){let t=(e.BOTMANCERS_CLAUDE_STATE_DIR||"").trim();return t?i.default.resolve(t):i.default.join(i.default.dirname(i.default.resolve(eU(e))),"claude-provider")}(t),d=e.spawn??to.spawn,u=e.isPidAlive??tB,l=e.startupTimeoutMs??6e4,_=e.exitGraceMs??1e4,c=e.pollMs??100,E=e.now??Date.now,p=i.default.join(o,"turns"),T=i.default.join(o,"keys"),m=(e,t)=>i.default.join(p,`${e}.${t}`),f=e=>{if(!/^ct-[0-9a-f-]{36}$/.test(e))return null;try{return JSON.parse(r.default.readFileSync(m(e,"json"),"utf8"))}catch{return null}},g=e=>{let t=m(e.id,`json.${process.pid}.tmp`);r.default.writeFileSync(t,JSON.stringify(e)),r.default.renameSync(t,m(e.id,"json"))},h=e=>{try{return r.default.readFileSync(e,"utf8")}catch{return""}};function N(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 R(){return new Set([...function(e,t){let n=new Set,s=i.default.join(e,"sessions");for(let e of tv(s))if(/^\d+\.json$/.test(e))try{let a=JSON.parse(r.default.readFileSync(i.default.join(s,e),"utf8"));th(a.sessionId)&&"number"==typeof a.pid&&t(a.pid)&&n.add(a.sessionId)}catch{}return n}(a,u),...function(){let e=new Set;for(let t of r.default.existsSync(p)?r.default.readdirSync(p):[]){if(!t.endsWith(".json"))continue;let n=f(t.slice(0,-5));n&&"running"===n.state&&!v(n)&&e.add(n.session_id)}return e}()])}function v(e){var t;let n,r,i=tq(h(m(e.id,"out.jsonl"))),s=e.finished_at??Date.now(),a={provider_session_id:e.session_id,usage:{input_tokens:tC((n=(t=i.result)&&tb(t.usage)?t.usage:{}).input_tokens)??tC(n.inputTokens),output_tokens:tC(n.output_tokens)??tC(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 tF(i.result)?{...a,status:"completed",output:"string"==typeof i.result.result?i.result.result:null,failure:null}:{...a,status:"failed",output:null,failure:tW(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||!u(e.pid)))return null;let o=h(m(e.id,"err.log")),d=/unknown option|unrecognized option|invalid option/i.test(o);return{...a,status:"failed",output:null,failure:d?{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 y=e=>i.default.join(T,e.replace(/[^a-zA-Z0-9_-]/g,"_"));async function w(e,i,a,o){let u,_=`ct-${(0,s.randomUUID)()}`;r.default.mkdirSync(p,{recursive:!0});let E=i.session_context?.mint({kind:"claude_turn",ref:_})??null,T=E?m(_,"mcp.json"):null;E&&T&&function(e,t){r.default.rmSync(e,{force:!0});let n=r.default.openSync(e,"wx",384);try{r.default.writeFileSync(n,JSON.stringify({mcpServers:{[t_]:{type:"http",url:t,headers:{[td]:`\${${tu}}`}}}}))}finally{r.default.closeSync(n)}r.default.chmodSync(e,384)}(T,E.url);let N={id:_,session_id:a,kind:e,authority:i.authority,workspace:o,pid:null,state:"running",exit_code:null,created_at:Date.now(),finished_at:null},R=r.default.openSync(m(_,"out.jsonl"),"a"),y=r.default.openSync(m(_,"err.log"),"a"),w=null;try{u=d(n,function(e,t,n=null){let r=tH[e],i=n?[...r.tools,tE]: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:a}:{sessionId:a},T),{cwd:o,env:t$(t,E?.token??null),stdio:["pipe",R,y],detached:!0})}finally{r.default.closeSync(R),r.default.closeSync(y)}u.on("error",e=>{w=e}),N.pid=u.pid??null,g(N),u.on("exit",e=>{let t=f(_);t&&"running"===t.state&&g({...t,state:"exited",exit_code:e,finished_at:Date.now()})}),u.stdin?.on("error",()=>{}),u.stdin?.end(i.prompt),u.unref();let O=Date.now()+l;for(;;){let e=f(_),t=tq(h(m(_,"out.jsonl")));if(w)return g({...e,state:"spawn_failed",finished_at:Date.now()}),{turn:null,error:tt("unavailable",`Claude Code could not start: ${w.message}`)};if(null!==t.session_id&&t.session_id!==a)return L(e),g({...e,state:"cancelled",finished_at:Date.now()}),{turn:null,error:tt("not_resumable","Claude Code started a different session; it was stopped.")};if(null===t.session_id&&t.result&&!tF(t.result)){let e=tW(t.result,t);return{turn:null,error:tt(tK[e.code],e.message)}}if(null!==t.session_id||t.result)return{turn:e,error:null};let n=v(e);if(n){let e=n.failure?.code;return{turn:null,error:tt(e?tK[e]??"unavailable":"unavailable",n.failure?.message??"Claude Code exited.")}}if(Date.now()>=O)return{turn:e,error:null};await new Promise(e=>setTimeout(e,Math.min(c,25)))}}function L(e){if(null!==e.pid)for(let t of[-e.pid,e.pid])try{process.kill(t,"SIGTERM");return}catch{}}async function O(e,s,a,o){if(!tH[s.authority])return tt("unsupported_authority",`No Claude Code mode for ${String(s.authority)}.`);let d=function(e){r.default.mkdirSync(T,{recursive:!0});let t=i.default.join(T,e.replace(/[^a-zA-Z0-9_-]/g,"_"));try{return r.default.writeFileSync(t,"",{flag:"wx"}),{existing:null,claimed:!0}}catch{let e=h(t).trim();return{existing:e?f(e):null,claimed:!1}}}(s.idempotency_key);if(!d.claimed)return d.existing?tn({provider_turn_id:d.existing.id,provider_session_id:d.existing.session_id}):tt("busy","A turn with this idempotency key is starting.");let u=()=>r.default.rmSync(y(s.idempotency_key),{force:!0}),l=function(){let e,r=tG.get(n);if(r)return r;try{let r=(0,to.execFileSync)(n,["--version"],{env:t$(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,tM)?{ok:!1,code:"incompatible_version",message:`Claude Code ${i} is older than ${tM}.`}:{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 tG.set(n,e),e}();if(!l.ok)return u(),tt(l.code,l.message);let _=await w(e,s,a,o);return _.turn?(r.default.writeFileSync(y(s.idempotency_key),_.turn.id),tn({provider_turn_id:_.turn.id,provider_session_id:a})):(u(),_.error)}return{kind:"claude-code",capabilities:()=>({...tX,authorities:[...tX.authorities]}),async listSessions(e){let t=e.scope;if("workspaces"===t.kind&&0===t.workspaces.length)return tn({items:[],next_cursor:null});let n="sessions"===t.kind?t.provider_session_ids.map(e=>tw(a,e)).filter(e=>!!e).map(e=>({id:i.default.basename(e,".jsonl"),file:e,mtime_ms:r.default.statSync(e).mtimeMs})):function(e,t){let n=t?t.flatMap(ty):null,s=[];for(let t of tv(tR(e))){if(n&&!n.some(e=>t===e||t.startsWith(`${e}-`)))continue;let a=i.default.join(tR(e),t);for(let e of tv(a)){if(!e.endsWith(".jsonl"))continue;let t=e.slice(0,-6);if(th(t))try{let n=r.default.statSync(i.default.join(a,e));n.isFile()&&s.push({id:t,file:i.default.join(a,e),mtime_ms:n.mtimeMs})}catch{}}}return s.sort((e,t)=>t.mtime_ms-e.mtime_ms||e.id.localeCompare(t.id))}(a,"workspaces"===t.kind?t.workspaces:null),s=Math.max(0,Number(e.cursor??0)||0),o=(e.query??"").trim().toLowerCase(),d=R(),u=E(),l=864e5*tA(a),_=[],c=20*e.limit,p=s;for(;p<n.length&&_.length<e.limit&&p-s<c;p++){if(e.signal?.aborted)return tt("cancelled","list aborted");let r=tS(n[p]);r&&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,r)&&(!o||`${r.title??""}
|
|
1903
|
+
${r.workspace??""}`.toLowerCase().includes(o))&&_.push(N(r,d,u,l))}return tn({items:_,next_cursor:p<n.length?String(p):null})},async getSession(e){let t=tw(a,e.provider_session_id);if(!t)return tn(null);let n=tS({id:e.provider_session_id,file:t,mtime_ms:r.default.statSync(t).mtimeMs});return tn(n?N(n,R(),E(),864e5*tA(a)):null)},async readTranscript(e){let t=tw(a,e.provider_session_id),n=t?function(e,t){let n=tL(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(!tI(e)||void 0!==e.sessionId&&e.sessionId!==t)continue;let n=tO(e),r=tk(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 tt("not_found","Claude Code has no such session.");let r=Math.max(0,Number(e.cursor??0)||0);return tn({items:n.slice(r,r+e.limit),next_cursor:r+e.limit<n.length?String(r+e.limit):null})},async startSession(e){let t=null;try{t=r.default.statSync(e.workspace)}catch{t=null}return t?.isDirectory()?O("start",e,(0,s.randomUUID)(),e.workspace):tt("invalid_input","The workspace is not a directory here.")},async sendTurn(e){if(!th(e.provider_session_id))return tt("not_found","Not a Claude Code session id.");let t=tw(a,e.provider_session_id);if(!t)return tt("not_found","Claude Code has no such session.");let n=tS({id:e.provider_session_id,file:t,mtime_ms:r.default.statSync(t).mtimeMs});if(!n||0===n.messages||!n.workspace)return tt("not_resumable","The session has no conversation to resume.");if(R().has(n.id)){let t,n=(t=h(y(e.idempotency_key)).trim())?f(t):null;return n?tn({provider_turn_id:n.id,provider_session_id:n.session_id}):tt("busy","The session is open in a running Claude Code process.")}return O("send",e,n.id,n.workspace)},async observeTurn(e){let t=null;for(;;){let n=f(e.provider_turn_id);if(!n)return tt("not_found","No such turn.");let i=v(n);if(i&&"running"===n.state&&null!==n.pid&&u(n.pid)&&(t??=Date.now(),Date.now()-t<_&&!e.signal?.aborted&&!("number"==typeof e.deadline_at&&Date.now()>=e.deadline_at))){await new Promise(e=>setTimeout(e,c));continue}if(i)return"running"===n.state&&g({...n,state:"exited",finished_at:i.finished_at}),r.default.rmSync(m(n.id,"mcp.json"),{force:!0}),tn(i);if(e.signal?.aborted)return tt("cancelled","observe aborted");if("number"==typeof e.deadline_at&&Date.now()>=e.deadline_at)return tt("timed_out","observe deadline");await new Promise(e=>setTimeout(e,c))}},async cancelTurn(e){let t=f(e.provider_turn_id);return t?v(t)?tn("already_terminal"):(L(t),g({...t,state:"cancelled",finished_at:Date.now()}),r.default.rmSync(m(t.id,"mcp.json"),{force:!0}),tn("cancelled")):tt("not_found","No such turn.")}}}],71711);let tP={name:"botmancers",version:"1"},tj={list:!0,search:!0,read:!0,resume:!0,start:!0,cancel:!0,usage:!0,authorities:["read_only","workspace_write"],max_page_size:50},tY={list:!1,search:!1,read:!1,resume:!1,start:!1,cancel:!1,usage:!1,authorities:[],max_page_size:50};function tz(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:null}function tJ(e){return"string"==typeof e&&e.length>0?e:null}function tV(e){return"number"==typeof e&&Number.isFinite(e)&&e>=0?e:null}function tQ(e){if("string"!=typeof e)return null;let t=Date.parse(e);return Number.isFinite(t)?t:null}function tZ(e,t="durable"){let n=tz(e),r=tJ(n?.sessionId);if(!n||!r||"subagent"===n.kind)return null;let i=tJ(n.workspaceRoot),s=tJ(n.status);return{provider_session_id:r,title:tJ(n.title)??tJ(n.firstUserPrompt)??tJ(n.name),workspace:i&&i.startsWith("/")?i:null,created_at:tQ(n.createdAt),updated_at:tQ(n.lastActivityAt)??tQ(n.updatedAt),lifecycle:"open",resumable:"durable"===t&&"string"==typeof n.path&&n.path.length>0,busy:"running"===s||null!==tJ(n.activeTurnId)}}function t0(e,t){if(!Array.isArray(e))return null;let n=e.map(tz).filter(e=>!!e&&"agentMessage"===e.kind&&e.turnId===t&&!0!==e.retracted).map(e=>tJ(e.text)).filter(e=>null!==e);return n.length>0?n.join("\n"):null}function t1(e){return 0===e.length||e.some(e=>null===e)?null:e.reduce((e,t)=>e+t,0)}function t4(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 t2=/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,t3=/rate[\s_-]*limit|usage[\s_-]*limit|quota|\b429\b|rate_limited/i;function t6(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,s.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 t9(e){let t=e.lastIndexOf(":");return t<=0||t===e.length-1?null:{sessionId:e.slice(0,t),turnId:e.slice(t+1)}}class t5{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,to.spawn)(this.options.command,[...this.options.commandArgs,"serve",...t,...this.options.serveArgs],{cwd:tf.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:{...tP}});if(!i.ok)return(this.close(),n)?{code:"unavailable",message:n}:t2.test(r)?{code:"unavailable",message:"auth_required (host exited)"}:i.error;let s=tz(i.result.serverInfo),a=tz(i.result.schema);this.info={muse_version:tJ(s?.version),schema_version:"number"==typeof a?.version?a.version:null,schema_fingerprint:tJ(a?.fingerprint),durability:tJ(i.result.sessionDurability)??"durable"};try{e.stdin.write(`${JSON.stringify({jsonrpc:"2.0",method:"initialized",params:{}})}
|
|
1897
1904
|
`)}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=tz(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=tz(t.error);i(s?{ok:!1,error:(e="number"==typeof s.code?s.code:null,n=tJ(tz(s.data)?.kind)??"unknown",r=`${n} ${"string"==typeof s.message?s.message:""}`,t2.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:tz(t.result)??{}});return}if("string"!=typeof t.method||void 0!==t.id||"turn/completed"!==t.method&&"session/tokenUsage"!==t.method)return;let n=tz(t.params),r=tJ(n?.turnId),i=tJ(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})}
|
|
1898
1905
|
`)}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 t8=new Map;function t7(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:{...tY}}}let r=t4(n.muse_version);if(1!==n.schema_version)return{...n,status:"unsupported",reason:`msp_schema_${n.schema_version??"unknown"}`,capabilities:{...tY}};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,t4("1.4.0")))return{...n,status:"unsupported",reason:`muse_version_${n.muse_version??"unknown"}`,capabilities:{...tY}};let i="durable"===n.durability;return{...n,status:"ready",reason:null,capabilities:i?{...tj,authorities:[...tj.authorities]}:{...tj,list:!1,search:!1,read:!1,resume:!1,authorities:[...tj.authorities]}}}process.once("exit",()=>(function(){for(let e of t8.values())for(let t of Object.values(e.hosts))t?.close();t8.clear()})()),e.s(["createMuseSessionProvider",0,function(e,t={}){let n,r=((n=t8.get(e))||(n={hosts:{},probe:null,startKeys:new Map},t8.set(e,n)),n),i={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},s=t.cancelSettleMs??1e4;async function a(e){let t=r.hosts[e];t||(t=new t5(i,e),r.hosts[e]=t);let n=await t.start();return(r.probe=t7(t.info,n),n)?{ok:!1,error:n}:"ready"!==r.probe.status?(t.close(),{ok:!1,error:{code:"unsupported",message:r.probe.reason??"unsupported"}}):{ok:!0,host:t}}function o(){return a(["read_only","workspace_write"].find(e=>r.hosts[e]?.alive())??"read_only")}async function d(e,t,n){return e.request(t,n)}async function u(e,t){let n=await o();return n.ok?d(n.host,"session/read",{sessionId:e,excludeItems:!t}):n}function l(){return r.probe?.durability??"durable"}async function _(e,t){for(let n of Object.values(r.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 d(e,"session/read",{sessionId:t,excludeItems:!0});return n.ok?{ok:!0,session:tz(n.result.session)??{}}:n}let n=await d(e,"session/resume",{commandId:t6(),sessionId:t,excludeItems:!0});return n.ok?(e.loaded.add(t),{ok:!0,session:tz(n.result.session)??{}}):n}async function c(e,t,n){let r=await d(e,"turn/start",{commandId:t6(),sessionId:t,input:[{type:"text",text:n}]});if(!r.ok)return r;let i=tJ(r.result.turnId);return i?(e.turns.has(i)||e.turns.set(i,{sessionId:t,completed:null,usageRecords:[]}),tn(i)):tt("unavailable","provider_error (turn/start without turnId)")}async function E(e,t,n,r,i,s,a){let o,d,l,_,c=a;if(void 0===c){let t=await u(e,!0);c=t.ok?tz(t.result.history)?.items:null}let E="completed"===n?"completed":"cancelled"===n?"cancelled":"failed";return{status:E,provider_session_id:e,output:t0(c,t),failure:"completed"===E?null:"cancelled"===E?{code:"cancelled",message:tJ(i)??"cancelled"}:(o=tz(r),d=tJ(o?.kind)??"",l=(tJ(o?.message)??tJ(i)??d)||"turn failed",_=`${d} ${l}`,{code:t2.test(_)?"auth":t3.test(_)||o?.quota?"usage_cap":d||"failed",message:l.slice(0,500)}),usage:s?{input_tokens:s.input_tokens,output_tokens:s.output_tokens}:null,finished_at:Date.now()}}function p(e){for(let t of Object.values(r.hosts)){let n=t?.alive()?t.turns.get(e):void 0;if(t&&n)return{host:t,track:n}}return null}async function T(e,t,n,r){for(;;){let i=await u(e,!0);if(!i.ok)return i;let s=tz(i.result.session),a=tz(i.result.lastTurn),o=tz(i.result.history)?.items;if(a&&a.turnId===t)return tn(await E(e,t,a.terminal,a.error,a.reason,null,o));if(s?.activeTurnId!==t)return tn({status:"failed",provider_session_id:e,output:t0(o,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 tt("cancelled","observe aborted");if("number"==typeof r&&Date.now()>=r)return tt("timed_out","observe deadline");await new Promise(e=>setTimeout(e,500))}}return{kind:"muse-msp",capabilities(){let e=r.probe?.capabilities??tj;return{...e,authorities:[...e.authorities]}},async probe(){let e=await o();return r.probe??t7(null,e.ok?null:e.error)},async listSessions(e){let t=await o();if(!t.ok)return t;let n={},r="sessions"===e.scope.kind?e.scope.provider_session_ids:null;if(r){if(0===r.length)return tn({items:[],next_cursor:null});n.sessionId={anyOf:r.slice(0,200)}}let i=(e.query??"").trim().split(/\s+/).filter(Boolean).slice(0,16);i.length>0&&(n.text={allOf:i,fields:["name","title"]});let s=await d(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(!s.ok)return s;let a=tz(s.result.appliedFilter);return n.text&&!tz(a?.text)?tt("unsupported","unsupported (session/list text filter)"):tn({items:(Array.isArray(s.result.sessions)?s.result.sessions:[]).map(e=>tZ(e,l())).filter(e=>null!==e).filter(e=>!r||r.includes(e.provider_session_id)),next_cursor:tJ(s.result.nextCursor)})},async getSession(e){let t=await u(e.provider_session_id,!1);if(!t.ok)return"not_found"===t.error.code?tn(null):t;let n=tZ(t.result.session,l());return tn(n&&n.provider_session_id===e.provider_session_id?n:null)},async readTranscript(e){let t=await u(e.provider_session_id,!0);if(!t.ok)return t;let n=tz(t.result.history);if(n?.mode!=="inline")return tt("unavailable",`history_${tJ(n?.mode)??"missing"}`);let r=function(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=tz(n);if(!e||!0===e.retracted)continue;let r="userMessage"===e.kind?"user":"agentMessage"===e.kind?"assistant":null,i=tJ(e.text)??("user"===r?tJ(e.displayText):null);r&&i&&t.push({seq:t.length+1,role:r,text:i,at:tQ(e.recordedAt)})}return t}(n.items),i=e.cursor&&/^\d+$/.test(e.cursor)?Number(e.cursor):0;return tn({items:r.slice(i,i+e.limit),next_cursor:i+e.limit<r.length?String(i+e.limit):null})},async startSession(e){var t;let n=r.startKeys.get(e.idempotency_key);if(n)return tn(n);let i=await a(e.authority);if(!i.ok)return i;let s=await d(i.host,"session/start",{commandId:t6(),workspaceRoot:e.workspace,approvalMode:"denyUnmatched"});if(!s.ok)return s;let o=tJ(tz(s.result.session)?.sessionId);if(!o)return tt("unavailable","provider_error (session/start without sessionId)");i.host.loaded.add(o);let u=await c(i.host,o,e.prompt);if(!u.ok)return u;let l={provider_session_id:o,provider_turn_id:(t=u.value,`${o}:${t}`)};return r.startKeys.set(e.idempotency_key,l),tn(l)},async sendTurn(e){var t,n;let i=r.startKeys.get(e.idempotency_key);if(i)return tn(i);let s=await a(e.authority);if(!s.ok)return s;let o=await _(s.host,e.provider_session_id);if(!o.ok)return o;if("running"===o.session.status||tJ(o.session.activeTurnId))return tt("busy","busy (turn in flight)");let d=await c(s.host,e.provider_session_id,e.prompt);if(!d.ok)return d;let u={provider_session_id:e.provider_session_id,provider_turn_id:(t=e.provider_session_id,n=d.value,`${t}:${n}`)};return r.startKeys.set(e.idempotency_key,u),tn(u)},async observeTurn(e){let t=t9(e.provider_turn_id);if(!t)return tt("not_found","not_found (turn handle)");let n=p(t.turnId);if(n){let r=await n.host.waitFor(()=>null!==n.track.completed,e.signal,e.deadline_at);if("cancelled"===r)return tt("cancelled","observe aborted");if("timed_out"===r)return tt("timed_out","observe deadline");let i=n.track.completed;if(i)return tn(await E(t.sessionId,t.turnId,i.terminal,i.error,i.reason,function(e,t=[]){let n=tz(e);if(n)return{input_tokens:tV(n.inputTokens),output_tokens:tV(n.outputTokens),cost_usd:null};let r=t.map(tz).filter(e=>null!==e);return 0===r.length?null:{input_tokens:t1(r.map(e=>tV(e.inputTokens))),output_tokens:t1(r.map(e=>tV(e.outputTokens))),cost_usd:null}}(i.usage,n.track.usageRecords)))}return T(t.sessionId,t.turnId,e.signal,e.deadline_at)},async cancelTurn(e){let t=t9(e.provider_turn_id);if(!t)return tt("not_found","not_found (turn handle)");let n=p(t.turnId);if(!n){let e=await u(t.sessionId,!1);return e.ok?tz(e.result.session)?.activeTurnId===t.turnId?tt("unavailable","turn runs in another Muse host"):tn("already_terminal"):e}if(n.track.completed)return tn("already_terminal");let r=await d(n.host,"turn/cancel",{commandId:t6(),sessionId:t.sessionId,turnId:t.turnId});if(!r.ok)return r;await n.host.waitFor(()=>null!==n.track.completed,null,Date.now()+s);let i=n.track.completed?.terminal;return tn(void 0===i||"cancelled"===i?"cancelled":"already_terminal")}}}],23325);class ne{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 nt(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 nn=e=>"number"==typeof e&&Number.isFinite(e)&&e>=0?Math.trunc(e):null;function nr(e,t,n){return null===e&&null===n?null:{input_tokens:e,output_tokens:n,cached_input_tokens:t,cost_usd:null}}function ni(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 nr(nn(r.input_tokens),nn(r.cached_input_tokens),nn(r.output_tokens))}return null}(e)}}let ns=["cli","vscode","exec","appServer"],na=["thread/list","thread/read","thread/items/list","thread/turns/list","thread/start","thread/resume","turn/start","turn/interrupt"],no={"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}},nd=Object.fromEntries(na.map(e=>[e,!1]));function nu(e,t,n){return`codex:${e}:${t}:${n}`}function nl(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 n_(e){return Buffer.from(JSON.stringify(e)).toString("base64url")}function nc(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 nE=e=>"number"==typeof e&&Number.isFinite(e)?Math.round(1e3*e):null;function np(e,t){let n="string"==typeof e.cwd&&e.cwd.startsWith("/")?e.cwd:null,i=e.status?.type,s="string"==typeof e.name&&e.name.trim()?e.name:null,a="string"==typeof e.preview&&e.preview.trim()?e.preview:null;return{provider_session_id:e.id,title:s??a,workspace:n,created_at:nE(e.createdAt),updated_at:nE(e.updatedAt),lifecycle:t??("string"==typeof e.path&&e.path.split(/[\\/]/).includes("archived_sessions")?"archived":"open"),resumable:!0!==e.ephemeral&&"systemError"!==i&&null!==n&&r.default.existsSync(n),busy:"active"===i}}function nT(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 nm(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 nf(e){return"workspace_write"===e?"workspace-write":"read-only"}function ng(e){return!e.ok&&"rpc"===e.kind&&/thread not (found|loaded)|no rollout|invalid thread id|not found/i.test(e.error.message)}function nh(e,t){return"timeout"===e.kind?tt("timed_out",`${t} timed out`):"aborted"===e.kind?tt("cancelled",`${t} aborted`):"closed"===e.kind?tt("unavailable",`${t}: app-server closed`):tt("invalid_input",`${t} refused (${e.error.code})`)}class nN{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??i.default.join(i.default.dirname(i.default.resolve(eU(this.env))),"codex-exec-runs")}capabilities(){let e=this.probe?.status==="ready"?this.probe:null,t=e?.methods??nd,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??nd;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?tn(void 0):tt("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,to.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:{...nd},exec_fallback:!1,detail:n},this.probe);this.client?.close(),this.client=null;let n=new ne((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,to.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}
|
|
1899
|
-
`)},onLine:e=>r.push(e),onClose:e=>i.push(e),close(){s||(n.stdin?.end(),n.kill("SIGTERM"))}}})([...e,"app-server"],{env:tp(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(na.map(e=>n.request(e,no[e],{timeoutMs:1e4}))),s={...nd};if(na.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?nr(nn(s.inputTokens),nn(s.cachedInputTokens),nn(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??nm(t.items),e.error=t.error?.message??("failed"===e.status?"codex turn failed":null),e.finishedAt=nE(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,s.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=nc(e.cursor);if("sessions"===e.scope.kind){let n=Number(t?.i??0),r=e.scope.provider_session_ids.slice(n,n+e.limit),i=[];for(let t of r){let n=await this.getSession({...e,provider_session_id:t});if(!n.ok)return n;n.value&&i.push(n.value)}return tn({items:i,next_cursor:n+e.limit<e.scope.provider_session_ids.length?n_({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:ns,sortKey:"updated_at",...e.query?{searchTerm:e.query}:{}},e);if(!r.ok)return nh(r,"thread/list");let i=(Array.isArray(r.result?.data)?r.result.data:[]).filter(e=>e&&"string"==typeof e.id&&!0!==e.ephemeral&&!e.parentThreadId).map(e=>np(e,n)).filter(t=>"all_provider_sessions"===e.scope.kind||null!==t.workspace&&e.scope.workspaces.some(e=>v(e,t.workspace))),s=r.result?.nextCursor??null;return tn({items:i,next_cursor:s?n_({phase:n,c:s}):"open"===n?n_({phase:"archived"}):null})}async getSession(e){let t=await this.rpc("thread/read",{threadId:e.provider_session_id},e);if(!t.ok)return ng(t)?tn(null):nh(t,"thread/read");let n=t.result?.thread;return tn(n&&"string"==typeof n.id?np(n):null)}async readTranscript(e){let t=nc(e.cursor)??{},n=Number(t.n??0),r=e.provider_session_id;if("turns"!==t.mode&&this.has("thread/items/list")){let i=await this.rpc("thread/items/list",{threadId:r,cursor:"string"==typeof t.c?t.c:null,limit:e.limit,sortDirection:"asc"},e);if(i.ok){let t=(i.result?.data??[]).slice(0,e.limit);return tn({items:t.map((e,t)=>nT(e.item??{},n+t+1,e.completedAtMs??e.startedAtMs??null)).filter(e=>null!==e),next_cursor:i.result?.nextCursor?n_({c:i.result.nextCursor,n:n+t.length}):null})}if(ng(i))return tt("not_found","no such thread");if("rpc"!==i.kind||-32601!==i.error.code)return nh(i,"thread/items/list")}if(!this.has("thread/turns/list"))return tt("unsupported","no transcript method");let i="string"==typeof t.c?t.c:null,s=Number(t.skip??0),a=await this.rpc("thread/turns/list",{threadId:r,cursor:i,limit:1,sortDirection:"asc",itemsView:"full"},e);if(!a.ok)return ng(a)?tt("not_found","no such thread"):nh(a,"thread/turns/list");let o=(a.result?.data??[])[0];if(!o)return tn({items:[],next_cursor:null});let d=Array.isArray(o.items)?o.items:[],u=d.slice(s,s+e.limit),l=u.map((e,t)=>nT(e,n+t+1,null)).filter(e=>null!==e),_=n+u.length;return tn({items:l,next_cursor:s+e.limit<d.length?n_({mode:"turns",c:i,skip:s+e.limit,n:_}):a.result?.nextCursor?n_({mode:"turns",c:a.result.nextCursor,skip:0,n:_}):null})}turnInput(e){return[{type:"text",text:e,text_elements:[]}]}async beginTurn(e,t,n){var r;let i=await this.rpc("turn/start",{threadId:e,input:this.turnInput(n.prompt),cwd:t,approvalPolicy:"never",sandboxPolicy:(r=n.authority,"workspace_write"===r?{type:"workspaceWrite",writableRoots:[t],networkAccess:!1,excludeTmpdirEnvVar:!1,excludeSlashTmp:!1}:{type:"readOnly",networkAccess:!1}),clientUserMessageId:n.idempotency_key},n);if(!i.ok)return ng(i)?tt("not_found","no such thread"):nh(i,"turn/start");let s=i.result?.turn;if(!s||"string"!=typeof s.id)return tt("unavailable","turn/start returned no turn");let a=this.tracker(s.id,e);this.settle(a,s);let o={provider_turn_id:nu("as",e,s.id),provider_session_id:e};return this.keys.set(n.idempotency_key,o),tn(o)}async startSession(e){let t=this.keys.get(e.idempotency_key)??this.execRunByKey(e.idempotency_key);if(t)return tn(t);let n=this.selection().start;if(null===n)return tt("unsupported","this Codex cannot start sessions");if("exec"===n)return this.execStart(null,e.workspace,e);let r=this.mintLoad(e.session_context),i=await this.rpc("thread/start",{cwd:e.workspace,approvalPolicy:"never",sandbox:nf(e.authority),ephemeral:!1,...r?{config:tm(r)}:{}},e),s=i.ok?i.result?.thread?.id:void 0;return("string"!=typeof s&&r?.end("launch_failed"),i.ok)?"string"!=typeof s?tt("unavailable","thread/start returned no thread"):(this.markLoaded(s,r),this.beginTurn(s,e.workspace,e)):nh(i,"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 tn(t);let n=e.provider_session_id,i=this.selection().resume;if(null===i)return tt("unsupported","this Codex cannot resume sessions");if("exec"===i){let t=await this.getSession(e);return t.ok?t.value?t.value.resumable&&t.value.workspace?this.execStart(n,t.value.workspace,e):tt("not_resumable","the thread cannot be resumed"):tt("not_found","no such thread"):t}await this.connect();let s=this.isLoaded(n)?null:this.mintLoad(e.session_context),a=await this.rpc("thread/resume",{threadId:n,approvalPolicy:"never",sandbox:nf(e.authority),excludeTurns:!0,...s?{config:tm(s)}:{}},e);if(!a.ok)return s?.end("launch_failed"),ng(a)?tt("not_found","no such thread"):nh(a,"thread/resume");this.isLoaded(n)||this.markLoaded(n,s);let o="string"==typeof a.result?.cwd?a.result.cwd:a.result?.thread?.cwd;if(!o||!r.default.existsSync(o))return tt("not_resumable","the thread workspace no longer exists");let d=await this.findKeyedTurn(n,e.idempotency_key,e);if(d){let t={provider_turn_id:nu("as",n,d),provider_session_id:n};return this.keys.set(e.idempotency_key,t),tn(t)}return a.result?.thread?.status?.type==="active"?tt("busy","the thread has a turn in flight"):this.beginTurn(n,o,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 r=null;for(let i=0;i<10;i++){let i=await this.rpc("thread/turns/list",{threadId:e,cursor:r,limit:10,sortDirection:"desc",itemsView:"full"},n);if(!i.ok)return ng(i)?tt("not_found","no such thread"):nh(i,"thread/turns/list");let s=(i.result?.data??[]).find(e=>e.id===t);if(s){let r=this.tracker(t,e);if("inProgress"!==s.status)return this.settle(r,s),tn(r);let i=await this.rpc("thread/read",{threadId:e},n);if(i.ok&&i.result?.thread?.status?.type==="active")return(await this.rpc("thread/resume",{threadId:e,excludeTurns:!0},n)).ok&&!this.isLoaded(e)&&this.markLoaded(e,null),tn(r);return r.status="lost",r.output=nm(s.items),r.error="the turn ended without a result (its Codex app-server exited)",r.finishedAt=Date.now(),tn(r)}if(!(r=i.result?.nextCursor??null))break}return tt("not_found","no such turn")}async liveTracker(e,t,n){let r=this.trackers.get(t);return r&&("inProgress"!==r.status||this.client&&!this.client.closed)?tn(r):this.has("thread/turns/list")||(await this.connect(),this.has("thread/turns/list"))?this.recover(e,t,n):tt("unsupported","cannot read turn history")}async observeTurn(e){let t=nl(e.provider_turn_id);if(!t)return tt("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 r=n.value;for(;"inProgress"===r.status;){let t=await new Promise(t=>{let n=()=>o("done"),i=()=>o("aborted"),s="number"==typeof e.deadline_at?Math.max(0,e.deadline_at-Date.now()):null,a=null===s?null:setTimeout(()=>o("deadline"),s);function o(s){a&&clearTimeout(a),e.signal?.removeEventListener("abort",i);let o=r.waiters.indexOf(n);o>=0&&r.waiters.splice(o,1),t(s)}if(e.signal?.aborted)return o("aborted");r.waiters.push(n),e.signal?.addEventListener("abort",i,{once:!0})});if("aborted"===t)return tt("cancelled","observe aborted");if("deadline"===t)return tt("timed_out","observe deadline")}return tn(this.result(r))}async cancelTurn(e){let t=nl(e.provider_turn_id);if(!t)return tt("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 r=n.value;if("inProgress"!==r.status)return tn("already_terminal");if(!this.has("turn/interrupt"))return tt("unsupported","this Codex cannot interrupt turns");let i=await this.rpc("turn/interrupt",{threadId:t.threadId,turnId:t.id},e);if(!i.ok)return"inProgress"!==r.status?tn("already_terminal"):nh(i,"turn/interrupt");let s=Date.now()+1e4;for(;"inProgress"===r.status&&Date.now()<s;)await new Promise(e=>setTimeout(e,20));return"inProgress"===r.status||"interrupted"===r.status?(r.status="interrupted",r.finishedAt=r.finishedAt??Date.now(),r.waiters.splice(0).forEach(e=>e()),tn("cancelled")):tn("already_terminal")}runPath(e,t){return i.default.join(this.runsDir,`${e.replace(/[^A-Za-z0-9-]/g,"")}.${t}`)}readMeta(e){try{return JSON.parse(r.default.readFileSync(this.runPath(e,"json"),"utf8"))}catch{return null}}execRunByKey(e){if(!r.default.existsSync(this.runsDir))return null;for(let t of r.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:nu("ex",n.thread_id,String(n.run_id)),provider_session_id:n.thread_id}}return null}async execStart(e,t,n){let i,a;r.default.mkdirSync(this.runsDir,{recursive:!0});let o=(0,s.randomUUID)(),d=n.session_context?.mint({kind:"codex_exec",ref:o})??null,u=["-c",`sandbox_mode="${nf(n.authority)}"`,"-c",'approval_policy="never"',...d?(a=`mcp_servers.${t_}`,["-c",`${a}.url=${JSON.stringify(d.url)}`,"-c",`${a}.env_http_headers={ ${JSON.stringify(td)} = ${JSON.stringify(tl)} }`,"-c",`${a}.enabled_tools=[${JSON.stringify(tc)}]`,"-c",`${a}.tools.${tc}.approval_mode="approve"`]):[]],l=tp(this.env);d&&(l[tl]=d.token);let _=e?[...this.command.slice(1),"exec","resume","--json",...u,e,"-"]:[...this.command.slice(1),"exec","--json","-C",t,...u,"-"],c=r.default.openSync(this.runPath(o,"jsonl"),"a");try{i=(0,to.spawn)(this.command[0],_,{cwd:t,env:l,detached:!0,stdio:["pipe",c,"ignore"]})}catch(e){return r.default.closeSync(c),d?.end("launch_failed"),tt("unavailable",`codex exec did not start: ${e.message}`)}r.default.closeSync(c);let E=new Promise(e=>i.once("error",t=>e(t.message)));i.stdin?.on("error",()=>{}),i.stdin?.end(n.prompt);let p={run_id:o,pid:i.pid??null,thread_id:e,key:n.idempotency_key,authority:n.authority,cwd:t,correlation:n.correlation??{},cancelled:!1,started_at:Date.now()};if(r.default.writeFileSync(this.runPath(o,"json"),JSON.stringify(p)),i.unref(),!e){let e=Date.now()+3e4,t=null;for(E.then(e=>{t=e});;){let n=ni(nt(this.readLog(o)));if(n.thread_id){p.thread_id=n.thread_id,r.default.writeFileSync(this.runPath(o,"json"),JSON.stringify(p));break}if(t||n.terminal||Date.now()>e||p.pid&&!nR(p.pid))return tt("unavailable",`codex exec reported no thread${t?`: ${t}`:""}`);await new Promise(e=>setTimeout(e,25))}}return tn({provider_turn_id:nu("ex",p.thread_id,o),provider_session_id:p.thread_id})}readLog(e){try{return r.default.readFileSync(this.runPath(e,"jsonl"),"utf8")}catch{return""}}execResult(e,t){let n=this.readMeta(t);if(!n)return null;let r=ni(nt(this.readLog(t))),i="number"==typeof n.pid&&nR(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 tt("not_found","no such run");for(;;){let r=this.execResult(e,t);if(r)return tn(r);if(n.signal?.aborted)return tt("cancelled","observe aborted");if("number"==typeof n.deadline_at&&Date.now()>=n.deadline_at)return tt("timed_out","observe deadline");await new Promise(e=>setTimeout(e,25))}}execCancel(e){let t=this.readMeta(e);if(!t)return tt("not_found","no such run");let n=ni(nt(this.readLog(e)));if(t.cancelled||n.terminal||"number"!=typeof t.pid||!nR(t.pid))return tn("already_terminal");try{process.kill(t.pid,"SIGINT")}catch{return tn("already_terminal")}return r.default.writeFileSync(this.runPath(e,"json"),JSON.stringify({...t,cancelled:!0,finished_at:Date.now()})),tn("cancelled")}}function nR(e){try{return process.kill(e,0),!0}catch{return!1}}let nv=null;"off"!==process.env.BOTMANCERS_CODEX_PROVIDER&&ta("codex",()=>{var e;return nv||(nv=new nN),e=nv,{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([],78636);let ny="cursor",nL=/^[A-Za-z0-9][A-Za-z0-9._-]{0,199}$/,nw=new Map,nO=`
|
|
1906
|
+
`)},onLine:e=>r.push(e),onClose:e=>i.push(e),close(){s||(n.stdin?.end(),n.kill("SIGTERM"))}}})([...e,"app-server"],{env:tp(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(na.map(e=>n.request(e,no[e],{timeoutMs:1e4}))),s={...nd};if(na.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?nr(nn(s.inputTokens),nn(s.cachedInputTokens),nn(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??nm(t.items),e.error=t.error?.message??("failed"===e.status?"codex turn failed":null),e.finishedAt=nE(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,s.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=nc(e.cursor);if("sessions"===e.scope.kind){let n=Number(t?.i??0),r=e.scope.provider_session_ids.slice(n,n+e.limit),i=[];for(let t of r){let n=await this.getSession({...e,provider_session_id:t});if(!n.ok)return n;n.value&&i.push(n.value)}return tn({items:i,next_cursor:n+e.limit<e.scope.provider_session_ids.length?n_({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:ns,sortKey:"updated_at",...e.query?{searchTerm:e.query}:{}},e);if(!r.ok)return nh(r,"thread/list");let i=(Array.isArray(r.result?.data)?r.result.data:[]).filter(e=>e&&"string"==typeof e.id&&!0!==e.ephemeral&&!e.parentThreadId).map(e=>np(e,n)).filter(t=>"all_provider_sessions"===e.scope.kind||null!==t.workspace&&e.scope.workspaces.some(e=>v(e,t.workspace))),s=r.result?.nextCursor??null;return tn({items:i,next_cursor:s?n_({phase:n,c:s}):"open"===n?n_({phase:"archived"}):null})}async getSession(e){let t=await this.rpc("thread/read",{threadId:e.provider_session_id},e);if(!t.ok)return ng(t)?tn(null):nh(t,"thread/read");let n=t.result?.thread;return tn(n&&"string"==typeof n.id?np(n):null)}async readTranscript(e){let t=nc(e.cursor)??{},n=Number(t.n??0),r=e.provider_session_id;if("turns"!==t.mode&&this.has("thread/items/list")){let i=await this.rpc("thread/items/list",{threadId:r,cursor:"string"==typeof t.c?t.c:null,limit:e.limit,sortDirection:"asc"},e);if(i.ok){let t=(i.result?.data??[]).slice(0,e.limit);return tn({items:t.map((e,t)=>nT(e.item??{},n+t+1,e.completedAtMs??e.startedAtMs??null)).filter(e=>null!==e),next_cursor:i.result?.nextCursor?n_({c:i.result.nextCursor,n:n+t.length}):null})}if(ng(i))return tt("not_found","no such thread");if("rpc"!==i.kind||-32601!==i.error.code)return nh(i,"thread/items/list")}if(!this.has("thread/turns/list"))return tt("unsupported","no transcript method");let i="string"==typeof t.c?t.c:null,s=Number(t.skip??0),a=await this.rpc("thread/turns/list",{threadId:r,cursor:i,limit:1,sortDirection:"asc",itemsView:"full"},e);if(!a.ok)return ng(a)?tt("not_found","no such thread"):nh(a,"thread/turns/list");let o=(a.result?.data??[])[0];if(!o)return tn({items:[],next_cursor:null});let d=Array.isArray(o.items)?o.items:[],u=d.slice(s,s+e.limit),l=u.map((e,t)=>nT(e,n+t+1,null)).filter(e=>null!==e),_=n+u.length;return tn({items:l,next_cursor:s+e.limit<d.length?n_({mode:"turns",c:i,skip:s+e.limit,n:_}):a.result?.nextCursor?n_({mode:"turns",c:a.result.nextCursor,skip:0,n:_}):null})}turnInput(e){return[{type:"text",text:e,text_elements:[]}]}async beginTurn(e,t,n){var r;let i=await this.rpc("turn/start",{threadId:e,input:this.turnInput(n.prompt),cwd:t,approvalPolicy:"never",sandboxPolicy:(r=n.authority,"workspace_write"===r?{type:"workspaceWrite",writableRoots:[t],networkAccess:!1,excludeTmpdirEnvVar:!1,excludeSlashTmp:!1}:{type:"readOnly",networkAccess:!1}),clientUserMessageId:n.idempotency_key},n);if(!i.ok)return ng(i)?tt("not_found","no such thread"):nh(i,"turn/start");let s=i.result?.turn;if(!s||"string"!=typeof s.id)return tt("unavailable","turn/start returned no turn");let a=this.tracker(s.id,e);this.settle(a,s);let o={provider_turn_id:nu("as",e,s.id),provider_session_id:e};return this.keys.set(n.idempotency_key,o),tn(o)}async startSession(e){let t=this.keys.get(e.idempotency_key)??this.execRunByKey(e.idempotency_key);if(t)return tn(t);let n=this.selection().start;if(null===n)return tt("unsupported","this Codex cannot start sessions");if("exec"===n)return this.execStart(null,e.workspace,e);let r=this.mintLoad(e.session_context),i=await this.rpc("thread/start",{cwd:e.workspace,approvalPolicy:"never",sandbox:nf(e.authority),ephemeral:!1,...r?{config:tm(r)}:{}},e),s=i.ok?i.result?.thread?.id:void 0;return("string"!=typeof s&&r?.end("launch_failed"),i.ok)?"string"!=typeof s?tt("unavailable","thread/start returned no thread"):(this.markLoaded(s,r),this.beginTurn(s,e.workspace,e)):nh(i,"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 tn(t);let n=e.provider_session_id,i=this.selection().resume;if(null===i)return tt("unsupported","this Codex cannot resume sessions");if("exec"===i){let t=await this.getSession(e);return t.ok?t.value?t.value.resumable&&t.value.workspace?this.execStart(n,t.value.workspace,e):tt("not_resumable","the thread cannot be resumed"):tt("not_found","no such thread"):t}await this.connect();let s=this.isLoaded(n)?null:this.mintLoad(e.session_context),a=await this.rpc("thread/resume",{threadId:n,approvalPolicy:"never",sandbox:nf(e.authority),excludeTurns:!0,...s?{config:tm(s)}:{}},e);if(!a.ok)return s?.end("launch_failed"),ng(a)?tt("not_found","no such thread"):nh(a,"thread/resume");this.isLoaded(n)||this.markLoaded(n,s);let o="string"==typeof a.result?.cwd?a.result.cwd:a.result?.thread?.cwd;if(!o||!r.default.existsSync(o))return tt("not_resumable","the thread workspace no longer exists");let d=await this.findKeyedTurn(n,e.idempotency_key,e);if(d){let t={provider_turn_id:nu("as",n,d),provider_session_id:n};return this.keys.set(e.idempotency_key,t),tn(t)}return a.result?.thread?.status?.type==="active"?tt("busy","the thread has a turn in flight"):this.beginTurn(n,o,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 r=null;for(let i=0;i<10;i++){let i=await this.rpc("thread/turns/list",{threadId:e,cursor:r,limit:10,sortDirection:"desc",itemsView:"full"},n);if(!i.ok)return ng(i)?tt("not_found","no such thread"):nh(i,"thread/turns/list");let s=(i.result?.data??[]).find(e=>e.id===t);if(s){let r=this.tracker(t,e);if("inProgress"!==s.status)return this.settle(r,s),tn(r);let i=await this.rpc("thread/read",{threadId:e},n);if(i.ok&&i.result?.thread?.status?.type==="active")return(await this.rpc("thread/resume",{threadId:e,excludeTurns:!0},n)).ok&&!this.isLoaded(e)&&this.markLoaded(e,null),tn(r);return r.status="lost",r.output=nm(s.items),r.error="the turn ended without a result (its Codex app-server exited)",r.finishedAt=Date.now(),tn(r)}if(!(r=i.result?.nextCursor??null))break}return tt("not_found","no such turn")}async liveTracker(e,t,n){let r=this.trackers.get(t);return r&&("inProgress"!==r.status||this.client&&!this.client.closed)?tn(r):this.has("thread/turns/list")||(await this.connect(),this.has("thread/turns/list"))?this.recover(e,t,n):tt("unsupported","cannot read turn history")}async observeTurn(e){let t=nl(e.provider_turn_id);if(!t)return tt("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 r=n.value;for(;"inProgress"===r.status;){let t=await new Promise(t=>{let n=()=>o("done"),i=()=>o("aborted"),s="number"==typeof e.deadline_at?Math.max(0,e.deadline_at-Date.now()):null,a=null===s?null:setTimeout(()=>o("deadline"),s);function o(s){a&&clearTimeout(a),e.signal?.removeEventListener("abort",i);let o=r.waiters.indexOf(n);o>=0&&r.waiters.splice(o,1),t(s)}if(e.signal?.aborted)return o("aborted");r.waiters.push(n),e.signal?.addEventListener("abort",i,{once:!0})});if("aborted"===t)return tt("cancelled","observe aborted");if("deadline"===t)return tt("timed_out","observe deadline")}return tn(this.result(r))}async cancelTurn(e){let t=nl(e.provider_turn_id);if(!t)return tt("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 r=n.value;if("inProgress"!==r.status)return tn("already_terminal");if(!this.has("turn/interrupt"))return tt("unsupported","this Codex cannot interrupt turns");let i=await this.rpc("turn/interrupt",{threadId:t.threadId,turnId:t.id},e);if(!i.ok)return"inProgress"!==r.status?tn("already_terminal"):nh(i,"turn/interrupt");let s=Date.now()+1e4;for(;"inProgress"===r.status&&Date.now()<s;)await new Promise(e=>setTimeout(e,20));return"inProgress"===r.status||"interrupted"===r.status?(r.status="interrupted",r.finishedAt=r.finishedAt??Date.now(),r.waiters.splice(0).forEach(e=>e()),tn("cancelled")):tn("already_terminal")}runPath(e,t){return i.default.join(this.runsDir,`${e.replace(/[^A-Za-z0-9-]/g,"")}.${t}`)}readMeta(e){try{return JSON.parse(r.default.readFileSync(this.runPath(e,"json"),"utf8"))}catch{return null}}execRunByKey(e){if(!r.default.existsSync(this.runsDir))return null;for(let t of r.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:nu("ex",n.thread_id,String(n.run_id)),provider_session_id:n.thread_id}}return null}async execStart(e,t,n){let i,a;r.default.mkdirSync(this.runsDir,{recursive:!0});let o=(0,s.randomUUID)(),d=n.session_context?.mint({kind:"codex_exec",ref:o})??null,u=["-c",`sandbox_mode="${nf(n.authority)}"`,"-c",'approval_policy="never"',...d?(a=`mcp_servers.${t_}`,["-c",`${a}.url=${JSON.stringify(d.url)}`,"-c",`${a}.env_http_headers={ ${JSON.stringify(td)} = ${JSON.stringify(tl)} }`,"-c",`${a}.enabled_tools=[${JSON.stringify(tc)}]`,"-c",`${a}.tools.${tc}.approval_mode="approve"`]):[]],l=tp(this.env);d&&(l[tl]=d.token);let _=e?[...this.command.slice(1),"exec","resume","--json",...u,e,"-"]:[...this.command.slice(1),"exec","--json","-C",t,...u,"-"],c=r.default.openSync(this.runPath(o,"jsonl"),"a");try{i=(0,to.spawn)(this.command[0],_,{cwd:t,env:l,detached:!0,stdio:["pipe",c,"ignore"]})}catch(e){return r.default.closeSync(c),d?.end("launch_failed"),tt("unavailable",`codex exec did not start: ${e.message}`)}r.default.closeSync(c);let E=new Promise(e=>i.once("error",t=>e(t.message)));i.stdin?.on("error",()=>{}),i.stdin?.end(n.prompt);let p={run_id:o,pid:i.pid??null,thread_id:e,key:n.idempotency_key,authority:n.authority,cwd:t,correlation:n.correlation??{},cancelled:!1,started_at:Date.now()};if(r.default.writeFileSync(this.runPath(o,"json"),JSON.stringify(p)),i.unref(),!e){let e=Date.now()+3e4,t=null;for(E.then(e=>{t=e});;){let n=ni(nt(this.readLog(o)));if(n.thread_id){p.thread_id=n.thread_id,r.default.writeFileSync(this.runPath(o,"json"),JSON.stringify(p));break}if(t||n.terminal||Date.now()>e||p.pid&&!nR(p.pid))return tt("unavailable",`codex exec reported no thread${t?`: ${t}`:""}`);await new Promise(e=>setTimeout(e,25))}}return tn({provider_turn_id:nu("ex",p.thread_id,o),provider_session_id:p.thread_id})}readLog(e){try{return r.default.readFileSync(this.runPath(e,"jsonl"),"utf8")}catch{return""}}execResult(e,t){let n=this.readMeta(t);if(!n)return null;let r=ni(nt(this.readLog(t))),i="number"==typeof n.pid&&nR(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 tt("not_found","no such run");for(;;){let r=this.execResult(e,t);if(r)return tn(r);if(n.signal?.aborted)return tt("cancelled","observe aborted");if("number"==typeof n.deadline_at&&Date.now()>=n.deadline_at)return tt("timed_out","observe deadline");await new Promise(e=>setTimeout(e,25))}}execCancel(e){let t=this.readMeta(e);if(!t)return tt("not_found","no such run");let n=ni(nt(this.readLog(e)));if(t.cancelled||n.terminal||"number"!=typeof t.pid||!nR(t.pid))return tn("already_terminal");try{process.kill(t.pid,"SIGINT")}catch{return tn("already_terminal")}return r.default.writeFileSync(this.runPath(e,"json"),JSON.stringify({...t,cancelled:!0,finished_at:Date.now()})),tn("cancelled")}}function nR(e){try{return process.kill(e,0),!0}catch{return!1}}let nv=null;"off"!==process.env.BOTMANCERS_CODEX_PROVIDER&&ta("codex",()=>{var e;return nv||(nv=new nN),e=nv,{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([],78636);let ny="cursor",nw=/^[A-Za-z0-9][A-Za-z0-9._-]{0,199}$/,nL=new Map,nO=`
|
|
1900
1907
|
import { createRequire } from 'module';
|
|
1901
1908
|
import { pathToFileURL } from 'url';
|
|
1902
1909
|
import path from 'path';
|
|
@@ -1928,9 +1935,9 @@ try {
|
|
|
1928
1935
|
if (op === 'turn') out({ type: 'result', subtype: 'sdk_error', is_error: true, result: null });
|
|
1929
1936
|
process.exit(op === 'probe' ? 3 : 1);
|
|
1930
1937
|
}
|
|
1931
|
-
`;function nk(e,t,n){return["--input-type=module","-e",nO,e,t.sdkModule,...n]}function nI(e){return"string"==typeof e?e:null}function nS(e,t){let n=e.env??process.env,r=e.stateDir??(n.BOTMANCERS_CURSOR_STATE_DIR?.trim()||i.default.join(i.default.dirname(i.default.resolve(eU(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:i.default.join(r,t.replace(/[^A-Za-z0-9._-]/g,"_")),pollMs:e.pollMs??100,env:void 0!==n[tu]||void 0!==n[tl]?tp(n):n}}function nA(e){return i.default.join(e.stateDir,"state.json")}function nb(e,t,n){return i.default.join(e.stateDir,"turns",`${t}.${n}`)}function nq(e){try{let t=JSON.parse(r.default.readFileSync(nA(e),"utf8"));if(t&&1===t.version)return t}catch{}return{version:1,chats:{},turns:{},keys:{}}}function nC(e,t){r.default.mkdirSync(i.default.join(e.stateDir,"turns"),{recursive:!0});let n=`${nA(e)}.${process.pid}.${(0,s.randomUUID)()}.tmp`;r.default.writeFileSync(n,JSON.stringify(t)),r.default.renameSync(n,nA(e))}function nx(e){try{return r.default.readFileSync(e,"utf8")}catch{return null}}function nD(e){if(!e)return!1;try{return process.kill(e,0),!0}catch(e){return"EPERM"===e.code}}function nU(e){try{return r.default.realpathSync(e)}catch{return i.default.resolve(e)}}function nF(e){try{return r.default.statSync(e).isDirectory()}catch{return!1}}function nW(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 nM(e,t){let n=nx(nb(e,t.id,"exit")),r=null!==n||!nD(t.pid),i=function(e,t=!1){let n={init:null,steps:[],result:null,result_events:0,malformed:0},r=e.split("\n");for(let e of(t||r.pop(),r)){let t,r=e.trim();if(!r)continue;try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("not an object");t=e}catch{n.malformed++;continue}let i="number"==typeof t.timestamp_ms?t.timestamp_ms:null;if("system"!==t.type||"init"!==t.subtype||n.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?nI(e.text):null).filter(e=>null!==e);return n.length?n.join(""):null}(t.message);e&&n.steps.push({role:"assistant",text:e,at:i})}else"tool_call"===t.type&&"completed"===t.subtype?n.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:i}):"result"===t.type&&(n.result_events++,n.result||(n.result={ok:!1===t.is_error&&"success"===t.subtype,subtype:nI(t.subtype),text:nI(t.result),usage:function(e){let t=e.usage&&"object"==typeof e.usage?e.usage:null,n=e.total_cost_usd??t?.costUsd??t?.cost_usd;return t||void 0!==n?te({input_tokens:t?.inputTokens??t?.input_tokens,output_tokens:t?.outputTokens??t?.output_tokens,cost_usd:n}):null}(t)}));else n.init={session_id:nI(t.session_id),cwd:nI(t.cwd)}}return n}(nx(nb(e,t.id,"out"))??"",r),s=Date.now();if(i.init){if(i.init.session_id!==t.chat)return nW(t,"session_mismatch",i,s);if(null!==i.init.cwd&&nU(i.init.cwd)!==nU(t.workspace))return nW(t,"workspace_mismatch",i,s)}if(i.result){if(!i.result.ok)return nW(t,`cursor_${(i.result.subtype??"error").replace(/[^A-Za-z0-9_]/g,"_").slice(0,40)}`,i,s);let e=i.result.text??(i.steps.filter(e=>"assistant"===e.role).map(e=>e.text).join("\n")||null);return{state:"terminal",parsed:i,result:{status:"completed",provider_session_id:t.chat,output:e,failure:null,usage:i.result.usage,finished_at:s}}}return null!==t.cancel_requested_at?{state:"terminal",parsed:i,result:{status:"cancelled",provider_session_id:t.chat,output:null,failure:{code:"cancelled",message:"cancelled"},usage:null,finished_at:t.cancel_requested_at}}:null!==n?nW(t,`exit_${String(Number.parseInt(n,10))}`,i,s):nD(t.pid)?{state:"running",parsed:i}:nW(t,"process_lost",i,s)}function nH(e,t,n,r,i){return new Promise(s=>{let a=(0,to.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 nX(e,t,n){let r="cli"===t?await nH(e.cliPath,["create-chat"],n,e,6e4):await nH(process.execPath,nk("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&&
|
|
1938
|
+
`;function nk(e,t,n){return["--input-type=module","-e",nO,e,t.sdkModule,...n]}function nI(e){return"string"==typeof e?e:null}function nS(e,t){let n=e.env??process.env,r=e.stateDir??(n.BOTMANCERS_CURSOR_STATE_DIR?.trim()||i.default.join(i.default.dirname(i.default.resolve(eU(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:i.default.join(r,t.replace(/[^A-Za-z0-9._-]/g,"_")),pollMs:e.pollMs??100,env:void 0!==n[tu]||void 0!==n[tl]?tp(n):n}}function nA(e){return i.default.join(e.stateDir,"state.json")}function nb(e,t,n){return i.default.join(e.stateDir,"turns",`${t}.${n}`)}function nq(e){try{let t=JSON.parse(r.default.readFileSync(nA(e),"utf8"));if(t&&1===t.version)return t}catch{}return{version:1,chats:{},turns:{},keys:{}}}function nC(e,t){r.default.mkdirSync(i.default.join(e.stateDir,"turns"),{recursive:!0});let n=`${nA(e)}.${process.pid}.${(0,s.randomUUID)()}.tmp`;r.default.writeFileSync(n,JSON.stringify(t)),r.default.renameSync(n,nA(e))}function nx(e){try{return r.default.readFileSync(e,"utf8")}catch{return null}}function nD(e){if(!e)return!1;try{return process.kill(e,0),!0}catch(e){return"EPERM"===e.code}}function nU(e){try{return r.default.realpathSync(e)}catch{return i.default.resolve(e)}}function nF(e){try{return r.default.statSync(e).isDirectory()}catch{return!1}}function nW(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 nM(e,t){let n=nx(nb(e,t.id,"exit")),r=null!==n||!nD(t.pid),i=function(e,t=!1){let n={init:null,steps:[],result:null,result_events:0,malformed:0},r=e.split("\n");for(let e of(t||r.pop(),r)){let t,r=e.trim();if(!r)continue;try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("not an object");t=e}catch{n.malformed++;continue}let i="number"==typeof t.timestamp_ms?t.timestamp_ms:null;if("system"!==t.type||"init"!==t.subtype||n.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?nI(e.text):null).filter(e=>null!==e);return n.length?n.join(""):null}(t.message);e&&n.steps.push({role:"assistant",text:e,at:i})}else"tool_call"===t.type&&"completed"===t.subtype?n.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:i}):"result"===t.type&&(n.result_events++,n.result||(n.result={ok:!1===t.is_error&&"success"===t.subtype,subtype:nI(t.subtype),text:nI(t.result),usage:function(e){let t=e.usage&&"object"==typeof e.usage?e.usage:null,n=e.total_cost_usd??t?.costUsd??t?.cost_usd;return t||void 0!==n?te({input_tokens:t?.inputTokens??t?.input_tokens,output_tokens:t?.outputTokens??t?.output_tokens,cost_usd:n}):null}(t)}));else n.init={session_id:nI(t.session_id),cwd:nI(t.cwd)}}return n}(nx(nb(e,t.id,"out"))??"",r),s=Date.now();if(i.init){if(i.init.session_id!==t.chat)return nW(t,"session_mismatch",i,s);if(null!==i.init.cwd&&nU(i.init.cwd)!==nU(t.workspace))return nW(t,"workspace_mismatch",i,s)}if(i.result){if(!i.result.ok)return nW(t,`cursor_${(i.result.subtype??"error").replace(/[^A-Za-z0-9_]/g,"_").slice(0,40)}`,i,s);let e=i.result.text??(i.steps.filter(e=>"assistant"===e.role).map(e=>e.text).join("\n")||null);return{state:"terminal",parsed:i,result:{status:"completed",provider_session_id:t.chat,output:e,failure:null,usage:i.result.usage,finished_at:s}}}return null!==t.cancel_requested_at?{state:"terminal",parsed:i,result:{status:"cancelled",provider_session_id:t.chat,output:null,failure:{code:"cancelled",message:"cancelled"},usage:null,finished_at:t.cancel_requested_at}}:null!==n?nW(t,`exit_${String(Number.parseInt(n,10))}`,i,s):nD(t.pid)?{state:"running",parsed:i}:nW(t,"process_lost",i,s)}function nH(e,t,n,r,i){return new Promise(s=>{let a=(0,to.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 nX(e,t,n){let r="cli"===t?await nH(e.cliPath,["create-chat"],n,e,6e4):await nH(process.execPath,nk("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&&nw.test(s)?s:null}function nG(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 nB(e,t){let n;r.default.mkdirSync(e.stateDir,{recursive:!0});let s="cli"===t?await nH(e.cliPath,["ls","--output-format","json"],e.stateDir,e,6e4):await nH(process.execPath,nk("list",e,[]),e.stateDir,e,6e4);if(0!==s.status)return null;try{n=JSON.parse(s.stdout.trim())}catch{return null}let a=Array.isArray(n)?n:n?.sessions??n?.chats;if(!Array.isArray(a))return null;let o=[];for(let e of a){if(!e||"object"!=typeof e)continue;let t=nI(e.id)??nI(e.chatId)??nI(e.session_id);if(!t||!nw.test(t))continue;let n=nI(e.cwd)??nI(e.workspace);o.push({id:t,workspace:n&&i.default.isAbsolute(n)?n:null,title:nI(e.title)??nI(e.name),created_at:nG(e.createdAt??e.created_at),updated_at:nG(e.updatedAt??e.updated_at)})}return o}e.s(["CURSOR_PROVIDER_KIND",0,ny,"cursorSessionProviderFactory",0,function(e){return function(e,t={}){let n=nS(t,e.id),a=()=>(function(e={}){let t=nS(e,"probe"),n=`${t.cliPath}
|
|
1932
1939
|
${t.sdkModule}
|
|
1933
|
-
${t.env===process.env?"":JSON.stringify(t.env)}`,r=
|
|
1940
|
+
${t.env===process.env?"":JSON.stringify(t.env)}`,r=nL.get(n);if(r&&Date.now()-r.at<3e5)return r.probe;let i=function(e){let t=(0,to.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,to.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,to.spawnSync)(process.execPath,nk("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 nL.set(n,{at:Date.now(),probe:a}),a})(t),o=()=>{var e;let t;return t=null!==(e=a()).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}},d=e=>tt(null===a().backend?"unavailable":"unsupported",`Cursor ${e} is not available.`);function u(e,t,r){let i=r.turns.some(t=>e.turns[t]&&"running"===nM(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 l(e){let t=await nB(n,e);return t?tn(t):tt("unavailable","Cursor session listing failed.")}function _(e,t,a,o){let d=e.chats[a],u={id:`ct-${(0,s.randomUUID)()}`,chat:a,workspace:d.workspace,prompt:o.prompt,authority:o.authority,backend:t,pid:null,started_at:Date.now(),cancel_requested_at:null,correlation:{...o.correlation}};return e.turns[u.id]=u,e.keys[o.idempotency_key]=u.id,d.turns.push(u.id),nC(n,e),u.pid=function(e,t){r.default.mkdirSync(i.default.join(e.stateDir,"turns"),{recursive:!0});let[n,s]="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,nk("turn",e,[t.chat,t.workspace,"read_only"===t.authority?"ask":"-",t.prompt])];try{let r=(0,to.spawn)("/bin/sh",["-c",'"$@" >"$BM_OUT" 2>"$BM_ERR" </dev/null; echo $? >"$BM_EXIT.tmp" && mv "$BM_EXIT.tmp" "$BM_EXIT"',"sh",n,...s],{cwd:t.workspace,detached:!0,stdio:"ignore",env:{...e.env,BM_OUT:nb(e,t.id,"out"),BM_ERR:nb(e,t.id,"err"),BM_EXIT:nb(e,t.id,"exit"),BOTMANCERS_CORRELATION:JSON.stringify(t.correlation)}});return r.on("error",()=>{}),r.unref(),r.pid??null}catch{return null}}(n,u),nC(n,e),tn({provider_turn_id:u.id,provider_session_id:a})}function c(e,t){let n=e.keys[t];return n&&e.turns[n]?tn({provider_turn_id:n,provider_session_id:e.turns[n].chat}):null}return{kind:ny,probe:a,capabilities:o,async listSessions(e){let t=a().backend;if(!t||!o().list)return d("session listing");let r=await l(t);if(!r.ok)return r;let i=nq(n),s=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(/\/+$/,"")}/`)))}),_=e.cursor&&/^\d+$/.test(e.cursor)?Number(e.cursor):0,c=s.slice(_,_+Math.min(e.limit,50)),E=Date.now();for(let e of c)!i.chats[e.id]&&e.workspace&&(i.chats[e.id]={workspace:e.workspace,title:e.title,origin:"listed",created_at:e.created_at??E,updated_at:e.updated_at??E,turns:[]});return nC(n,i),tn({items:c.map(e=>i.chats[e.id]?{...u(i,e.id,i.chats[e.id]),title:e.title??i.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<s.length?String(_+c.length):null})},async getSession(e){let t=a().backend;if(!t)return d("sessions");let r=nq(n),i=r.chats[e.provider_session_id];if(!i)return tn(null);if(o().list){let n=await l(t);if(!n.ok)return n;if(!n.value.some(t=>t.id===e.provider_session_id))return tn(null)}return tn(u(r,e.provider_session_id,i))},async importSession(e){let t=a().backend;if(!t)return d("sessions");if(!nw.test(e.provider_session_id))return tt("invalid_input","Not a Cursor session id.");if(!i.default.isAbsolute(e.workspace)||!nF(e.workspace))return tt("invalid_input","workspace must be an existing absolute directory.");let r=nq(n),s=r.chats[e.provider_session_id];if(s)return tn(u(r,e.provider_session_id,s));let _=e.workspace,c=null;if(o().list){let n=await l(t);if(!n.ok)return n;let r=n.value.find(t=>t.id===e.provider_session_id);if(!r)return tt("not_found","Cursor does not list that session.");_=r.workspace??_,c=r.title}let E=Date.now();return r.chats[e.provider_session_id]={workspace:_,title:c,origin:o().list?"listed":"imported",created_at:E,updated_at:E,turns:[]},nC(n,r),tn(u(r,e.provider_session_id,r.chats[e.provider_session_id]))},async readTranscript(e){if(!a().backend)return d("transcripts");let t=nq(n),r=t.chats[e.provider_session_id];if(!r)return tt("not_found","Unknown Cursor session.");let i=[];for(let e of r.turns){let r=t.turns[e];if(r)for(let e of(i.push({seq:i.length+1,role:"user",text:r.prompt,at:r.started_at}),nM(n,r).parsed.steps))i.push({seq:i.length+1,role:e.role,text:e.text,at:e.at})}let s=e.cursor&&/^\d+$/.test(e.cursor)?Number(e.cursor):0,o=i.slice(s,s+Math.min(e.limit,50));return tn({items:o,next_cursor:s+o.length<i.length?String(s+o.length):null})},async startSession(e){let t=a().backend;if(!t)return d("sessions");let r=c(nq(n),e.idempotency_key);if(r)return r;if(!i.default.isAbsolute(e.workspace)||!nF(e.workspace))return tt("invalid_input","workspace must be an existing absolute directory.");let s=await nX(n,t,e.workspace);if(!s)return tt("unavailable","Cursor did not create a chat.");let o=nq(n),u=Date.now();return o.chats[s]={workspace:e.workspace,title:null,origin:"created",created_at:u,updated_at:u,turns:[]},_(o,t,s,e)},async sendTurn(e){let t=a().backend;if(!t)return d("sessions");let r=nq(n),i=c(r,e.idempotency_key);if(i)return i;let s=r.chats[e.provider_session_id];return s?s.turns.some(e=>r.turns[e]&&"running"===nM(n,r.turns[e]).state)?tt("busy","A turn is in flight."):_(r,t,e.provider_session_id,e):tt("not_found","Unknown Cursor session.")},async observeTurn(e){for(;;){let t=nq(n).turns[e.provider_turn_id];if(!t)return tt("not_found","Unknown Cursor turn.");let r=nM(n,t);if("terminal"===r.state)return tn(r.result);if(e.signal?.aborted)return tt("cancelled","observe aborted");if("number"==typeof e.deadline_at&&Date.now()>=e.deadline_at)return tt("timed_out","observe deadline");await new Promise(e=>setTimeout(e,n.pollMs))}},async cancelTurn(e){let t=nq(n),r=t.turns[e.provider_turn_id];if(!r)return tt("not_found","Unknown Cursor turn.");if("terminal"===nM(n,r).state)return tn("already_terminal");if(r.cancel_requested_at=Date.now(),nC(n,t),r.pid){try{process.kill(-r.pid,"SIGTERM")}catch{}let e=r.pid;setTimeout(()=>{try{process.kill(-e,"SIGKILL")}catch{}},2e3).unref()}return tn("cancelled")}}}(e)}],48758)},69312,1537,e=>{"use strict";e.s(["ProviderSessionError",()=>N,"cancelProviderTurn",()=>es,"getProviderTurn",()=>ea,"observeProviderTurn",()=>ei,"privateProviderIds",()=>eo,"sendProviderTurn",()=>ee,"startProviderSession",()=>Z,"syncHistoryAtRegistration",()=>G],69312),e.s(["attachSessionContextsToTurn",()=>m,"bindSessionContext",()=>T,"endSessionContext",()=>h,"endTurnSessionContexts",()=>g,"mintSessionContext",()=>p],1537);var t=e.i(54799),n=e.i(98307),r=e.i(74455),i=e.i(71711),s=e.i(23325);e.i(78636);var a=e.i(98596),o=e.i(46632),d=e.i(48758),u=e.i(99904),l=e.i(89443);Object.freeze({kind:"service",id:"botmancers-session-context"}),u.default.exec(`
|
|
1934
1941
|
CREATE TABLE IF NOT EXISTS session_contexts (
|
|
1935
1942
|
id TEXT PRIMARY KEY CHECK (id LIKE 'sctx_%'),
|
|
1936
1943
|
token_sha256 TEXT NOT NULL UNIQUE CHECK (length(token_sha256) = 64),
|
|
@@ -1969,7 +1976,7 @@ ${r}`)),e.processBound?`${process.pid}:${Math.round(performance.timeOrigin)}`:nu
|
|
|
1969
1976
|
`).run(t,n,n,e).changes}function h(e,t){return 1===f(e,"ended",t)}(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 N extends Error{code;constructor(e,t){super(t),this.name="ProviderSessionError",this.code=e}}function R(e,t){let i=e.prepare(`
|
|
1970
1977
|
SELECT id, runtime_connection_id, session_scope_kind, session_scope_items, policy_mode, allow_new_sessions, allow_resume_with_edits
|
|
1971
1978
|
FROM bots WHERE id = ?
|
|
1972
|
-
`).get(t);if(!i)throw new N("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 N("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 v(e,t,n={}){let i=R(e,t);if(!i.provider.ready)return i;let s=await i.provider.ready(O(n));return s.ok||
|
|
1979
|
+
`).get(t);if(!i)throw new N("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 N("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 v(e,t,n={}){let i=R(e,t);if(!i.provider.ready)return i;let s=await i.provider.ready(O(n));return s.ok||L(s.error),{...i,capabilities:(0,r.normalizeCapabilities)(i.provider.capabilities())}}function y(e,t){if(!e.capabilities[t])throw new N("unsupported",`The session provider does not support ${t}.`)}function w(e){if(!e.scope)throw new N("scope_missing","The Agent has no session scope.");return e.scope}function L(e,t="provider_failed"){throw new N("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 O(e){return{correlation:{...e.correlation??{}},signal:e.signal??null,deadline_at:e.deadlineAt??null}}function k(e,t){let n=[];return{minted:n,minter:{mint:r=>{let i=p({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=>{h(s,e)}}}},record:(e,t)=>{for(let t of n)T(t,e);m(n,t)},abandon:()=>{for(let e of n)h(e,"launch_failed")}}}let I="SELECT * FROM provider_sessions";function S(e,t,n){let r=e.prepare(`${I} WHERE id = ? AND agent_id = ?`).get(n,t);if(!r)throw new N("session_not_found","No session with that reference.");return r}function A(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 b(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 q(e){return"string"==typeof e&&e.startsWith("/")?e:null}function C(e,t,r){if("all_provider_sessions"===e.kind)return!0;if("sessions"===e.kind)return r.has(t.provider_session_id);let i=q(t.workspace);return null!==i&&e.workspaces.some(e=>(0,n.workspaceContains)(e,i))}function x(e,t,n){return"sessions"!==n.kind||0===n.sessions.length?new Set:new Set(e.prepare(`
|
|
1973
1980
|
SELECT provider_session_id FROM provider_sessions
|
|
1974
1981
|
WHERE agent_id = ? AND runtime_connection_id = ? AND id IN (SELECT value FROM json_each(?))
|
|
1975
1982
|
`).all(t.agentId,t.connection.id,JSON.stringify(n.sessions)).map(e=>e.provider_session_id))}function D(e,n,r,i,s,a=null){var o;let d=(o=r.provider_session_id,e.prepare(`
|
|
@@ -1985,13 +1992,13 @@ ${r}`)),e.processBound?`${process.pid}:${Math.round(performance.timeOrigin)}`:nu
|
|
|
1985
1992
|
provider_created_at = COALESCE(?, provider_created_at), provider_updated_at = COALESCE(?, provider_updated_at),
|
|
1986
1993
|
availability = 'available', lifecycle = ?, resumable = ?, busy = ?, capabilities = ?, last_synced_at = ?, updated_at = ?
|
|
1987
1994
|
WHERE id = ?
|
|
1988
|
-
`).run(b(r.title),q(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 F(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),A(e,{agentId:t.agent_id,sessionRef:t.id,type:"session_missing",now:n}))}async function W(e,t,n={}){let r=await v(e,t,n);y(r,"list");let i="string"==typeof n.query&&n.query.trim()?n.query.trim().slice(0,200):null;i&&y(r,"search");let s=
|
|
1995
|
+
`).run(b(r.title),q(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 F(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),A(e,{agentId:t.agent_id,sessionRef:t.id,type:"session_missing",now:n}))}async function W(e,t,n={}){let r=await v(e,t,n);y(r,"list");let i="string"==typeof n.query&&n.query.trim()?n.query.trim().slice(0,200):null;i&&y(r,"search");let s=w(r),a=x(e,r,s),o=function(e,t){let n=Number(t??e.capabilities.max_page_size);if(!Number.isInteger(n)||n<1)throw new N("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({...O(n),scope:{kind:s.kind,workspaces:[...s.workspaces],provider_session_ids:[...a]},query:i,cursor:n.cursor??null,limit:o});d.ok||L(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),!C(s,o,a)){i.rejected_out_of_scope++;continue}let{ref:d,created:l}=D(e,r,o,"discovered",u);(l?i.imported:i.updated).push(d),A(e,{agentId:t,sessionRef:d,type:l?"session_imported":"session_synced",now:u})}return i.rejected_out_of_scope>0&&A(e,{agentId:t,type:"sync_rejected_out_of_scope",detail:{count:i.rejected_out_of_scope},now:u}),i}).immediate()}async function M(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,_=new Set,c=n.now??Date.now();for(;u<1e3;){let E;if(null!==a){if(l.has(a))return A(e,{agentId:t,type:"sync_incomplete_guarded",detail:{pages:u,reason:"cursor_loop"},now:c}),{imported:r,updated:i,rejected_out_of_scope:s,next_cursor:a,pages:u,complete:!1};l.add(a)}try{E=await W(e,t,{...n,cursor:a,seenCollector:_})}catch(r){if(r instanceof N){if("agent_not_found"===r.code||"scope_missing"===r.code||"unsupported"===r.code)throw r;if("provider_unavailable"===r.code)try{R(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 A(e,{agentId:t,type:"sync_error_guarded",detail:{error_code:r instanceof N?r.code:"provider_failed",pages:u},now:c}),r}if(r.push(...E.imported),i.push(...E.updated),s+=E.rejected_out_of_scope,u++,null===(a=E.next_cursor))return function(e,t,n){let r;if(n.hasQuery||null!==n.initialCursor)return;try{r=R(e,t)}catch{return}let i=r.scope;if(!i||"sessions"===i.kind)return;let s=e.prepare(`
|
|
1989
1996
|
SELECT COUNT(*) AS n FROM provider_sessions
|
|
1990
1997
|
WHERE agent_id = ? AND runtime_connection_id = ? AND origin = 'discovered' AND binding_id IS NULL AND availability = 'available'
|
|
1991
1998
|
`).get(t,r.connection.id).n;if(0===n.seenProviderIds.size){s>0&&A(e,{agentId:t,type:"sync_empty_guarded",detail:{stored:s},now:n.now});return}if(0===s)return;let a=x(e,r,i),o=e.prepare(`
|
|
1992
1999
|
SELECT * FROM provider_sessions
|
|
1993
2000
|
WHERE agent_id = ? AND runtime_connection_id = ? AND origin = 'discovered' AND binding_id IS NULL AND availability = 'available'
|
|
1994
|
-
`).all(t,r.connection.id);e.transaction(()=>{for(let t of o)C(i,{workspace:t.workspace,provider_session_id:t.provider_session_id},a)&&(n.seenProviderIds.has(t.provider_session_id)||F(e,t,n.now))}).immediate()}(e,t,{seenProviderIds:_,hasQuery:d,initialCursor:o,now:c}),{imported:r,updated:i,rejected_out_of_scope:s,next_cursor:null,pages:u,complete:!0}}return A(e,{agentId:t,type:"sync_incomplete_guarded",detail:{pages:u,reason:"page_cap"},now:c}),{imported:r,updated:i,rejected_out_of_scope:s,next_cursor:a,pages:u,complete:!1}}function H(e,t,n){A(e,{agentId:t,type:"sync_completed",detail:{imported:n.imported,rejected_out_of_scope:n.rejected_out_of_scope,complete:n.complete},now:n.now})}function X(e,t,n){A(e,{agentId:t,type:"sync_failed",detail:{error_code:n.error_code},now:n.now})}async function G(e,t,n={}){let r,i=n.now??Date.now();try{R(e,t)}catch(n){if(n instanceof N&&"provider_unavailable"===n.code)return H(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 N?n.code:"provider_failed"}}try{r=await v(e,t,n)}catch(r){if(r instanceof N&&"unsupported"===r.code)return H(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 N?r.code:"provider_failed";return X(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 H(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 M(e,t,n);return H(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 N&&"unsupported"===r.code)return H(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 N?r.code:"provider_failed";return X(e,t,{error_code:n,now:i}),{outcome:"failed",imported:0,rejected_out_of_scope:0,complete:!1,error_code:n}}}async function B(e,t,n,r={}){let i=await v(e,t,r),s=S(e,t,n);if(s.runtime_connection_id!==i.connection.id)throw new N("provider_unavailable","The session belongs to another runtime connection.");let a=await i.provider.getSession({...O(r),provider_session_id:s.provider_session_id});a.ok||
|
|
2001
|
+
`).all(t,r.connection.id);e.transaction(()=>{for(let t of o)C(i,{workspace:t.workspace,provider_session_id:t.provider_session_id},a)&&(n.seenProviderIds.has(t.provider_session_id)||F(e,t,n.now))}).immediate()}(e,t,{seenProviderIds:_,hasQuery:d,initialCursor:o,now:c}),{imported:r,updated:i,rejected_out_of_scope:s,next_cursor:null,pages:u,complete:!0}}return A(e,{agentId:t,type:"sync_incomplete_guarded",detail:{pages:u,reason:"page_cap"},now:c}),{imported:r,updated:i,rejected_out_of_scope:s,next_cursor:a,pages:u,complete:!1}}function H(e,t,n){A(e,{agentId:t,type:"sync_completed",detail:{imported:n.imported,rejected_out_of_scope:n.rejected_out_of_scope,complete:n.complete},now:n.now})}function X(e,t,n){A(e,{agentId:t,type:"sync_failed",detail:{error_code:n.error_code},now:n.now})}async function G(e,t,n={}){let r,i=n.now??Date.now();try{R(e,t)}catch(n){if(n instanceof N&&"provider_unavailable"===n.code)return H(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 N?n.code:"provider_failed"}}try{r=await v(e,t,n)}catch(r){if(r instanceof N&&"unsupported"===r.code)return H(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 N?r.code:"provider_failed";return X(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 H(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 M(e,t,n);return H(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 N&&"unsupported"===r.code)return H(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 N?r.code:"provider_failed";return X(e,t,{error_code:n,now:i}),{outcome:"failed",imported:0,rejected_out_of_scope:0,complete:!1,error_code:n}}}async function B(e,t,n,r={}){let i=await v(e,t,r),s=S(e,t,n);if(s.runtime_connection_id!==i.connection.id)throw new N("provider_unavailable","The session belongs to another runtime connection.");let a=await i.provider.getSession({...O(r),provider_session_id:s.provider_session_id});a.ok||L(a.error);let o=r.now??Date.now();return e.transaction(()=>{null===a.value?F(e,s,o):(U(e,i,s.id,a.value,o),A(e,{agentId:t,sessionRef:s.id,type:"session_synced",now:o}))}).immediate(),S(e,t,n)}function $(e){if("string"!=typeof e.prompt||!e.prompt.trim())throw new N("invalid_input","prompt is required.");if(e.prompt.length>2e4)throw new N("invalid_input","prompt is longer than 20000 characters.");if("read_only"!==e.authority&&"workspace_write"!==e.authority)throw new N("invalid_input","authority must be read_only or workspace_write.");if("string"!=typeof e.idempotencyKey||!e.idempotencyKey.trim()||e.idempotencyKey.length>200)throw new N("invalid_input","idempotencyKey is required.");if(!e.requester||!["person","bot","service"].includes(e.requester.kind)||!e.requester.id)throw new N("invalid_input","requester is required.")}function K(e,t,n){if(!e.capabilities.authorities.includes(t))throw new N("authority_not_allowed",`The session provider cannot enforce ${t}.`);if(!e.policy)throw new N("authority_not_allowed","The Agent has no launch policy.");if("workspace_write"===t){if("workspace_write"!==e.policy.mode)throw new N("authority_not_allowed","The Agent's policy is read only.");if("send"===n&&!e.policy.allow_resume_with_edits)throw new N("authority_not_allowed","The Agent's policy does not allow resuming with edits.")}}function P(e){return(0,t.createHash)("sha256").update(JSON.stringify(e)).digest("hex")}function j(e,n,r){return`bm-${(0,t.createHash)("sha256").update(`${e}
|
|
1995
2002
|
${n.kind}
|
|
1996
2003
|
${n.id}
|
|
1997
2004
|
${r}`).digest("hex").slice(0,32)}`}function Y(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 z(e,t){if(e){if(e.request_hash!==t)throw new N("idempotency_conflict","That idempotency key was used for a different turn.");return e}}function J(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(`${I} 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 V(e,t){return e.prepare(`
|
|
@@ -1999,22 +2006,22 @@ ${r}`).digest("hex").slice(0,32)}`}function Y(e,t,n){return e.prepare("SELECT *
|
|
|
1999
2006
|
id, session_ref, agent_id, kind, authority, requester_kind, requester_id, idempotency_key, request_hash,
|
|
2000
2007
|
provider_turn_id, state, output, failure_code, correlation, created_at, finished_at
|
|
2001
2008
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', NULL, NULL, ?, ?, NULL)
|
|
2002
|
-
`).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),A(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 Q(e){return e instanceof Error&&/UNIQUE constraint failed: provider_session_turns/.test(e.message)}async function Z(e,r,i){$(i);let s=q(i.workspace);if(!s)throw new N("invalid_input","workspace must be an absolute path.");R(e,r);let a=P({kind:"start",workspace:s,prompt:i.prompt,authority:i.authority}),o=z(Y(e,r,i),a);if(o)return{turn:J(e,o),replayed:!0};let d=await v(e,r,i);y(d,"start");let u=
|
|
2009
|
+
`).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),A(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 Q(e){return e instanceof Error&&/UNIQUE constraint failed: provider_session_turns/.test(e.message)}async function Z(e,r,i){$(i);let s=q(i.workspace);if(!s)throw new N("invalid_input","workspace must be an absolute path.");R(e,r);let a=P({kind:"start",workspace:s,prompt:i.prompt,authority:i.authority}),o=z(Y(e,r,i),a);if(o)return{turn:J(e,o),replayed:!0};let d=await v(e,r,i);y(d,"start");let u=w(d);if("sessions"===u.kind)throw new N("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 N("out_of_scope","The workspace is outside the Agent's session scope.");if(!d.policy?.allow_new_sessions)throw new N("new_sessions_not_allowed","The Agent's policy does not allow new sessions.");K(d,i.authority,"start");let l=k(r,null),_=await d.provider.startSession({...O(i),workspace:s,prompt:i.prompt,authority:i.authority,idempotency_key:j(r,i.requester,i.idempotencyKey),session_context:l.minter});_.ok||(l.abandon(),L(_.error));let c=_.value,E=await d.provider.getSession({...O(i),provider_session_id:c.provider_session_id}),p=i.now??Date.now();try{let n=e.transaction(()=>{let n=E.ok&&E.value?{...E.value,provider_session_id:c.provider_session_id,workspace:E.value.workspace??s}:{provider_session_id:c.provider_session_id,title:null,workspace:s,created_at:p,updated_at:p,lifecycle:"open",resumable:!1,busy:!0},{ref:o,created:u}=D(e,d,n,"started",p,b(i.prompt));return u&&A(e,{agentId:r,sessionRef:o,type:"session_started",detail:{authority:i.authority},now:p}),V(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:c.provider_turn_id,correlation:JSON.stringify(i.correlation??{}),created_at:p})}).immediate();return l.record(n.session_ref,n.id),{turn:J(e,n),replayed:!1}}catch(t){if(l.abandon(),Q(t))return{turn:J(e,z(Y(e,r,i),a)),replayed:!0};throw t}}async function ee(e,r,i,s){$(s),R(e,r);let a=S(e,r,i),o=P({kind:"send",ref:i,prompt:s.prompt,authority:s.authority}),d=z(Y(e,r,s),o);if(d)return{turn:J(e,d),replayed:!0};let u=await v(e,r,s);if(y(u,"resume"),a.runtime_connection_id!==u.connection.id)throw new N("provider_unavailable","The session belongs to another runtime connection.");let l=w(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 N("out_of_scope","The session is outside the Agent's session scope.");K(u,s.authority,"send");let _=await B(e,r,i,s);if("missing"===_.availability)throw new N("session_missing","The provider no longer has this session.");if(1!==_.resumable)throw new N("not_resumable","The provider cannot resume this session.");let c=e.prepare("SELECT 1 FROM provider_session_turns WHERE session_ref = ? AND state = 'running'").get(i);if(1===_.busy||c)throw new N("busy","The session has a turn in flight.");let E=k(r,i),p=await u.provider.sendTurn({...O(s),provider_session_id:a.provider_session_id,prompt:s.prompt,authority:s.authority,idempotency_key:j(r,s.requester,s.idempotencyKey),session_context:E.minter});p.ok||(E.abandon(),L(p.error));let T=s.now??Date.now();try{let n=e.transaction(()=>V(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:p.value.provider_turn_id,correlation:JSON.stringify(s.correlation??{}),created_at:T})).immediate();return E.record(i,n.id),{turn:J(e,n),replayed:!1}}catch(t){if(E.abandon(),Q(t))return{turn:J(e,z(Y(e,r,s),o)),replayed:!0};throw t}}function et(e,t,n){let r=e.prepare("SELECT * FROM provider_session_turns WHERE id = ? AND agent_id = ?").get(n,t);if(!r)throw new N("turn_not_found","No turn with that reference.");return r}function en(e){return"number"==typeof e&&Number.isInteger(e)&&e>=0?e:null}function er(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(`
|
|
2003
2010
|
UPDATE provider_session_turns SET state = ?, output = ?, failure_code = ?, finished_at = ?, input_tokens = ?, output_tokens = ?, total_cost_usd = ?
|
|
2004
2011
|
WHERE id = ? AND state = 'running'
|
|
2005
2012
|
`).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,en(u?.input_tokens),en(u?.output_tokens),"number"==typeof(s=u?.total_cost_usd)&&Number.isFinite(s)&&s>=0?s:null,t.id).changes)return;if(g(t.id),n.failure?.code==="session_missing"){let n=e.prepare(`${I} WHERE id = ?`).get(t.session_ref);F(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(`
|
|
2006
2013
|
UPDATE provider_sessions SET busy = CASE WHEN EXISTS (
|
|
2007
2014
|
SELECT 1 FROM provider_session_turns WHERE session_ref = ? AND state = 'running') THEN 1 ELSE 0 END,
|
|
2008
2015
|
provider_updated_at = ?, updated_at = ? WHERE id = ?
|
|
2009
|
-
`).run(t.session_ref,i,i,t.session_ref);let _=(0,r.normalizeUsage)(u&&void 0===u.cost_usd&&"total_cost_usd"in u?{...u,cost_usd:u.total_cost_usd}:u);A(e,{agentId:t.agent_id,sessionRef:t.session_ref,turnId:t.id,type:`turn_${d}`,detail:_?{usage:_}:{},now:i})}).immediate()}async function ei(e,t,n,r={}){let i=et(e,t,n);if("running"!==i.state)return J(e,i);let s=await v(e,t,r),a=await s.provider.observeTurn({...O(r),provider_turn_id:i.provider_turn_id});if(!a.ok){if("cancelled"===a.error.code||"timed_out"===a.error.code)return J(e,et(e,t,n));
|
|
2016
|
+
`).run(t.session_ref,i,i,t.session_ref);let _=(0,r.normalizeUsage)(u&&void 0===u.cost_usd&&"total_cost_usd"in u?{...u,cost_usd:u.total_cost_usd}:u);A(e,{agentId:t.agent_id,sessionRef:t.session_ref,turnId:t.id,type:`turn_${d}`,detail:_?{usage:_}:{},now:i})}).immediate()}async function ei(e,t,n,r={}){let i=et(e,t,n);if("running"!==i.state)return J(e,i);let s=await v(e,t,r),a=await s.provider.observeTurn({...O(r),provider_turn_id:i.provider_turn_id});if(!a.ok){if("cancelled"===a.error.code||"timed_out"===a.error.code)return J(e,et(e,t,n));L(a.error)}return er(e,i,a.value,r.now??Date.now()),J(e,et(e,t,n))}async function es(e,t,n,r={}){let i=et(e,t,n);if("running"!==i.state)return{turn:J(e,i),outcome:"already_terminal"};let s=await v(e,t,r);y(s,"cancel");let a=r.now??Date.now();A(e,{agentId:t,sessionRef:i.session_ref,turnId:i.id,type:"cancel_requested",now:a});let o=await s.provider.cancelTurn({...O(r),provider_turn_id:i.provider_turn_id});return(o.ok||L(o.error),"cancelled"===o.value)?(er(e,i,{status:"cancelled",provider_session_id:"",output:null,failure:{code:"cancelled",message:""},finished_at:a},a),{turn:J(e,et(e,t,n)),outcome:"cancelled"}):{turn:await ei(e,t,n,r),outcome:"already_terminal"}}function ea(e,t,n){let r=e.prepare("SELECT * FROM provider_session_turns WHERE id = ? AND agent_id = ?").get(n,t);return r?J(e,r):void 0}function eo(e){return e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'provider_sessions'").get()?[...e.prepare("SELECT provider_session_id AS id FROM provider_sessions").all(),...e.prepare("SELECT provider_turn_id AS id FROM provider_session_turns").all()].map(e=>e.id):[]}},72414,e=>{"use strict";e.s(["serviceRedactor",()=>_]);var t=e.i(46786),n=e.i(99904),r=e.i(69312);let i=/^(cwd|working_directory|workspace|default_workspace|workspaces|deck|deck_id|deck_name|hermes_profile|hermes_profile_path)$/,s=/(KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL)/i,a=/^(id|ref|session_ref|sessionRef|kind)$|(request|conversation|agent|message|attempt|exchange|event|wake|grant|binding|finalization|bot|participant|sender|requester|origin|group)_?id$/i;function o(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function d(e){try{return JSON.parse(e)}catch{return null}}function u(e,t,n=!1){if("string"==typeof e)n&&t.add(e);else if(Array.isArray(e))for(let r of e)u(r,t,n);else if(o(e))for(let[r,s]of Object.entries(e))u(s,t,n||i.test(r))}function l(e,t,n){return t.reduce((e,t)=>t.length>=6?e.includes(t)?e.split(t).join(n):e:e.includes(t)?e.replace(RegExp(`(?<![A-Za-z0-9])${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?![A-Za-z0-9])`,"g"),n):e,e)}function _(){let e,i=function(){let e=new Set;for(let t of n.default.prepare("SELECT external_session_id AS id FROM session_bindings").all())e.add(t.id);for(let t of(0,r.privateProviderIds)(n.default))e.add(t);for(let t of n.default.prepare("SELECT external_session_id, external_run_id FROM work_attempts WHERE external_session_id IS NOT NULL OR external_run_id IS NOT NULL").all())t.external_session_id&&e.add(t.external_session_id),t.external_run_id&&e.add(t.external_run_id);return[...e].filter(e=>e.length>0).sort((e,t)=>t.length-e.length)}(),_=function(){let e=new Set;for(let t of n.bots.getAll())u(t,e),"string"==typeof t.session_scope_items&&u(d(t.session_scope_items),e,!0);if(n.default.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'provider_sessions'").get())for(let t of n.default.prepare("SELECT workspace FROM provider_sessions WHERE workspace IS NOT NULL").all())e.add(t.workspace);for(let n of[...e]){var r;let i="~"===(r=n)?t.default.homedir():r.startsWith("~/")?`${t.default.homedir()}/${r.slice(2)}`:null;i&&e.add(i),n.length>1&&n.endsWith("/")&&e.add(n.replace(/\/+$/,""))}for(let t of n.default.prepare(`
|
|
2010
2017
|
SELECT launch_snapshot AS snapshot FROM work_attempts WHERE launch_snapshot IS NOT NULL
|
|
2011
2018
|
UNION ALL SELECT snapshot FROM launch_snapshots
|
|
2012
|
-
`).all())u(d(t.snapshot),e);return[...new Set([...[...e].filter(e=>e.trim().length>=4),...Object.entries(process.env).filter(([e,t])=>s.test(e)&&"string"==typeof t).flatMap(([,e])=>[e,...e.split(/[\s,=]+/)]).filter(e=>e.length>=8)])].sort((e,t)=>t.length-e.length)}(),c=(e=t.default.homedir().replace(/\/+$/,"")).length<4?null:RegExp(`${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?=$|[/\\s"'\`)\\]}>,;:])[^\\s"'\`)\\]}>,;]*`,"g"),E=e=>{let t=l(l(e,i,"[redacted runtime id]"),_,"[redacted]");return c?t.replace(c,"[redacted]"):t},p=(e,t)=>"string"==typeof e?null!==t&&a.test(t)?e:E(e):Array.isArray(e)?e.map(e=>p(e,null)):o(e)?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,p(t,e)])):e;return{text:E,deep:e=>p(e,null)}}},89443,e=>{"use strict";e.s(["SHARE_LIMITS",()=>ts,"ShareAskError",()=>
|
|
2019
|
+
`).all())u(d(t.snapshot),e);return[...new Set([...[...e].filter(e=>e.trim().length>=4),...Object.entries(process.env).filter(([e,t])=>s.test(e)&&"string"==typeof t).flatMap(([,e])=>[e,...e.split(/[\s,=]+/)]).filter(e=>e.length>=8)])].sort((e,t)=>t.length-e.length)}(),c=(e=t.default.homedir().replace(/\/+$/,"")).length<4?null:RegExp(`${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?=$|[/\\s"'\`)\\]}>,;:])[^\\s"'\`)\\]}>,;]*`,"g"),E=e=>{let t=l(l(e,i,"[redacted runtime id]"),_,"[redacted]");return c?t.replace(c,"[redacted]"):t},p=(e,t)=>"string"==typeof e?null!==t&&a.test(t)?e:E(e):Array.isArray(e)?e.map(e=>p(e,null)):o(e)?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,p(t,e)])):e;return{text:E,deep:e=>p(e,null)}}},89443,e=>{"use strict";e.s(["SHARE_LIMITS",()=>ts,"ShareAskError",()=>tL,"ShareError",()=>to,"askShare",()=>tS,"audienceAllowed",()=>tg,"loadSessionSharesConfig",()=>tf,"shareAnswer",()=>tA,"shareFromTurnEnabled",()=>th,"shareRow",()=>tN,"shareState",()=>tR,"sweepExpiredShares",()=>tw],89443);var t=e.i(22734),n=e.i(14747),r=e.i(54799),i=e.i(99904),s=e.i(99684),a=e.i(72414),o=e.i(46786),d=e.i(98307),u=e.i(94057),l=e.i(89965);e.i(46632),Object.freeze({default:50,max:200});var _=e.i(69312),c=e.i(76422),E=e.i(34923);let p=Object.freeze({maxWakeDepth:3,rootBudget:12,maxContinuations:24,globalConcurrency:4,perTargetConcurrency:1}),T={maxWakeDepth:"BOTMANCERS_WAKE_MAX_DEPTH",rootBudget:"BOTMANCERS_WAKE_ROOT_BUDGET"};function m(e=process.env){let t=(t,n)=>{let r=e[T[t]]?.trim(),i=r&&/^\d+$/.test(r)?Number(r):NaN;return Number.isSafeInteger(i)&&i>=n&&i<p[t]?i:p[t]},n=t("rootBudget",1);return{...p,maxWakeDepth:t("maxWakeDepth",0),rootBudget:n,maxContinuations:2*n}}let f=Object.freeze({kind:"person",id:"local-owner"}),g=Object.freeze({kind:"service",id:"botmancers-exchanges"}),h=["ask","continue"],N={invalid_request:400,authority_not_allowed:403,recursive_exchange:403,conversation_not_found:404,agent_not_found:404,session_not_found:404,session_ended:409,session_not_resumable:409,source_session_busy:409,agent_unavailable:409,destination_invalid:400,idempotency_conflict:409,exchange_not_found:404,exchange_terminal:409,invalid_transition:409};class R extends Error{code;constructor(e,t){super(t),this.name="ExchangeError",this.code=e}get status(){return N[this.code]}}let v=["decisions","constraints","artifacts","open_questions"];function y(e){return"string"==typeof e&&e.trim().length>0}function w(e,...t){return t.reduce((e,t)=>t?e.split(t).join("[redacted session id]"):e,e)}let L="\n[truncated]";function O(e,t){return e.length<=t?{content:e,truncated:!1}:t<=L.length?{content:e.slice(0,t),truncated:!0}:{content:`${e.slice(0,t-L.length)}${L}`,truncated:!0}}let k="This is a read-only turn: do not edit files, change state, start other work, or emit Wakes.";function I(e,t){return`${e}:
|
|
2013
2020
|
${t.length>0?t.map(e=>`- ${e}`).join("\n"):"(none)"}`}function S(e){let t;if(e.requester_kind!==g.kind||e.requester_id!==g.id)return null;try{t=JSON.parse(e.policy_snapshot)}catch{return null}return t&&"session_exchange"===t.source&&"string"==typeof t.exchange_id&&("ask"===t.hop||"extract"===t.hop||"deliver"===t.hop)?{exchangeId:t.exchange_id,hop:t.hop,resumeBindingId:"string"==typeof t.resume_session_binding?t.resume_session_binding:null}:null}let A="/v1/chat/completions";class b extends Error{code;status;constructor(e,t,n){super(t),this.name="HermesError",this.code=e,this.status=n}}function q(e=process.env){var t;let n,r=(e.HERMES_API_SERVER_KEY||"").trim();if(!r)return null;let i=(e.HERMES_BASE_URL||"").trim()||"http://127.0.0.1:8642",s=(e.HERMES_SESSION_PREFIX||"").trim()||"botmancer-specialist-",a=(e.HERMES_MODEL||"").trim()||"hermes";return{baseUrl:i.replace(/\/+$/,""),apiKey:r,timeoutMs:(n=Number(t=e.HERMES_TIMEOUT_MS),void 0!==t&&""!==t&&Number.isFinite(n)&&n>0?Math.floor(n):24e4),sessionPrefix:s,model:a}}function C(e,t){return`${t.sessionPrefix}${e}`}function x(e,t){return new b("aborted","Hermes request aborted")}async function D(e){var t;let n,r,{config:i,profilePath:s,sessionId:a,messages:o,signal:d}=e,u=e.fetchImpl||((e,t)=>fetch(e,t)),l=(t=i.baseUrl,n=t.replace(/\/+$/,""),r=s.startsWith("/")?s:`/${s}`,`${n}${r}`),_=new AbortController,c=!1,E=setTimeout(()=>{c=!0,_.abort()},i.timeoutMs);E.unref&&E.unref();let p=()=>_.abort();if(d){if(d.aborted)throw clearTimeout(E),x(d,i.timeoutMs);d.addEventListener("abort",p,{once:!0})}try{let e,t;try{e=await u(l,{method:"POST",headers:{Authorization:`Bearer ${i.apiKey}`,"Content-Type":"application/json","X-Hermes-Session-Id":a},body:JSON.stringify({model:i.model,stream:!1,messages:o}),signal:_.signal})}catch(e){if(c)throw new b("timeout",`Hermes request timed out after ${i.timeoutMs} ms`);if(_.signal.aborted)throw x(d??_.signal,i.timeoutMs);throw new b("network",`Hermes request failed: ${String(e)}`)}let n="";try{n=await e.text()}catch{n=""}if(!e.ok){let t=`Hermes turn failed with status ${e.status}`;try{let e=JSON.parse(n);e?.error?.message&&(t=e.error.message)}catch{let e=n.trim().slice(0,120);e&&(t=`${t}: ${e}`)}throw new b("http",t,e.status)}try{t=JSON.parse(n)}catch{throw new b("protocol","Hermes reply was not JSON",e.status)}return t.choices?.[0]?.message?.content?.trim()||"No response"}finally{clearTimeout(E),d&&d.removeEventListener("abort",p)}}function U(e,t,n=null){return{category:e,code:n,message:t.slice(0,500)}}function F(e){let t=null,n=null;return{promise:new Promise(r=>{if(e.signal&&(n=()=>r(U("cancelled","The attempt was cancelled.")),e.signal.aborted?n():e.signal.addEventListener("abort",n,{once:!0})),"number"==typeof e.deadlineAt){let n=e.deadlineAt,i=()=>{let e=n-Date.now();e<=0?r(U("timed_out","The attempt passed its deadline.")):(t=setTimeout(i,Math.min(e,0x7fffffff))).unref&&t.unref()};i()}}),dispose:()=>{t&&clearTimeout(t),n&&e.signal&&e.signal.removeEventListener("abort",n)}}}function W(e){return e.signal?.aborted?U("cancelled","The attempt was cancelled before launch."):"number"==typeof e.deadlineAt&&Date.now()>=e.deadlineAt?U("timed_out","The attempt passed its deadline before launch."):null}var M=e.i(98596);let H="session-provider",X="\n[truncated]",G=Object.freeze({kind:"service",id:"botmancers-attempt"});function B(e){let t=e.correlation?.attemptId;if("string"==typeof t&&t)return`botmancers-attempt-${t}`;let n=(0,r.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-${n}`}function $(e){var t;if(e.freshSession&&e.sessionBinding)return{ok:!1,failure:U("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:U("unsupported_authority",`Unsupported tool profile: ${JSON.stringify(String(e.toolProfile))}.`)};let r=function(e){if("text"===e.kind)return e.text;let t=e.history.map(e=>`[${e.fromAgent?"you":e.speakerLabel}] ${e.content}`).join("\n\n");return`${e.system}
|
|
2014
2021
|
|
|
2015
2022
|
Conversation so far (reply to the last message):
|
|
2016
2023
|
|
|
2017
|
-
${t}`}(e.prompt);if(!r.trim())return{ok:!1,failure:U("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:r,authority:n}}:{ok:!1,failure:U("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:r,authority:n}}:{ok:!1,failure:U("unavailable","A session provider start requires an absolute working directory.")}}function K(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 j(e){let t=t=>({adapter:H,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 Y(e,t,n,r,i){let{failed:s}=j(i),a=F({signal:r.signal??null,deadlineAt:r.deadlineAt??null}),o=(0,_.observeProviderTurn)(e,n,t,{signal:r.signal??null,deadlineAt:r.deadlineAt??null,correlation:r.correlation??{}});o.catch(()=>{});try{let u=await Promise.race([o.then(e=>({view:e}),e=>({error:e})),a.promise.then(e=>({interrupted:e}))]);if("interrupted"in u){let i="requested";try{await (0,_.cancelProviderTurn)(e,n,t,{correlation:r.correlation??{}})}catch{i="failed"}let a=await z(e,n,t);return s(u.interrupted,{...a,externalCancel:i})}if("error"in u){var d;let i="requested";try{await (0,_.cancelProviderTurn)(e,n,t,{correlation:r.correlation??{}})}catch{i="failed"}let a=await z(e,n,t);return s((d=u.error)instanceof _.ProviderSessionError?"provider_unavailable"===d.code||"auth_required"===d.code?U("unavailable",`[${d.code}] ${K("unavailable")}`,d.code):U("runtime_failed",`[${d.code}] ${K("runtime_failed")}`,d.code):U("runtime_failed","The session provider did not complete the turn."),{...a,externalCancel:i})}let l=u.view;if("running"===l.state){let i=r.signal?.aborted?U("cancelled","The attempt was cancelled."):U("timed_out","The attempt passed its deadline."),a="requested";try{await (0,_.cancelProviderTurn)(e,n,t,{correlation:r.correlation??{}})}catch{a="failed"}return s(i,{externalRunId:l.turn_ref,externalSessionId:l.session_ref,externalCancel:a})}return function(e,t,n){var r;let{result:i,failed:s}=j(n),a={externalRunId:e.turn_ref,externalSessionId:e.session_ref},o=(0,M.usageFromEvent)(e.usage??null),d=Date.now();if("cancelled"===e.state)return s(U("cancelled","The provider turn was cancelled."),{...a,usage:o,finishedAt:d});if("failed"===e.state){let t="string"==typeof e.failure_code&&e.failure_code?e.failure_code.slice(0,100):"provider_failed";return s(U("runtime_failed",`[${t}] ${K("runtime_failed")}`,t),{...a,usage:o,finishedAt:d})}if("completed"!==e.state)return s(U("runtime_failed",K("runtime_failed")),{...a,usage:o,finishedAt:d});if("string"!=typeof e.output||!e.output)return s(U("result_contract",`Provider turn ${e.turn_ref} result contract mismatch: expected a non-empty string output.`),{...a,usage:o,finishedAt:d});if(null!==t&&e.session_ref!==t)return s(U("session_mismatch",`Resume turn ${e.turn_ref} forked the session; failing closed.`),{...a,usage:o,finishedAt:d});let u=(r=e.output).length<=32e3?{content:r,truncated:!1}:32e3<=X.length?{content:r.slice(0,32e3),truncated:!0}:{content:`${r.slice(0,32e3-X.length)}${X}`,truncated:!0};return i({status:"completed",...a,output:u.content,...u.truncated?{outputTruncated:!0}:{},usage:o,finishedAt:d})}(l,r.resumeSessionId,i)}finally{a.dispose()}}async function z(e,t,n){try{let r=(0,_.getProviderTurn)(e,t,n);return{externalRunId:n,externalSessionId:r?.session_ref??null}}catch{return{externalRunId:n,externalSessionId:null}}}function J(e={}){let t=e.db??i.default;return{name:H,reconciler:{currentGrantFingerprint:()=>null,async inspect(e){try{let n=P(t,e);if(!n)return{kind:"not_found"};let r=(0,_.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,_.startProviderSession)(t,n.agentId,{workspace:n.workspace,prompt:n.prompt,authority:n.authority,idempotencyKey:e.idempotencyKey,requester:n.requester,correlation:{}}):await (0,_.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 _.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 r=Date.now(),{failed:i}=j(r),s=P(t,e);return s?Y(t,e,s,{resumeSessionId:n.resumeSessionId,deadlineAt:n.deadlineAt??null,signal:n.signal??null,correlation:{}},r):i(U("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,_.cancelProviderTurn)(t,n,e,{correlation:{}}),"requested"}catch{return"failed"}}},externalCancel:!0,launchIntent(e){var t;let n=$(e);return n.ok?{idempotencyKey:B(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:{...G}}),grantFingerprint:null}:null},async run(e,n){let r,i=Date.now(),{failed:s}=j(i),a=$(e);if(!a.ok)return s(a.failure);let o=W(e);if(o)return s(o);let d=a.plan,u=B(e),l={...G};try{r="start"===d.kind?(await (0,_.startProviderSession)(t,d.agentId,{workspace:d.workspace,prompt:d.prompt,authority:d.authority,idempotencyKey:u,requester:l,correlation:{...e.correlation}})).turn:(await (0,_.sendProviderTurn)(t,d.agentId,d.sessionRef,{prompt:d.prompt,authority:d.authority,idempotencyKey:u,requester:l,correlation:{...e.correlation}})).turn}catch(e){return s(function(e){if(e instanceof _.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 U(n,`[${e.code}] ${K(n)}`,e.code)}return U("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:H,at:Date.now(),externalRunId:r.turn_ref,externalSessionId:r.session_ref}),Y(t,r.turn_ref,d.agentId,{resumeSessionId:d.sessionRef,deadlineAt:e.deadlineAt??null,signal:e.signal??null,correlation:{...e.correlation}},i)}}}class V extends Error{code;constructor(e,t){super(t),this.name="DispatchFailure",this.code=e}}let Q={"hermes-gateway":()=>(function(e={}){let t="hermes-gateway";return{name:t,async run(n,i){var s,a;let o=Date.now(),d=(e,n=null)=>({status:"failed",adapter:t,externalRunId:null,externalSessionId:n,output:null,artifacts:[],startedAt:o,finishedAt:Date.now(),failure:e});if("readonly"!==n.toolProfile)return d(U("unsupported_authority",`The Hermes gateway does not support the ${n.toolProfile} tool profile.`));let u=(e.loadConfig??q)();if(!u)return d(U("unavailable","The Hermes gateway is not configured."));let l=W(n);if(l)return d(l);if(n.freshSession&&n.sessionBinding)return d(U("session_mismatch","A fresh-session turn cannot resume a session."));let _=n.sessionBinding?.externalSessionId??(n.freshSession?(s=n.target.agentId,`${C(s,u)}-x-${(0,r.randomUUID)()}`):C(n.target.agentId,u)),c=new AbortController,E=F(n),p=null;E.promise.then(e=>{p=e,c.abort()}),i?.({type:"started",adapter:t,at:Date.now(),externalRunId:null,externalSessionId:_});try{let r=await D({config:u,profilePath:n.target.hermesProfilePath||A,sessionId:_,messages:(a=n.prompt,"text"===a.kind?[{role:"user",content:a.text}]:[{role:"system",content:a.system},...a.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:t,externalRunId:null,externalSessionId:_,output:r,artifacts:[],startedAt:o,finishedAt:Date.now(),failure:null}}catch(r){let e=r instanceof b?r.code:"unknown";if(p)return d({...p,code:e},_);let t="timeout"===e?"timed_out":"runtime_failed",n=r instanceof b&&void 0!==r.status?` ${r.status}`:"";return d(U(t,`The Hermes gateway did not complete the turn (${e}${n}).`,e),_)}finally{E.dispose()}}}})({fetchImpl:null}),"session-provider":()=>J()};function Z(e){return"completed"===e.status?"succeeded":e.failure?.category==="cancelled"?"cancelled":e.failure?.category==="timed_out"?"timed_out":"failed"}function ee(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 et(e,t,n,r=Date.now()){ee(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:Z(n),error_category:n.failure?.category??null,external_run_id:n.externalRunId,output:n.output,request_state:i?.state??null},now:r})}async function en(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:U("runtime_failed",r instanceof Error?r.message:String(r))}}return r.sanitize&&(i=r.sanitize(i)),e.transaction(()=>{var s,o,d,u,l;let _,c,E=e.getAttempt(t.attempt.id);if(E&&null!==E.finished_at)return et(e,E,i),{attempt:E,result:i,projected:void 0,late:!0,abandoned:null};let p=a?function(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}(t.attempt,n,t.input.signal??null,i):null,T=p?(d=e,u=p,l=i,ee(d,u.attemptId,l),_="failed"===u.externalCancel?"The runtime did not accept the cancel request":"The runtime cannot stop the run",c=d.finishAttempt(u.attemptId,{outcome:Z(l),errorCategory:"abandoned",errorMessage:`${l.failure?.message??"The attempt was interrupted."} ${_}; it may continue and a later result is not awaited.`.slice(0,500),artifacts:l.artifacts,...l.externalRunId?{externalRunId:l.externalRunId}:{},...l.externalSessionId?{externalSessionId:l.externalSessionId}:{},now:l.finishedAt}),u.externalRunId=c.external_run_id,d.appendEvent(u.requestId,{type:"attempt_abandoned",attemptId:u.attemptId,data:{reason:u.reason,attempt_number:c.attempt_number,external_run_id:c.external_run_id,transport:u.transport,local_only:!0,error_code:l.failure?.code??null,external_cancel:u.externalCancel},now:l.finishedAt}),c):(ee(e,s=t.attempt.id,o=i),e.finishAttempt(s,{outcome:Z(o),output:o.output,errorCategory:o.failure?.category??null,errorMessage:o.failure?.message??null,artifacts:o.artifacts,...o.externalRunId?{externalRunId:o.externalRunId}:{},...o.externalSessionId?{externalSessionId:o.externalSessionId}:{},now:o.finishedAt})),m=r.project?r.project(i,T):void 0;return{attempt:T,result:i,projected:m,late:!1,abandoned:p}})}class er extends Error{code;constructor(e,t){super(t),this.name="ControlError",this.code=e}}let ei=["queued","blocked","running","waiting"];function es(e){try{let t=JSON.parse(e.launch_snapshot);return t&&"object"==typeof t?t:{}}catch{return{}}}let ea="'grant_requested', 'grant_approved', 'grant_denied', 'grant_revoked'",eo=Object.freeze({maxGlobal:4,maxPerTarget:1,leaseMs:6e4,heartbeatMs:15e3,deferMs:5e3,cancelGraceMs:3e4}),ed={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"},eu=Object.freeze({maxGlobal:eo.maxGlobal,maxPerTarget:eo.maxPerTarget});class el extends Error{requestId;constructor(e){super(`The dispatch lease for ${e} is no longer held.`),this.name="LeaseLostError",this.requestId=e}}let e_=new Set(["version","target","executionKind","objective","contextWorkRequests","resumeWorkRequest","limits"]),ec=new Set(["maxAttempts","deadlineSeconds"]),eE=new Set(["conversation","implementation","review","revision"]);function ep(e,t){return"string"==typeof e&&e.trim().length>0&&e.length<=t}function eT(e,t,n){return Number.isInteger(e)&&e>=t&&e<=n}function em(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=>!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(!ep(e.target,120))return{ok:!1,reason:"target must be a non-empty Agent name (max 120 characters)"};if("string"!=typeof e.executionKind||!eE.has(e.executionKind))return{ok:!1,reason:"unknown executionKind"};if(!ep(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=>!ep(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||!ep(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=>!ec.has(e)))return{ok:!1,reason:"unknown limits field"};if(void 0!==t.maxAttempts&&!eT(t.maxAttempts,1,10))return{ok:!1,reason:"limits.maxAttempts must be 1-10"};if(void 0!==t.deadlineSeconds&&!eT(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 ef=/```botmancers-wake[^\S\r\n]*\r?\n([\s\S]*?)```/g,eg=/WAKE\s+([A-Za-z0-9_-]+)\s*:/gi;function eh(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}))}m().maxWakeDepth,m().rootBudget;class eN extends Error{code;constructor(e,t){super(t),this.name="WakeRouterError",this.code=e}}let eR=i.default.prepare("SELECT * FROM wakes WHERE id = ?"),ev=i.default.prepare("SELECT * FROM wakes WHERE idempotency_key = ?"),ey=i.default.prepare("SELECT * FROM wakes WHERE source_event_id = ? AND position = ?");function eL(e,t){return{wake:e,request:e.work_request_id?i.engine.getWorkRequest(e.work_request_id)??null:null,created:t}}function ew(e){return"accepted"===e.status||"blocked"===e.status}function eO(e){return i.default.prepare("SELECT COUNT(*) AS n FROM work_requests WHERE root_request_id = ? AND wake_event_id IS NOT NULL").get(e).n}m().maxContinuations;let ek={kind:"service",id:"botmancers-engine"},eI="Botmancers";function eS(e){try{let t=JSON.parse(e.policy_snapshot);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}catch{return{}}}function eA(e){return i.bots.getById(e)?.name??`agent:${e}`}function eb(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 n=i.default.prepare("SELECT * FROM messages WHERE id = ?").get(t);return n&&"bot"===n.sender_type&&n.sender_id===e.target_agent_id?n:null}function eq(e,t=!1){let n=i.engine.listAttempts(e.id),r=n.length>0?n[n.length-1]:null,s=[`Work Request: ${e.id}`,...r?[`Attempt: ${r.id}`]:[],`Agent: ${eA(e.target_agent_id)}`,`Execution kind: ${e.execution_kind}`,`State: ${e.state}`],a=eb(e);if(a){var o;s.push(t?`Result: the ${eA(e.target_agent_id)} reply above.`:`Result:
|
|
2024
|
+
${t}`}(e.prompt);if(!r.trim())return{ok:!1,failure:U("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:r,authority:n}}:{ok:!1,failure:U("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:r,authority:n}}:{ok:!1,failure:U("unavailable","A session provider start requires an absolute working directory.")}}function K(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 j(e){let t=t=>({adapter:H,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 Y(e,t,n,r,i){let{failed:s}=j(i),a=F({signal:r.signal??null,deadlineAt:r.deadlineAt??null}),o=(0,_.observeProviderTurn)(e,n,t,{signal:r.signal??null,deadlineAt:r.deadlineAt??null,correlation:r.correlation??{}});o.catch(()=>{});try{let u=await Promise.race([o.then(e=>({view:e}),e=>({error:e})),a.promise.then(e=>({interrupted:e}))]);if("interrupted"in u){let i="requested";try{await (0,_.cancelProviderTurn)(e,n,t,{correlation:r.correlation??{}})}catch{i="failed"}let a=await z(e,n,t);return s(u.interrupted,{...a,externalCancel:i})}if("error"in u){var d;let i="requested";try{await (0,_.cancelProviderTurn)(e,n,t,{correlation:r.correlation??{}})}catch{i="failed"}let a=await z(e,n,t);return s((d=u.error)instanceof _.ProviderSessionError?"provider_unavailable"===d.code||"auth_required"===d.code?U("unavailable",`[${d.code}] ${K("unavailable")}`,d.code):U("runtime_failed",`[${d.code}] ${K("runtime_failed")}`,d.code):U("runtime_failed","The session provider did not complete the turn."),{...a,externalCancel:i})}let l=u.view;if("running"===l.state){let i=r.signal?.aborted?U("cancelled","The attempt was cancelled."):U("timed_out","The attempt passed its deadline."),a="requested";try{await (0,_.cancelProviderTurn)(e,n,t,{correlation:r.correlation??{}})}catch{a="failed"}return s(i,{externalRunId:l.turn_ref,externalSessionId:l.session_ref,externalCancel:a})}return function(e,t,n){var r;let{result:i,failed:s}=j(n),a={externalRunId:e.turn_ref,externalSessionId:e.session_ref},o=(0,M.usageFromEvent)(e.usage??null),d=Date.now();if("cancelled"===e.state)return s(U("cancelled","The provider turn was cancelled."),{...a,usage:o,finishedAt:d});if("failed"===e.state){let t="string"==typeof e.failure_code&&e.failure_code?e.failure_code.slice(0,100):"provider_failed";return s(U("runtime_failed",`[${t}] ${K("runtime_failed")}`,t),{...a,usage:o,finishedAt:d})}if("completed"!==e.state)return s(U("runtime_failed",K("runtime_failed")),{...a,usage:o,finishedAt:d});if("string"!=typeof e.output||!e.output)return s(U("result_contract",`Provider turn ${e.turn_ref} result contract mismatch: expected a non-empty string output.`),{...a,usage:o,finishedAt:d});if(null!==t&&e.session_ref!==t)return s(U("session_mismatch",`Resume turn ${e.turn_ref} forked the session; failing closed.`),{...a,usage:o,finishedAt:d});let u=(r=e.output).length<=32e3?{content:r,truncated:!1}:32e3<=X.length?{content:r.slice(0,32e3),truncated:!0}:{content:`${r.slice(0,32e3-X.length)}${X}`,truncated:!0};return i({status:"completed",...a,output:u.content,...u.truncated?{outputTruncated:!0}:{},usage:o,finishedAt:d})}(l,r.resumeSessionId,i)}finally{a.dispose()}}async function z(e,t,n){try{let r=(0,_.getProviderTurn)(e,t,n);return{externalRunId:n,externalSessionId:r?.session_ref??null}}catch{return{externalRunId:n,externalSessionId:null}}}function J(e={}){let t=e.db??i.default;return{name:H,reconciler:{currentGrantFingerprint:()=>null,async inspect(e){try{let n=P(t,e);if(!n)return{kind:"not_found"};let r=(0,_.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,_.startProviderSession)(t,n.agentId,{workspace:n.workspace,prompt:n.prompt,authority:n.authority,idempotencyKey:e.idempotencyKey,requester:n.requester,correlation:{}}):await (0,_.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 _.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 r=Date.now(),{failed:i}=j(r),s=P(t,e);return s?Y(t,e,s,{resumeSessionId:n.resumeSessionId,deadlineAt:n.deadlineAt??null,signal:n.signal??null,correlation:{}},r):i(U("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,_.cancelProviderTurn)(t,n,e,{correlation:{}}),"requested"}catch{return"failed"}}},externalCancel:!0,launchIntent(e){var t;let n=$(e);return n.ok?{idempotencyKey:B(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:{...G}}),grantFingerprint:null}:null},async run(e,n){let r,i=Date.now(),{failed:s}=j(i),a=$(e);if(!a.ok)return s(a.failure);let o=W(e);if(o)return s(o);let d=a.plan,u=B(e),l={...G};try{r="start"===d.kind?(await (0,_.startProviderSession)(t,d.agentId,{workspace:d.workspace,prompt:d.prompt,authority:d.authority,idempotencyKey:u,requester:l,correlation:{...e.correlation}})).turn:(await (0,_.sendProviderTurn)(t,d.agentId,d.sessionRef,{prompt:d.prompt,authority:d.authority,idempotencyKey:u,requester:l,correlation:{...e.correlation}})).turn}catch(e){return s(function(e){if(e instanceof _.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 U(n,`[${e.code}] ${K(n)}`,e.code)}return U("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:H,at:Date.now(),externalRunId:r.turn_ref,externalSessionId:r.session_ref}),Y(t,r.turn_ref,d.agentId,{resumeSessionId:d.sessionRef,deadlineAt:e.deadlineAt??null,signal:e.signal??null,correlation:{...e.correlation}},i)}}}class V extends Error{code;constructor(e,t){super(t),this.name="DispatchFailure",this.code=e}}let Q={"hermes-gateway":()=>(function(e={}){let t="hermes-gateway";return{name:t,async run(n,i){var s,a;let o=Date.now(),d=(e,n=null)=>({status:"failed",adapter:t,externalRunId:null,externalSessionId:n,output:null,artifacts:[],startedAt:o,finishedAt:Date.now(),failure:e});if("readonly"!==n.toolProfile)return d(U("unsupported_authority",`The Hermes gateway does not support the ${n.toolProfile} tool profile.`));let u=(e.loadConfig??q)();if(!u)return d(U("unavailable","The Hermes gateway is not configured."));let l=W(n);if(l)return d(l);if(n.freshSession&&n.sessionBinding)return d(U("session_mismatch","A fresh-session turn cannot resume a session."));let _=n.sessionBinding?.externalSessionId??(n.freshSession?(s=n.target.agentId,`${C(s,u)}-x-${(0,r.randomUUID)()}`):C(n.target.agentId,u)),c=new AbortController,E=F(n),p=null;E.promise.then(e=>{p=e,c.abort()}),i?.({type:"started",adapter:t,at:Date.now(),externalRunId:null,externalSessionId:_});try{let r=await D({config:u,profilePath:n.target.hermesProfilePath||A,sessionId:_,messages:(a=n.prompt,"text"===a.kind?[{role:"user",content:a.text}]:[{role:"system",content:a.system},...a.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:t,externalRunId:null,externalSessionId:_,output:r,artifacts:[],startedAt:o,finishedAt:Date.now(),failure:null}}catch(r){let e=r instanceof b?r.code:"unknown";if(p)return d({...p,code:e},_);let t="timeout"===e?"timed_out":"runtime_failed",n=r instanceof b&&void 0!==r.status?` ${r.status}`:"";return d(U(t,`The Hermes gateway did not complete the turn (${e}${n}).`,e),_)}finally{E.dispose()}}}})({fetchImpl:null}),"session-provider":()=>J()};function Z(e){return"completed"===e.status?"succeeded":e.failure?.category==="cancelled"?"cancelled":e.failure?.category==="timed_out"?"timed_out":"failed"}function ee(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 et(e,t,n,r=Date.now()){ee(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:Z(n),error_category:n.failure?.category??null,external_run_id:n.externalRunId,output:n.output,request_state:i?.state??null},now:r})}async function en(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:U("runtime_failed",r instanceof Error?r.message:String(r))}}return r.sanitize&&(i=r.sanitize(i)),e.transaction(()=>{var s,o,d,u,l;let _,c,E=e.getAttempt(t.attempt.id);if(E&&null!==E.finished_at)return et(e,E,i),{attempt:E,result:i,projected:void 0,late:!0,abandoned:null};let p=a?function(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}(t.attempt,n,t.input.signal??null,i):null,T=p?(d=e,u=p,l=i,ee(d,u.attemptId,l),_="failed"===u.externalCancel?"The runtime did not accept the cancel request":"The runtime cannot stop the run",c=d.finishAttempt(u.attemptId,{outcome:Z(l),errorCategory:"abandoned",errorMessage:`${l.failure?.message??"The attempt was interrupted."} ${_}; it may continue and a later result is not awaited.`.slice(0,500),artifacts:l.artifacts,...l.externalRunId?{externalRunId:l.externalRunId}:{},...l.externalSessionId?{externalSessionId:l.externalSessionId}:{},now:l.finishedAt}),u.externalRunId=c.external_run_id,d.appendEvent(u.requestId,{type:"attempt_abandoned",attemptId:u.attemptId,data:{reason:u.reason,attempt_number:c.attempt_number,external_run_id:c.external_run_id,transport:u.transport,local_only:!0,error_code:l.failure?.code??null,external_cancel:u.externalCancel},now:l.finishedAt}),c):(ee(e,s=t.attempt.id,o=i),e.finishAttempt(s,{outcome:Z(o),output:o.output,errorCategory:o.failure?.category??null,errorMessage:o.failure?.message??null,artifacts:o.artifacts,...o.externalRunId?{externalRunId:o.externalRunId}:{},...o.externalSessionId?{externalSessionId:o.externalSessionId}:{},now:o.finishedAt})),m=r.project?r.project(i,T):void 0;return{attempt:T,result:i,projected:m,late:!1,abandoned:p}})}class er extends Error{code;constructor(e,t){super(t),this.name="ControlError",this.code=e}}let ei=["queued","blocked","running","waiting"];function es(e){try{let t=JSON.parse(e.launch_snapshot);return t&&"object"==typeof t?t:{}}catch{return{}}}let ea="'grant_requested', 'grant_approved', 'grant_denied', 'grant_revoked'",eo=Object.freeze({maxGlobal:4,maxPerTarget:1,leaseMs:6e4,heartbeatMs:15e3,deferMs:5e3,cancelGraceMs:3e4}),ed={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"},eu=Object.freeze({maxGlobal:eo.maxGlobal,maxPerTarget:eo.maxPerTarget});class el extends Error{requestId;constructor(e){super(`The dispatch lease for ${e} is no longer held.`),this.name="LeaseLostError",this.requestId=e}}let e_=new Set(["version","target","executionKind","objective","contextWorkRequests","resumeWorkRequest","limits"]),ec=new Set(["maxAttempts","deadlineSeconds"]),eE=new Set(["conversation","implementation","review","revision"]);function ep(e,t){return"string"==typeof e&&e.trim().length>0&&e.length<=t}function eT(e,t,n){return Number.isInteger(e)&&e>=t&&e<=n}function em(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=>!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(!ep(e.target,120))return{ok:!1,reason:"target must be a non-empty Agent name (max 120 characters)"};if("string"!=typeof e.executionKind||!eE.has(e.executionKind))return{ok:!1,reason:"unknown executionKind"};if(!ep(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=>!ep(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||!ep(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=>!ec.has(e)))return{ok:!1,reason:"unknown limits field"};if(void 0!==t.maxAttempts&&!eT(t.maxAttempts,1,10))return{ok:!1,reason:"limits.maxAttempts must be 1-10"};if(void 0!==t.deadlineSeconds&&!eT(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 ef=/```botmancers-wake[^\S\r\n]*\r?\n([\s\S]*?)```/g,eg=/WAKE\s+([A-Za-z0-9_-]+)\s*:/gi;function eh(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}))}m().maxWakeDepth,m().rootBudget;class eN extends Error{code;constructor(e,t){super(t),this.name="WakeRouterError",this.code=e}}let eR=i.default.prepare("SELECT * FROM wakes WHERE id = ?"),ev=i.default.prepare("SELECT * FROM wakes WHERE idempotency_key = ?"),ey=i.default.prepare("SELECT * FROM wakes WHERE source_event_id = ? AND position = ?");function ew(e,t){return{wake:e,request:e.work_request_id?i.engine.getWorkRequest(e.work_request_id)??null:null,created:t}}function eL(e){return"accepted"===e.status||"blocked"===e.status}function eO(e){return i.default.prepare("SELECT COUNT(*) AS n FROM work_requests WHERE root_request_id = ? AND wake_event_id IS NOT NULL").get(e).n}m().maxContinuations;let ek={kind:"service",id:"botmancers-engine"},eI="Botmancers";function eS(e){try{let t=JSON.parse(e.policy_snapshot);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}catch{return{}}}function eA(e){return i.bots.getById(e)?.name??`agent:${e}`}function eb(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 n=i.default.prepare("SELECT * FROM messages WHERE id = ?").get(t);return n&&"bot"===n.sender_type&&n.sender_id===e.target_agent_id?n:null}function eq(e,t=!1){let n=i.engine.listAttempts(e.id),r=n.length>0?n[n.length-1]:null,s=[`Work Request: ${e.id}`,...r?[`Attempt: ${r.id}`]:[],`Agent: ${eA(e.target_agent_id)}`,`Execution kind: ${e.execution_kind}`,`State: ${e.state}`],a=eb(e);if(a){var o;s.push(t?`Result: the ${eA(e.target_agent_id)} reply above.`:`Result:
|
|
2018
2025
|
${(o=a.content).length>8e3?`${o.slice(0,8e3)}
|
|
2019
2026
|
[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 eC='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.',ex=i.default.prepare("SELECT * FROM work_requests WHERE requester_kind = ? AND requester_id = ? AND idempotency_key = ?");function eD(e){let t=ex.get(ek.kind,ek.id,e.key);if(t)return t;if(!i.bots.getById(e.coordinatorId)||!i.default.prepare("SELECT 1 FROM conversations WHERE id = ?").get(e.conversationId))return null;let n=i.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,ek.kind,ek.id),r=m().maxContinuations;if(n.n>=r)return i.default.prepare("SELECT 1 FROM engine_events WHERE request_id = ? AND type = 'lineage_stopped'").get(e.parent.id)||i.engine.appendEvent(e.parent.id,{type:"lineage_stopped",data:{reason:"continuation_budget_exhausted",limit:r,observed:n.n,continues:e.continues,coordinator_agent_id:e.coordinatorId},now:e.now}),null;let s=(0,c.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:1,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:n.n+1,limit:r}};return i.engine.createOrGetWorkRequest({sourceConversationId:e.conversationId,sourceEventId:e.sourceEventId,requester:ek,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:ek,decision:"allowed",grantRule:"readonly_default",snapshot:o,now:e.now},now:e.now}).request}let eU=i.default.prepare("SELECT 1 FROM terminal_followups WHERE request_id = ? AND done_at IS NULL"),eF=i.default.prepare("UPDATE terminal_followups SET done_at = ? WHERE request_id = ? AND done_at IS NULL");function eW(e,t,n,r){i.engine.transaction(()=>{t&&i.engine.finishAttempt(t,{outcome:"failed",errorCategory:n,errorMessage:r});let s=i.engine.getWorkRequest(e);s&&("queued"===s.state||"running"===s.state)&&i.engine.transitionWorkRequest(e,{from:s.state,to:"failed",errorCode:n,errorMessage:r})})}let eM=function(e,t,n={}){let i=n.owner??`${o.default.hostname()}:${process.pid}:${(0,r.randomUUID)().slice(0,8)}`,s={...function(e=process.env){let t={...eo};for(let n of Object.keys(ed)){let r=e[ed[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,eu.maxGlobal),t.maxPerTarget=Math.min(t.maxPerTarget,eu.maxPerTarget),t}(),...n.config??{}},a=n.now??Date.now,d=function(e,t,n={}){let i=n.now??Date.now,s=n.cancelGraceMs??3e4,a=e.prepare("SELECT * FROM work_attempts WHERE request_id = ? AND finished_at IS NULL"),o=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 = ?"),l=e.prepare("SELECT 1 FROM engine_events WHERE attempt_id = ? AND type = 'runtime_started' LIMIT 1");function _(e){let n=t.getWorkRequest(e);if(!n)throw new er("not_found",`No work request ${e}.`);return n}function c(e,t,n,r){if(r&&(!e||!r(e,t,n)))throw new er("forbidden",`Not allowed to ${n} this request.`)}function p(e){return Math.max(e.attempt_count,o.get(e.id).n)}function T(t,n){e.prepare("UPDATE dispatch_attention SET cleared_at = ? WHERE request_id = ? AND cleared_at IS NULL").run(n,t)}function m(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 f(e,n,r){let i=a.get(e.id);if(!i)return null;let s=es(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 s?s:null},now:r}),{requestId:e.id,attemptId:i.id,externalRunId:i.external_run_id,transport:"string"==typeof s?s:null,reason:n,launched:!!i.external_run_id||!!i.external_session_id||!!l.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 h(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 N(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 R(n,i,s){let a=(0,E.storedRetryPolicy)(n.retry_policy),o=(0,E.classifyFailure)(i.category,i.code),d=p(n),u=(0,E.decideRetry)({policy:a,attemptCount:d,disposition:o,deadlineAt:n.deadline_at,now:s}),l=i.attention&&"retry"===u.action?{action:"attention"}:u,_={category:i.category,disposition:o,attempt_count:d,max_attempts:a.max_attempts};switch(l.action){case"retry":{e.prepare("UPDATE work_requests SET next_eligible_at = ? WHERE id = ?").run(l.nextEligibleAt,n.id);let r=t.transitionWorkRequest(n.id,{from:"running",to:"queued",reason:"retry_scheduled",data:{..._,retry:l.retry,delay_ms:l.delayMs,next_eligible_at:l.nextEligibleAt,error_code:i.errorCode},now:s});return{outcome:"retry_scheduled",decision:l,request:r}}case"deadline":return{outcome:"timed_out",decision:l,request:N(n,s,_)};case"attention":{let a=i.attention??`failure:${i.category??"unknown"}`;return e.prepare("INSERT INTO dispatch_attention (id, request_id, attempt_id, reason, detail, created_at) VALUES (?, ?, NULL, ?, ?, ?)").run((0,r.randomUUID)(),n.id,a,i.code,s),t.appendEvent(n.id,{type:"attention_set",data:{reason:a,detail:i.code},now:s}),{outcome:"attention",decision:l,request:t.transitionWorkRequest(n.id,{from:"running",to:"waiting",reason:`manual_attention:${i.attention??i.category??"unknown"}`,data:_,now:s})}}case"exhausted":if(a.max_attempts>1)return{outcome:"retries_exhausted",decision:l,request:t.transitionWorkRequest(n.id,{from:"running",to:"failed",reason:"retries_exhausted",errorCode:i.errorCode,errorMessage:i.errorMessage,data:_,now:s})};case"fail":return{outcome:"failed",decision:l,request:t.transitionWorkRequest(n.id,{from:"running",to:"failed",errorCode:i.errorCode,errorMessage:i.errorMessage,data:"fail"===l.action?_:{},now:s})}}}let v={now:i,cancelGraceMs:s,cancel:(e,n={})=>t.transaction(()=>{let t=_(e);if(c(n.actor,t,"cancel",n.authorize),u.TERMINAL_STATES.includes(t.state))return{outcome:"already_terminal",state:t.state,replayed:!0,abandoned:null};let r=n.now??i();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,r),{outcome:"cancel_requested",state:"running",replayed:!1,abandoned:null});null===t.cancel_requested_at&&g(t,n.actor,n.reason??null,r);let s=_(e),a=f(s,"cancelled",r);return T(e,r),m(e,"cancelled",r),{outcome:"cancelled",state:h(s,r,{from_state:t.state}).state,replayed:!1,abandoned:a}}),retry:(n,r={})=>t.transaction(()=>{let s=_(n);if(c(r.actor,s,"retry",r.authorize),u.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,E.storedRetryPolicy)(s.retry_policy),o=p(s);if(o>=a.max_attempts)return{outcome:"retries_exhausted",state:s.state,abandoned:null};let d=r.now??i();if(null!==s.deadline_at&&d>=s.deadline_at)return{outcome:"not_retryable",state:s.state,abandoned:null};let l=f(s,"retried",d);return T(n,d),e.prepare("UPDATE work_requests SET next_eligible_at = ? WHERE id = ?").run(d,n),{outcome:"retry_scheduled",state:t.transitionWorkRequest(n,{from:"waiting",to:"queued",reason:"retry_scheduled",data:{manual:!0,by:r.actor?`${r.actor.kind}:${r.actor.id}`:null,attempt_count:o,max_attempts:a.max_attempts,retry:o,delay_ms:0,next_eligible_at:d},now:d}).state,abandoned:l}}),timeOut:(e,n)=>t.transaction(()=>{let r=t.getWorkRequest(e),s=n??i();if(!r||!ei.includes(r.state)||null===r.deadline_at||s<r.deadline_at)return null;let a=f(r,"timed_out",s);return T(e,s),m(e,"timed_out",s),N(r,s,{from_state:r.state}),{requestId:e,outcome:"timed_out",abandoned:a}}),settleFailure:(e,n,r)=>t.transaction(()=>{let t=_(e);if("running"!==t.state)throw new u.EngineStoreError("stale_state",`Work request ${e} is ${t.state}, not running.`);return R(t,n,r??i())}),enforceRequest:(e,n,r={})=>t.transaction(()=>{let o,u=t.getWorkRequest(e),l=n??i();if(!u||!ei.includes(u.state)||null!==u.legacy_agent_request_id)return null;if(null!==u.deadline_at&&l>=u.deadline_at)return v.timeOut(e,l);if("running"!==u.state)return null;if(null!==u.cancel_requested_at){let t=d.get(e);if(!(!0===r.force||!t||t.expires_at<=l)&&l-u.cancel_requested_at<s)return null;let n=f(u,"cancelled",l);return m(e,"cancelled",l),h(u,l,{abandoned:null!==n}),{requestId:e,outcome:"cancelled",abandoned:n}}let c=a.get(e),E=c&&"number"==typeof(o=es(c).deadline_at)?o:null;if(!c||null===E||l<E)return null;let p=f(u,"timed_out",l);m(e,"attempt_timed_out",l);let T=R(_(e),{category:"timed_out",code:null,errorCode:"timed_out",errorMessage:"The Attempt passed its deadline."},l);return{requestId:e,outcome:T.outcome,abandoned:p}}),dueRequests(t){let n=t??i();return e.prepare(`
|
|
2020
2027
|
SELECT id FROM work_requests
|
|
@@ -2038,10 +2045,10 @@ ${(o=a.content).length>8e3?`${o.slice(0,8e3)}
|
|
|
2038
2045
|
AND (SELECT COUNT(*) FROM dispatch_leases l WHERE l.target_agent_id = w.target_agent_id) < ?
|
|
2039
2046
|
ORDER BY w.created_at ASC, w.rowid ASC
|
|
2040
2047
|
LIMIT 1
|
|
2041
|
-
`);function N(e,n,r,i){let o=p.get(e.id);return(o?.type==="dispatch_deferred"&&o.data?JSON.parse(o.data).reason:null)!==n&&t.appendEvent(e.id,{type:"dispatch_deferred",data:{reason:n,active_global:r.global,active_target:r.target,max_global:s.maxGlobal,max_per_target:s.maxPerTarget,...i?{waiting_behind:i}:{}},now:a()}),i?{ok:!1,reason:n,blockedBy:i}:{ok:!1,reason:n}}function R(e){if(!m.get(e.requestId,e.token))throw new el(e.requestId)}let v={owner:i,config:s,now:a,control:d,claim:(n,o={})=>t.transaction(()=>{let u=t.getWorkRequest(n);if(!u||"queued"!==u.state||void 0!==o.expectedVersion&&u.version!==o.expectedVersion)return{ok:!1,reason:"not_queued"};let p=a();if(null!==u.deadline_at&&p>=u.deadline_at)return d.timeOut(n,p),{ok:!1,reason:"timed_out"};if(null!==u.next_eligible_at&&p<u.next_eligible_at)return{ok:!1,reason:"not_eligible"};if(c.get(n))return{ok:!1,reason:"attention"};let T=function(e){let t=f.get(e.id);if(t?.decision!=="allowed")return"The request has no allowed safety decision.";if(null!==e.wake_event_id){let t=g.get(e.wake_event_id);if(t?.status!=="accepted")return"The Wake that created this request was not accepted."}return null}(u);if(T)return t.transitionWorkRequest(n,{from:"queued",to:"failed",reason:"not_authorized",expectedVersion:u.version,errorCode:"not_authorized",errorMessage:T,now:p}),{ok:!1,reason:"not_authorized"};let m=(0,E.storedRetryPolicy)(u.retry_policy),R=d.attemptsUsed(u);if(R>=m.max_attempts)return t.transitionWorkRequest(n,{from:"queued",to:"failed",reason:"retries_exhausted",expectedVersion:u.version,errorCode:"retries_exhausted",errorMessage:"No Attempt is left in the retry budget.",data:{attempt_count:R,max_attempts:m.max_attempts},now:p}),{ok:!1,reason:"exhausted"};let v=l.get().n,y=_.get(u.target_agent_id).n;if(v>=s.maxGlobal)return N(u,"global_limit",{global:v,target:y});if(y>=s.maxPerTarget)return N(u,"target_limit",{global:v,target:y});let
|
|
2048
|
+
`);function N(e,n,r,i){let o=p.get(e.id);return(o?.type==="dispatch_deferred"&&o.data?JSON.parse(o.data).reason:null)!==n&&t.appendEvent(e.id,{type:"dispatch_deferred",data:{reason:n,active_global:r.global,active_target:r.target,max_global:s.maxGlobal,max_per_target:s.maxPerTarget,...i?{waiting_behind:i}:{}},now:a()}),i?{ok:!1,reason:n,blockedBy:i}:{ok:!1,reason:n}}function R(e){if(!m.get(e.requestId,e.token))throw new el(e.requestId)}let v={owner:i,config:s,now:a,control:d,claim:(n,o={})=>t.transaction(()=>{let u=t.getWorkRequest(n);if(!u||"queued"!==u.state||void 0!==o.expectedVersion&&u.version!==o.expectedVersion)return{ok:!1,reason:"not_queued"};let p=a();if(null!==u.deadline_at&&p>=u.deadline_at)return d.timeOut(n,p),{ok:!1,reason:"timed_out"};if(null!==u.next_eligible_at&&p<u.next_eligible_at)return{ok:!1,reason:"not_eligible"};if(c.get(n))return{ok:!1,reason:"attention"};let T=function(e){let t=f.get(e.id);if(t?.decision!=="allowed")return"The request has no allowed safety decision.";if(null!==e.wake_event_id){let t=g.get(e.wake_event_id);if(t?.status!=="accepted")return"The Wake that created this request was not accepted."}return null}(u);if(T)return t.transitionWorkRequest(n,{from:"queued",to:"failed",reason:"not_authorized",expectedVersion:u.version,errorCode:"not_authorized",errorMessage:T,now:p}),{ok:!1,reason:"not_authorized"};let m=(0,E.storedRetryPolicy)(u.retry_policy),R=d.attemptsUsed(u);if(R>=m.max_attempts)return t.transitionWorkRequest(n,{from:"queued",to:"failed",reason:"retries_exhausted",expectedVersion:u.version,errorCode:"retries_exhausted",errorMessage:"No Attempt is left in the retry budget.",data:{attempt_count:R,max_attempts:m.max_attempts},now:p}),{ok:!1,reason:"exhausted"};let v=l.get().n,y=_.get(u.target_agent_id).n;if(v>=s.maxGlobal)return N(u,"global_limit",{global:v,target:y});if(y>=s.maxPerTarget)return N(u,"target_limit",{global:v,target:y});let w=h.get(n,u.created_at,u.created_at,n,p,p,s.maxPerTarget);if(w)return N(u,"older_waiting",{global:v,target:y},w.id);let L={requestId:n,owner:i,token:(0,r.randomUUID)(),expiresAt:p+s.leaseMs};return e.prepare(`
|
|
2042
2049
|
INSERT INTO dispatch_leases (request_id, target_agent_id, owner, token, acquired_at, heartbeat_at, expires_at)
|
|
2043
2050
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
2044
|
-
`).run(n,u.target_agent_id,i,
|
|
2051
|
+
`).run(n,u.target_agent_id,i,L.token,p,p,L.expiresAt),t.appendEvent(n,{type:"dispatch_claimed",data:{owner:i,lease_expires_at:L.expiresAt,active_global:v+1,active_target:y+1,attempt_number:R+1,max_attempts:m.max_attempts},now:p}),e.prepare("UPDATE work_requests SET attempt_count = ?, next_eligible_at = NULL WHERE id = ?").run(R+1,n),{ok:!0,lease:L,request:t.transitionWorkRequest(n,{from:"queued",to:"running",expectedVersion:u.version,data:o.data,now:p})}}),claimNext(t){let n=t??e.prepare(`
|
|
2045
2052
|
SELECT id FROM work_requests WHERE state = 'queued' AND legacy_agent_request_id IS NULL AND executor = 'dispatcher'
|
|
2046
2053
|
AND (next_eligible_at IS NULL OR next_eligible_at <= ?)
|
|
2047
2054
|
ORDER BY created_at ASC, rowid ASC
|
|
@@ -2060,14 +2067,14 @@ ${(o=a.content).length>8e3?`${o.slice(0,8e3)}
|
|
|
2060
2067
|
`).run(...r).changes)return null}else{let r=t.getWorkRequest(n.requestId);if(!r||"running"!==r.state||e.prepare("SELECT 1 FROM dispatch_leases WHERE request_id = ?").get(n.requestId)||c.get(n.requestId))return null;e.prepare(`
|
|
2061
2068
|
INSERT INTO dispatch_leases (request_id, target_agent_id, owner, token, acquired_at, heartbeat_at, expires_at)
|
|
2062
2069
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
2063
|
-
`).run(n.requestId,r.target_agent_id,i,d.token,o,o,d.expiresAt)}return t.appendEvent(n.requestId,{type:"dispatch_lease_taken_over",data:{owner:i,previous_owner:n.priorOwner,reason:n.reason},now:o}),d}),deferredRequestIds:()=>T.all().map(e=>e.id),leaseOf:t=>e.prepare("SELECT owner, token, expires_at FROM dispatch_leases WHERE request_id = ?").get(t)};return v}(i.default,i.engine);class eH extends Error{reason;constructor(e){super(`Commit deferred: ${e}`),this.reason=e}}async function eX(e){let t=await eG(e);var n=e,s=t||i.engine.getWorkRequest(e)?.state!=="queued";for(let e of function(e,t=Date.now()){return i.engine.transaction(()=>{var n;if(!eU.get(e))return[];let s=i.engine.getWorkRequest(e);if(!s||null===s.terminal_at||null!==s.legacy_agent_request_id)return[];eF.run(t,e);let a=[],o=e=>{e&&"queued"===e.state&&a.push(e.id)},d=eb(s);if(d){let e,n=[],a=null;try{n=function(e){if("string"!=typeof e.sourceEventId||!e.sourceEventId.trim())throw new eN("invalid_input","sourceEventId is required.");return i.default.transaction(()=>{let t=i.default.prepare("SELECT * FROM messages WHERE id = ?").get(e.sourceEventId);if(!t)throw new eN("source_not_found",`No conversation event ${e.sourceEventId}.`);if("bot"!==t.sender_type||!t.sender_id||!i.bots.getById(t.sender_id))throw new eN("invalid_input","Wakes are routed only from an Agent message.");let n=null;if(e.parentRequestId){if(!(n=i.engine.getWorkRequest(e.parentRequestId)??null))throw new eN("not_found",`No parent Work Request ${e.parentRequestId}.`);if(n.target_agent_id!==t.sender_id||n.source_conversation_id!==t.conversation_id)throw new eN("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,s;let a;for(let o of(i=e.slice(n,r),(a=[...i.matchAll(eg)]).map((e,t)=>{let r=t+1<a.length?a[t+1].index:i.length,s=i.slice(e.index,r);return{at:n+e.index,raw:s.trim(),target:e[1],message:s.slice(e[0].length).trim()}}))){let e="GROUP"===o.target.toUpperCase()?{ok:!1,reason:"group wakes are not supported; wake one Agent by name"}:0===o.message.length?{ok:!1,reason:"objective must be non-empty (max 20000 characters)"}:em((s=o.target,{version:1,target:s,executionKind:"conversation",objective:o.message}));t.push({at:o.at,syntax:"legacy",raw:o.raw,validation:e})}};for(let i of e.matchAll(ef)){let e,s=i.index;r(n,s);try{e=em(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}))})(t.content).map(e=>(function(e,t,n,s,a){var o,d;let u,_,E=(o=t.id,_=(0,r.createHash)("sha256").update(eh(e)).digest("hex").slice(0,32),`wake:v1:${o}:${e.position}:${_}`),p=ev.get(E);if(p)return
|
|
2070
|
+
`).run(n.requestId,r.target_agent_id,i,d.token,o,o,d.expiresAt)}return t.appendEvent(n.requestId,{type:"dispatch_lease_taken_over",data:{owner:i,previous_owner:n.priorOwner,reason:n.reason},now:o}),d}),deferredRequestIds:()=>T.all().map(e=>e.id),leaseOf:t=>e.prepare("SELECT owner, token, expires_at FROM dispatch_leases WHERE request_id = ?").get(t)};return v}(i.default,i.engine);class eH extends Error{reason;constructor(e){super(`Commit deferred: ${e}`),this.reason=e}}async function eX(e){let t=await eG(e);var n=e,s=t||i.engine.getWorkRequest(e)?.state!=="queued";for(let e of function(e,t=Date.now()){return i.engine.transaction(()=>{var n;if(!eU.get(e))return[];let s=i.engine.getWorkRequest(e);if(!s||null===s.terminal_at||null!==s.legacy_agent_request_id)return[];eF.run(t,e);let a=[],o=e=>{e&&"queued"===e.state&&a.push(e.id)},d=eb(s);if(d){let e,n=[],a=null;try{n=function(e){if("string"!=typeof e.sourceEventId||!e.sourceEventId.trim())throw new eN("invalid_input","sourceEventId is required.");return i.default.transaction(()=>{let t=i.default.prepare("SELECT * FROM messages WHERE id = ?").get(e.sourceEventId);if(!t)throw new eN("source_not_found",`No conversation event ${e.sourceEventId}.`);if("bot"!==t.sender_type||!t.sender_id||!i.bots.getById(t.sender_id))throw new eN("invalid_input","Wakes are routed only from an Agent message.");let n=null;if(e.parentRequestId){if(!(n=i.engine.getWorkRequest(e.parentRequestId)??null))throw new eN("not_found",`No parent Work Request ${e.parentRequestId}.`);if(n.target_agent_id!==t.sender_id||n.source_conversation_id!==t.conversation_id)throw new eN("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,s;let a;for(let o of(i=e.slice(n,r),(a=[...i.matchAll(eg)]).map((e,t)=>{let r=t+1<a.length?a[t+1].index:i.length,s=i.slice(e.index,r);return{at:n+e.index,raw:s.trim(),target:e[1],message:s.slice(e[0].length).trim()}}))){let e="GROUP"===o.target.toUpperCase()?{ok:!1,reason:"group wakes are not supported; wake one Agent by name"}:0===o.message.length?{ok:!1,reason:"objective must be non-empty (max 20000 characters)"}:em((s=o.target,{version:1,target:s,executionKind:"conversation",objective:o.message}));t.push({at:o.at,syntax:"legacy",raw:o.raw,validation:e})}};for(let i of e.matchAll(ef)){let e,s=i.index;r(n,s);try{e=em(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}))})(t.content).map(e=>(function(e,t,n,s,a){var o,d;let u,_,E=(o=t.id,_=(0,r.createHash)("sha256").update(eh(e)).digest("hex").slice(0,32),`wake:v1:${o}:${e.position}:${_}`),p=ev.get(E);if(p)return ew(p,!1);if(ey.get(t.id,e.position))throw new eN("idempotency_conflict",`Wake ${e.position} of event ${t.id} was already recorded with a different payload.`);let T=(0,r.randomUUID)(),g=s?.wake_event_id?(d=s.wake_event_id,eR.get(d)):void 0,h={id:T,idempotency_key:E,source_conversation_id:t.conversation_id,source_event_id:t.id,requester_agent_id:n,parent_request_id:s?.id??null,root_wake_id:g?.root_wake_id??T,syntax:e.syntax},N=null;if(e.validation.ok)if(s){let r=function(e,t,n){for(let r of[...e.contextWorkRequests??[],...e.resumeWorkRequest?[e.resumeWorkRequest]:[]]){let e=i.engine.getWorkRequest(r);if(!(e&&(n?e.root_request_id===n.root_request_id:e.source_conversation_id===t)))return`Work Request ${r} is not in this conversation lineage.`}return null}(N=e.validation.envelope,t.conversation_id,s);u=r?{status:"rejected",code:"invalid_reference",reason:r}:function(e){let{maxWakeDepth:t}=m(),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}).`}:function(e){let{rootBudget:t}=m(),n=eO(e);return n<t?null:{status:"rejected",code:"root_budget_exhausted",limit:t,observed:n,reason:`This work already used ${n} Wakes (limit ${t}).`}}(e.root_request_id)}(s)??function(e,t,n){let r=(0,i.resolveWakeTarget)(e.target);if(!r.ok){var s;return"ambiguous"===r.reason?{status:"unavailable",code:"target_ambiguous",reason:`More than one Agent is named ${e.target}; rename one to restore routing.`}:(s=e.target,i.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 function(e,t,n,r){let s=r.parent?.root_request_id??null,a=(0,c.selectExecutionPolicy)({entryPoint:"wake",executionKind:e.executionKind,wakeSyntax:t,resumesWorkRequest:!!e.resumeWorkRequest});if(!a.ok)return{status:"rejected",code:"unsupported_policy",reason:a.reason,target:n};let o=a.policy;if(e.resumeWorkRequest){let t=i.engine.getWorkRequest(e.resumeWorkRequest);if(!t||t.target_agent_id!==n.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:n}}if("review"===e.executionKind&&((e.contextWorkRequests??[]).some(e=>{let t=i.engine.getWorkRequest(e);return t&&["implementation","revision"].includes(t.execution_kind)&&t.target_agent_id===n.id})||null!==s&&i.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,n.id)))return{status:"rejected",code:"reviewer_not_independent",reason:`${n.name} did the work under review; wake a different reviewer or ask the person.`,target:n};let d=function(e,t,n){var r,s,a;if("implementation"!==(r=e.executionKind)&&"revision"!==r)return{rule:"readonly_default",id:null};if(function(e,t,n){var r;let s=n.parent;if("implementation"!==e.executionKind||t.id!==n.agentId||!s||null!==s.wake_event_id||0!==s.wake_depth||null!==s.parent_request_id||s.target_agent_id!==n.agentId||(r={kind:s.root_principal_kind??"",id:s.root_principal_id??""},r.kind!==f.kind||r.id!==f.id))return!1;let a=i.engine.listSafetyDecisions(s.id)[0];return a?.principal_type==="human_owner"}(e,t,n))return{rule:"owner_direct_self_wake",id:null};let o=(s=n.agentId,a=t.id,i.default.prepare("SELECT * FROM wake_grants WHERE caller_agent_id = ? AND target_agent_id = ? AND authority = 'edit' AND revoked_at IS NULL").get(s,a));return o?{rule:"edit_grant",id:o.id}:null}(e,n,r);return d?function(e,t,n){var r;let s=i.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:n};let o=(r=s,"hermes-gateway"===(0,l.agentTransport)((0,l.resolveAgent)(r).agent)?q()?{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:n}:{status:"blocked",code:"target_unavailable",reason:o.reason,target:e,policy:t,grant:n}}(n,o,d):{status:"blocked",code:"edit_approval_required",reason:`${n.name} needs your approval for edit work.`,target:n,policy:o,grant:null}}(e,t,{id:r.agentId,name:r.displayName},n)}(N,e.syntax,{agentId:n,parent:s})}else N=e.validation.envelope,u={status:"rejected",code:"untracked_lineage",reason:"Its source turn is not tracked work, so the Wake cannot start a lineage."};else u={status:"rejected",code:"invalid_envelope",reason:e.validation.reason};let R=N&&eL(u)?function(e,t,n,r){var s,a,o,d,u,l;let _,c,E=e.parent_request_id?i.engine.getWorkRequest(e.parent_request_id)??null:null;if(!E)throw new eN("invalid_input","A Wake creates work only in a tracked lineage.");let p=(s={rootPrincipal:{kind:E.root_principal_kind??"unknown",id:E.root_principal_id??"unknown"},wakeDepth:E.wake_depth+1,grant:n.grant,rootRequestId:E.root_request_id,counting:!0},_=m(),c=s.rootRequestId?eO(s.rootRequestId):0,{safety_version:1,root_principal:s.rootPrincipal,wake_depth:s.wakeDepth,grant_rule:s.grant?.rule??null,grant_id:s.grant?.id??null,root_budget:{used:c+ +!!s.counting,limit:_.rootBudget},safety_limits:{max_wake_depth:_.maxWakeDepth,root_budget:_.rootBudget}}),{request:T}=i.engine.createOrGetWorkRequest({sourceConversationId:e.source_conversation_id,sourceEventId:e.source_event_id,requester:{kind:"bot",id:e.requester_agent_id},targetAgentId:n.target.id,intent:t.objective,executionKind:n.policy.execution_kind,toolProfile:n.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:n.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:n.policy,initialState:"blocked"===n.status?"blocked":"queued",stateReason:"blocked"===n.status?`${n.code}: ${n.reason}`:null,safetySnapshot:p,safety:(a=e.id,o=e.requester_agent_id,{principalType:"agent_principal",principal:{kind:"bot",id:o},decision:"accepted"===n.status?"allowed":"blocked",reasonCode:n.code,grantRule:n.grant?.rule??null,grantId:n.grant?.id??null,wakeId:a,snapshot:p,now:r}),now:r});return"edit_approval_required"===n.code&&(d=T,u=e.id,l=r,i.engine.appendEvent(d.id,{type:"grant_requested",data:{wake_id:u,caller_agent_id:d.requester_id,target_agent_id:d.target_agent_id,authority:"edit",execution_kind:d.execution_kind},now:l})),T}(h,N,u,a):null;return i.default.prepare(`
|
|
2064
2071
|
INSERT INTO wakes (
|
|
2065
2072
|
id, idempotency_key, source_conversation_id, source_event_id, position, syntax, payload,
|
|
2066
2073
|
requester_agent_id, requested_target, target_agent_id, target_name_snapshot, execution_kind,
|
|
2067
2074
|
parent_request_id, root_request_id, root_wake_id, depth, status, reason_code, reason,
|
|
2068
2075
|
work_request_id, limit_value, observed_value, created_at, updated_at
|
|
2069
2076
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
2070
|
-
`).run(T,E,t.conversation_id,t.id,e.position,e.syntax,eh(e),n,N?.target??null,u.target?.id??null,u.target?.name??null,N?.executionKind??null,s?.id??null,R?.root_request_id??s?.root_request_id??null,h.root_wake_id,R?.wake_depth??(s?s.wake_depth+1:0),u.status,u.code,u.reason,R?.id??null,
|
|
2077
|
+
`).run(T,E,t.conversation_id,t.id,e.position,e.syntax,eh(e),n,N?.target??null,u.target?.id??null,u.target?.name??null,N?.executionKind??null,s?.id??null,R?.root_request_id??s?.root_request_id??null,h.root_wake_id,R?.wake_depth??(s?s.wake_depth+1:0),u.status,u.code,u.reason,R?.id??null,eL(u)?null:u.limit??null,eL(u)?null:u.observed??null,a,a),ew(eR.get(T),!0)})(e,t,t.sender_id,n,s))}).immediate()}({sourceEventId:d.id,parentRequestId:s.id,now:t})}catch(e){if(!(e instanceof eN))throw e;console.error(`Wakes of ${d.id} could not be routed:`,e.message),a=e}for(let e of n)o(e.request);let u=n.filter(e=>"rejected"===e.wake.status||"unavailable"===e.wake.status);(a||u.length>0)&&o(eD({key:`continuation:v1:wakes:${d.id}`,coordinatorId:s.target_agent_id,conversationId:d.conversation_id,sourceEventId:d.id,parent:s,intent:a?["[Wake not started] The Wakes in your last message could not be routed, so no work started:",a.message,eC].join("\n\n"):(e=u.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===u.length?"One Wake":`${u.length} Wakes`} from your last message did not start any work:`,e.join("\n"),eC].join("\n\n")),continues:"wake_outcome",subjects:u.flatMap(e=>e.wake.work_request_id?[e.wake.work_request_id]:[]),now:t}))}let u=function(e){if(!e.wake_event_id)return null;let t=eS(e).return_to;return t&&"string"==typeof t.agent_id&&"string"==typeof t.conversation_id?{agentId:t.agent_id,conversationId:t.conversation_id}:null}(s);return u&&o(eD({key:`continuation:v1:result:${s.id}`,coordinatorId:u.agentId,conversationId:u.conversationId,sourceEventId:d?.id??s.source_event_id,parent:s,intent:(n=d?.conversation_id===u.conversationId,[`[Work Request result] ${eA(s.target_agent_id)} finished the ${s.execution_kind} you requested.`,eq(s,n),eC].join("\n\n")),continues:"result",subjects:[s.id],now:t})),a})}(n))ej(e);(function(e){let t=eY.forHopRequest(e);if(t)try{for(let e of eY.advance(t.id))ej(e)}catch(e){console.error("Exchange advance failed:",e instanceof Error?e.message:"unknown error")}})(n),s&&function(){for(let e of eM.deferredRequestIds())eP.has(e)||ej(e)}()}async function eG(e){let n,s,a=i.engine.getWorkRequest(e);if(!a||"queued"!==a.state||null!==a.next_eligible_at&&eM.now()<a.next_eligible_at)return!1;let o=i.bots.getById(a.target_agent_id);if(!o)return eW(e,null,"agent_unavailable","The agent is no longer registered."),!1;let _=(0,c.authorizeWorkRequest)(a);if(!_.ok){try{i.engine.transitionWorkRequest(e,{from:"queued",to:"failed",expectedVersion:a.version,reason:"policy_rejected",errorCode:_.code,errorMessage:_.reason})}catch(e){if(!(e instanceof u.EngineStoreError&&"stale_state"===e.code))throw e}return!1}let E=_.policy,p=(0,l.resolveAgent)(o).agent,T=eY.resumeFor(a,p)??function(e,t){if("revision"!==e.execution_kind)return{ok:!0,binding:null};let n=eS(e).resume_work_request,r="string"==typeof n?i.engine.getWorkRequest(n):void 0;if(!r||r.root_request_id!==e.root_request_id||r.target_agent_id!==e.target_agent_id||!["implementation","revision"].includes(r.execution_kind))return{ok:!1,reason:"The revision does not reference an implementation of this Agent in this lineage."};let s=i.engine.getActiveSessionBinding({agentId:e.target_agent_id,adapter:t,conversationId:r.source_conversation_id,requestId:r.id});return s?{ok:!0,binding:s}:{ok:!1,reason:"The session of the referenced implementation is not available to resume."}}(a,p);if(!T.ok){try{i.engine.transitionWorkRequest(e,{from:"queued",to:"failed",expectedVersion:a.version,reason:"session_unavailable",errorCode:"session_unavailable",errorMessage:T.reason})}catch(e){if(!(e instanceof u.EngineStoreError&&"stale_state"===e.code))throw e}return!1}let m=null,f=null;try{m=function(e){var n,r;let i,s=(0,l.resolveAgent)(e.bot);if(!s.launchable)throw new V("agent_unavailable","connection"===(n=s.launch_blocker)?"The agent has no runtime connection. Choose one in Config.":"session_scope"===n?"The agent has no session scope. Choose one in Config.":"The agent has an unsupported Agent type.");let a={prompt:{kind:"conversation",system:(i=(r=e.bot).title?`${r.name} (${r.title})`:r.name,`You are ${i}.
|
|
2071
2078
|
${r.description}`),history:e.history},toolProfile:e.toolProfile??c.TOOL_PROFILE_FOR_KIND.conversation,sessionBinding:e.sessionBinding??null,correlation:{},...e.freshSession?{freshSession:!0}:{}};if("hermes-gateway"===(0,l.agentTransport)(s.agent))return{agent:s.agent,adapter:Q["hermes-gateway"](),input:{...a,target:{agentId:e.bot.id,agent:s.agent,hermesProfilePath:function(e){let t=(e.hermes_profile||"").trim();if(!t)return A;let n=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return n?`/p/${n}${A}`:A}(e.bot)},cwd:null}};let o=a.sessionBinding?null:function(e){let n=(0,d.directLaunchWorkspace)(e);if(!n){let t=(0,d.readStoredScope)(e);throw new V("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 t.default.mkdirSync(n,{recursive:!0}),n}catch{throw new V("agent_unavailable","The agent working directory is unavailable.")}}(e.bot);return{agent:s.agent,adapter:Q["session-provider"](),input:{...a,target:{agentId:e.bot.id,agent:s.agent},cwd:o}}}({bot:o,history:[...i.default.prepare(`SELECT * FROM messages WHERE conversation_id = ?
|
|
2072
2079
|
AND rowid <= (SELECT rowid FROM messages WHERE id = ?)
|
|
2073
2080
|
ORDER BY rowid ASC`).all(a.source_conversation_id,a.source_event_id).map(e=>({speakerLabel:function(e){if("bot"===e.sender_kind&&e.sender_id){let t=i.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===o.id,content:e.content})),...function(e){if(e.requester_kind===ek.kind&&e.requester_id===ek.id&&"coordinator_continuation"===eS(e).source)return[{speakerLabel:eI,fromAgent:!1,content:e.intent}];if(!e.wake_event_id)return[];let t=eS(e),n=Array.isArray(t.context_work_requests)?t.context_work_requests.filter(e=>"string"==typeof e):[],r=[`[${e.execution_kind} Wake from ${eA(e.requester_id)}] Work Request: ${e.id}`,`Objective:
|
|
@@ -2079,13 +2086,13 @@ ${eq(t)}`)}return[{speakerLabel:eI,fromAgent:!1,content:r.join("\n\n")}]}(a),...
|
|
|
2079
2086
|
UPDATE session_exchanges SET state = ?, version = version + 1, updated_at = ?, terminal_at = ?,
|
|
2080
2087
|
failure_code = ?, failure_message = ?
|
|
2081
2088
|
WHERE id = ? AND state = ? AND version = ?
|
|
2082
|
-
`).run(n,r,s?r:null,"failed"===n?i.failureCode??"failed":t.failure_code,"failed"===n?i.failureMessage??"The exchange failed.":t.failure_message,t.id,t.state,t.version).changes)throw new R("invalid_transition",`Exchange ${t.id} changed concurrently.`);return p(t.id,"state_changed",{from:t.state,to:n,reason:i.reason??null,..."failed"===n?{failure_code:i.failureCode??"failed"}:{}},r),_(t.id)}function N(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 R("invalid_transition",`Exchange ${t.id} changed concurrently.`);return _(t.id)}function
|
|
2089
|
+
`).run(n,r,s?r:null,"failed"===n?i.failureCode??"failed":t.failure_code,"failed"===n?i.failureMessage??"The exchange failed.":t.failure_message,t.id,t.state,t.version).changes)throw new R("invalid_transition",`Exchange ${t.id} changed concurrently.`);return p(t.id,"state_changed",{from:t.state,to:n,reason:i.reason??null,..."failed"===n?{failure_code:i.failureCode??"failed"}:{}},r),_(t.id)}function N(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 R("invalid_transition",`Exchange ${t.id} changed concurrently.`);return _(t.id)}function L(e,n,r){let i,s={kind:e.requester_kind,id:e.requester_id},a=`exchange:${e.id}:${n}`;if(r.intent.length>u.EXCHANGE_LIMITS.promptChars)throw new R("invalid_request",`The ${n} prompt exceeds ${u.EXCHANGE_LIMITS.promptChars} characters.`);return t.createOrGetWorkRequest({sourceConversationId:r.conversationId,sourceEventId:a,requester:g,targetAgentId:r.targetAgentId,intent:r.intent,executionKind:"conversation",toolProfile:"readonly",idempotencyKey:a,parentRequestId:r.parentRequestId,policy:{source:"session_exchange",exchange_id:e.id,hop:n,...r.resumeBindingId?{resume_session_binding:r.resumeBindingId}:{}},executionPolicy:function(){let e=(0,c.selectExecutionPolicy)({entryPoint:"exchange",executionKind:"conversation"});if(!e.ok)throw Error(e.reason);return e.policy}(),rootPrincipal:s,retryPolicy:{...E.DEFAULT_RETRY_POLICY},...{safetySnapshot:i={safety_version:1,root_principal:{kind:s.kind,id:s.id},grant_rule:"readonly_default",grant_id:null,exchange:!0},safety:{principalType:"service"===s.kind?"api_principal":"human_owner",principal:s,decision:"allowed",grantRule:"readonly_default",snapshot:i}},now:r.now}).request}function A(e,t){let n=o.get(e);if(!n)throw new R("agent_not_found",`No ${t} Agent ${e}.`);let r=(0,l.resolveAgent)(n);if(!r.launchable){let e="connection"===r.launch_blocker?"has no runtime connection":"session_scope"===r.launch_blocker?"has no session scope":"has an unsupported Agent type";throw new R("agent_unavailable",`The ${t} Agent ${n.name} ${e}.`)}return{id:n.id,name:n.name,agent:r.agent}}function b(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 R("conversation_not_found",`No ${r} conversation ${t} is visible to the owner.`)}let q={create(n){var s;if(!n.requester||!y(n.requester.id)||!["person","bot","service"].includes(n.requester.kind))throw new R("invalid_request","A requester principal is required.");let d="service"===n.requester.kind&&!0===n.serviceGrant&&n.requester.id!==g.id;if("person"!==n.requester.kind&&!d)throw new R("recursive_exchange","Exchanges are started by the owner; an Agent or exchange hop cannot start another exchange.");if(!y(n.idempotencyKey)||n.idempotencyKey.length>200)throw new R("invalid_request","An idempotency key (1-200 characters) is required.");if(!h.includes(n.mode))throw new R("invalid_request",'mode must be "ask" or "continue".');if(!y(n.originConversationId))throw new R("invalid_request","origin_conversation_id is required.");if(!y(n.sourceAgentId))throw new R("invalid_request","source.agent_id is required.");if(!y(n.sessionRef))throw new R("invalid_request","source.session_ref is required.");if(!y(n.instruction))throw new R("invalid_request","instruction is required.");if(n.instruction.length>u.EXCHANGE_LIMITS.instructionChars)throw new R("invalid_request",`instruction exceeds ${u.EXCHANGE_LIMITS.instructionChars} characters.`);if(void 0!==n.executionKind){let e=(0,c.selectExecutionPolicy)({entryPoint:"exchange",executionKind:n.executionKind});if(!e.ok)throw new R("authority_not_allowed",`${e.reason} An exchange never requests edit authority.`)}if("ask"===n.mode&&(null!=n.destinationAgentId||null!=n.destinationConversationId))throw new R("destination_invalid","An Ask returns to the origin conversation and takes no destination.");if("continue"===n.mode){if(!y(n.destinationAgentId))throw new R("destination_invalid","A Continue names destination.agent_id.");if(n.destinationAgentId===n.sourceAgentId)throw new R("destination_invalid","A Continue hands off to another Agent; the destination cannot be the source Agent.");if(null!=n.destinationConversationId&&!y(n.destinationConversationId))throw new R("destination_invalid","destination.conversation_id must be a non-empty string when present.")}let l=(s=JSON.stringify([n.mode,n.originConversationId,n.sourceAgentId,n.sessionRef,n.destinationAgentId??null,n.destinationConversationId??null,n.instruction]),(0,r.createHash)("sha256").update(s).digest("hex"));return e.transaction(()=>{var s,d;let c=i.get(n.requester.kind,n.requester.id,n.idempotencyKey);if(c){if(c.request_hash!==l)throw new R("idempotency_conflict","The idempotency key was already used with a different exchange.");return{exchange:c,created:!1}}let E=n.now??Date.now();if(b(n.originConversationId,n.requester,"origin"),!o.get(n.sourceAgentId))throw new R("agent_not_found",`No source Agent ${n.sourceAgentId}.`);let T=a.get(n.sessionRef);if(!T||T.agent_id!==n.sourceAgentId)throw new R("session_not_found",`Session ${n.sessionRef} is not a session of Agent ${n.sourceAgentId}.`);if(null!==T.released_at)throw new R("session_ended",`Session ${T.id} has ended and cannot be resumed.`);let m=A(n.sourceAgentId,"source");if(T.adapter!==m.agent)throw new R("session_not_resumable",`Session ${T.id} was bound under ${T.adapter}; ${m.name} now runs ${m.agent}.`);let f=T.conversation_id?T.conversation_id:T.request_id?t.getWorkRequest(T.request_id)?.source_conversation_id??null:null;if(!f)throw new R("session_not_resumable",`Session ${T.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(T.id))throw new R("source_session_busy",`Session ${T.id} already has an exchange in progress; wait for it or cancel it.`);let g=null,h=null;if("continue"===n.mode)if(g=A(n.destinationAgentId,"destination"),n.destinationConversationId)b(n.destinationConversationId,n.requester,"destination"),h=n.destinationConversationId;else if("service"===n.requester.kind)throw new R("destination_invalid","A service-started Continue names destination.conversation_id.");else{let t=e.prepare("SELECT id FROM conversations WHERE bot_id = ?").get(g.id);if(!t)throw new R("destination_invalid",`${g.name} has no direct thread; name destination.conversation_id.`);h=t.id}let v=(0,r.randomUUID)();e.prepare(`
|
|
2083
2090
|
INSERT INTO session_exchanges (
|
|
2084
2091
|
id, requester_kind, requester_id, idempotency_key, request_hash, mode, origin_conversation_id,
|
|
2085
2092
|
source_agent_id, source_binding_id, destination_agent_id, destination_conversation_id, instruction,
|
|
2086
2093
|
state, created_at, updated_at
|
|
2087
2094
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)
|
|
2088
|
-
`).run(v,n.requester.kind,n.requester.id,n.idempotencyKey,l,n.mode,n.originConversationId,n.sourceAgentId,T.id,g?.id??null,h,n.instruction,E,E),p(v,"created",{mode:n.mode,source_agent_id:n.sourceAgentId,source_binding_id:T.id,destination_agent_id:g?.id??null,destination_conversation_id:h},E);let y=_(v),
|
|
2095
|
+
`).run(v,n.requester.kind,n.requester.id,n.idempotencyKey,l,n.mode,n.originConversationId,n.sourceAgentId,T.id,g?.id??null,h,n.instruction,E,E),p(v,"created",{mode:n.mode,source_agent_id:n.sourceAgentId,source_binding_id:T.id,destination_agent_id:g?.id??null,destination_conversation_id:h},E);let y=_(v),w="ask"===n.mode?"ask":"extract",O=L(y,w,{conversationId:f,targetAgentId:n.sourceAgentId,intent:"ask"===w?function(e,t,n="the owner"){return`[Session Ask from ${n}] Exchange: ${e}
|
|
2089
2096
|
|
|
2090
2097
|
Answer one question from the context of this session. ${k} Reply with the answer only.
|
|
2091
2098
|
|
|
@@ -2103,9 +2110,9 @@ objective: what ${s} should achieve. decisions: what was decided and why. constr
|
|
|
2103
2110
|
Limits: objective at most ${u.EXCHANGE_LIMITS.packetObjectiveChars} characters; each list at most ${u.EXCHANGE_LIMITS.packetListItems} entries of at most ${u.EXCHANGE_LIMITS.packetItemChars} characters.
|
|
2104
2111
|
|
|
2105
2112
|
Owner instruction:
|
|
2106
|
-
${d}`),parentRequestId:T.request_id,resumeBindingId:T.id,now:E}),I=N(y,{source_request_id:O.id},E);return p(v,"hop_queued",{hop:
|
|
2113
|
+
${d}`),parentRequestId:T.request_id,resumeBindingId:T.id,now:E}),I=N(y,{source_request_id:O.id},E);return p(v,"hop_queued",{hop:w,request_id:O.id},E),{exchange:I,created:!0}}).immediate()},get:e=>n.get(e),require:_,listEvents:t=>e.prepare("SELECT * FROM session_exchange_events WHERE exchange_id = ? ORDER BY sequence ASC").all(t),forHopRequest:e=>s.get(e,e),resumeFor(e,t){let n=S(e);if(!n)return null;if("deliver"===n.hop)return{ok:!0,binding:null,freshSession:!0};let r=q.get(n.exchangeId),i=n.resumeBindingId?a.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=>S(e)?[{speakerLabel:"Botmancers",fromAgent:!1,content:e.intent}]:null,hopClaimed(e,t,n){let r=q.forHopRequest(e);if(!(!r||m(r.state))){if(r.source_request_id===e){let i=r.source_attempt_id?r:N(r,{source_attempt_id:t},n);"queued"===i.state&&f(i,"extracting",n,{reason:"hop_started"}),p(r.id,"hop_started",{hop:"ask"===r.mode?"ask":"extract",request_id:e,attempt_id:t},n);return}r.destination_attempt_id||N(r,{destination_attempt_id:t},n),p(r.id,"hop_started",{hop:"deliver",request_id:e,attempt_id:t},n)}},sanitizeHopResult(e,t){let n=S(e),r=n?q.get(n.exchangeId):void 0;if(!n||!r)return t;let i=a.get(r.source_binding_id)?.external_session_id??null,s="ask"===n.hop?u.EXCHANGE_LIMITS.answerChars:"extract"===n.hop?u.EXCHANGE_LIMITS.extractionOutputChars:u.EXCHANGE_LIMITS.replyChars,o=t.externalSessionId??null,d=null===t.output?null:O(w(t.output,i,o),s);return{...t,output:d?d.content:null,outputTruncated:!0===t.outputTruncated||d?.truncated===!0,failure:t.failure?{...t.failure,message:w(t.failure.message,i,o)}:null}},commitHop(n,i,s,o){let d=S(n),l=d?q.get(d.exchangeId):void 0;if(!d||!l)return{exchange_id:d?.exchangeId??null,discarded:"exchange_missing"};if(m(l.state)||null!==l.cancel_requested_at)return p(l.id,"hop_result_discarded",{hop:d.hop,request_id:n.id,reason:m(l.state)?l.state:"cancel_requested"},o),{exchange_id:l.id,discarded:"cancel_requested"};let _=s.output??"",c=a.get(l.source_binding_id)?.external_session_id??null;if("ask"===d.hop){let t=O(w(_,c),u.EXCHANGE_LIMITS.answerChars),{content:a}=t,d=t.truncated||!0===s.outputTruncated,E=(0,r.randomUUID)();return e.prepare("INSERT INTO messages (id, conversation_id, sender_type, sender_id, sender_kind, request_id, content, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run(E,l.origin_conversation_id,"bot",l.source_agent_id,"bot",n.id,a,o),N(l,{answer_message_id:E},o),p(l.id,"answer_returned",{request_id:n.id,attempt_id:i.id,message_id:E,conversation_id:l.origin_conversation_id,truncated:d},o),{exchange_id:l.id,answer_message_id:E}}if("extract"===d.hop){var E;let e=s.outputTruncated?{ok:!1,reason:`The extraction output exceeds ${u.EXCHANGE_LIMITS.extractionOutputChars} characters.`}:function(e){let t;if(e.length>u.EXCHANGE_LIMITS.extractionOutputChars)return{ok:!1,reason:`The extraction output exceeds ${u.EXCHANGE_LIMITS.extractionOutputChars} characters.`};let n=/```(?:json)?\s*([\s\S]*?)```/.exec(e),r=(n?n[1]:e).trim(),i=r.indexOf("{"),s=r.lastIndexOf("}");if(i<0||s<i)return{ok:!1,reason:"The handoff packet is not a JSON object."};try{t=JSON.parse(r.slice(i,s+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 a=t;if(!y(a.objective))return{ok:!1,reason:"The handoff packet has no objective."};if(a.objective.length>u.EXCHANGE_LIMITS.packetObjectiveChars)return{ok:!1,reason:`The handoff packet objective exceeds ${u.EXCHANGE_LIMITS.packetObjectiveChars} characters.`};let o={objective:a.objective.trim(),decisions:[],constraints:[],artifacts:[],open_questions:[]};for(let e of v){let t=a[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>u.EXCHANGE_LIMITS.packetListItems)return{ok:!1,reason:`The handoff packet field ${e} has ${t.length} entries (limit ${u.EXCHANGE_LIMITS.packetListItems}).`};if(t.some(e=>e.length>u.EXCHANGE_LIMITS.packetItemChars))return{ok:!1,reason:`An entry of the handoff packet field ${e} exceeds ${u.EXCHANGE_LIMITS.packetItemChars} characters.`};o[e]=t.map(e=>e.trim()).filter(e=>e.length>0)}return JSON.stringify(o).length>u.EXCHANGE_LIMITS.packetChars?{ok:!1,reason:`The handoff packet exceeds ${u.EXCHANGE_LIMITS.packetChars} characters.`}:{ok:!0,packet:o}}(_);if(!e.ok)return p(l.id,"packet_rejected",{request_id:n.id,attempt_id:i.id,reason:e.reason},o),f(l,"failed",o,{reason:"packet_invalid",failureCode:"packet_invalid",failureMessage:e.reason}),{exchange_id:l.id,packet:"rejected"};let t=(E=e.packet,{objective:w(E.objective,c),decisions:E.decisions.map(e=>w(e,c)),constraints:E.constraints.map(e=>w(e,c)),artifacts:E.artifacts.map(e=>w(e,c)),open_questions:E.open_questions.map(e=>w(e,c))});return N(l,{packet:JSON.stringify(t)},o),p(l.id,"packet_extracted",{request_id:n.id,attempt_id:i.id,size:JSON.stringify(t).length,counts:Object.fromEntries(v.map(e=>[e,t[e].length]))},o),{exchange_id:l.id,packet:"stored"}}let T=s.externalSessionId??null,g=!1;try{g=!0===JSON.parse(i.launch_snapshot).fresh_session}catch{g=!1}if(!(g&&T&&T!==c&&!e.prepare("SELECT 1 FROM session_bindings WHERE external_session_id = ?").get(T)&&!e.prepare("SELECT 1 FROM work_attempts WHERE external_session_id = ? AND id != ?").get(T,i.id))){let e=g?T?"reused":"not_reported":"not_fresh_launch";return p(l.id,"destination_session_rejected",{request_id:n.id,attempt_id:i.id,reason:e},o),f(l,"failed",o,{reason:"destination_session_invalid",failureCode:"destination_session_invalid",failureMessage:T?"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:l.id,destination_session:"rejected"}}let h=(0,r.randomUUID)(),R=l.destination_conversation_id,L=O(w(_,c,T),u.EXCHANGE_LIMITS.replyChars),{content:k}=L,I=L.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(h,R,"bot",n.target_agent_id,"bot",n.id,k,o);let A=t.bindSession({agentId:n.target_agent_id,adapter:i.adapter,externalSessionId:T,conversationId:R,requestId:n.id,sourceAttemptId:i.id,now:o}).id;return N(l,{destination_binding_id:A},o),p(l.id,"destination_replied",{request_id:n.id,attempt_id:i.id,message_id:h,conversation_id:R,session_ref:A,truncated:I},o),{exchange_id:l.id,destination_message_id:h}},advance:(n,r=Date.now())=>e.transaction(()=>{let i=q.get(n);if(!i||m(i.state))return[];if("queued"===i.state||"extracting"===i.state){var s,a,o,d;let n=i.source_request_id?t.getWorkRequest(i.source_request_id):void 0;if(!n)return f(i,"failed",r,{reason:"hop_missing",failureCode:"hop_missing",failureMessage:"The source session turn is missing."}),[];if(!u.TERMINAL_STATES.includes(n.state))return"queued"!==n.state&&"queued"===i.state&&f(i,"extracting",r,{reason:"hop_started"}),"queued"===n.state&&null===i.cancel_requested_at?[n.id]:[];if(null!==i.cancel_requested_at||"cancelled"===n.state)return f(i,"cancelled",r,{reason:null!==i.cancel_requested_at?"cancel_requested":"hop_cancelled"}),[];if("failed"===n.state)return f(i,"failed",r,{reason:"hop_failed",failureCode:"source_turn_failed",failureMessage:`The source session turn failed (${n.error_code??"failed"}): ${n.error_message??"no detail"}`}),[];if("queued"===i.state&&(i=f(i,"extracting",r,{reason:"hop_started"})),"ask"===i.mode)return i.answer_message_id?f(i,"completed",r,{reason:"answered"}):f(i,"failed",r,{reason:"answer_missing",failureCode:"answer_missing",failureMessage:"The source session turn returned no answer."}),[];if(!i.packet)return f(i,"failed",r,{reason:"packet_missing",failureCode:"packet_missing",failureMessage:"The source session turn returned no handoff packet."}),[];let l=JSON.parse(i.packet),_=i.destination_conversation_id,c=i.destination_agent_id;s={kind:"bot",id:c},e.prepare("INSERT OR IGNORE INTO conversation_participants (conversation_id, participant_kind, participant_id, joined_at) VALUES (?, ?, ?, ?)").run(_,s.kind,s.id,r);let E=L(i,"deliver",{conversationId:_,targetAgentId:c,intent:(a=i.id,o=T(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:
|
|
2107
2114
|
${l.objective}`,I("Decisions",l.decisions),I("Constraints",l.constraints),I("Artifacts and references",l.artifacts),I("Open questions",l.open_questions),`Owner instruction:
|
|
2108
|
-
${d}`].join("\n\n")),parentRequestId:null,resumeBindingId:null,now:r});return p((i=N(i,{destination_request_id:E.id},r)).id,"hop_queued",{hop:"deliver",request_id:E.id},r),f(i,"delivering",r,{reason:"packet_extracted"}),[E.id]}let l=i.destination_request_id?t.getWorkRequest(i.destination_request_id):void 0;return l?u.TERMINAL_STATES.includes(l.state)?(null!==i.cancel_requested_at||"cancelled"===l.state?f(i,"cancelled",r,{reason:null!==i.cancel_requested_at?"cancel_requested":"hop_cancelled"}):"failed"===l.state?f(i,"failed",r,{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?f(i,"completed",r,{reason:"delivered"}):f(i,"failed",r,{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]:[]:(f(i,"failed",r,{reason:"hop_missing",failureCode:"hop_missing",failureMessage:"The destination turn is missing."}),[])}).immediate(),requestCancel:(t,n,r,i=Date.now())=>e.transaction(()=>{let s=_(t);if(m(s.state))throw new R("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),p(t,"cancel_requested",{by:`${n.kind}:${n.id}`,reason:r,state:s.state,request_id:a},i),{exchange:_(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(n){let r=_(n),i=(e,n)=>{let r=e?t.getWorkRequest(e):void 0;return r?{request_id:r.id,attempt_id:n,state:r.state,execution_kind:r.execution_kind,tool_profile:r.tool_profile}:null},s=r.answer_message_id?e.prepare("SELECT id, conversation_id, content FROM messages WHERE id = ?").get(r.answer_message_id):void 0;return{id:r.id,mode:r.mode,state:r.state,requester:{kind:r.requester_kind,id:r.requester_id},origin_conversation_id:r.origin_conversation_id,instruction:r.instruction,source:{agent_id:r.source_agent_id,agent_name:T(r.source_agent_id),session_ref:r.source_binding_id},destination:r.destination_agent_id&&r.destination_conversation_id?{agent_id:r.destination_agent_id,agent_name:T(r.destination_agent_id),conversation_id:r.destination_conversation_id,session_ref:r.destination_binding_id}:null,hops:{source:i(r.source_request_id,r.source_attempt_id),destination:i(r.destination_request_id,r.destination_attempt_id)},answer:s?{message_id:s.id,conversation_id:s.conversation_id,content:s.content}:null,packet:r.packet?JSON.parse(r.packet):null,failure:"failed"===r.state?{code:r.failure_code??"failed",message:r.failure_message??""}:null,cancel:null!==r.cancel_requested_at?{requested_at:r.cancel_requested_at,reason:r.cancel_reason}:null,events:q.listEvents(r.id).map(e=>({sequence:e.sequence,type:e.type,at:e.created_at,data:e.data?JSON.parse(e.data):null})),limits:u.EXCHANGE_LIMITS,created_at:r.created_at,updated_at:r.updated_at,terminal_at:r.terminal_at}}};return q}(i.default,i.engine),ez={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",workspace_required:"ask_owner",no_eligible_session:"ask_owner",
|
|
2115
|
+
${d}`].join("\n\n")),parentRequestId:null,resumeBindingId:null,now:r});return p((i=N(i,{destination_request_id:E.id},r)).id,"hop_queued",{hop:"deliver",request_id:E.id},r),f(i,"delivering",r,{reason:"packet_extracted"}),[E.id]}let l=i.destination_request_id?t.getWorkRequest(i.destination_request_id):void 0;return l?u.TERMINAL_STATES.includes(l.state)?(null!==i.cancel_requested_at||"cancelled"===l.state?f(i,"cancelled",r,{reason:null!==i.cancel_requested_at?"cancel_requested":"hop_cancelled"}):"failed"===l.state?f(i,"failed",r,{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?f(i,"completed",r,{reason:"delivered"}):f(i,"failed",r,{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]:[]:(f(i,"failed",r,{reason:"hop_missing",failureCode:"hop_missing",failureMessage:"The destination turn is missing."}),[])}).immediate(),requestCancel:(t,n,r,i=Date.now())=>e.transaction(()=>{let s=_(t);if(m(s.state))throw new R("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),p(t,"cancel_requested",{by:`${n.kind}:${n.id}`,reason:r,state:s.state,request_id:a},i),{exchange:_(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(n){let r=_(n),i=(e,n)=>{let r=e?t.getWorkRequest(e):void 0;return r?{request_id:r.id,attempt_id:n,state:r.state,execution_kind:r.execution_kind,tool_profile:r.tool_profile}:null},s=r.answer_message_id?e.prepare("SELECT id, conversation_id, content FROM messages WHERE id = ?").get(r.answer_message_id):void 0;return{id:r.id,mode:r.mode,state:r.state,requester:{kind:r.requester_kind,id:r.requester_id},origin_conversation_id:r.origin_conversation_id,instruction:r.instruction,source:{agent_id:r.source_agent_id,agent_name:T(r.source_agent_id),session_ref:r.source_binding_id},destination:r.destination_agent_id&&r.destination_conversation_id?{agent_id:r.destination_agent_id,agent_name:T(r.destination_agent_id),conversation_id:r.destination_conversation_id,session_ref:r.destination_binding_id}:null,hops:{source:i(r.source_request_id,r.source_attempt_id),destination:i(r.destination_request_id,r.destination_attempt_id)},answer:s?{message_id:s.id,conversation_id:s.conversation_id,content:s.content}:null,packet:r.packet?JSON.parse(r.packet):null,failure:"failed"===r.state?{code:r.failure_code??"failed",message:r.failure_message??""}:null,cancel:null!==r.cancel_requested_at?{requested_at:r.cancel_requested_at,reason:r.cancel_reason}:null,events:q.listEvents(r.id).map(e=>({sequence:e.sequence,type:e.type,at:e.created_at,data:e.data?JSON.parse(e.data):null})),limits:u.EXCHANGE_LIMITS,created_at:r.created_at,updated_at:r.updated_at,terminal_at:r.terminal_at}}};return q}(i.default,i.engine),ez={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",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"},eJ={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 eV extends Error{code;recovery;constructor(e,t){super(t),this.name="PinError",this.code=e,this.recovery=function(e){return Object.prototype.hasOwnProperty.call(ez,e)?ez[e]:null}(e)}get status(){return eJ[this.code]}}function eQ(e){return"string"==typeof e&&e.trim().length>0}function eZ(e,t,n,s){i.default.prepare(`
|
|
2109
2116
|
INSERT INTO session_pin_events (id, pin_id, sequence, type, data, created_at)
|
|
2110
2117
|
SELECT ?, ?, COALESCE(MAX(sequence), 0) + 1, ?, ?, ? FROM session_pin_events WHERE pin_id = ?
|
|
2111
2118
|
`).run((0,r.randomUUID)(),e,t,JSON.stringify(n),s,e)}function e0(e){return i.default.prepare("SELECT * FROM session_pins WHERE id = ?").get(e)}function e1(e,t){return i.default.prepare("SELECT * FROM session_pin_turns WHERE requester_kind = ? AND requester_id = ? AND idempotency_key = ?").get(e.kind,e.id,t)}function e4(e,t){let n="string"==typeof t&&t.length<=200?e0(t):void 0;if(!n||n.requester_kind!==e.kind||n.requester_id!==e.id)throw new eV("pin_not_found","No pin with that reference is visible to this requester.");return n}function e2(e,t,n,s){let a=(0,r.randomUUID)();return i.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,n,s),a}function e3(e){if(e.provider_turn_ref){let t=e0(e.pin_id),n=(0,_.getProviderTurn)(i.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=eY.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",r=t.answer_message_id?i.default.prepare("SELECT content FROM messages WHERE id = ?").get(t.answer_message_id)?.content??null:null;return{state:n,answer:"completed"===n?r:null,failure:"failed"===n?{code:t.failure_code??"failed"}:"cancelled"===n?{code:"cancelled"}:null,finished_at:t.terminal_at}}function e6(e,t){let n=e3(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 e9(e,t,n){let r=t;try{if(t instanceof eV)throw t;if(t instanceof _.ProviderSessionError)throw function(e){switch(e.code){case"agent_not_found":return new eV("agent_not_found","No such Agent.");case"session_not_found":return new eV("session_not_found","No session with that reference.");case"session_missing":return new eV("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 eV("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 eV("session_not_resumable","The session is outside the Agent’s session scope.");case"busy":return new eV("source_session_busy","A turn is already running in this session; wait for it, then send again.");case"authority_not_allowed":return new eV("authority_not_allowed",`The Agent’s policy or runtime refused this authority: ${e.message}`);case"new_sessions_not_allowed":return new eV("no_eligible_session","The Agent’s policy does not allow new sessions.");case"unsupported":return new eV("action_unavailable","The Agent’s runtime does not support this action.");case"scope_missing":return new eV("agent_unavailable","The Agent has no session scope; the owner must choose one.");case"provider_unavailable":return new eV("agent_unavailable","The Agent’s runtime connection is not available.");case"idempotency_conflict":return new eV("idempotency_conflict","That idempotency key was used for a different turn.");case"invalid_input":return new eV("invalid_request",e.message);default:return new eV("provider_failed","The runtime failed this turn. The pin stays on the same session; retry later.")}}(t);if(t instanceof R)throw function(e){switch(e.code){case"session_not_found":return new eV("session_not_found","No session with that reference.");case"agent_not_found":return new eV("agent_not_found","No such Agent.");case"conversation_not_found":return new eV("conversation_not_found","No conversation with that id is visible.");case"session_ended":return new eV("session_ended","This session has ended. The pin stays on it; detach it or switch to another session.");case"session_not_resumable":return new eV("session_not_resumable","Botmancers cannot resume this session under the Agent’s current runtime.");case"source_session_busy":return new eV("source_session_busy","This session already has a turn in progress; wait for it, then send again.");case"agent_unavailable":return new eV("agent_unavailable",e.message);case"idempotency_conflict":return new eV("idempotency_conflict","That idempotency key was used for a different turn.");default:return new eV("invalid_request",e.message)}}(t);throw t}catch(e){r=e}if(r instanceof eV){let t=r.code;i.default.transaction(()=>eZ(e.id,"turn_refused",{code:t,session_ref:e.session_ref},n)).immediate()}throw r}function e5(e,t){return`pin-${(0,r.createHash)("sha256").update(`${e}
|
|
@@ -2166,14 +2173,14 @@ ${t}`).digest("hex").slice(0,40)}`}function e8(e,t,n,s,a,o,d){var u;let l=(0,r.r
|
|
|
2166
2173
|
`);let td=(0,r.randomBytes)(9).toString("base64url"),tu=new Set,tl=/^T[A-Z0-9]{2,20}$/,t_=/^[CG][A-Z0-9]{2,20}$/,tc=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;class tE extends Error{constructor(e){super(e),this.name="SessionSharesConfigError"}}function tp(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function tT(e,t,n){let r=Object.keys(e).find(e=>!t.includes(e));if(void 0!==r)throw new tE(`${n} has an unknown field "${r}".`)}let tm=null;function tf(e=process.env){let a,o=function(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}(e);if(!o)return{state:"absent",path:null};try{a=t.default.statSync(o)}catch(e){if("ENOENT"===e.code)return{state:"absent",path:o};return{state:"invalid",path:o,reason:"The document cannot be read."}}let d=new Set(i.default.prepare("SELECT id FROM bots").all().map(e=>e.id)),u=(0,r.createHash)("sha256").update([...d].sort().join("\n"),"utf8").digest("hex"),l=[o,a.ino,a.size,a.mode,a.uid,a.mtimeMs,u].join(":");if(tm&&tm.key===l)return tm.state;let _=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:function(e,t){let n;try{n=JSON.parse(e)}catch{throw new tE("The document is not valid JSON.")}if(!tp(n))throw new tE("The document must be a JSON object.");if(tT(n,["version","audiences","agents"],"The document"),1!==n.version)throw new tE("version must be 1.");let r=n.audiences??[],i=n.agents??[];if(!Array.isArray(r))throw new tE("audiences must be a list.");if(!Array.isArray(i))throw new tE("agents must be a list.");if(r.length>512||i.length>512)throw new tE("A list has more than 512 entries.");let s=new Set,a=r.map((e,t)=>{let n=`audiences[${t}]`;if(!tp(e))throw new tE(`${n} must be an object.`);if(tT(e,["kind","team_id","channel_id"],n),!(tp(e)&&Object.keys(e).every(e=>["kind","team_id","channel_id"].includes(e))&&"slack"===e.kind&&"string"==typeof e.team_id&&tl.test(e.team_id)&&"string"==typeof e.channel_id&&t_.test(e.channel_id)))throw new tE(`${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 tE(`${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(!tp(e))throw new tE(`${r} must be an object.`);if(tT(e,["agent","share_from_turn"],r),"string"!=typeof e.agent||!tc.test(e.agent))throw new tE(`${r}.agent must be one Agent id; wildcards are not allowed.`);if(t&&!t.has(e.agent))throw new tE(`${r}.agent is not a registered Agent.`);if("boolean"!=typeof e.share_from_turn)throw new tE(`${r}.share_from_turn must be true or false.`);if(d.has(e.agent))throw new tE(`${r} repeats that Agent.`);d.add(e.agent),e.share_from_turn&&o.add(e.agent)}),{audiences:Object.freeze(a),shareFromTurn:o}}(i,r)}}catch(t){if(t instanceof tE)return{state:"invalid",path:e,reason:t.message};throw t}}(o,a,d);return tm={key:l,state:_},_}function tg(e){let t=tf();return"loaded"===t.state&&t.config.audiences.some(t=>t.team_id===e.team_id&&t.channel_id===e.channel_id)}function th(e){let t=tf();return"loaded"===t.state&&t.config.shareFromTurn.has(e)}function tN(e){if("string"==typeof e&&0!==e.length&&!(e.length>200))return i.default.prepare("SELECT * FROM session_shares WHERE id = ?").get(e)}function tR(e,t=Date.now()){return"revoked"===e.state?"revoked":t>=e.expires_at?"expired":"active"}function tv(e,t=Date.now()){return{share_ref:e.id,agent_id:e.agent_id,session_ref:e.session_ref,authority:"ask",state:tR(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 ty(e,t,n,r={}){i.default.prepare(`
|
|
2167
2174
|
INSERT INTO session_share_events (share_ref, sequence, type, turn_ref, code, at)
|
|
2168
2175
|
SELECT ?, COALESCE(MAX(sequence), 0) + 1, ?, ?, ?, ? FROM session_share_events WHERE share_ref = ?
|
|
2169
|
-
`).run(e,t,r.turnRef??null,r.code??null,n,e)}function
|
|
2176
|
+
`).run(e,t,r.turnRef??null,r.code??null,n,e)}function tw(){let e=Date.now(),t=i.default.prepare(`
|
|
2170
2177
|
SELECT s.id FROM session_shares s JOIN session_pins p ON p.id = s.pin_ref
|
|
2171
2178
|
WHERE s.state = 'active' AND s.expires_at <= ? AND p.state = 'attached'
|
|
2172
2179
|
ORDER BY s.expires_at, s.id LIMIT 500
|
|
2173
|
-
`).all(e),n=[];for(let{id:r}of t)i.default.transaction(()=>{let t=tN(r);if(!t||"expired"!==tR(t,e))return;let{replayed:s}=function(e,t,n={}){return i.default.transaction(()=>{var r;let s=e4(e,t);if("detached"===s.state)return n.onCommit?.(s),{pin:s,replayed:!0};r=n.now??Date.now(),i.default.prepare("UPDATE session_pins SET state = 'detached', detach_reason = ?, replaced_by = ?, detached_at = ?, updated_at = ? WHERE id = ? AND state = 'attached'").run("detached",null,r,r,s.id),eZ(s.id,"detached",{},r);let a=e0(s.id);return n.onCommit?.(a),{pin:a,replayed:!1}}).immediate()}(ti,t.pin_ref,{now:e});s||(i.serviceAudit.append({principal:ti,operation:"shares.expire",capability:"shares:ask",targetKind:"session",targetRef:t.session_ref,agentId:t.agent_id,outcome:"allowed",code:"expired"}),n.push(r))}).immediate();return{swept:n}}class
|
|
2180
|
+
`).all(e),n=[];for(let{id:r}of t)i.default.transaction(()=>{let t=tN(r);if(!t||"expired"!==tR(t,e))return;let{replayed:s}=function(e,t,n={}){return i.default.transaction(()=>{var r;let s=e4(e,t);if("detached"===s.state)return n.onCommit?.(s),{pin:s,replayed:!0};r=n.now??Date.now(),i.default.prepare("UPDATE session_pins SET state = 'detached', detach_reason = ?, replaced_by = ?, detached_at = ?, updated_at = ? WHERE id = ? AND state = 'attached'").run("detached",null,r,r,s.id),eZ(s.id,"detached",{},r);let a=e0(s.id);return n.onCommit?.(a),{pin:a,replayed:!1}}).immediate()}(ti,t.pin_ref,{now:e});s||(i.serviceAudit.append({principal:ti,operation:"shares.expire",capability:"shares:ask",targetKind:"session",targetRef:t.session_ref,agentId:t.agent_id,outcome:"allowed",code:"expired"}),n.push(r))}).immediate();return{swept:n}}class tL extends Error{code;status;constructor(e,t,n){super(t),this.name="ShareAskError",this.code=e,this.status=n}}function tO(e){return{turn_ref:e.turn_ref,state:e.state,answer:"completed"===e.state?function(e){if(null===e)return null;let t=(0,a.serviceRedactor)().text(e);return t.length>ts.replyChars?`${t.slice(0,ts.replyChars-1)}…`:t}(e.answer):null,failure:e.failure?{code:e.failure.code}:null}}async function tk(e,t){let{turns:n}=await tr(ti,e.pin_ref);return n.find(e=>e.turn_ref===t)??null}async function tI(e){if(e.inflight_turn_ref){let t=await tk(e,e.inflight_turn_ref);if(t&&"running"===t.state)return"busy";i.default.prepare("UPDATE session_shares SET inflight_turn_ref = NULL WHERE id = ? AND inflight_turn_ref = ?").run(e.id,e.inflight_turn_ref)}if(e.inflight_key){if(e.inflight_owner===td&&tu.has(e.id))return"busy";i.default.prepare("UPDATE session_shares SET inflight_key = NULL, inflight_owner = NULL WHERE id = ? AND inflight_key = ?").run(e.id,e.inflight_key)}return"free"}async function tS(e){var t,n,r;let s=tN(e.shareRef),a=(e,t)=>i.serviceAudit.append({principal:ti,operation:"shares.ask",capability:"shares:ask",targetKind:"session",targetRef:s?.session_ref??null,agentId:s?.agent_id??null,outcome:e,code:t}),o=(e,t,n)=>{let r="invalid_request"===e||"idempotency_conflict"===e?"rejected":"denied";throw i.default.transaction(()=>{a(r,e),s&&ty(s.id,"turn_refused",Date.now(),{code:e})}).immediate(),new tL(e,t,n)},d=(e,t)=>o(e,t,ta[e]);s||d("share_not_found","No share with that reference."),("string"!=typeof e.messageKey||0===e.messageKey.trim().length||e.messageKey.length>200)&&d("invalid_request","A question key (1-200 characters) is required."),("string"!=typeof e.question||0===e.question.trim().length||e.question.length>ts.questionChars)&&d("invalid_request",`The question must be 1-${ts.questionChars} characters.`);let u=tR(s);"revoked"===u&&d("share_revoked","This share was revoked."),"expired"===u&&d("share_expired","This share has expired.");let l=()=>tn({requester:ti,pinRef:s.pin_ref,content:e.question,idempotencyKey:e.messageKey,onCommit:(e,t)=>{let n=Date.now();if(1!==i.default.prepare(`
|
|
2174
2181
|
UPDATE session_shares SET turns_used = turns_used + 1, inflight_turn_ref = ?, inflight_key = NULL, inflight_owner = NULL, updated_at = ?
|
|
2175
2182
|
WHERE id = ? AND turns_used < max_turns
|
|
2176
|
-
`).run(t.id,n,s.id).changes)throw new to("share_turn_limit","This share has used all of its questions.");ty(s.id,"turn_sent",n,{turnRef:t.id}),a("allowed",null)}}),_=e=>{if(e instanceof
|
|
2183
|
+
`).run(t.id,n,s.id).changes)throw new to("share_turn_limit","This share has used all of its questions.");ty(s.id,"turn_sent",n,{turnRef:t.id}),a("allowed",null)}}),_=e=>{if(e instanceof tL)throw e;throw e instanceof to&&d(e.code,e.message),e instanceof eV&&(("pin_detached"===e.code||"pin_not_found"===e.code)&&d("share_revoked","This share was revoked."),o(e.code,e.message,e.status)),e};if(t=e.messageKey,i.default.prepare("SELECT pin_id FROM session_pin_turns WHERE requester_kind = ? AND requester_id = ? AND idempotency_key = ?").get(ti.kind,ti.id,`turn:${t}`)){let e;try{e=await l()}catch(e){return _(e)}return e.replayed&&a("allowed","replayed"),{share:tv(tN(s.id)),turn:tO(e.turn),replayed:e.replayed,settled:e.settled}}if(s.turns_used>=s.max_turns&&d("share_turn_limit","This share has used all of its questions."),await tI(s)==="busy"&&d("share_turn_in_progress","A question on this share is still being answered."),1!==i.default.prepare(`
|
|
2177
2184
|
UPDATE session_shares SET inflight_key = ?, inflight_owner = ?
|
|
2178
2185
|
WHERE id = ? AND state = 'active' AND inflight_key IS NULL AND inflight_turn_ref IS NULL AND turns_used < max_turns
|
|
2179
2186
|
`).run(e.messageKey,td,s.id).changes){let e=tN(s.id);"revoked"===tR(e)&&d("share_revoked","This share was revoked."),e.turns_used>=e.max_turns&&d("share_turn_limit","This share has used all of its questions."),d("share_turn_in_progress","A question on this share is still being answered.")}tu.add(s.id);try{let e=await l();return{share:tv(tN(s.id)),turn:tO(e.turn),replayed:e.replayed,settled:e.settled}}catch(t){return n=s.id,r=e.messageKey,i.default.prepare("UPDATE session_shares SET inflight_key = NULL, inflight_owner = NULL WHERE id = ? AND inflight_key = ? AND inflight_turn_ref IS NULL").run(n,r),_(t)}finally{tu.delete(s.id)}}async function tA(e,t){let n=tN(e);if(!n)throw new to("share_not_found","No share with that reference.");let r=await tk(n,t);if(!r)throw new to("share_not_found","No turn with that reference on this share.");return"running"===r.state?null:(i.default.prepare("UPDATE session_shares SET inflight_turn_ref = NULL WHERE id = ? AND inflight_turn_ref = ?").run(n.id,t),tO(r))}}];
|