@makaio/framework 1.0.0-dev-1783282710723 → 1.0.0-dev-1783355411417

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.
Files changed (144) hide show
  1. package/dist/.makaio-build.json +2 -2
  2. package/dist/adapter-BRxCc72E.mjs +1 -0
  3. package/dist/adapters/index.d.mts +11 -2
  4. package/dist/adapters/index.mjs +1 -1
  5. package/dist/adapters/node.d.mts +1 -1
  6. package/dist/{base-orchestrator-Cw0vpNgB.d.mts → base-orchestrator-BNysGvaM.d.mts} +70 -2
  7. package/dist/bus/index.mjs +1 -1
  8. package/dist/{client-BcfR-LJC.mjs → client-BgUjVbXX.mjs} +1 -1
  9. package/dist/contracts/adapter/index.d.mts +1 -1
  10. package/dist/contracts/adapter/index.mjs +1 -1
  11. package/dist/contracts/artifact/index.d.mts +1 -1
  12. package/dist/contracts/client/index.d.mts +1 -1
  13. package/dist/contracts/client/index.mjs +1 -1
  14. package/dist/contracts/extension/index.d.mts +3 -3
  15. package/dist/contracts/facet/index.d.mts +1 -1
  16. package/dist/contracts/harness/index.d.mts +1 -1
  17. package/dist/contracts/index.d.mts +24 -24
  18. package/dist/contracts/index.mjs +1 -1
  19. package/dist/contracts/materialization/index.d.mts +3 -3
  20. package/dist/contracts/session/index.d.mts +3 -3
  21. package/dist/contracts/session/index.mjs +1 -1
  22. package/dist/contracts/shared/index.d.mts +1 -1
  23. package/dist/contracts/workflow/index.d.mts +2 -2
  24. package/dist/contracts/workflow/index.mjs +1 -1
  25. package/dist/{definition-DFcxkf2i.d.mts → definition-b9jyJqPD.d.mts} +1 -1
  26. package/dist/drizzle/0021_m_mr8e1j84.sql +3 -0
  27. package/dist/drizzle/0022_m_mr8i4ky3.sql +43 -0
  28. package/dist/drizzle/meta/_journal.json +14 -0
  29. package/dist/{handler-2bPhRn0u.mjs → handler-BFNvtv5t.mjs} +1 -1
  30. package/dist/handlers-v47Gbsr1.mjs +57 -0
  31. package/dist/hooks/index.d.mts +8 -0
  32. package/dist/hooks/index.mjs +1 -1
  33. package/dist/{index-CTEsbp9H.d.mts → index-31vR1sxk.d.mts} +31 -13
  34. package/dist/{index-9b2_jXxq.d.mts → index-3J0HZlPH.d.mts} +372 -87
  35. package/dist/{index-Bh6lHiW4.d.mts → index-3X0368CL.d.mts} +16 -16
  36. package/dist/{index-Y2r0Zvcm.d.mts → index-B5w-0Gg9.d.mts} +4 -4
  37. package/dist/{index-DdBRlm7m.d.mts → index-BKZhnb2B.d.mts} +3 -3
  38. package/dist/{index-gAFwNiJT.d.mts → index-BYfSAJRC.d.mts} +64 -0
  39. package/dist/{index-2fK9iSHI.d.mts → index-BwGfdbI0.d.mts} +9 -9
  40. package/dist/{index-DLy-tc0L.d.mts → index-C5C1tk9f.d.mts} +214 -1
  41. package/dist/{index-CL2T6LVv.d.mts → index-C6Ys8pxt.d.mts} +9 -9
  42. package/dist/{index-NkNbYFud.d.mts → index-CaerrEDH.d.mts} +1 -1
  43. package/dist/{index-CfIW5biI.d.mts → index-D7rWAEY0.d.mts} +1 -0
  44. package/dist/{index-CaOWqztb.d.mts → index-DQYj8-53.d.mts} +1 -1
  45. package/dist/{index-Dg-y1mrq.d.mts → index-DV4nRk0h.d.mts} +14 -14
  46. package/dist/{index-GD-i3DW7.d.mts → index-DvHYpi-J.d.mts} +365 -163
  47. package/dist/{index-BMbmoarE.d.mts → index-O08Q2ikz.d.mts} +8 -8
  48. package/dist/kernel/extension/index.d.mts +1 -1
  49. package/dist/kernel/index.d.mts +2 -2
  50. package/dist/kernel/observability/index.d.mts +1 -1
  51. package/dist/{lib-Ba55od_d.mjs → lib-BOmKyjWD.mjs} +1 -1
  52. package/dist/{lib-CM_BUxN8.mjs → lib-DLZYp5z3.mjs} +1 -1
  53. package/dist/{loop-gate-handlers-BLoGCWMQ.mjs → loop-gate-handlers-Bjmat-K3.mjs} +1 -1
  54. package/dist/{namespace-DGAWYjbO.d.mts → namespace-Bm77p82L.d.mts} +5 -5
  55. package/dist/{namespace-LUNf8zo5.d.mts → namespace-D1_9WVCo.d.mts} +157 -0
  56. package/dist/{namespace-BsYKEMd8.d.mts → namespace-DAj_riOn.d.mts} +138 -0
  57. package/dist/{namespace-KMxsPJwm.d.mts → namespace-DhDY0juT.d.mts} +66 -0
  58. package/dist/{namespace-DXW-voCe.d.mts → namespace-DmqoDDRD.d.mts} +158 -22
  59. package/dist/namespace-dFBD2ZmS.mjs +1 -0
  60. package/dist/node/transports/index.mjs +1 -1
  61. package/dist/orchestrator-shared-ChygCvR1.mjs +1 -0
  62. package/dist/{orchestrator-shared-ChOdIgh6.d.mts → orchestrator-shared-DFLb1otg.d.mts} +9 -3
  63. package/dist/package-BmRhhi-3.mjs +1 -0
  64. package/dist/package.json +1 -1
  65. package/dist/runtime-node/index.mjs +1 -1
  66. package/dist/schema-7aKBGB7S.mjs +1 -0
  67. package/dist/{schema-DHlTAy0N.mjs → schema-CHp6I33k.mjs} +1 -1
  68. package/dist/{schema-D1HrnvT7.d.mts → schema-DLNBajAV.d.mts} +23 -1
  69. package/dist/{schemas-DMCGXlKa.d.mts → schemas-DMMWmWjq.d.mts} +3 -3
  70. package/dist/schemas-DZGnr9Tl.mjs +1 -0
  71. package/dist/{schemas-D-9zNyAM2.d.mts → schemas-DuuVuhHX2.d.mts} +2 -2
  72. package/dist/schemas-ftgVeWIG.mjs +1 -0
  73. package/dist/services/context-rules/index.d.mts +6 -6
  74. package/dist/services/filesystem/namespace.d.mts +12 -12
  75. package/dist/services/filesystem/schemas.d.mts +6 -6
  76. package/dist/services/git/namespace.d.mts +4 -4
  77. package/dist/services/git/schemas.d.mts +3 -3
  78. package/dist/services/harness/index.d.mts +1 -1
  79. package/dist/services/harness/index.mjs +1 -1
  80. package/dist/services/index.d.mts +87 -18
  81. package/dist/services/index.mjs +1 -1
  82. package/dist/services/log-import/browser.d.mts +2 -2
  83. package/dist/services/log-import/index.d.mts +73 -6
  84. package/dist/services/log-import/index.mjs +2 -2
  85. package/dist/services/log-import/log-import.d.mts +1 -1
  86. package/dist/services/log-import/log-import.mjs +1 -1
  87. package/dist/services/log-import/namespace.d.mts +54 -0
  88. package/dist/services/log-import/namespace.mjs +1 -1
  89. package/dist/services/log-import/schemas.d.mts +44 -0
  90. package/dist/services/log-import/schemas.mjs +1 -1
  91. package/dist/services/session/handlers/index.d.mts +1 -1
  92. package/dist/services/session/handlers/index.mjs +1 -1
  93. package/dist/services/session/index.d.mts +9 -9
  94. package/dist/services/session/index.mjs +1 -1
  95. package/dist/services/session/messages/namespace.d.mts +1 -1
  96. package/dist/services/session/messages/namespace.mjs +1 -1
  97. package/dist/services/session/orchestrator-testing/index.d.mts +1 -1
  98. package/dist/services/session/orchestrator-testing/index.mjs +1 -1
  99. package/dist/services/session/session-events/namespace.d.mts +1 -1
  100. package/dist/services/session/session-events/namespace.mjs +1 -1
  101. package/dist/services/session/storage/namespace.d.mts +1 -1
  102. package/dist/services/session/storage/schema.d.mts +1 -1
  103. package/dist/services/session/storage/schema.mjs +1 -1
  104. package/dist/services/session/testing/index.mjs +9 -4
  105. package/dist/services/session/testing/orchestrator-shared.d.mts +1 -1
  106. package/dist/services/session/testing/orchestrator-shared.mjs +1 -1
  107. package/dist/services/session/turns/namespace.d.mts +1 -1
  108. package/dist/services/session/turns/namespace.mjs +1 -1
  109. package/dist/services/settings/namespace.d.mts +2 -2
  110. package/dist/services/subagent-template/index.d.mts +1 -1
  111. package/dist/services/subagent-template/schemas.d.mts +1 -1
  112. package/dist/services/tool-approval/index.mjs +1 -1
  113. package/dist/services/tools/index.mjs +1 -1
  114. package/dist/services/turn/index.d.mts +1 -1
  115. package/dist/services/turn/namespace.d.mts +1 -1
  116. package/dist/services/turn/schemas.d.mts +89 -0
  117. package/dist/services/turn/schemas.mjs +1 -1
  118. package/dist/session-CKWfn3oc.mjs +1 -0
  119. package/dist/session-DCbJwYEU.mjs +69 -0
  120. package/dist/storage/drizzle/index.d.mts +1 -1
  121. package/dist/storage/drizzle/index.mjs +1 -1
  122. package/dist/{tool-approval-service-DEQiipxj.mjs → tool-approval-service-MU_DmJsf.mjs} +1 -1
  123. package/dist/tools-BrNm-een.mjs +1 -0
  124. package/dist/{transition-DnXibkhX.d.mts → transition-Dq41YCkc.d.mts} +1 -1
  125. package/dist/{types-BslClRkH.d.mts → types-BMlzmWp6.d.mts} +11 -1
  126. package/dist/{types-Dur8EtpR.d.mts → types-C76EP81O.d.mts} +125 -82
  127. package/dist/ui-components/index.mjs +1 -1
  128. package/dist/{workflow-BqH6ar-D.mjs → workflow-C1z7I5CI.mjs} +1 -1
  129. package/dist/workflow-engine/index.d.mts +1 -1
  130. package/dist/workflow-engine/index.mjs +1 -1
  131. package/dist/workflow-engine/package.mjs +1 -1
  132. package/dist/workflow-engine/workflow-orchestrator.mjs +1 -1
  133. package/package.json +1 -1
  134. package/dist/adapter-DaQqmKOJ.mjs +0 -1
  135. package/dist/handlers-BAycjV02.mjs +0 -41
  136. package/dist/namespace-C-piH3w4.mjs +0 -1
  137. package/dist/orchestrator-shared-Cxk3x8Vs.mjs +0 -1
  138. package/dist/package-B1AXe-oz.mjs +0 -1
  139. package/dist/schema-D6WAI8OL.mjs +0 -1
  140. package/dist/schemas-ArqQTC0Q.mjs +0 -1
  141. package/dist/schemas-uID59wR8.mjs +0 -1
  142. package/dist/session-0nWT4st6.mjs +0 -39
  143. package/dist/session-DH-ja8Ka.mjs +0 -1
  144. package/dist/tools-DFOsOboy.mjs +0 -1
@@ -0,0 +1,57 @@
1
+ import{agents as e}from"./services/session/storage/schema.mjs";import{n as t,t as n}from"./schema-CHp6I33k.mjs";import{i as r,n as i,r as a}from"./namespace-dFBD2ZmS.mjs";import{TurnStorageSubjects as o}from"./services/turn/namespace.mjs";import{SessionStorageSubjects as s}from"./services/session/storage/namespace.mjs";import{n as c}from"./namespace-DBHwyhME.mjs";import{r as l,t as u}from"./provider-context-DC_eq7es.mjs";import{AdapterRuntimeSubjects as d}from"./services/adapter-runtime/namespace.mjs";import{ProviderStorageSubjects as f}from"./services/settings/storage/providers-namespace.mjs";import{ExecutionTargetSubjects as p}from"./services/execution-target/namespace.mjs";import{MessageStorageSubjects as m}from"./services/session/messages/namespace.mjs";import"./services/session/turns/namespace.mjs";import{ExtractedContextSchema as h}from"./services/compression/schemas.mjs";import{PreferencesSubjects as g}from"./services/preferences/storage-namespace.mjs";import{z as _}from"zod";import{AdapterSubjects as v,AgentResolutionSubjects as y,AgentStatusSchema as b,AgentSubjects as x,MakaioSessionAgentSchema as S,ProviderContextSchema as ee,SessionSubjects as C,TurnInitiatorSchema as w,TurnUsageSchema as te}from"@makaio/framework/contracts";import{defineDialectSchema as ne,getRawSqlExecutor as re,getStorageEngine as ie,resolveSchema as T}from"@makaio/framework/storage/drizzle";import{and as E,asc as D,desc as O,eq as k,gt as ae,inArray as A,lt as oe,sql as se}from"drizzle-orm";import{createStorageNamespaceDefinition as ce}from"@makaio/framework/storage";import{HookAbortError as j}from"@makaio/framework/hooks";import{AdapterRuntimeSubjects as le}from"@makaio/framework/services/adapter-runtime";import{buildProviderContext as ue}from"@makaio/framework/services/provider-context";function de(e,t,n,r){return e.on(i.append,e=>{let{event:i}=e.payload,a=t.get(i.sessionId)??[];if(n.has(i.eventId)){e.setResult({success:!0});return}a.push(i),t.set(i.sessionId,a),n.set(i.eventId,r()),e.setResult({success:!0})})}function fe(e,t,n){return e.on(i.getEvents,e=>{let{sessionId:r,options:i}=e.payload,a=t.get(r)??[],o=i?.order??`asc`,s=o===`desc`?[...a].reverse():a,c=0;if(i?.after&&/^\d+$/.test(i.after)){let t=Number(i.after),r=s.findIndex(e=>{let r=n.get(e.eventId)??-1;return o===`desc`?r<t:r>t});if(r===-1){e.setResult({events:[],nextCursor:null,totalCount:a.length});return}c=r}let l=s.slice(c);if(i?.types&&i.types.length>0){let e=new Set(i.types);l=l.filter(t=>e.has(t.type))}let u=i?.limit??100,d=l.length>u,f=l.slice(0,u),p=null;if(d&&f.length>0){let e=f[f.length-1],t=n.get(e.eventId);t!==void 0&&(p=t.toString())}e.setResult({events:f,nextCursor:p,totalCount:a.length})})}function pe(e,t){return e.on(i.getByIds,e=>{let{sessionId:n,eventIds:r}=e.payload,i=t.get(n)??[],a=new Set(r),o=i.filter(e=>a.has(e.eventId));e.setResult({events:o})})}function me(e,t,n){return e.on(i.deleteBySession,e=>{let{sessionId:r}=e.payload,i=t.get(r);if(i)for(let e of i)n.delete(e.eventId);let a=i?.length??0;t.delete(r),e.setResult({success:!0,deletedCount:a})})}function he(e,t){return e.on(i.getEventsBySessions,e=>{let{sessionIds:n,types:r,limitPerSession:i=50}=e.payload;if(n.length===0||r.length===0){e.setResult({eventsBySession:{}});return}let a=new Set(r),o={};for(let e of n){let n=(t.get(e)??[]).filter(e=>a.has(e.type)).reverse().slice(0,i);n.length>0&&(o[e]=n)}e.setResult({eventsBySession:o})})}function ge(e){let t=new Map,n=new Map,r=1,i=[de(e,t,n,()=>r++),fe(e,t,n),pe(e,t),me(e,t,n),he(e,t)];return()=>i.forEach(e=>e())}const _e=r.postgres,ve=ne({sessionEvents:a},{sessionEvents:_e}),ye=[`sessionId`,`agentId`,`adapterId`,`messageId`,`turnId`];function be(e){let t=e.payload,n={};for(let[e,r]of Object.entries(t))ye.includes(e)||(n[e]=r);return n}function M(e){let t=JSON.parse(e.payload),n=e.type===`message`?e.messageId:e.originatingMessageId,r={...t,sessionId:e.sessionId,...e.agentId&&{agentId:e.agentId},...e.adapterId&&{adapterId:e.adapterId},...n&&{messageId:n},...e.type===`message`?{turnId:e.turnId??null}:e.turnId&&{turnId:e.turnId}};return{sessionId:e.sessionId,eventId:e.eventId,timestamp:e.timestamp,type:e.type,payload:r}}function xe(e){switch(e.type){case`user_message.sent`:{let t=e.payload.content;return typeof t==`string`?t:(Array.isArray(t.blocks)?t.blocks:[t.blocks]).filter(e=>e.type===`text`).map(e=>e.content).join(`
2
+ `)}case`agent.added`:case`user_message.acknowledged`:case`user_message.completed`:case`turn.started`:case`turn.completed`:case`message`:case`branch.created`:case`branch.merged`:case`squash`:return null;default:return Se(e.payload)}}function Se(e){let t=e.contentText;if(typeof t==`string`&&t.length>0)return t;let n=e.summary;return typeof n==`string`&&n.length>0?n:null}function Ce({bus:e,db:t,sessionEvents:n}){return e.on(i.append,async e=>{let{event:r}=e.payload,i=`payload`in r&&`agentId`in r.payload?r.payload.agentId:null,a=`payload`in r&&`adapterId`in r.payload?r.payload.adapterId:null,o=`payload`in r&&`turnId`in r.payload?r.payload.turnId:null,s=`payload`in r&&`messageId`in r.payload?r.payload.messageId:null,c=r.type===`message`?s:null,l=r.type===`message`?null:s,u={sessionId:r.sessionId,eventId:r.eventId,timestamp:r.timestamp,type:r.type,agentId:i,adapterId:a,messageId:c,originatingMessageId:l,turnId:o,contentText:xe(r),payload:JSON.stringify(be(r))};await t.insert(n).values(u).onConflictDoNothing(),e.setResult({success:!0})})}function we({bus:e,db:t,sessionEvents:n}){return e.on(i.getEvents,async e=>{let{sessionId:r,options:i}=e.payload,a=[k(n.sessionId,r)],o=i?.order??`asc`;if(i?.after){let e=parseInt(i.after,10);!isNaN(e)&&e>0&&(o===`desc`?a.push(oe(n.id,e)):a.push(ae(n.id,e)))}i?.types&&i.types.length>0&&a.push(A(n.type,i.types));let s=i?.limit??100,c=o===`desc`?O:D,l=await t.select().from(n).where(E(...a)).orderBy(c(n.id)).limit(s+1),u=l.length>s,d=u?l.slice(0,s):l,f=d.map(M),p=u&&d.length>0?d[d.length-1].id.toString():null;e.setResult({events:f,nextCursor:p})})}function Te({bus:e,db:t,sessionEvents:n}){return e.on(i.getByIds,async e=>{let{sessionId:r,eventIds:i}=e.payload,a=(await t.select().from(n).where(E(k(n.sessionId,r),A(n.eventId,i))).orderBy(D(n.timestamp))).map(M);e.setResult({events:a})})}function Ee({bus:e,db:t,sessionEvents:n}){return e.on(i.deleteBySession,async e=>{let{sessionId:r}=e.payload,i=(await t.select().from(n).where(k(n.sessionId,r))).length;await t.delete(n).where(k(n.sessionId,r)),e.setResult({success:!0,deletedCount:i})})}function De({bus:e,db:t,sessionEvents:n}){return e.on(i.getEventsBySessions,async e=>{let{sessionIds:r,types:i,limitPerSession:a=50}=e.payload;if(r.length===0||i.length===0){e.setResult({eventsBySession:{}});return}let o={};for(let e of r){let r=await t.select().from(n).where(E(k(n.sessionId,e),A(n.type,i))).orderBy(O(n.timestamp)).limit(a);r.length>0&&(o[e]=r.map(M))}e.setResult({eventsBySession:o})})}function Oe(e,t){let{sessionEvents:n}=T(t,ve),r={bus:e,db:t,sessionEvents:n},i=[Ce(r),we(r),Te(r),Ee(r),De(r)];return()=>i.forEach(e=>e())}async function N(e,t,n){let r={sessionId:t.sessionId,eventId:t.eventId??crypto.randomUUID(),timestamp:t.timestamp??Date.now(),type:t.type,payload:t.payload},a=n?n(r):r;a&&await e.requestOptional(i.append,{event:a})}async function P(e,t){await N(e,{type:`turn.started`,sessionId:t.sessionId,payload:t}),await e.emit(C.turn.started,t)}function ke(e,t){let n=[e.on(C.agent.added,async n=>{await Ae(e,{type:`agent.added`,sessionId:n.payload.sessionId,payload:n.payload},t)}),e.on(C.branch.created,async n=>{await Ae(e,{type:`branch.created`,sessionId:n.payload.sessionId,payload:n.payload},t)})];return()=>{for(let e of n)e()}}async function Ae(e,t,n){try{await N(e,t,n)}catch(e){console.warn(`[session-lifecycle-events] Failed to persist subscription lifecycle event`,{type:t.type,sessionId:t.sessionId,error:e instanceof Error?e.message:String(e)})}}const F=ce(`agent`,{schemas:{get:{request:_.object({agentId:_.string()}),response:_.object({agent:S.nullable()})},set:{request:_.object({agentId:_.string(),agent:S}),response:_.object({success:_.boolean()})},delete:{request:_.object({agentId:_.string()}),response:_.object({success:_.boolean()})},listByAdapter:{request:_.object({adapterName:_.string(),status:_.enum([`idle`,`active`,`dead`,`disposed`,`all`]).optional()}),response:_.object({agents:_.array(S)})},listBySession:{request:_.object({sessionId:_.string()}),response:_.object({agents:_.array(S)})},updateStatus:{request:_.object({agentId:_.string(),status:b}),response:_.object({success:_.boolean()})},updateActivity:{request:_.object({agentId:_.string(),lastActivityAt:_.number()}),response:_.object({success:_.boolean()})},updateRuntime:{request:_.object({agentId:_.string(),adapterId:_.string().optional(),cwd:_.string().optional(),model:_.string().optional(),allowedDirectories:_.array(_.string()).optional(),providerConfigId:_.string().optional()}).refine(e=>e.adapterId!==void 0||e.cwd!==void 0||e.model!==void 0||e.allowedDirectories!==void 0||e.providerConfigId!==void 0,{message:`At least one runtime field (adapterId, cwd, model, allowedDirectories, or providerConfigId) must be provided`}),response:_.object({success:_.boolean()})}},extensions:{drizzle:{agents:e}}}),I=F.subjects;async function L(e,t,n){let{adapterId:r}=await e.request(d.resolveId,{adapterName:t,...n!==void 0&&{machineId:n}});return r}async function je(e,t,n){if(!(!t||!n))try{let{config:r}=await e.request(c.getProviderConfig,{id:t});if(!r)return;let{provider:i}=await e.request(f.get,{id:r.definitionId}),a=i?.availableModels?.find(e=>e.name===n);return a?{supportedReasoningLevels:a.supportedReasoningLevels}:void 0}catch{return}}async function Me(e,t){let{executionTarget:n}=await e.request(p.resolve,t);return n}async function Ne(e,t){let{sessionId:n,limit:r}=t,a=[],o=!1,s=!1,c;do{let{events:t,nextCursor:l}=await e.request(i.getEvents,{sessionId:n,options:{limit:1e4,...c&&{after:c}}});for(let i of t){if(i.type===`squash`){o=!0,a.length=0;let e=i.payload,t={messageId:`squash-${i.eventId}`,sessionId:n,turnId:null,role:`assistant`,contentText:e.summaryJson,blocks:[{type:`text`,content:e.summaryJson}],timestamp:i.timestamp};a.push(t)}else if(i.type===`message`){let t=i.payload,{message:n}=await e.request(m.get,{messageId:t.messageId});n&&a.push(n)}if(r&&a.length>=r){s=!0;break}}if(r&&a.length>=r)break;c=l??void 0}while(c);return{messages:a,hasSquashBoundary:o,sessionChain:[n],truncated:s,incomplete:!1}}const R=new class{actions=new Map;register(e){if(this.actions.has(e.id))throw Error(`Action already registered: ${e.id}`);this.actions.set(e.id,e)}get(e){return this.actions.get(e)}getAll(){return Array.from(this.actions.values())}getByCategory(e){return this.getAll().filter(t=>t.category===e)}reset(){this.actions.clear()}};async function z(e,t,n){let r=e,i,a;for(let e of t){let t=R.get(e.actionId);if(!t)throw Error(`Unknown action: ${e.actionId}`);let o={...n,...e.options},s=await t.execute(r,o);if(s.kind===`messages`)r=s.messages;else{i=s.json,a=s.tokenEstimate,r=[];break}}if(!i&&r.length>0){let e=r.reduce((e,t)=>e+JSON.stringify(t.blocks).length,0);a=Math.ceil(e/4)}return{messages:r,contextJson:i,tokenEstimate:a}}function Pe(e){return e.map(e=>({...e,blocks:e.blocks.filter(e=>e.type!==`reasoning`)}))}const Fe={id:`strip-reasoning`,label:`Strip Reasoning`,description:`Remove reasoning/thinking blocks from messages`,category:`transformation`,async execute(e){return{kind:`messages`,messages:Pe(e)}}};function Ie(e){return e.map(e=>({...e,blocks:e.blocks.map(e=>{if(e.type===`tool_output`){let t=e.output.length;return{...e,output:`[output removed - ${t} chars]`}}return e})}))}const Le={id:`strip-tool-outputs`,label:`Strip Tool Outputs`,description:`Remove tool output contents, keep structure`,category:`transformation`,async execute(e){return{kind:`messages`,messages:Ie(e)}}};async function B(e,t){let n=[],r=[],i=[],a=!1,o=!1,c=!1,l=[],u,d=t,f;for(;d;){let n=await e.request(s.get,{sessionId:d});if(!n.session){c=!0;break}d===t&&(u=n.session.forkTransforms??void 0),l.unshift({sessionId:d,forkPointMessageId:n.session.forkPointMessageId??void 0}),f=n.session.parentSessionId??void 0,d=f}for(let t=0;t<l.length;t++){let{sessionId:s}=l[t],c=t===l.length-1,u=l[t+1]?.forkPointMessageId;n.push(s);let d=await Ne(e,{sessionId:s});if(d.hasSquashBoundary&&(a=!0,c||(r.length=0)),d.truncated&&(o=!0),c)i=d.messages;else for(let e of d.messages)if(r.push(e),u&&e.messageId===u)break}return u&&(r=await Re(r,u)),{messages:[...r,...i],hasSquashBoundary:a,sessionChain:n,truncated:o,incomplete:c}}async function Re(e,t){if(t.segments?.length){let n=t.segments[0].fromMessageId,r=t.segments[t.segments.length-1].toMessageId,i=e.findIndex(e=>e.messageId===n),a=e.findIndex(e=>e.messageId===r);if(i===-1||a===-1||i>a)return V(e,t.segments);let o=e.slice(0,i),s=e.slice(i,a+1),c=e.slice(a+1),l=V(s,t.segments);return[...o,...l,...c]}let n=e;if(t.removedMessageIds?.length){let e=new Set(t.removedMessageIds);n=n.filter(t=>!e.has(t.messageId))}return t.appliedPipeline?.length&&(n=(await z(n,t.appliedPipeline)).messages),n}function ze(e,t){let n=e;return t.stripReasoning&&(n=Pe(n)),t.stripToolOutputs&&(n=Ie(n)),n}function V(e,t){let n=new Map;for(let t=0;t<e.length;t++)n.set(e[t].messageId,t);let r=[];for(let i of t){let t=n.get(i.fromMessageId),a=n.get(i.toMessageId);if(t===void 0||a===void 0){console.warn(`[getFullConversation] Skipping segment with missing boundary IDs`,{segmentKey:`${i.fromMessageId}..${i.toMessageId}`,fromMessageId:i.fromMessageId,toMessageId:i.toMessageId,hasFrom:t!==void 0,hasTo:a!==void 0});continue}let o=e.slice(t,a+1),s;switch(i.policy){case`exclude`:s=[];break;case`summarize`:if(i.summaryText){if(o.length===0)throw Error(`Cannot create synthetic summary message for empty segment: ${i.fromMessageId}..${i.toMessageId}`);s=[{messageId:`summary-${i.fromMessageId}-${i.toMessageId}`,turnId:null,sessionId:o[0].sessionId,role:`assistant`,contentText:i.summaryText,blocks:[{type:`text`,content:i.summaryText}],timestamp:o[o.length-1].timestamp}]}else s=o;break;default:s=o;break}if((i.policy!==`summarize`||!i.summaryText)&&i.overrides&&Object.keys(i.overrides).length>0){let e=new Set(Object.entries(i.overrides).filter(([,e])=>e===`exclude`).map(([e])=>e));s=s.filter(t=>!e.has(t.messageId))}s=ze(s,i),r.push(...s)}return r}function H(e){return{role:e.role,blocks:e.blocks}}async function Be(e,t){return{messageHistory:(await B(e,t.sessionId)).messages.map(H),isFirstTurn:!0}}async function Ve(e,t,n,r){if(t.cwd===n)return{swapped:!1};let i=await e.request(x.cwd.change,{agentId:t.agentId,adapterId:t.adapterId,adapterName:t.adapterName,adapterSessionId:t.adapterSessionId??``,sessionId:t.sessionId,newCwd:n,...r?.skipWarning?{skipWarning:!0}:{}});if(!i.success)throw Error(`Failed to change cwd for agent ${t.agentId}: ${i.reason??`unknown`}`);return i.previousCwd?(t.cwd=n,{swapped:!0,previousCwd:i.previousCwd}):(t.cwd=n,{swapped:!1})}async function He(e,t,n,r){let i=n===void 0||t.model===n,a=r?.reasoningEffort===void 0,o=!r?.providerConfigId;if(i&&a&&o)return{changed:!1};let s=r?.providerConfigId?await l(e,r.providerConfigId):void 0,c=await e.request(x.model.change,{agentId:t.agentId,adapterId:t.adapterId,adapterName:t.adapterName,adapterSessionId:t.adapterSessionId??``,...n!==void 0&&{newModel:n},...r?.reasoningEffort!==void 0&&{reasoningEffort:r.reasoningEffort},...r?.skipWarning!==void 0&&{skipWarning:r.skipWarning},...s!==void 0&&{providerContext:s}});if(!c.success)throw Error(`Failed to change model for agent ${t.agentId}: ${c.reason??`unknown`}`);return n!==void 0&&(t.model=n),{changed:!0,swapped:c.swapped??!1}}async function Ue(e,t,n){let r=[],i=new Set;for(let a of t){let t=await e.requestOptional(v.getAgent,{adapterId:a.adapterId,agentId:a.agentId});if(t.handled&&t.data.agent!==null)r.push(a);else{let t=await U(e,a,n);r.push(t),i.add(t.agentId)}}return{verifiedAgents:r,recoveredAgentIds:i}}async function We(e,t,n){let r=await B(e,t.sessionId),i=n?.pipeline??[];return{messageHistory:(i.length>0?(await z(r.messages,i)).messages:r.messages).map(H),isFirstTurn:!0}}async function U(e,t,n){let r=await L(e,t.adapterName).catch(()=>t.adapterId);return await e.request(v.rehydrateAgent,{adapterId:r,agentId:t.agentId,cwd:n.cwd,model:n.model??t.model,...t.adapterSessionId!==void 0&&{adapterSessionId:t.adapterSessionId}}),t.adapterId=r,t}const Ge=t.postgres,W=ne({turns:n},{turns:Ge});async function G(e,t){let n=ie(e.dialect);for(let r=1;;r++)try{await e.run(t());return}catch(e){if(r>=32||!n.capabilities.maxCounterAssignmentRaces||!n.errors.isUniqueViolationError(e,`uniq_turns_session_number`))throw e}}function Ke(e){if(e)try{let t=JSON.parse(e),n=te.safeParse(t);return n.success?n.data:void 0}catch{return}}function K(e){return e?JSON.stringify(e):null}function qe(e){if(e)try{let t=JSON.parse(e),n=w.safeParse(t);return n.success?n.data:void 0}catch{return}}function q(e){let t=qe(e.initiator);return{turnId:e.turnId,sessionId:e.sessionId,turnNumber:e.turnNumber,startedAt:e.startedAt,completedAt:e.completedAt??void 0,status:e.status,error:e.error??void 0,usage:Ke(e.usage),...t!==void 0&&{initiator:t}}}function Je(e,t){let n=[Ye(e,t),Xe(e,t),Ze(e,t),Qe(e,t),$e(e,t),et(e,t),tt(e,t),nt(e,t)];return()=>n.forEach(e=>e())}function Ye(e,t){let n=re(t),{turns:r}=T(t,W);return e.on(o.create,async e=>{let{sessionId:i,turnId:a,initiator:o}=e.payload,s=Date.now(),c=a??crypto.randomUUID(),l=K(o);await G(n,()=>se`
3
+ WITH next_num AS (
4
+ SELECT COALESCE(MAX(turn_number), 0) + 1 AS n
5
+ FROM turns
6
+ WHERE session_id = ${i}
7
+ )
8
+ INSERT INTO turns (turn_id, session_id, turn_number, started_at, status, initiator)
9
+ SELECT ${c}, ${i}, n, ${s}, ${`active`}, ${l}
10
+ FROM next_num
11
+ `);let[u]=await t.select({turnNumber:r.turnNumber}).from(r).where(k(r.turnId,c)),d={turnId:c,sessionId:i,turnNumber:u.turnNumber,startedAt:s,status:`active`,...o!==void 0&&{initiator:o}};e.setResult({turn:d})})}function Xe(e,t){let n=re(t),{turns:r}=T(t,W);return e.on(o.ingestCompleted,async e=>{let{sessionId:i,turnAnchorId:a,startedAt:o,completedAt:s,status:c,error:l,usage:u,initiator:d}=e.payload,f=crypto.randomUUID(),p=K(d),m=u===void 0?null:JSON.stringify(u);await G(n,()=>se`
12
+ WITH next_num AS (
13
+ SELECT COALESCE(MAX(turn_number), 0) + 1 AS n
14
+ FROM turns
15
+ WHERE session_id = ${i}
16
+ )
17
+ INSERT INTO turns (turn_id, session_id, turn_number, started_at, completed_at, status, error, usage, initiator, turn_anchor_id)
18
+ SELECT ${f}, ${i}, n, ${o}, ${s}, ${c}, ${l??null}, ${m}, ${p}, ${a}
19
+ FROM next_num
20
+ WHERE true
21
+ ON CONFLICT(session_id, turn_anchor_id) DO UPDATE SET
22
+ completed_at = excluded.completed_at,
23
+ status = excluded.status,
24
+ error = excluded.error,
25
+ usage = excluded.usage
26
+ `);let[h]=await t.select().from(r).where(E(k(r.sessionId,i),k(r.turnAnchorId,a))).limit(1);e.setResult({turn:q(h),created:h.turnId===f})})}function Ze(e,t){let{turns:n}=T(t,W);return e.on(o.complete,async e=>{let{turnId:r,status:i,expectedStatus:a,error:o,usage:s}=e.payload,c={completedAt:Date.now(),status:i,error:o??null};s!==void 0&&(c.usage=JSON.stringify(s));let l=a?E(k(n.turnId,r),k(n.status,a)):k(n.turnId,r),u=await t.update(n).set(c).where(l).returning();if(u.length>0){e.setResult({turn:q(u[0]),transitioned:!0});return}let[d]=await t.select().from(n).where(k(n.turnId,r)).limit(1);if(!d)throw Error(`Turn not found: ${r}`);e.setResult({turn:q(d),transitioned:!1})})}function Qe(e,t){let{turns:n}=T(t,W);return e.on(o.set,async e=>{let{turn:r}=e.payload,i={turnId:r.turnId,sessionId:r.sessionId,turnNumber:r.turnNumber,startedAt:r.startedAt,completedAt:r.completedAt??null,status:r.status,error:r.error??null,usage:r.usage?JSON.stringify(r.usage):null,initiator:K(r.initiator)};await t.insert(n).values(i).onConflictDoUpdate({target:n.turnId,set:i}),e.setResult({turn:r})})}function $e(e,t){let{turns:n}=T(t,W);return e.on(o.get,async e=>{let{turnId:r}=e.payload,[i]=await t.select().from(n).where(k(n.turnId,r)).limit(1);e.setResult({turn:i?q(i):null})})}function et(e,t){let{turns:n}=T(t,W);return e.on(o.getBySession,async e=>{let{sessionId:r,limit:i,status:a}=e.payload,o=t.select().from(n).where(k(n.sessionId,r)).orderBy(D(n.turnNumber));a&&(o=t.select().from(n).where(E(k(n.sessionId,r),k(n.status,a))).orderBy(D(n.turnNumber))),i&&(o=o.limit(i));let s=await o;e.setResult({turns:s.map(q)})})}function tt(e,t){let{turns:n}=T(t,W);return e.on(o.getActive,async e=>{let{sessionId:r}=e.payload,[i]=await t.select().from(n).where(E(k(n.sessionId,r),k(n.status,`active`))).orderBy(O(n.turnNumber)).limit(1);e.setResult({turn:i?q(i):null})})}function nt(e,t){let{turns:n}=T(t,W);return e.on(o.listActive,async e=>{let r=await t.select().from(n).where(k(n.status,`active`)).orderBy(D(n.startedAt));e.setResult({turns:r.map(q)})})}function rt(e){let t=new Map,n=new Map,r=new Map,i=it(t,n,r),a=new Map,o=[at(e,i,r),ot(e,t,i,r,a),st(e,t,i),ct(e,i),lt(e,t),ut(e,t,n),dt(e,t,n),ft(e,t)];return()=>o.forEach(e=>e())}function it(e,t,n){return r=>{e.set(r.turnId,r);let i=t.get(r.sessionId)??[];i.includes(r.turnId)||i.push(r.turnId),t.set(r.sessionId,i);let a=n.get(r.sessionId)??0;r.turnNumber>a&&n.set(r.sessionId,r.turnNumber)}}function at(e,t,n){return e.on(o.create,e=>{let{sessionId:r,turnId:i,initiator:a}=e.payload,o=Date.now(),s={turnId:i??crypto.randomUUID(),sessionId:r,turnNumber:(n.get(r)??0)+1,startedAt:o,status:`active`,...a!==void 0&&{initiator:a}};t(s),e.setResult({turn:s})})}function ot(e,t,n,r,i){return e.on(o.ingestCompleted,e=>{let{sessionId:a,turnAnchorId:o,startedAt:s,completedAt:c,status:l,error:u,usage:d,initiator:f}=e.payload,p=i.get(a)??new Map,m=p.get(o);if(m!==void 0){let r=t.get(m);if(!r)throw Error(`Turn not found for anchor in session: ${a}`);let i={...r,completedAt:c,status:l,error:u??void 0,usage:d??void 0};n(i),e.setResult({turn:i,created:!1});return}let h={turnId:crypto.randomUUID(),sessionId:a,turnNumber:(r.get(a)??0)+1,startedAt:s,completedAt:c,status:l,error:u??void 0,usage:d??void 0,...f!==void 0&&{initiator:f}};n(h),p.set(o,h.turnId),i.set(a,p),e.setResult({turn:h,created:!0})})}function st(e,t,n){return e.on(o.complete,e=>{let{turnId:r,status:i,expectedStatus:a,error:o,usage:s}=e.payload,c=t.get(r);if(!c)throw Error(`Turn not found: ${r}`);if(a&&c.status!==a){e.setResult({turn:c,transitioned:!1});return}let l={...c,completedAt:Date.now(),status:i,error:o??void 0,usage:s??c.usage};n(l),e.setResult({turn:l,transitioned:!0})})}function ct(e,t){return e.on(o.set,e=>{let{turn:n}=e.payload;t(n),e.setResult({turn:n})})}function lt(e,t){return e.on(o.get,e=>{e.setResult({turn:t.get(e.payload.turnId)??null})})}function ut(e,t,n){return e.on(o.getBySession,e=>{let{sessionId:r,status:i,limit:a}=e.payload,o=(n.get(r)??[]).map(e=>t.get(e)).filter(e=>!!e);i&&(o=o.filter(e=>e.status===i)),o.sort((e,t)=>e.turnNumber-t.turnNumber),a&&(o=o.slice(0,a)),e.setResult({turns:o})})}function dt(e,t,n){return e.on(o.getActive,e=>{let{sessionId:r}=e.payload,i=(n.get(r)??[]).map(e=>t.get(e)).filter(e=>!!e).filter(e=>e.status===`active`).sort((e,t)=>t.turnNumber-e.turnNumber).at(0);e.setResult({turn:i??null})})}function ft(e,t){return e.on(o.listActive,e=>{let n=[...t.values()].filter(e=>e.status===`active`).sort((e,t)=>e.startedAt-t.startedAt);e.setResult({turns:n})})}function pt(e){return{source:e.source,...e.sourceId!==void 0&&{sourceId:e.sourceId}}}var mt=class{turnId;sessionId;turnNumber;startedAt;_initiator;_agentIds;_messageIds=[];_completedAgents=new Set;_erroredAgents=new Map;constructor(e){if(!Number.isInteger(e.turnNumber)||e.turnNumber<1)throw Error(`turnNumber must be a positive integer`);this.turnId=e.turnId??crypto.randomUUID(),this.sessionId=e.sessionId,this.turnNumber=e.turnNumber,this.startedAt=e.startedAt??Date.now(),this._initiator=Object.freeze(pt(e.initiator??{source:`user`})),this._agentIds=Object.freeze([...e.agentIds])}get agentIds(){return this._agentIds}get initiator(){return pt(this._initiator)}get messageIds(){return this._messageIds}get completedAgents(){return this._completedAgents}get erroredAgents(){return this._erroredAgents}addMessage(e){this._messageIds.push(e)}markAgentCompleted(e){return this._completedAgents.add(e),this.checkCompletion()}markAgentErrored(e,t){return this._erroredAgents.set(e,t),this.checkCompletion()}hasAgent(e){return this._agentIds.includes(e)}isComplete(){return this._completedAgents.size+this._erroredAgents.size>=this._agentIds.length}getResult(){return{success:this._erroredAgents.size===0,errors:Array.from(this._erroredAgents.values())}}getContext(){if(this._messageIds.length===0)throw Error(`Turn ${this.turnId} has no messages yet`);return{turnId:this.turnId,messageId:this._messageIds[this._messageIds.length-1]}}getContextForMessage(e){return{turnId:this.turnId,messageId:e}}checkCompletion(){return this.isComplete()?{turnComplete:!0,result:this.getResult()}:{turnComplete:!1}}};function J(e){return typeof e==`string`?e:(Array.isArray(e.blocks)?e.blocks:[e.blocks]).filter(e=>e.type===`text`).map(e=>e.content).join(`
27
+ `)}function ht(e){return e}function gt(e){return typeof e==`string`?[{type:`text`,content:e}]:(Array.isArray(e.blocks)?e.blocks:[e.blocks]).map(ht)}async function _t(e,t,n,r){let{session:i}=await e.request(C.get,{sessionId:t});if(i){if(i.status!==`active`)throw Error(`[getOrCreateSession] Session is not active: ${t}`);return{sessionId:t,session:i}}await e.request(C.create,{sessionId:t,originWindowId:r});let{session:a}=await e.request(C.get,{sessionId:t});if(!a)throw Error(`[getOrCreateSession] Failed to create session: ${t}`);return{sessionId:t,session:a}}function vt(e,t){if(t===void 0){let t=e.agents.find(t=>t.agentId===e.leadAgentId);if(!t)throw Error(`[resolveTargetAgents] Lead agent not found: ${e.leadAgentId}`);return[t]}if(t===`all`)return e.agents;let n=new Set(t);return e.agents.filter(e=>n.has(e.agentId))}function yt(e,t){for(let n of e.values())if(n.hasAgent(t))return n}function bt(e,t){if(e===`extension`){let e=t?.trim();if(!e)throw Error(`extensionId is required when source is "extension"`);return{source:`extension`,sourceId:e}}return e?{source:e}:{source:`user`}}function Y(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}async function xt(e,t,n,r){let{adapterName:i}=await e.request(d.resolveName,{adapterId:t});if(n&&i!==n)throw Error(`${r}adapterName "${n}" does not match adapterId "${t}"`);return i}async function St(e,t,n,r){if(r!==void 0&&t!==void 0&&t!==r.providerConfigId)throw Error(`[attach-handler] providerConfigId '${t}' does not match resolved provider context '${r.providerConfigId}'`);let i=t??r?.providerConfigId??n?.providerConfigId;return r===void 0?{providerConfigId:i,providerContext:i===void 0?void 0:await l(e,i)}:{providerConfigId:i,providerContext:r}}async function Ct(e,t,n,r,i,a,o){try{return await wt(e,t,r,i,a,o)}catch(t){throw console.error(`[attach-handler] Failed to set up initial-message turn, rolling back started agent`,{sessionId:r,agentId:i,adapterId:n.adapterId,error:t}),await X(e,n,r,`initial-message turn setup failure`),t}}async function X(e,t,n,r){try{await e.request(v.stopAgent,{adapterId:t.adapterId,agentId:t.agentId})}catch(e){console.error(`[attach-handler] Failed to rollback started agent after ${r}`,{sessionId:n,agentId:t.agentId,adapterId:t.adapterId,error:e})}}async function wt(e,t,n,r,i,a){let{turn:s}=await e.request(o.create,{sessionId:n}),c=new mt({sessionId:n,agentIds:[r],turnId:s.turnId,turnNumber:s.turnNumber});try{await e.requestOptional(m.append,{message:{messageId:i,turnId:c.turnId,sessionId:n,role:`user`,contentText:J(a),blocks:gt(a),timestamp:Date.now()}})}catch(t){console.warn(`[attach-handler] Failed to store initial user message`,{sessionId:n,messageId:i,error:t instanceof Error?t.message:String(t)});try{await e.requestOptional(o.complete,{turnId:c.turnId,status:`error`,expectedStatus:`active`,error:`initial-message-persistence-failed`})}catch(e){console.error(`[attach-handler] Failed to rollback initial-message turn after message persistence failure`,{sessionId:n,turnId:c.turnId,error:e})}throw t}c.addMessage(i),t.set(n,c);try{await Tt(e,n,c,r,i,a)}catch(e){throw t.get(n)?.turnId===c.turnId&&t.delete(n),e}return{messageId:i,turnId:c.turnId}}async function Tt(e,t,n,r,i,a){await P(e,{sessionId:t,turnId:n.turnId,turnNumber:n.turnNumber,messageId:i,agentIds:[...n.agentIds],ingestionMarker:`live`}),await e.emit(C.user_message.sent,{sessionId:t,turnId:n.turnId,turnNumber:n.turnNumber,messageId:i,content:a,agentIds:[...n.agentIds]}),await e.emit(C.user_message.acknowledged,{sessionId:t,turnId:n.turnId,turnNumber:n.turnNumber,messageId:i,agentId:r})}function Et(e){return{...e.model!==void 0&&{model:e.model},...e.reasoningEffort!==void 0&&{reasoningEffort:e.reasoningEffort},...e.cwd!==void 0&&{cwd:e.cwd},...e.allowedTools!==void 0&&{allowedTools:e.allowedTools},...e.disallowedTools!==void 0&&{disallowedTools:e.disallowedTools},...e.allowedDirectories!==void 0&&{allowedDirectories:e.allowedDirectories},...e.env!==void 0&&{env:e.env},...e.mcpSessionContext!==void 0&&{mcpSessionContext:e.mcpSessionContext},...e.adapterConfig!==void 0&&{adapterConfig:e.adapterConfig},...e.systemPrompt!==void 0&&{systemPrompt:e.systemPrompt}}}function Dt(e,t,n){let r=e.model??t?.model,i=e.cwd;return{runtimeOptions:Ot({model:r,reasoningEffort:e.reasoningEffort??t?.reasoningEffort,cwd:i,allowedTools:e.allowedTools??t?.allowedTools,disallowedTools:e.disallowedTools??t?.disallowedTools,allowedDirectories:e.allowedDirectories??t?.allowedDirectories,env:e.env,mcpSessionContext:e.mcpSessionContext,adapterConfig:e.adapterConfig,systemPrompt:e.systemPrompt??t?.systemPrompt,providerContext:n}),mergedModel:r,mergedCwd:i}}function Ot(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function kt(e,t,n){let r=e.on(C.agent.attach,async r=>{r.setResult(await At(e,t,n,r.payload))}),i=e.on(C.agent.attachResolved,async r=>{if(!r.origin.local)throw Error(`[attach-handler] session.agent.attachResolved requires a local-origin request`);r.setResult(await At(e,t,n,{...r.payload,resolvedProviderContext:r.payload.agent.providerContext===void 0?void 0:ee.parse(r.payload.agent.providerContext)}))});return()=>{r(),i()}}async function At(e,t,n,r){let{sessionId:i,agent:a,initialMessage:o,role:s,resolvedProviderContext:c}=r,l=Et(a),d=await Ft(e,i),f=await Pt(e,i,o,a),p=Mt(a,f),{adapterName:m,adapterId:h}=await Nt(e,p.adapterName,p.adapterId,n),{providerConfigId:g,providerContext:_}=await St(e,a.providerConfigId,f,c),{runtimeOptions:y,mergedModel:b,mergedCwd:x}=Dt(l,f,_),S=It(d,s),ee=Rt(h,i,o,S,y,Lt(d),f?.harnessId);_!==void 0&&await u(e,_);let C=await e.request(v.startAgent,ee);if(!C.success)throw Error(`[attach-handler] Failed to start agent: ${C.message}`);await Bt(e,C,{adapterName:m,sessionId:i,role:S,timestamp:Date.now(),personaId:jt(a),profileId:f?.profileId,harnessId:f?.harnessId,providerConfigId:g,compressionMode:f?.compressionMode,model:b,cwd:x});let w=o&&C.messageId?await Ct(e,t,C,i,C.agentId,C.messageId,o):void 0;return{agentId:C.agentId,adapterSessionId:C.adapterSessionId,role:S,...w&&{messageId:w.messageId,turnId:w.turnId}}}function jt(e){return e.kind===`persona`?e.personaId:void 0}function Mt(e,t){return{adapterName:e.kind===`adapter`&&`adapterName`in e?e.adapterName:t?.adapterName,adapterId:e.kind===`adapter`&&`adapterId`in e?e.adapterId:void 0}}async function Nt(e,t,n,r){let i=Y(t),a=Y(n);if(!i&&!a)throw Error(`[attach-handler] adapterName or adapterId is required — provide one explicitly or via persona/profile/virtualModel resolution`);if(a)return{adapterName:await xt(e,a,i,`[attach-handler] `),adapterId:a};let o=i;return{adapterName:o,adapterId:await L(e,o,r)}}async function Pt(e,t,n,r){if(r.kind===`adapter`)return null;let i=n?J(n):void 0;return e.request(y.resolve,{selection:r,context:{sessionId:t,promptText:i}})}async function Ft(e,t){let{session:n}=await e.request(C.get,{sessionId:t});if(!n)throw Error(`[attach-handler] Session not found: ${t}`);if(n.status!==`active`)throw Error(`[attach-handler] Session is not active: ${t}`);return n}function It(e,t){let n=e.agents.length===0;return t??(n?`lead`:`member`)}function Lt(e){if(e.isImported&&e.isOrchestrated===!1&&e.adapterSessionId)return e.adapterSessionId}function Rt(e,t,n,r,i,a,o){return a?{mode:`resume`,adapterId:e,sessionId:t,adapterSessionId:a,role:r,...i,...n!==void 0&&{initialMessage:n},...o!==void 0&&{harnessId:o}}:{adapterId:e,sessionId:t,role:r,...i,...n!==void 0&&{initialMessage:n},...o!==void 0&&{harnessId:o}}}async function zt(e,t){!t.personaId&&!t.profileId&&!t.harnessId&&!t.providerConfigId||await e.request(I.set,{agentId:t.agentId,agent:{agentId:t.agentId,adapterId:t.adapterId,adapterName:t.adapterName,sessionId:t.sessionId,role:t.role,status:`idle`,personaId:t.personaId,profileId:t.profileId,harnessId:t.harnessId,providerConfigId:t.providerConfigId,createdAt:t.timestamp,lastActivityAt:t.timestamp,...t.model!==void 0&&{model:t.model},...t.cwd!==void 0&&{cwd:t.cwd},...t.compressionMode!==void 0&&{compressionMode:t.compressionMode}}})}async function Bt(e,t,n){try{await zt(e,{agentId:t.agentId,adapterId:t.adapterId,adapterName:n.adapterName,sessionId:n.sessionId,role:n.role,timestamp:n.timestamp,personaId:n.personaId,profileId:n.profileId,harnessId:n.harnessId,providerConfigId:n.providerConfigId,compressionMode:n.compressionMode,model:n.model,cwd:n.cwd})}catch(r){throw console.error(`[attach-handler] Failed to persist agent identity, rolling back started agent`,{sessionId:n.sessionId,agentId:t.agentId,adapterId:t.adapterId,error:r}),await X(e,t,n.sessionId,`identity persistence failure`),r}}async function Vt(e,t,n,r,i,a,o,s,c,l){let u=n.map(async n=>{try{await e.request(x.sendMessage,{agentId:n.agentId,adapterId:n.adapterId,message:r,deliveryMode:o,messageId:i,turnId:a.turnId,sessionId:t.sessionId,sessionContext:c,...l!==void 0&&{responseSchema:l}}),await e.emit(C.user_message.acknowledged,{sessionId:a.sessionId,turnId:a.turnId,turnNumber:a.turnNumber,messageId:i,agentId:n.agentId})}catch(t){if(t instanceof j){await e.emit(C.user_message.completed,{sessionId:a.sessionId,turnId:a.turnId,turnNumber:a.turnNumber,messageId:i,agentId:n.agentId,outcome:`cancelled`});let t=a.markAgentCompleted(n.agentId);t.turnComplete&&await s(a,t.result);return}let r=t instanceof Error?t.message:String(t),o=a.markAgentErrored(n.agentId,r);await e.emit(C.user_message.completed,{sessionId:a.sessionId,turnId:a.turnId,turnNumber:a.turnNumber,messageId:i,agentId:n.agentId,outcome:`error`,error:r}),o.turnComplete&&await s(a,o.result)}});await Promise.all(u)}function Ht(e){return e.on(C.abandon,async t=>{let{parentSessionId:n,childSessionId:r}=t.payload,{session:i}=await e.request(C.get,{sessionId:r});if(!i)throw Error(`[abandon-handler] Child session not found: ${r}`);if(i.parentSessionId!==n)throw Error(`[abandon-handler] Invalid parent-child relationship: session ${r} is not a child of ${n}`+(i.parentSessionId?` (actual parent: ${i.parentSessionId})`:` (session has no parent)`));if(!(await e.request(C.close,{sessionId:r})).success)throw Error(`[abandon-handler] Failed to close child session: ${r}`);await e.emit(C.abandoned,{sessionId:r,parentSessionId:n}),t.setResult({success:!0})})}const Ut={id:`messages-to-context`,label:`Export as Context`,description:`Convert messages to context JSON (final step)`,category:`extraction`,async execute(e){let t=e.map(e=>({role:e.role,content:e.blocks.map(e=>e.type===`text`?e.content:e.type===`reasoning`?`[reasoning: ${e.content}]`:e.type===`tool_call`?`[tool: ${e.name}]`:e.type===`tool_output`?e.output:``).filter(Boolean).join(`
28
+ `)})),n=t.reduce((e,t)=>e+t.content.length,0),r=Math.ceil(n/4);return{kind:`context`,json:{type:`compressed-messages`,messageCount:e.length,messages:t},tokenEstimate:r}}},Wt={id:`llm-summarize`,label:`Summarize`,description:`LLM-generated summary of selected messages`,category:`transformation`,async execute(e){return{kind:`messages`,messages:e}}};function Gt(e){let t=[];for(let n of e){let e=n.blocks.filter(e=>e.type===`text`).map(e=>e.content).join(`
29
+ `);e&&(n.role===`user`?t.push(`[human]\n${e}\n[/human]`):n.role===`assistant`&&t.push(`[assistant]\n${e}\n[/assistant]`))}return`<conversation>\n${t.join(`
30
+
31
+ `)}\n</conversation>`}function Kt(e){return{id:`llm-extract`,label:`LLM Extract`,description:`Extract structured context using a cheap LLM model (requires virtualModelId in options)`,category:`extraction`,async execute(t,n){let r={kind:`messages`,messages:t},i=n?.virtualModelId;if(typeof i!=`string`)return r;let a=(typeof n?.sessionId==`string`&&n.sessionId.length>0?n.sessionId:void 0)??t[0]?.sessionId;if(typeof a!=`string`||a.length===0)return r;try{let n=await e.request(y.resolve,{selection:{kind:`virtual-model`,virtualModelId:i},context:{sessionId:a}}),{adapterId:r}=await e.request(le.resolveId,{adapterName:n.adapterName}),o=Gt(t),s=n.providerConfigId?await ue(e,n.providerConfigId):void 0,{text:c}=await e.request(v.infer,{adapterId:r,prompt:o,model:n.model,systemPrompt:`You are a context extraction assistant. Analyze the following conversation and extract structured information. Respond with ONLY valid JSON matching this exact schema — no markdown, no explanation, no code fences:
32
+
33
+ {
34
+ "resolved_items": ["string — completed work with resolution details"],
35
+ "known_bugs": [{ "issue": "string", "location": "string", "impact": "string" }],
36
+ "todos": [{ "issue": "string", "location": "string", "priority": "high|medium|low" }],
37
+ "key_decisions_and_rationale": ["string — decision with reasoning"],
38
+ "technical_details": {
39
+ "files": ["string — file paths mentioned"],
40
+ "schemas": {},
41
+ "apis": ["string — API endpoints or contracts"],
42
+ "config": {}
43
+ },
44
+ "constraints_and_requirements": ["string — constraints or non-negotiable requirements"],
45
+ "current_state": "string — one paragraph summary of where work stands now",
46
+ "roadmap": ["string — future work items in priority order"],
47
+ "data_flows": ["string — key data movement patterns"],
48
+ "component_interactions": { "ComponentName": "string — description of its role" },
49
+ "key_files": { "filepath": "string — what this file does" },
50
+ "helpful_hint": ["string — quick reference hints for resuming work"]
51
+ }
52
+
53
+ Rules:
54
+ - Omit array items you have no evidence for (prefer empty array over fabrication).
55
+ - current_state MUST be present; write "No summary available" if you cannot determine it.
56
+ - Extract only facts stated or clearly implied in the conversation. Do not invent.
57
+ - key_files and component_interactions should only include items explicitly mentioned.`,...s!==void 0&&{providerContext:s}}),l=c.trim().replace(/^```(?:json)?\s*/i,``).replace(/\s*```$/i,``).trim(),u=JSON.parse(l),d=h.parse(u),f=Math.ceil(JSON.stringify(d).length/4);return{kind:`context`,json:{...d},tokenEstimate:f}}catch(e){return console.warn(`[llm-extract] action failed`,{action:`llm-extract`,sessionId:a,error:e}),r}}}}let Z=!1,Q=!1;function qt(e){Z||(Z=!0,R.register(Fe),R.register(Le),R.register(Ut),R.register(Wt)),e&&!Q&&(Q=!0,R.register(Kt(e)))}function Jt(){Z=!1,Q=!1}function Yt(e){return qt(e),e.on(C.compress,async t=>{let{sessionId:n,pipeline:r}=t.payload,{messages:a}=await e.request(m.getBySession,{sessionId:n,limit:1e4}),o=await z(a,r,{sessionId:n});if(!o.contextJson)throw Error(`[compress-handler] Compress pipeline must produce context JSON (sessionId=${n})`);let s=a.map(e=>e.messageId),c=Math.ceil(a.reduce((e,t)=>e+JSON.stringify(t.blocks).length/4,0)),l=crypto.randomUUID();await e.request(i.append,{event:{sessionId:n,eventId:l,timestamp:Date.now(),type:`squash`,payload:{summaryJson:JSON.stringify(o.contextJson),tokensBefore:c,tokensAfter:o.tokenEstimate,compressedMessageIds:s}}}),await e.emit(C.compressed,{sessionId:n,eventId:l}),t.setResult({eventId:l,contextJson:o.contextJson,tokensBefore:c,tokensAfter:o.tokenEstimate})})}async function Xt(e,t,n,r){if(!n.segments?.length)return!1;let i=[],a;do{let{messages:n,nextCursor:o}=await e.request(m.getBySession,{sessionId:t,order:`asc`,limit:200,after:a});i.push(...n),a=r&&n.some(e=>e.messageId===r)?void 0:o??void 0}while(a);if(i.length===0)throw Error(`[fork-handler] Segment transforms require at least one source message (sourceSessionId=${t})`);let o=i;if(r){let e=i.findIndex(e=>e.messageId===r);if(e===-1)throw Error(`[fork-handler] Fork point message not found in source message list: ${r} (sourceSessionId=${t})`);o=i.slice(0,e+1)}let s=new Map;o.forEach((e,t)=>{s.set(e.messageId,t)});let c=-1;for(let e of n.segments){if(!e.fromMessageId||!e.toMessageId)throw Error(`[fork-handler] Segment must have fromMessageId and toMessageId (sourceSessionId=${t})`);let n=s.get(e.fromMessageId),r=s.get(e.toMessageId);if(n===void 0||r===void 0)throw Error(`[fork-handler] Segment boundaries must reference source messages: ${e.fromMessageId}..${e.toMessageId} (sourceSessionId=${t})`);if(n>r)throw Error(`[fork-handler] Segment range is reversed: ${e.fromMessageId}..${e.toMessageId} (sourceSessionId=${t})`);if(n<=c)throw Error(`[fork-handler] Segments must not overlap and must be ordered (sourceSessionId=${t})`);if(n!==c+1)throw Error(`[fork-handler] Segments must be contiguous without gaps (sourceSessionId=${t})`);c=r}if(c!==o.length-1)throw Error(`[fork-handler] Segments must cover the entire source message range (sourceSessionId=${t})`);return!0}function Zt(e){if(!e.segments?.length&&e.appliedPipeline?.length)for(let t of e.appliedPipeline){let e=R.get(t.actionId);if(!e)throw Error(`[fork-handler] Unknown action in pipeline: ${t.actionId}`);if(e.category!==`transformation`)throw Error(`[fork-handler] Action '${t.actionId}' is category '${e.category}', but only 'transformation' actions are allowed in fork transforms`)}}function Qt(e){return e.on(C.fork,async t=>{let{sourceSessionId:n,fromMessageId:r,name:i,branchKind:a=`fork`,transforms:o,targetWorkingDirectory:s,metadata:c,existingSessionId:l}=t.payload,{session:u}=await e.request(C.get,{sessionId:n});if(!u)throw Error(`[fork-handler] Source session not found: ${n}`);if(r){let{message:t}=await e.request(m.get,{messageId:r});if(!t)throw Error(`[fork-handler] Fork point message not found: ${r} (sourceSessionId=${n})`);if(t.sessionId!==n)throw Error(`[fork-handler] Fork point message ${r} does not belong to session ${n}`)}o&&(await Xt(e,n,o,r)||Zt(o));let{sessionId:d}=await e.request(C.create,{...l?{sessionId:l}:{},parentSessionId:n,forkPointMessageId:r,branchKind:a,forkTransforms:o,...i?{title:i}:{},...s?{targetWorkingDirectory:s}:{},...c?{metadata:c}:{}});await e.emit(C.branch.created,{sessionId:n,childSessionId:d,parentSessionId:n,kind:a,forkPointMessageId:r,transforms:o}),await e.emit(C.forked,{parentSessionId:n,childSessionId:d,forkPoint:r}),t.setResult({sessionId:d})})}function $t(e){return e.on(C.merge,async t=>{let{parentSessionId:n,childSessionId:r,summary:a}=t.payload,o=`merge:${n}:${r}`,{session:s}=await e.request(C.get,{sessionId:n});if(!s)throw Error(`[merge-handler] Parent session not found: ${n}`);if(s.status!==`active`)throw Error(`[merge-handler] Parent session is not active: ${n}`);let{session:c}=await e.request(C.get,{sessionId:r});if(!c)throw Error(`[merge-handler] Child session not found: ${r}`);if(c.parentSessionId!==n)throw Error(`[merge-handler] Invalid parent-child relationship: session ${r} is not a child of ${n}`+(c.parentSessionId?` (actual parent: ${c.parentSessionId})`:` (session has no parent)`));await e.emit(C.merging,{parentSessionId:n,childSessionId:r});let l=a??`Child session ${r} merged.`;if(!(await e.request(C.close,{sessionId:r})).success)throw Error(`[merge-handler] Failed to close child session: ${r}`);let u=JSON.stringify({handoff:l});await e.request(i.append,{event:{sessionId:n,eventId:o,timestamp:Date.now(),type:`branch.merged`,payload:{childSessionId:r,parentSessionId:n,resultJson:u}}}),await e.emit(C.branch.merged,{sessionId:n,childSessionId:r,parentSessionId:n,resultJson:u}),await e.emit(C.merged,{parentSessionId:n,childSessionId:r,handoff:l}),t.setResult({success:!0,handoff:l})})}async function en(e,t,n,r,i){if(!(t.parentSessionId!==void 0&&(t.contextInheritance===`parent-history`||t.contextInheritance===void 0&&t.branchKind!==`subagent`))||r?.messageHistory)return r;let{turns:a}=await e.request(o.getBySession,{sessionId:n,limit:2});if(!(i&&a.length<=1))return r;let s=(await B(e,n)).messages.map(H);return{...r,messageHistory:s,isFirstTurn:!0,hasNewTransforms:t.forkTransforms!==void 0}}const $={enabled:!0,template:`User changed working directory from {oldCwd} to {newCwd}`};function tn(e,t,n){return e.replace(/\{oldCwd\}/g,t).replace(/\{newCwd\}/g,n)}function nn(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.enabled==`boolean`&&typeof t.template==`string`}async function rn(e){try{let t=await e.request(g.get,{key:{scope:`global`,surface:`ui`,context:`cwdChangeNotification`},category:`chat-display`});if(t.value!==null&&t.value!==void 0)return nn(t.value)?t.value:$}catch{}return $}function an(e){let{baseContext:t,recoveryContext:n,isRecovered:r,isSwapped:i,swapMeta:a,cwdMessage:o,freshMessageHistory:s}=e,c=r&&n?{...t,...n}:t;if(!i)return c;let l=a&&o!==void 0?{cwdChange:{previousCwd:a.previousCwd,newCwd:a.newCwd,message:o}}:void 0;return c={...c,hasConnectorSwap:!0,...s!==void 0&&{messageHistory:s},...l&&{turnContext:{...c?.turnContext,...l}}},c}async function on(e){let{bus:t,session:n,turn:r,message:i,messageId:a,deliveryMode:o,onTurnComplete:s,agent:c,agentContext:l,responseSchema:u}=e;try{await t.request(x.sendMessage,{agentId:c.agentId,adapterId:c.adapterId,message:i,deliveryMode:o,messageId:a,turnId:r.turnId,sessionId:n.sessionId,sessionContext:l,...u!==void 0&&{responseSchema:u}}),await t.emit(C.user_message.acknowledged,{sessionId:r.sessionId,turnId:r.turnId,turnNumber:r.turnNumber,messageId:a,agentId:c.agentId})}catch(e){if(e instanceof j){await t.emit(C.user_message.completed,{sessionId:r.sessionId,turnId:r.turnId,turnNumber:r.turnNumber,messageId:a,agentId:c.agentId,outcome:`cancelled`});let e=r.markAgentCompleted(c.agentId);e.turnComplete&&await s(r,e.result);return}let n=e instanceof Error?e.message:String(e),i=r.markAgentErrored(c.agentId,n);await t.emit(C.user_message.completed,{sessionId:r.sessionId,turnId:r.turnId,turnNumber:r.turnNumber,messageId:a,agentId:c.agentId,outcome:`error`,error:n}),i.turnComplete&&await s(r,i.result)}}async function sn(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g){let _=await en(e,t,t.sessionId,c,u),v=l?await l.enrichForDeliveryMode(_?.messageHistory,a.turnId,o):_?.messageHistory,y=_?{..._,messageHistory:v}:void 0,b=p?.size?await rn(e):$,x=n.map(async n=>{let c=m?.get(n.agentId),l=c&&b.enabled?tn(b.template,c.previousCwd,c.newCwd):void 0;await on({bus:e,session:t,turn:a,message:r,messageId:i,deliveryMode:o,onTurnComplete:s,agent:n,agentContext:an({baseContext:y,recoveryContext:d,isRecovered:f?.has(n.agentId)??!1,isSwapped:p?.has(n.agentId)??!1,swapMeta:c,cwdMessage:l,freshMessageHistory:h}),responseSchema:g})});await Promise.all(x)}export{Ne as A,ge as B,Ve as C,Be as D,Ue as E,I as F,N as I,P as L,Me as M,je as N,B as O,F as P,ke as R,We as S,U as T,J as _,Yt as a,rt as b,Ht as c,Y as d,xt as f,vt as g,_t as h,Qt as i,L as j,R as k,Vt as l,yt as m,en as n,qt as o,bt as p,$t as r,Jt as s,sn as t,kt as u,gt as v,He as w,Je as x,mt as y,Oe as z};
@@ -289,6 +289,14 @@ type PreTurnHookOptions = BaseHookOptions;
289
289
  interface PostTurnHookOptions extends BaseHookOptions {
290
290
  /** Hook name for error attribution (default: 'anonymous') */
291
291
  name?: string;
292
+ /**
293
+ * When true, the handler also runs for turns ingested from historical
294
+ * imports (`session.turn.completed` with ingestionMarker `'backfill'`).
295
+ * Default false: backfill emissions are filtered so LLM-driven consumers do
296
+ * not stampede over historical imports. Live turns (marker `'live'` or
297
+ * absent) always run.
298
+ */
299
+ includeBackfill?: boolean;
292
300
  }
293
301
  /**
294
302
  * Options for PostStep hook.
@@ -1 +1 @@
1
- import{MakaioBus as e}from"@makaio/framework/bus";import{AgentSubjects as t,SessionSubjects as n}from"@makaio/framework/contracts";import{TurnStorageSubjects as r}from"@makaio/framework/services/turn";const i={session:void 0,recentHistory:[],contextExtensions:{}};async function a(e,t){try{let{session:a}=await e.request(n.get,{sessionId:t});if(!a)return i;let[o,s]=await Promise.all([e.request(r.getBySession,{sessionId:t,limit:10}).catch(()=>({turns:[]})),e.requestOptional(n.enrichContext,{sessionId:t}).catch(()=>({handled:!1}))]),c=s.handled?s.data:{};return{session:a,recentHistory:o.turns,contextExtensions:c}}catch{return i}}async function o(e,t){let n=e.payload,r=await a(t,n.sessionId);return{...r.contextExtensions,hookEvent:`PostTurn`,sessionId:n.sessionId,turnId:n.turnId,success:n.success,error:n.error,payload:n,messageId:e.messageId,correlationId:e.correlationId,session:r.session,recentHistory:r.recentHistory,contextExtensions:r.contextExtensions,bus:t,async next(){await e.next()},stopPropagation:e.stopPropagation.bind(e)}}async function s(e,t){let n=e.payload,r=n.sessionId?await a(t,n.sessionId):i;return{...r.contextExtensions,hookEvent:`PostStep`,sessionId:n.sessionId,agentId:n.agentId,adapterId:n.adapterId,adapterName:n.adapterName,messageId:n.messageId,stepType:n.stepType,blockIndex:n.blockIndex,stepContent:n.content,payload:n,correlationId:e.correlationId,session:r.session,recentHistory:r.recentHistory,contextExtensions:r.contextExtensions,bus:t,async next(){await e.next()},stopPropagation:e.stopPropagation.bind(e)}}var c=class extends Error{hookName;reason;code=`HOOK_ABORT`;constructor(e,t){super(`Message aborted by hook: ${e}${t?` - ${t}`:``}`),this.hookName=e,this.reason=t,this.name=`HookAbortError`}},l=class{entries=[];register(e,t,n,r=0){let i={name:e,handler:t,priority:r,options:n};return this.entries.push(i),this.entries.sort((e,t)=>t.priority-e.priority),()=>{let e=this.entries.indexOf(i);e!==-1&&this.entries.splice(e,1)}}reset(){this.entries.length=0}[Symbol.iterator](){return this.entries[Symbol.iterator]()}};const u=new l;function d(e,t,n,r=0){return u.register(e,t,n,r)}function f(){u.reset()}async function p(e,t){let n=e.message,r=e.sessionContext,o=e.sessionId?await a(t,e.sessionId):i;for(let{name:i,handler:a}of u){let s={},l={...o.contextExtensions,get payload(){return{message:n,sessionId:e.sessionId,sessionContext:r,cwd:e.cwd,adapterId:e.adapterId,agentId:e.agentId}},messageId:e.messageId,correlationId:void 0,replacePayload:e=>{e.message!==void 0&&(n=e.message),e.sessionContext!==void 0&&(r=e.sessionContext)},next:async()=>{},abort:e=>{throw new c(i,e)},hookEvent:`PreUserMessage`,session:o.session,recentHistory:o.recentHistory,contextExtensions:o.contextExtensions,bus:t,setTurnContext(e,t){s[e]=t},getTurnContext(){return{...s}}};await a(l);let u=l.getTurnContext();if(Object.keys(u).length>0){let e={...r?.turnContext??{},...u};r={...r,turnContext:e}}}return{message:n,sessionContext:r}}const m=new l;function h(e,t,n,r=0){return m.register(e,t,n,r)}function g(){m.reset()}async function _(e,t){for(let{name:n,handler:r}of m){let i={hookEvent:`PostUserMessage`,agentId:e.agentId,adapterId:e.adapterId,sessionId:e.sessionId,messageId:e.messageId,bus:t};try{await r(i)}catch(e){console.error(`[PostUserMessage] Hook "${n}" failed:`,e)}}}async function v(e,t,n,r,i){try{await r(await n())}catch(n){console.error(`[${e}] Hook '${t}' error:`,n)}await i()}function y(r,i){if(r===`BusMessage`){let t=i;return{unsubscribe:e.intercept(t.subject,t.handler,{priority:t.priority}),hookName:r}}if(r===`PreUserMessage`){let e=i;return{unsubscribe:d(e.name??`anonymous`,e.handler,e,e.priority??0),hookName:r}}if(r===`PostUserMessage`){let e=i;return{unsubscribe:h(e.name??`anonymous`,e.handler,e,e.priority??0),hookName:r}}if(r===`PostTurn`){let t=i,a=t.name??`anonymous`;return{unsubscribe:e.intercept(n.turn.completed,async n=>{await v(`PostTurn`,a,()=>o(n,e),t.handler,()=>n.next())},{priority:t.priority}),hookName:r}}if(r===`PostStep`){let n=i,a=n.stepTypes??[`reasoning`],o=n.name??`anonymous`;return{unsubscribe:e.intercept(t.step.finished,async t=>{if(!a.includes(t.payload.stepType)){await t.next();return}await v(`PostStep`,o,()=>s(t,e),n.handler,()=>t.next())},{priority:n.priority}),hookName:r}}throw Error(`Named hook "${r}" not yet implemented. Use BusMessage for now.`)}export{c as HookAbortError,y as createHook,d as registerPreUserMessageHook,g as resetPostUserMessageHooks,f as resetPreUserMessageHooks,_ as runPostUserMessageHooks,p as runPreUserMessageHooks};
1
+ import{MakaioBus as e}from"@makaio/framework/bus";import{AgentSubjects as t,SessionSubjects as n}from"@makaio/framework/contracts";import{TurnStorageSubjects as r}from"@makaio/framework/services/turn";const i={session:void 0,recentHistory:[],contextExtensions:{}};async function a(e,t){try{let{session:a}=await e.request(n.get,{sessionId:t});if(!a)return i;let[o,s]=await Promise.all([e.request(r.getBySession,{sessionId:t,limit:10}).catch(()=>({turns:[]})),e.requestOptional(n.enrichContext,{sessionId:t}).catch(()=>({handled:!1}))]),c=s.handled?s.data:{};return{session:a,recentHistory:o.turns,contextExtensions:c}}catch{return i}}async function o(e,t){let n=e.payload,r=await a(t,n.sessionId);return{...r.contextExtensions,hookEvent:`PostTurn`,sessionId:n.sessionId,turnId:n.turnId,success:n.success,error:n.error,payload:n,messageId:e.messageId,correlationId:e.correlationId,session:r.session,recentHistory:r.recentHistory,contextExtensions:r.contextExtensions,bus:t,async next(){await e.next()},stopPropagation:e.stopPropagation.bind(e)}}async function s(e,t){let n=e.payload,r=n.sessionId?await a(t,n.sessionId):i;return{...r.contextExtensions,hookEvent:`PostStep`,sessionId:n.sessionId,agentId:n.agentId,adapterId:n.adapterId,adapterName:n.adapterName,messageId:n.messageId,stepType:n.stepType,blockIndex:n.blockIndex,stepContent:n.content,payload:n,correlationId:e.correlationId,session:r.session,recentHistory:r.recentHistory,contextExtensions:r.contextExtensions,bus:t,async next(){await e.next()},stopPropagation:e.stopPropagation.bind(e)}}var c=class extends Error{hookName;reason;code=`HOOK_ABORT`;constructor(e,t){super(`Message aborted by hook: ${e}${t?` - ${t}`:``}`),this.hookName=e,this.reason=t,this.name=`HookAbortError`}},l=class{entries=[];register(e,t,n,r=0){let i={name:e,handler:t,priority:r,options:n};return this.entries.push(i),this.entries.sort((e,t)=>t.priority-e.priority),()=>{let e=this.entries.indexOf(i);e!==-1&&this.entries.splice(e,1)}}reset(){this.entries.length=0}[Symbol.iterator](){return this.entries[Symbol.iterator]()}};const u=new l;function d(e,t,n,r=0){return u.register(e,t,n,r)}function f(){u.reset()}async function p(e,t){let n=e.message,r=e.sessionContext,o=e.sessionId?await a(t,e.sessionId):i;for(let{name:i,handler:a}of u){let s={},l={...o.contextExtensions,get payload(){return{message:n,sessionId:e.sessionId,sessionContext:r,cwd:e.cwd,adapterId:e.adapterId,agentId:e.agentId}},messageId:e.messageId,correlationId:void 0,replacePayload:e=>{e.message!==void 0&&(n=e.message),e.sessionContext!==void 0&&(r=e.sessionContext)},next:async()=>{},abort:e=>{throw new c(i,e)},hookEvent:`PreUserMessage`,session:o.session,recentHistory:o.recentHistory,contextExtensions:o.contextExtensions,bus:t,setTurnContext(e,t){s[e]=t},getTurnContext(){return{...s}}};await a(l);let u=l.getTurnContext();if(Object.keys(u).length>0){let e={...r?.turnContext??{},...u};r={...r,turnContext:e}}}return{message:n,sessionContext:r}}const m=new l;function h(e,t,n,r=0){return m.register(e,t,n,r)}function g(){m.reset()}async function _(e,t){for(let{name:n,handler:r}of m){let i={hookEvent:`PostUserMessage`,agentId:e.agentId,adapterId:e.adapterId,sessionId:e.sessionId,messageId:e.messageId,bus:t};try{await r(i)}catch(e){console.error(`[PostUserMessage] Hook "${n}" failed:`,e)}}}async function v(e,t,n,r,i){try{await r(await n())}catch(n){console.error(`[${e}] Hook '${t}' error:`,n)}await i()}function y(r,i){if(r===`BusMessage`){let t=i;return{unsubscribe:e.intercept(t.subject,t.handler,{priority:t.priority}),hookName:r}}if(r===`PreUserMessage`){let e=i;return{unsubscribe:d(e.name??`anonymous`,e.handler,e,e.priority??0),hookName:r}}if(r===`PostUserMessage`){let e=i;return{unsubscribe:h(e.name??`anonymous`,e.handler,e,e.priority??0),hookName:r}}if(r===`PostTurn`){let t=i,a=t.name??`anonymous`;return{unsubscribe:e.intercept(n.turn.completed,async n=>{if(t.includeBackfill!==!0&&n.payload.ingestionMarker===`backfill`){await n.next();return}await v(`PostTurn`,a,()=>o(n,e),t.handler,()=>n.next())},{priority:t.priority}),hookName:r}}if(r===`PostStep`){let n=i,a=n.stepTypes??[`reasoning`],o=n.name??`anonymous`;return{unsubscribe:e.intercept(t.step.finished,async t=>{if(!a.includes(t.payload.stepType)){await t.next();return}await v(`PostStep`,o,()=>s(t,e),n.handler,()=>t.next())},{priority:n.priority}),hookName:r}}throw Error(`Named hook "${r}" not yet implemented. Use BusMessage for now.`)}export{c as HookAbortError,y as createHook,d as registerPreUserMessageHook,g as resetPostUserMessageHooks,f as resetPreUserMessageHooks,_ as runPostUserMessageHooks,p as runPreUserMessageHooks};
@@ -17,8 +17,8 @@ declare const ClientExecutionContextSchema: z.ZodObject<{
17
17
  env: z.ZodRecord<z.ZodString, z.ZodString>;
18
18
  configDir: z.ZodNullable<z.ZodString>;
19
19
  source: z.ZodEnum<{
20
- global: "global";
21
20
  managed: "managed";
21
+ global: "global";
22
22
  }>;
23
23
  version: z.ZodNullable<z.ZodString>;
24
24
  }, z.core.$strip>;
@@ -39,8 +39,8 @@ declare const ClientResolveBinarySchema: {
39
39
  sessionId: z.ZodOptional<z.ZodString>;
40
40
  projectDir: z.ZodOptional<z.ZodString>;
41
41
  preferSource: z.ZodOptional<z.ZodEnum<{
42
- global: "global";
43
42
  managed: "managed";
43
+ global: "global";
44
44
  }>>;
45
45
  harnessId: z.ZodOptional<z.ZodString>;
46
46
  }, z.core.$strip>;
@@ -49,8 +49,8 @@ declare const ClientResolveBinarySchema: {
49
49
  env: z.ZodRecord<z.ZodString, z.ZodString>;
50
50
  configDir: z.ZodNullable<z.ZodString>;
51
51
  source: z.ZodEnum<{
52
- global: "global";
53
52
  managed: "managed";
53
+ global: "global";
54
54
  }>;
55
55
  version: z.ZodNullable<z.ZodString>;
56
56
  }, z.core.$strip>;
@@ -456,6 +456,8 @@ declare const ClientSchemas: {
456
456
  sessionId: z.ZodOptional<z.ZodString>;
457
457
  adapterSessionId: z.ZodOptional<z.ZodString>;
458
458
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
459
+ transcriptPath: z.ZodOptional<z.ZodString>;
460
+ cwd: z.ZodOptional<z.ZodString>;
459
461
  }, z.core.$strip>;
460
462
  'session.userPrompt.submitted': z.ZodObject<{
461
463
  clientId: z.ZodString;
@@ -481,6 +483,7 @@ declare const ClientSchemas: {
481
483
  sessionId: z.ZodOptional<z.ZodString>;
482
484
  adapterSessionId: z.ZodOptional<z.ZodString>;
483
485
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
486
+ transcriptPath: z.ZodOptional<z.ZodString>;
484
487
  }, z.core.$strip>;
485
488
  'session.tool.pre': z.ZodObject<{
486
489
  clientId: z.ZodString;
@@ -630,8 +633,8 @@ declare const ClientSchemas: {
630
633
  reason: z.ZodEnum<{
631
634
  update: "update";
632
635
  install: "install";
633
- uninstall: "uninstall";
634
636
  "set-active": "set-active";
637
+ uninstall: "uninstall";
635
638
  }>;
636
639
  }, z.core.$strip>;
637
640
  resolveBinary: {
@@ -640,8 +643,8 @@ declare const ClientSchemas: {
640
643
  sessionId: z.ZodOptional<z.ZodString>;
641
644
  projectDir: z.ZodOptional<z.ZodString>;
642
645
  preferSource: z.ZodOptional<z.ZodEnum<{
643
- global: "global";
644
646
  managed: "managed";
647
+ global: "global";
645
648
  }>>;
646
649
  harnessId: z.ZodOptional<z.ZodString>;
647
650
  }, z.core.$strip>;
@@ -650,8 +653,8 @@ declare const ClientSchemas: {
650
653
  env: z.ZodRecord<z.ZodString, z.ZodString>;
651
654
  configDir: z.ZodNullable<z.ZodString>;
652
655
  source: z.ZodEnum<{
653
- global: "global";
654
656
  managed: "managed";
657
+ global: "global";
655
658
  }>;
656
659
  version: z.ZodNullable<z.ZodString>;
657
660
  }, z.core.$strip>;
@@ -1130,8 +1133,8 @@ declare const ClientVersionChangedSchema: z.ZodObject<{
1130
1133
  reason: z.ZodEnum<{
1131
1134
  update: "update";
1132
1135
  install: "install";
1133
- uninstall: "uninstall";
1134
1136
  "set-active": "set-active";
1137
+ uninstall: "uninstall";
1135
1138
  }>;
1136
1139
  }, z.core.$strip>;
1137
1140
  type ClientVersionChanged = z.infer<typeof ClientVersionChangedSchema>;
@@ -1326,6 +1329,8 @@ declare const ClientSessionStartedSchema: z.ZodObject<{
1326
1329
  sessionId: z.ZodOptional<z.ZodString>;
1327
1330
  adapterSessionId: z.ZodOptional<z.ZodString>;
1328
1331
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1332
+ transcriptPath: z.ZodOptional<z.ZodString>;
1333
+ cwd: z.ZodOptional<z.ZodString>;
1329
1334
  }, z.core.$strip>;
1330
1335
  type ClientSessionStarted = z.infer<typeof ClientSessionStartedSchema>;
1331
1336
  /**
@@ -1350,6 +1355,12 @@ type ClientSessionUserPromptSubmitted = z.infer<typeof ClientSessionUserPromptSu
1350
1355
  *
1351
1356
  * Emitted when an adapter observes the beginning of an assistant turn inside
1352
1357
  * an ongoing client session.
1358
+ *
1359
+ * Intentionally base-only: unlike {@link ClientSessionTurnCompletedSchema},
1360
+ * this event carries no `transcriptPath`. The Stop hook (`turn.completed`) is
1361
+ * the import trigger for observed sessions; `turn.started` (mapped from
1362
+ * UserPromptSubmit) is cadence-only. Do not "fix" this asymmetry by adding
1363
+ * transcript fields here.
1353
1364
  */
1354
1365
  declare const ClientSessionTurnStartedSchema: z.ZodObject<{
1355
1366
  clientId: z.ZodString;
@@ -1373,6 +1384,7 @@ declare const ClientSessionTurnCompletedSchema: z.ZodObject<{
1373
1384
  sessionId: z.ZodOptional<z.ZodString>;
1374
1385
  adapterSessionId: z.ZodOptional<z.ZodString>;
1375
1386
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1387
+ transcriptPath: z.ZodOptional<z.ZodString>;
1376
1388
  }, z.core.$strip>;
1377
1389
  type ClientSessionTurnCompleted = z.infer<typeof ClientSessionTurnCompletedSchema>;
1378
1390
  /**
@@ -1832,6 +1844,8 @@ declare const ClientNamespace: _$_makaio_core0.BusNamespaceDefinition<"client",
1832
1844
  sessionId: _$zod.ZodOptional<_$zod.ZodString>;
1833
1845
  adapterSessionId: _$zod.ZodOptional<_$zod.ZodString>;
1834
1846
  metadata: _$zod.ZodOptional<_$zod.ZodRecord<_$zod.ZodString, _$zod.ZodUnknown>>;
1847
+ transcriptPath: _$zod.ZodOptional<_$zod.ZodString>;
1848
+ cwd: _$zod.ZodOptional<_$zod.ZodString>;
1835
1849
  }, _$zod_v4_core0.$strip>;
1836
1850
  'session.userPrompt.submitted': _$zod.ZodObject<{
1837
1851
  clientId: _$zod.ZodString;
@@ -1857,6 +1871,7 @@ declare const ClientNamespace: _$_makaio_core0.BusNamespaceDefinition<"client",
1857
1871
  sessionId: _$zod.ZodOptional<_$zod.ZodString>;
1858
1872
  adapterSessionId: _$zod.ZodOptional<_$zod.ZodString>;
1859
1873
  metadata: _$zod.ZodOptional<_$zod.ZodRecord<_$zod.ZodString, _$zod.ZodUnknown>>;
1874
+ transcriptPath: _$zod.ZodOptional<_$zod.ZodString>;
1860
1875
  }, _$zod_v4_core0.$strip>;
1861
1876
  'session.tool.pre': _$zod.ZodObject<{
1862
1877
  clientId: _$zod.ZodString;
@@ -2006,8 +2021,8 @@ declare const ClientNamespace: _$_makaio_core0.BusNamespaceDefinition<"client",
2006
2021
  reason: _$zod.ZodEnum<{
2007
2022
  update: "update";
2008
2023
  install: "install";
2009
- uninstall: "uninstall";
2010
2024
  "set-active": "set-active";
2025
+ uninstall: "uninstall";
2011
2026
  }>;
2012
2027
  }, _$zod_v4_core0.$strip>;
2013
2028
  resolveBinary: {
@@ -2016,8 +2031,8 @@ declare const ClientNamespace: _$_makaio_core0.BusNamespaceDefinition<"client",
2016
2031
  sessionId: _$zod.ZodOptional<_$zod.ZodString>;
2017
2032
  projectDir: _$zod.ZodOptional<_$zod.ZodString>;
2018
2033
  preferSource: _$zod.ZodOptional<_$zod.ZodEnum<{
2019
- global: "global";
2020
2034
  managed: "managed";
2035
+ global: "global";
2021
2036
  }>>;
2022
2037
  harnessId: _$zod.ZodOptional<_$zod.ZodString>;
2023
2038
  }, _$zod_v4_core0.$strip>;
@@ -2026,8 +2041,8 @@ declare const ClientNamespace: _$_makaio_core0.BusNamespaceDefinition<"client",
2026
2041
  env: _$zod.ZodRecord<_$zod.ZodString, _$zod.ZodString>;
2027
2042
  configDir: _$zod.ZodNullable<_$zod.ZodString>;
2028
2043
  source: _$zod.ZodEnum<{
2029
- global: "global";
2030
2044
  managed: "managed";
2045
+ global: "global";
2031
2046
  }>;
2032
2047
  version: _$zod.ZodNullable<_$zod.ZodString>;
2033
2048
  }, _$zod_v4_core0.$strip>;
@@ -2414,6 +2429,8 @@ declare const ClientSubjects: _$_makaio_core0.BusSubjects<_$_makaio_core0.FlatSu
2414
2429
  sessionId: _$zod.ZodOptional<_$zod.ZodString>;
2415
2430
  adapterSessionId: _$zod.ZodOptional<_$zod.ZodString>;
2416
2431
  metadata: _$zod.ZodOptional<_$zod.ZodRecord<_$zod.ZodString, _$zod.ZodUnknown>>;
2432
+ transcriptPath: _$zod.ZodOptional<_$zod.ZodString>;
2433
+ cwd: _$zod.ZodOptional<_$zod.ZodString>;
2417
2434
  }, _$zod_v4_core0.$strip>;
2418
2435
  'session.userPrompt.submitted': _$zod.ZodObject<{
2419
2436
  clientId: _$zod.ZodString;
@@ -2439,6 +2456,7 @@ declare const ClientSubjects: _$_makaio_core0.BusSubjects<_$_makaio_core0.FlatSu
2439
2456
  sessionId: _$zod.ZodOptional<_$zod.ZodString>;
2440
2457
  adapterSessionId: _$zod.ZodOptional<_$zod.ZodString>;
2441
2458
  metadata: _$zod.ZodOptional<_$zod.ZodRecord<_$zod.ZodString, _$zod.ZodUnknown>>;
2459
+ transcriptPath: _$zod.ZodOptional<_$zod.ZodString>;
2442
2460
  }, _$zod_v4_core0.$strip>;
2443
2461
  'session.tool.pre': _$zod.ZodObject<{
2444
2462
  clientId: _$zod.ZodString;
@@ -2588,8 +2606,8 @@ declare const ClientSubjects: _$_makaio_core0.BusSubjects<_$_makaio_core0.FlatSu
2588
2606
  reason: _$zod.ZodEnum<{
2589
2607
  update: "update";
2590
2608
  install: "install";
2591
- uninstall: "uninstall";
2592
2609
  "set-active": "set-active";
2610
+ uninstall: "uninstall";
2593
2611
  }>;
2594
2612
  }, _$zod_v4_core0.$strip>;
2595
2613
  resolveBinary: {
@@ -2598,8 +2616,8 @@ declare const ClientSubjects: _$_makaio_core0.BusSubjects<_$_makaio_core0.FlatSu
2598
2616
  sessionId: _$zod.ZodOptional<_$zod.ZodString>;
2599
2617
  projectDir: _$zod.ZodOptional<_$zod.ZodString>;
2600
2618
  preferSource: _$zod.ZodOptional<_$zod.ZodEnum<{
2601
- global: "global";
2602
2619
  managed: "managed";
2620
+ global: "global";
2603
2621
  }>>;
2604
2622
  harnessId: _$zod.ZodOptional<_$zod.ZodString>;
2605
2623
  }, _$zod_v4_core0.$strip>;
@@ -2608,8 +2626,8 @@ declare const ClientSubjects: _$_makaio_core0.BusSubjects<_$_makaio_core0.FlatSu
2608
2626
  env: _$zod.ZodRecord<_$zod.ZodString, _$zod.ZodString>;
2609
2627
  configDir: _$zod.ZodNullable<_$zod.ZodString>;
2610
2628
  source: _$zod.ZodEnum<{
2611
- global: "global";
2612
2629
  managed: "managed";
2630
+ global: "global";
2613
2631
  }>;
2614
2632
  version: _$zod.ZodNullable<_$zod.ZodString>;
2615
2633
  }, _$zod_v4_core0.$strip>;