@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.
- package/dist/.makaio-build.json +2 -2
- package/dist/adapter-BRxCc72E.mjs +1 -0
- package/dist/adapters/index.d.mts +11 -2
- package/dist/adapters/index.mjs +1 -1
- package/dist/adapters/node.d.mts +1 -1
- package/dist/{base-orchestrator-Cw0vpNgB.d.mts → base-orchestrator-BNysGvaM.d.mts} +70 -2
- package/dist/bus/index.mjs +1 -1
- package/dist/{client-BcfR-LJC.mjs → client-BgUjVbXX.mjs} +1 -1
- package/dist/contracts/adapter/index.d.mts +1 -1
- package/dist/contracts/adapter/index.mjs +1 -1
- package/dist/contracts/artifact/index.d.mts +1 -1
- package/dist/contracts/client/index.d.mts +1 -1
- package/dist/contracts/client/index.mjs +1 -1
- package/dist/contracts/extension/index.d.mts +3 -3
- package/dist/contracts/facet/index.d.mts +1 -1
- package/dist/contracts/harness/index.d.mts +1 -1
- package/dist/contracts/index.d.mts +24 -24
- package/dist/contracts/index.mjs +1 -1
- package/dist/contracts/materialization/index.d.mts +3 -3
- package/dist/contracts/session/index.d.mts +3 -3
- package/dist/contracts/session/index.mjs +1 -1
- package/dist/contracts/shared/index.d.mts +1 -1
- package/dist/contracts/workflow/index.d.mts +2 -2
- package/dist/contracts/workflow/index.mjs +1 -1
- package/dist/{definition-DFcxkf2i.d.mts → definition-b9jyJqPD.d.mts} +1 -1
- package/dist/drizzle/0021_m_mr8e1j84.sql +3 -0
- package/dist/drizzle/0022_m_mr8i4ky3.sql +43 -0
- package/dist/drizzle/meta/_journal.json +14 -0
- package/dist/{handler-2bPhRn0u.mjs → handler-BFNvtv5t.mjs} +1 -1
- package/dist/handlers-v47Gbsr1.mjs +57 -0
- package/dist/hooks/index.d.mts +8 -0
- package/dist/hooks/index.mjs +1 -1
- package/dist/{index-CTEsbp9H.d.mts → index-31vR1sxk.d.mts} +31 -13
- package/dist/{index-9b2_jXxq.d.mts → index-3J0HZlPH.d.mts} +372 -87
- package/dist/{index-Bh6lHiW4.d.mts → index-3X0368CL.d.mts} +16 -16
- package/dist/{index-Y2r0Zvcm.d.mts → index-B5w-0Gg9.d.mts} +4 -4
- package/dist/{index-DdBRlm7m.d.mts → index-BKZhnb2B.d.mts} +3 -3
- package/dist/{index-gAFwNiJT.d.mts → index-BYfSAJRC.d.mts} +64 -0
- package/dist/{index-2fK9iSHI.d.mts → index-BwGfdbI0.d.mts} +9 -9
- package/dist/{index-DLy-tc0L.d.mts → index-C5C1tk9f.d.mts} +214 -1
- package/dist/{index-CL2T6LVv.d.mts → index-C6Ys8pxt.d.mts} +9 -9
- package/dist/{index-NkNbYFud.d.mts → index-CaerrEDH.d.mts} +1 -1
- package/dist/{index-CfIW5biI.d.mts → index-D7rWAEY0.d.mts} +1 -0
- package/dist/{index-CaOWqztb.d.mts → index-DQYj8-53.d.mts} +1 -1
- package/dist/{index-Dg-y1mrq.d.mts → index-DV4nRk0h.d.mts} +14 -14
- package/dist/{index-GD-i3DW7.d.mts → index-DvHYpi-J.d.mts} +365 -163
- package/dist/{index-BMbmoarE.d.mts → index-O08Q2ikz.d.mts} +8 -8
- package/dist/kernel/extension/index.d.mts +1 -1
- package/dist/kernel/index.d.mts +2 -2
- package/dist/kernel/observability/index.d.mts +1 -1
- package/dist/{lib-Ba55od_d.mjs → lib-BOmKyjWD.mjs} +1 -1
- package/dist/{lib-CM_BUxN8.mjs → lib-DLZYp5z3.mjs} +1 -1
- package/dist/{loop-gate-handlers-BLoGCWMQ.mjs → loop-gate-handlers-Bjmat-K3.mjs} +1 -1
- package/dist/{namespace-DGAWYjbO.d.mts → namespace-Bm77p82L.d.mts} +5 -5
- package/dist/{namespace-LUNf8zo5.d.mts → namespace-D1_9WVCo.d.mts} +157 -0
- package/dist/{namespace-BsYKEMd8.d.mts → namespace-DAj_riOn.d.mts} +138 -0
- package/dist/{namespace-KMxsPJwm.d.mts → namespace-DhDY0juT.d.mts} +66 -0
- package/dist/{namespace-DXW-voCe.d.mts → namespace-DmqoDDRD.d.mts} +158 -22
- package/dist/namespace-dFBD2ZmS.mjs +1 -0
- package/dist/node/transports/index.mjs +1 -1
- package/dist/orchestrator-shared-ChygCvR1.mjs +1 -0
- package/dist/{orchestrator-shared-ChOdIgh6.d.mts → orchestrator-shared-DFLb1otg.d.mts} +9 -3
- package/dist/package-BmRhhi-3.mjs +1 -0
- package/dist/package.json +1 -1
- package/dist/runtime-node/index.mjs +1 -1
- package/dist/schema-7aKBGB7S.mjs +1 -0
- package/dist/{schema-DHlTAy0N.mjs → schema-CHp6I33k.mjs} +1 -1
- package/dist/{schema-D1HrnvT7.d.mts → schema-DLNBajAV.d.mts} +23 -1
- package/dist/{schemas-DMCGXlKa.d.mts → schemas-DMMWmWjq.d.mts} +3 -3
- package/dist/schemas-DZGnr9Tl.mjs +1 -0
- package/dist/{schemas-D-9zNyAM2.d.mts → schemas-DuuVuhHX2.d.mts} +2 -2
- package/dist/schemas-ftgVeWIG.mjs +1 -0
- package/dist/services/context-rules/index.d.mts +6 -6
- package/dist/services/filesystem/namespace.d.mts +12 -12
- package/dist/services/filesystem/schemas.d.mts +6 -6
- package/dist/services/git/namespace.d.mts +4 -4
- package/dist/services/git/schemas.d.mts +3 -3
- package/dist/services/harness/index.d.mts +1 -1
- package/dist/services/harness/index.mjs +1 -1
- package/dist/services/index.d.mts +87 -18
- package/dist/services/index.mjs +1 -1
- package/dist/services/log-import/browser.d.mts +2 -2
- package/dist/services/log-import/index.d.mts +73 -6
- package/dist/services/log-import/index.mjs +2 -2
- package/dist/services/log-import/log-import.d.mts +1 -1
- package/dist/services/log-import/log-import.mjs +1 -1
- package/dist/services/log-import/namespace.d.mts +54 -0
- package/dist/services/log-import/namespace.mjs +1 -1
- package/dist/services/log-import/schemas.d.mts +44 -0
- package/dist/services/log-import/schemas.mjs +1 -1
- package/dist/services/session/handlers/index.d.mts +1 -1
- package/dist/services/session/handlers/index.mjs +1 -1
- package/dist/services/session/index.d.mts +9 -9
- package/dist/services/session/index.mjs +1 -1
- package/dist/services/session/messages/namespace.d.mts +1 -1
- package/dist/services/session/messages/namespace.mjs +1 -1
- package/dist/services/session/orchestrator-testing/index.d.mts +1 -1
- package/dist/services/session/orchestrator-testing/index.mjs +1 -1
- package/dist/services/session/session-events/namespace.d.mts +1 -1
- package/dist/services/session/session-events/namespace.mjs +1 -1
- package/dist/services/session/storage/namespace.d.mts +1 -1
- package/dist/services/session/storage/schema.d.mts +1 -1
- package/dist/services/session/storage/schema.mjs +1 -1
- package/dist/services/session/testing/index.mjs +9 -4
- package/dist/services/session/testing/orchestrator-shared.d.mts +1 -1
- package/dist/services/session/testing/orchestrator-shared.mjs +1 -1
- package/dist/services/session/turns/namespace.d.mts +1 -1
- package/dist/services/session/turns/namespace.mjs +1 -1
- package/dist/services/settings/namespace.d.mts +2 -2
- package/dist/services/subagent-template/index.d.mts +1 -1
- package/dist/services/subagent-template/schemas.d.mts +1 -1
- package/dist/services/tool-approval/index.mjs +1 -1
- package/dist/services/tools/index.mjs +1 -1
- package/dist/services/turn/index.d.mts +1 -1
- package/dist/services/turn/namespace.d.mts +1 -1
- package/dist/services/turn/schemas.d.mts +89 -0
- package/dist/services/turn/schemas.mjs +1 -1
- package/dist/session-CKWfn3oc.mjs +1 -0
- package/dist/session-DCbJwYEU.mjs +69 -0
- package/dist/storage/drizzle/index.d.mts +1 -1
- package/dist/storage/drizzle/index.mjs +1 -1
- package/dist/{tool-approval-service-DEQiipxj.mjs → tool-approval-service-MU_DmJsf.mjs} +1 -1
- package/dist/tools-BrNm-een.mjs +1 -0
- package/dist/{transition-DnXibkhX.d.mts → transition-Dq41YCkc.d.mts} +1 -1
- package/dist/{types-BslClRkH.d.mts → types-BMlzmWp6.d.mts} +11 -1
- package/dist/{types-Dur8EtpR.d.mts → types-C76EP81O.d.mts} +125 -82
- package/dist/ui-components/index.mjs +1 -1
- package/dist/{workflow-BqH6ar-D.mjs → workflow-C1z7I5CI.mjs} +1 -1
- package/dist/workflow-engine/index.d.mts +1 -1
- package/dist/workflow-engine/index.mjs +1 -1
- package/dist/workflow-engine/package.mjs +1 -1
- package/dist/workflow-engine/workflow-orchestrator.mjs +1 -1
- package/package.json +1 -1
- package/dist/adapter-DaQqmKOJ.mjs +0 -1
- package/dist/handlers-BAycjV02.mjs +0 -41
- package/dist/namespace-C-piH3w4.mjs +0 -1
- package/dist/orchestrator-shared-Cxk3x8Vs.mjs +0 -1
- package/dist/package-B1AXe-oz.mjs +0 -1
- package/dist/schema-D6WAI8OL.mjs +0 -1
- package/dist/schemas-ArqQTC0Q.mjs +0 -1
- package/dist/schemas-uID59wR8.mjs +0 -1
- package/dist/session-0nWT4st6.mjs +0 -39
- package/dist/session-DH-ja8Ka.mjs +0 -1
- 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};
|
package/dist/hooks/index.d.mts
CHANGED
|
@@ -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.
|
package/dist/hooks/index.mjs
CHANGED
|
@@ -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>;
|