@lunora/agent 1.0.0-alpha.120 → 1.0.0-alpha.122
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/component.mjs +2 -2
- package/dist/index.mjs +1 -1
- package/dist/packem_shared/{VoiceSessionDO-D238XrlM.mjs → VoiceSessionDO-Ci1gaR3m.mjs} +1 -1
- package/dist/packem_shared/agent-loop-ByRhLA54.mjs +3 -0
- package/dist/packem_shared/{compileAgentWorkflow-D_4LPcGV.mjs → compileAgentWorkflow-CzfL6bQS.mjs} +1 -1
- package/dist/packem_shared/{defineAgent-KgH-gwYg.mjs → defineAgent-C3FzOwlh.mjs} +1 -1
- package/dist/packem_shared/{runAgentLoop-Drn1NcCc.mjs → runAgentLoop--Ophyew8.mjs} +1 -1
- package/dist/packem_shared/{runVoiceTurn-BtcmyaBo.mjs → runVoiceTurn-B9WgyNaq.mjs} +1 -1
- package/dist/packem_shared/{voice-turn-BRj_it54.mjs → voice-turn-CYXdylKF.mjs} +1 -1
- package/package.json +1 -1
- package/dist/packem_shared/agent-loop-CE_Q6bk9.mjs +0 -3
package/dist/component.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{LunoraError as g}from"@lunora/errors";import{defineTable as v,initLunora as D,defineSchemaExtension as j}from"@lunora/server";import{v as e}from"@lunora/values";import{a as
|
|
2
|
-
`)}});return{agentEpisodeRecall:f(o),agentEpisodeUpsert:f(u)}},S="threads",$="messages",M="run_queue",p=`${k}_${S}`,K=`${k}_${$}`,E=`${k}_${M}`,N=5,te=780*60*1e3,ne=j(k,{tables:{[$]:v({content:e.string(),createdAt:e.number(),messageKey:e.string(),role:e.union(e.literal("user"),e.literal("assistant"),e.literal("tool"),e.literal("system")),seq:e.number(),status:e.optional(e.union(e.literal("awaiting_approval"),e.literal("approved"),e.literal("rejected"))),stepName:e.optional(e.string()),threadKey:e.string(),toolCallId:e.optional(e.string()),toolCalls:e.optional(e.array(e.object({id:e.string(),input:e.any(),name:e.string()}))),toolName:e.optional(e.string())}).index("byThread",["threadKey","seq"]).index("byMessageKey",["threadKey","messageKey"],{unique:!0}).public(),[S]:v({agent:e.string(),createdAt:e.number(),error:e.optional(e.string()),instanceId:e.optional(e.string()),key:e.string(),messageCount:e.number(),owner:e.optional(e.string()),state:e.optional(e.any()),status:e.union(e.literal("idle"),e.literal("running"),e.literal("error"),e.literal("cancelled"),e.literal("awaiting_input")),title:e.optional(e.string()),updatedAt:e.number(),usage:e.optional(e.object({inputTokens:e.optional(e.number()),outputTokens:e.optional(e.number()),totalTokens:e.optional(e.number())}))}).index("byKey",["key"],{unique:!0}).index("byAgent",["agent"]).index("byInstance",["instanceId"]).public(),[M]:v({agent:e.string(),enqueuedAt:e.number(),instanceId:e.string(),position:e.number(),threadKey:e.string()}).index("byThread",["threadKey","position"]).index("byThreadInstance",["threadKey","instanceId"],{unique:!0}).public(),...G,...W}}),{mutation:b,query:T}=D.dataModel().create(),ie=async(u,o,s)=>{if(o.instanceId===void 0)throw new g("CONFLICT",`@lunora/agent: thread "${o.key}" already has a run in flight (instance "${o.priorInstanceId}") — cannot queue a dispatch with no instance id`);const{instanceId:y}=o,w=await u.query(E).withIndex("byThreadInstance",h=>h.eq("threadKey",o.key).eq("instanceId",y)).first();if(w)return{outcome:"queued",position:w.position};const I=await u.query(E).withIndex("byThread",h=>h.eq("threadKey",o.key)).collect();if(I.length>=N)throw new g("CONFLICT",`@lunora/agent: thread "${o.key}" run queue is full (depth ${String(N)}) — rejecting instance "${y}"`);const m=(I.at(-1)?.position??-1)+1;return await u.insert(E,{agent:o.agent,enqueuedAt:s,instanceId:y,position:m,threadKey:o.key}),{outcome:"queued",position:m}},ae=async(u,o,s)=>{if(o.policy==="queue")return ie(u,{agent:o.agent,instanceId:o.instanceId,key:o.key,priorInstanceId:o.priorInstanceId},s);if(o.policy!=="replace")throw new g("CONFLICT",`@lunora/agent: thread "${o.key}" already has a run in flight (instance "${o.priorInstanceId}") — onConcurrentRun="${o.policy}"`);return await u.patch(o.existingId,{error:void 0,status:"running",updatedAt:s,...o.instanceId===void 0?{}:{instanceId:o.instanceId}}),{outcome:"replaced",priorInstanceId:o.priorInstanceId}},le=()=>{const u=b.input({agent:e.string(),initialState:e.optional(e.any()),instanceId:e.optional(e.string()),key:e.string(),onConcurrentRun:e.optional(e.union(e.literal("reject"),e.literal("queue"),e.literal("replace"))),owner:e.optional(e.string()),title:e.optional(e.string())}).mutation(async({args:t,ctx:n})=>{const a=Date.now(),i=await n.db.query(p).withIndex("byKey",r=>r.eq("key",t.key)).first();if(i){if(i.owner!==t.owner)throw new Error(`@lunora/agent: thread "${t.key}" belongs to another owner`);const r=i.instanceId,d=typeof i.updatedAt=="number"?i.updatedAt:0,c=i.status==="awaiting_input"?P:te;return!(a-d>c)&&(i.status==="running"||i.status==="awaiting_input")&&r!==void 0&&(t.instanceId===void 0||t.instanceId!==r)?ae(n.db,{agent:t.agent,existingId:i._id,instanceId:t.instanceId,key:t.key,policy:t.onConcurrentRun??"reject",priorInstanceId:r},a):(await n.db.patch(i._id,{error:void 0,status:"running",updatedAt:a,...t.instanceId===void 0?{}:{instanceId:t.instanceId}}),{outcome:"continued"})}return await n.db.insert(p,{agent:t.agent,createdAt:a,key:t.key,messageCount:0,status:"running",updatedAt:a,...F({instanceId:t.instanceId,owner:t.owner,state:t.initialState,title:t.title})}),{outcome:"created"}}),o=b.input({content:e.string(),messageKey:e.string(),role:e.union(e.literal("user"),e.literal("assistant"),e.literal("tool"),e.literal("system")),status:e.optional(e.union(e.literal("awaiting_approval"),e.literal("approved"),e.literal("rejected"))),stepName:e.optional(e.string()),threadKey:e.string(),toolCallId:e.optional(e.string()),toolCalls:e.optional(e.array(e.object({id:e.string(),input:e.any(),name:e.string()}))),toolName:e.optional(e.string())}).mutation(async({args:t,ctx:n})=>{const a=await n.db.query(K).withIndex("byMessageKey",c=>c.eq("threadKey",t.threadKey).eq("messageKey",t.messageKey)).first();if(a)return{seq:a.seq};const i=await n.db.query(p).withIndex("byKey",c=>c.eq("key",t.threadKey)).first();if(!i)throw new Error(`@lunora/agent: cannot append to unknown thread "${t.threadKey}" — run agentEnsureThread first`);const r=i.messageCount,d=Date.now();return await n.db.insert(K,{content:t.content,createdAt:d,messageKey:t.messageKey,role:t.role,seq:r,threadKey:t.threadKey,...t.status===void 0?{}:{status:t.status},...t.stepName===void 0?{}:{stepName:t.stepName},...t.toolCallId===void 0?{}:{toolCallId:t.toolCallId},...t.toolCalls===void 0?{}:{toolCalls:t.toolCalls},...t.toolName===void 0?{}:{toolName:t.toolName}}),await n.db.patch(i._id,{messageCount:r+1,updatedAt:d}),{seq:r}}),s=b.input({messageKey:e.string(),threadKey:e.string()}).mutation(async({args:t,ctx:n})=>{const a=await n.db.query(K).withIndex("byMessageKey",i=>i.eq("threadKey",t.threadKey).eq("messageKey",t.messageKey)).first();a&&await n.db.delete(a._id)}),y=b.input({error:e.optional(e.string()),instanceId:e.optional(e.string()),key:e.optional(e.string()),status:e.optional(e.union(e.literal("idle"),e.literal("running"),e.literal("error"),e.literal("cancelled"),e.literal("awaiting_input"))),title:e.optional(e.string()),usage:e.optional(e.object({inputTokens:e.optional(e.number()),outputTokens:e.optional(e.number()),totalTokens:e.optional(e.number())}))}).mutation(async({args:t,ctx:n})=>{const{instanceId:a,key:i}=t;let r;i!==void 0?r=await n.db.query(p).withIndex("byKey",d=>d.eq("key",i)).first():a!==void 0&&(r=await n.db.query(p).withIndex("byInstance",d=>d.eq("instanceId",a)).first()),r&&await n.db.patch(r._id,{updatedAt:Date.now(),...t.error===void 0?{}:{error:t.error},...t.status===void 0?{}:{status:t.status},...t.title===void 0?{}:{title:t.title},...t.usage===void 0?{}:{usage:t.usage}})}),w=b.input({error:e.optional(e.string()),instanceId:e.string(),key:e.string(),status:e.union(e.literal("idle"),e.literal("error"),e.literal("cancelled")),usage:e.optional(e.object({inputTokens:e.optional(e.number()),outputTokens:e.optional(e.number()),totalTokens:e.optional(e.number())}))}).mutation(async({args:t,ctx:n})=>{const a=Date.now(),i=await n.db.query(p).withIndex("byKey",l=>l.eq("key",t.key)).first();if(i?.instanceId!==t.instanceId){const l=await n.db.query(E).withIndex("byThreadInstance",q=>q.eq("threadKey",t.key).eq("instanceId",t.instanceId)).first();return l&&await n.db.delete(l._id),{}}const d=(await n.db.query(E).withIndex("byThread",l=>l.eq("threadKey",t.key)).collect())[0];if(!d)return await n.db.patch(i._id,{status:t.status,updatedAt:a,...t.error===void 0?{}:{error:t.error},...t.usage===void 0?{}:{usage:t.usage}}),{};const c=d.instanceId;return await n.db.delete(d._id),await n.db.patch(i._id,{instanceId:c,status:"running",updatedAt:a,...t.error===void 0?{}:{error:t.error},...t.usage===void 0?{}:{usage:t.usage}}),{dequeued:c}}),I=b.input({key:e.string(),state:e.any()}).mutation(async({args:t,ctx:n})=>{const a=await n.db.query(p).withIndex("byKey",i=>i.eq("key",t.key)).first();a&&await n.db.patch(a._id,{state:t.state,updatedAt:Date.now()})}),m=(t,n)=>{if(!t)return;const{owner:a}=t;if(!(a!==void 0&&a!==(n.userId??void 0)))return t},h=T.input({key:e.string()}).query(async({args:t,ctx:n})=>{const a=await n.db.query(p).withIndex("byKey",i=>i.eq("key",t.key)).first();return m(a,n.auth)}),O=T.input({key:e.string()}).query(async({args:t,ctx:n})=>{const a=await n.db.query(p).withIndex("byKey",i=>i.eq("key",t.key)).first();return m(a,n.auth)?.state}),L=T.input({key:e.string(),limit:e.optional(e.number())}).query(async({args:t,ctx:n})=>{const a=await n.db.query(p).withIndex("byKey",i=>i.eq("key",t.key)).first();return m(a,n.auth)===void 0?[]:t.limit!==void 0?(await n.db.query(K).withIndex("byThread",r=>r.eq("threadKey",t.key)).order("desc").take(t.limit)).toReversed():n.db.query(K).withIndex("byThread",i=>i.eq("threadKey",t.key)).collect()}),U=b.input({decision:e.union(e.literal("approve"),e.literal("reject")),instanceId:e.string(),note:e.optional(e.string()),threadKey:e.string(),toolCallId:e.string()}).mutation(async({args:t,ctx:n})=>{const a=await n.db.query(p).withIndex("byKey",l=>l.eq("key",t.threadKey)).first(),i=m(a,n.auth);if(i===void 0)throw new g("FORBIDDEN",`@lunora/agent: not allowed to resolve approvals on thread "${t.threadKey}"`);if(i.instanceId!==t.instanceId)throw new g("FORBIDDEN",`@lunora/agent: instance "${t.instanceId}" does not own thread "${t.threadKey}"`);const r=i.agent,{agents:d}=n,c=d?.[r];if(typeof c?.sendEvent!="function")throw new g("INTERNAL",`@lunora/agent: no ctx.agents["${r}"] producer to resolve the approval — run codegen/dev so the agent binding is wired`);return await c.sendEvent(t.instanceId,{payload:{decision:t.decision,toolCallId:t.toolCallId,...t.note===void 0?{}:{note:t.note}},type:`agent-approval:${t.toolCallId}`}),{resolved:!0}}),B=b.input({agent:e.string(),input:e.string(),threadKey:e.string(),title:e.optional(e.string())}).mutation(async({args:t,ctx:n})=>{const{agents:a}=n,i=a?.[t.agent];if(typeof i?.run!="function")throw new g("INTERNAL",`@lunora/agent: no ctx.agents["${t.agent}"] producer to start a run — run codegen/dev so the agent binding is wired, and check the agent name`);if(i.publicRun!==!0)throw new g("FORBIDDEN",`@lunora/agent: agent "${t.agent}" is not enabled for public runs — set defineAgent({ publicRun: true }) to allow an external client (e.g. the @lunora/mcp server) to start it`);const r=n.auth.userId??void 0,d=await n.db.query(p).withIndex("byKey",l=>l.eq("key",t.threadKey)).first();if(d){const l=d.status,q=d.instanceId,_=d.owner;if((l==="running"||l==="awaiting_input")&&q!==void 0&&(_===void 0||_===r))return{id:q,threadKey:t.threadKey};if(_!==r)throw new g("FORBIDDEN",`@lunora/agent: thread "${t.threadKey}" belongs to another owner`)}const{id:c}=await i.run({input:t.input,threadKey:t.threadKey,...r===void 0?{}:{owner:r},...t.title===void 0?{}:{title:t.title}});return{id:c,threadKey:t.threadKey}}),C=H(),R=ee();return{extension:ne,functions:{agentAppendMessage:f(o),agentCompleteRun:f(w),agentEnsureThread:f(u),agentEpisodeRecall:R.agentEpisodeRecall,agentEpisodeUpsert:R.agentEpisodeUpsert,agentGraphTraverse:C.agentGraphTraverse,agentGraphUpsert:C.agentGraphUpsert,agentMessages:L,agentDeleteMessage:f(s),agentPatchThread:f(y),agentResolveApproval:U,agentRun:B,agentSetState:f(I),agentState:O,agentThread:h}}};export{le as agentComponent,ne as agentExtension,pe as normalizeEntityName,we as sandboxComponent};
|
|
1
|
+
import{LunoraError as g}from"@lunora/errors";import{defineTable as v,initLunora as D,defineSchemaExtension as j}from"@lunora/server";import{v as e}from"@lunora/values";import{a as q,A as _,b as P,d as F}from"./packem_shared/component-shared-G8ngerkU.mjs";import{graphTables as G,graphComponent as H}from"./packem_shared/normalizeEntityName-k3fjicAG.mjs";import{normalizeEntityName as pe}from"./packem_shared/normalizeEntityName-k3fjicAG.mjs";import{sandboxComponent as we}from"./packem_shared/sandboxComponent-BtOkUYpY.mjs";const k="agent_episodes",X=5,Q=20,Y=500,x=200,z=/\s+/gu,V=u=>u===void 0||!Number.isFinite(u)?X:Math.min(Q,Math.max(1,Math.trunc(u))),W={episodes:v({createdAt:e.number(),messageKey:e.string(),owner:e.string(),summary:e.string(),threadKey:e.optional(e.string())}).index("byOwnerCreatedAt",["owner","createdAt"]).index("byOwnerMessageKey",["owner","messageKey"],{unique:!0}).public()},{mutation:J,query:Z}=D.dataModel().create(),ee=()=>{const u=J.input({createdAt:e.optional(e.number()),messageKey:e.string(),owner:e.string(),summary:e.string(),threadKey:e.optional(e.string())}).mutation(async({args:s,ctx:c})=>{const h=s.summary.replaceAll(z," ").trim().slice(0,Y);if(h.length===0)return{recorded:!1};if(await c.db.query(k).withIndex("byOwnerMessageKey",p=>p.eq("owner",s.owner).eq("messageKey",s.messageKey)).first())return{recorded:!1};await c.db.insert(k,{createdAt:s.createdAt??Date.now(),messageKey:s.messageKey,owner:s.owner,summary:h,...s.threadKey===void 0?{}:{threadKey:s.threadKey}});const w=await c.db.query(k).withIndex("byOwnerCreatedAt",p=>p.eq("owner",s.owner)).order("asc").take(x+1);for(const p of w.slice(0,Math.max(0,w.length-x)))await c.db.delete(p._id);return{recorded:!0}}),o=Z.input({limit:e.optional(e.number()),owner:e.string()}).query(async({args:s,ctx:c})=>{const h=await c.db.query(k).withIndex("byOwnerCreatedAt",b=>b.eq("owner",s.owner)).order("desc").take(V(s.limit));return h.length===0?{context:""}:{context:h.toReversed().map(b=>`- ${b.summary}`).join(`
|
|
2
|
+
`)}});return{agentEpisodeRecall:q(o),agentEpisodeUpsert:q(u)}},S="threads",$="messages",M="run_queue",y=`${_}_${S}`,E=`${_}_${$}`,A=`${_}_${M}`,N=5,te=780*60*1e3,ne=j(_,{tables:{[$]:v({content:e.string(),createdAt:e.number(),messageKey:e.string(),role:e.union(e.literal("user"),e.literal("assistant"),e.literal("tool"),e.literal("system")),seq:e.number(),status:e.optional(e.union(e.literal("awaiting_approval"),e.literal("approved"),e.literal("rejected"))),stepName:e.optional(e.string()),threadKey:e.string(),toolCallId:e.optional(e.string()),toolCalls:e.optional(e.array(e.object({id:e.string(),input:e.any(),name:e.string()}))),toolName:e.optional(e.string())}).index("byThread",["threadKey","seq"]).index("byMessageKey",["threadKey","messageKey"],{unique:!0}).public(),[S]:v({agent:e.string(),createdAt:e.number(),error:e.optional(e.string().nullable()),completedInstanceId:e.optional(e.string()),instanceId:e.optional(e.string()),key:e.string(),messageCount:e.number(),owner:e.optional(e.string()),state:e.optional(e.any()),status:e.union(e.literal("idle"),e.literal("running"),e.literal("error"),e.literal("cancelled"),e.literal("awaiting_input")),title:e.optional(e.string()),updatedAt:e.number(),usage:e.optional(e.object({inputTokens:e.optional(e.number()),outputTokens:e.optional(e.number()),totalTokens:e.optional(e.number())}))}).index("byKey",["key"],{unique:!0}).index("byAgent",["agent"]).index("byInstance",["instanceId"]).public(),[M]:v({agent:e.string(),enqueuedAt:e.number(),instanceId:e.string(),position:e.number(),threadKey:e.string()}).index("byThread",["threadKey","position"]).index("byThreadInstance",["threadKey","instanceId"],{unique:!0}).public(),...G,...W}}),{mutation:f,query:T}=D.dataModel().create(),ie=async(u,o,s)=>{if(o.instanceId===void 0)throw new g("CONFLICT",`@lunora/agent: thread "${o.key}" already has a run in flight (instance "${o.priorInstanceId}") — cannot queue a dispatch with no instance id`);const{instanceId:c}=o,h=await u.query(A).withIndex("byThreadInstance",p=>p.eq("threadKey",o.key).eq("instanceId",c)).first();if(h)return{outcome:"queued",position:h.position};const b=await u.query(A).withIndex("byThread",p=>p.eq("threadKey",o.key)).collect();if(b.length>=N)throw new g("CONFLICT",`@lunora/agent: thread "${o.key}" run queue is full (depth ${String(N)}) — rejecting instance "${c}"`);const w=(b.at(-1)?.position??-1)+1;return await u.insert(A,{agent:o.agent,enqueuedAt:s,instanceId:c,position:w,threadKey:o.key}),{outcome:"queued",position:w}},ae=async(u,o,s)=>{if(o.policy==="queue")return ie(u,{agent:o.agent,instanceId:o.instanceId,key:o.key,priorInstanceId:o.priorInstanceId},s);if(o.policy!=="replace")throw new g("CONFLICT",`@lunora/agent: thread "${o.key}" already has a run in flight (instance "${o.priorInstanceId}") — onConcurrentRun="${o.policy}"`);return await u.patch(o.existingId,{error:null,status:"running",updatedAt:s,...o.instanceId===void 0?{}:{instanceId:o.instanceId}}),{outcome:"replaced",priorInstanceId:o.priorInstanceId}},le=()=>{const u=f.input({agent:e.string(),initialState:e.optional(e.any()),instanceId:e.optional(e.string()),key:e.string(),onConcurrentRun:e.optional(e.union(e.literal("reject"),e.literal("queue"),e.literal("replace"))),owner:e.optional(e.string()),title:e.optional(e.string())}).mutation(async({args:t,ctx:n})=>{const a=Date.now(),i=await n.db.query(y).withIndex("byKey",r=>r.eq("key",t.key)).first();if(i){if(i.owner!==t.owner)throw new Error(`@lunora/agent: thread "${t.key}" belongs to another owner`);const r=i.instanceId,d=typeof i.updatedAt=="number"?i.updatedAt:0,l=i.status==="awaiting_input"?P:te;return!(a-d>l)&&(i.status==="running"||i.status==="awaiting_input")&&r!==void 0&&(t.instanceId===void 0||t.instanceId!==r)?ae(n.db,{agent:t.agent,existingId:i._id,instanceId:t.instanceId,key:t.key,policy:t.onConcurrentRun??"reject",priorInstanceId:r},a):(await n.db.patch(i._id,{error:null,status:"running",updatedAt:a,...t.instanceId===void 0?{}:{instanceId:t.instanceId}}),{outcome:"continued"})}return await n.db.insert(y,{agent:t.agent,createdAt:a,key:t.key,messageCount:0,status:"running",updatedAt:a,...F({instanceId:t.instanceId,owner:t.owner,state:t.initialState,title:t.title})}),{outcome:"created"}}),o=f.input({content:e.string(),messageKey:e.string(),role:e.union(e.literal("user"),e.literal("assistant"),e.literal("tool"),e.literal("system")),status:e.optional(e.union(e.literal("awaiting_approval"),e.literal("approved"),e.literal("rejected"))),stepName:e.optional(e.string()),threadKey:e.string(),toolCallId:e.optional(e.string()),toolCalls:e.optional(e.array(e.object({id:e.string(),input:e.any(),name:e.string()}))),toolName:e.optional(e.string())}).mutation(async({args:t,ctx:n})=>{const a=await n.db.query(E).withIndex("byMessageKey",l=>l.eq("threadKey",t.threadKey).eq("messageKey",t.messageKey)).first();if(a)return{seq:a.seq};const i=await n.db.query(y).withIndex("byKey",l=>l.eq("key",t.threadKey)).first();if(!i)throw new Error(`@lunora/agent: cannot append to unknown thread "${t.threadKey}" — run agentEnsureThread first`);const r=i.messageCount,d=Date.now();return await n.db.insert(E,{content:t.content,createdAt:d,messageKey:t.messageKey,role:t.role,seq:r,threadKey:t.threadKey,...t.status===void 0?{}:{status:t.status},...t.stepName===void 0?{}:{stepName:t.stepName},...t.toolCallId===void 0?{}:{toolCallId:t.toolCallId},...t.toolCalls===void 0?{}:{toolCalls:t.toolCalls},...t.toolName===void 0?{}:{toolName:t.toolName}}),await n.db.patch(i._id,{messageCount:r+1,updatedAt:d}),{seq:r}}),s=f.input({messageKey:e.string(),threadKey:e.string()}).mutation(async({args:t,ctx:n})=>{const a=await n.db.query(E).withIndex("byMessageKey",i=>i.eq("threadKey",t.threadKey).eq("messageKey",t.messageKey)).first();a&&await n.db.delete(a._id)}),c=f.input({error:e.optional(e.string()),instanceId:e.optional(e.string()),key:e.optional(e.string()),status:e.optional(e.union(e.literal("idle"),e.literal("running"),e.literal("error"),e.literal("cancelled"),e.literal("awaiting_input"))),title:e.optional(e.string()),usage:e.optional(e.object({inputTokens:e.optional(e.number()),outputTokens:e.optional(e.number()),totalTokens:e.optional(e.number())}))}).mutation(async({args:t,ctx:n})=>{const{instanceId:a,key:i}=t;let r;i!==void 0?r=await n.db.query(y).withIndex("byKey",d=>d.eq("key",i)).first():a!==void 0&&(r=await n.db.query(y).withIndex("byInstance",d=>d.eq("instanceId",a)).first()),r&&await n.db.patch(r._id,{updatedAt:Date.now(),...t.error===void 0?{}:{error:t.error},...t.status===void 0?{}:{status:t.status},...t.title===void 0?{}:{title:t.title},...t.usage===void 0?{}:{usage:t.usage}})}),h=f.input({error:e.optional(e.string()),instanceId:e.string(),key:e.string(),status:e.union(e.literal("idle"),e.literal("error"),e.literal("cancelled")),usage:e.optional(e.object({inputTokens:e.optional(e.number()),outputTokens:e.optional(e.number()),totalTokens:e.optional(e.number())}))}).mutation(async({args:t,ctx:n})=>{const a=Date.now(),i=await n.db.query(y).withIndex("byKey",I=>I.eq("key",t.key)).first();if(i?.instanceId!==t.instanceId){const I=await n.db.query(A).withIndex("byThreadInstance",K=>K.eq("threadKey",t.key).eq("instanceId",t.instanceId)).first();return I&&await n.db.delete(I._id),{}}const l=(i.completedInstanceId===t.instanceId?[]:await n.db.query(A).withIndex("byThread",I=>I.eq("threadKey",t.key)).collect())[0];if(!l)return await n.db.patch(i._id,{completedInstanceId:t.instanceId,status:t.status,updatedAt:a,...t.error===void 0?{}:{error:t.error},...t.usage===void 0?{}:{usage:t.usage}}),{};const m=l.instanceId;return await n.db.delete(l._id),await n.db.patch(i._id,{instanceId:m,status:"running",updatedAt:a,...t.error===void 0?{}:{error:t.error},...t.usage===void 0?{}:{usage:t.usage}}),{dequeued:m}}),b=f.input({key:e.string(),state:e.any()}).mutation(async({args:t,ctx:n})=>{const a=await n.db.query(y).withIndex("byKey",i=>i.eq("key",t.key)).first();a&&await n.db.patch(a._id,{state:t.state,updatedAt:Date.now()})}),w=(t,n)=>{if(!t)return;const{owner:a}=t;if(!(a!==void 0&&a!==(n.userId??void 0)))return t},p=T.input({key:e.string()}).query(async({args:t,ctx:n})=>{const a=await n.db.query(y).withIndex("byKey",i=>i.eq("key",t.key)).first();return w(a,n.auth)}),O=T.input({key:e.string()}).query(async({args:t,ctx:n})=>{const a=await n.db.query(y).withIndex("byKey",i=>i.eq("key",t.key)).first();return w(a,n.auth)?.state}),L=T.input({key:e.string(),limit:e.optional(e.number())}).query(async({args:t,ctx:n})=>{const a=await n.db.query(y).withIndex("byKey",i=>i.eq("key",t.key)).first();return w(a,n.auth)===void 0?[]:t.limit!==void 0?(await n.db.query(E).withIndex("byThread",r=>r.eq("threadKey",t.key)).order("desc").take(t.limit)).toReversed():n.db.query(E).withIndex("byThread",i=>i.eq("threadKey",t.key)).collect()}),U=f.input({decision:e.union(e.literal("approve"),e.literal("reject")),instanceId:e.string(),note:e.optional(e.string()),threadKey:e.string(),toolCallId:e.string()}).mutation(async({args:t,ctx:n})=>{const a=await n.db.query(y).withIndex("byKey",m=>m.eq("key",t.threadKey)).first(),i=w(a,n.auth);if(i===void 0)throw new g("FORBIDDEN",`@lunora/agent: not allowed to resolve approvals on thread "${t.threadKey}"`);if(i.instanceId!==t.instanceId)throw new g("FORBIDDEN",`@lunora/agent: instance "${t.instanceId}" does not own thread "${t.threadKey}"`);const r=i.agent,{agents:d}=n,l=d?.[r];if(typeof l?.sendEvent!="function")throw new g("INTERNAL",`@lunora/agent: no ctx.agents["${r}"] producer to resolve the approval — run codegen/dev so the agent binding is wired`);return await l.sendEvent(t.instanceId,{payload:{decision:t.decision,toolCallId:t.toolCallId,...t.note===void 0?{}:{note:t.note}},type:`agent-approval:${t.toolCallId}`}),{resolved:!0}}),B=f.input({agent:e.string(),input:e.string(),threadKey:e.string(),title:e.optional(e.string())}).mutation(async({args:t,ctx:n})=>{const{agents:a}=n,i=a?.[t.agent];if(typeof i?.run!="function")throw new g("INTERNAL",`@lunora/agent: no ctx.agents["${t.agent}"] producer to start a run — run codegen/dev so the agent binding is wired, and check the agent name`);if(i.publicRun!==!0)throw new g("FORBIDDEN",`@lunora/agent: agent "${t.agent}" is not enabled for public runs — set defineAgent({ publicRun: true }) to allow an external client (e.g. the @lunora/mcp server) to start it`);const r=n.auth.userId??void 0,d=await n.db.query(y).withIndex("byKey",m=>m.eq("key",t.threadKey)).first();if(d){const m=d.status,I=d.instanceId,K=d.owner;if((m==="running"||m==="awaiting_input")&&I!==void 0&&(K===void 0||K===r))return{id:I,threadKey:t.threadKey};if(K!==r)throw new g("FORBIDDEN",`@lunora/agent: thread "${t.threadKey}" belongs to another owner`)}const{id:l}=await i.run({input:t.input,threadKey:t.threadKey,...r===void 0?{}:{owner:r},...t.title===void 0?{}:{title:t.title}});return{id:l,threadKey:t.threadKey}}),C=H(),R=ee();return{extension:ne,functions:{agentAppendMessage:q(o),agentCompleteRun:q(h),agentEnsureThread:q(u),agentEpisodeRecall:R.agentEpisodeRecall,agentEpisodeUpsert:R.agentEpisodeUpsert,agentGraphTraverse:C.agentGraphTraverse,agentGraphUpsert:C.agentGraphUpsert,agentMessages:L,agentDeleteMessage:q(s),agentPatchThread:q(c),agentResolveApproval:U,agentRun:B,agentSetState:q(b),agentState:O,agentThread:p}}};export{le as agentComponent,ne as agentExtension,pe as normalizeEntityName,we as sandboxComponent};
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as t,s as r}from"./packem_shared/agent-loop-
|
|
1
|
+
import{r as t,s as r}from"./packem_shared/agent-loop-ByRhLA54.mjs";import{collectAgenticMemoryTools as a,toSearchResults as i}from"./packem_shared/collectAgenticMemoryTools-BeMWT2qt.mjs";import{agentAsTool as l}from"./packem_shared/agentAsTool-CgZb6ycK.mjs";import{codeTool as m}from"./packem_shared/codeTool-BQb-K3my.mjs";import{agentComponent as c,agentExtension as x}from"./component.mjs";import{default as A}from"./packem_shared/createAgentContext-BvU9LP43.mjs";import{defineAgent as d,defineAgentTool as u,isAgentDefinition as N}from"./packem_shared/defineAgent-C3FzOwlh.mjs";import{functionTool as D}from"./packem_shared/functionTool-D3CP4f8-.mjs";import{createAgentGenerate as M,createEpisodeExtract as O,createGraphExtract as _,createStreamGenerate as C,resolveAgentModel as G}from"./packem_shared/createAgentGenerate-BOILDUZj.mjs";import{adaptMcpResult as F,mcpTools as L}from"./packem_shared/adaptMcpResult-CVlq-_TO.mjs";import{buildModelMessages as k}from"./packem_shared/buildModelMessages-Y4tGo1T9.mjs";import{agentBindingName as R,agentClassName as V,agentDefaultName as b,voiceBindingName as h,voiceClassName as w}from"./naming.mjs";import{AGENT_MODULE as I,DEFAULT_AGENT_FUNCTION_PATHS as P,SANDBOX_INVOKE_PATH as X,SANDBOX_MODULE as y,toFunctionReference as K}from"./packem_shared/AGENT_MODULE-M4D1EejI.mjs";import{browserTool as j,containerTool as q,fsTool as z}from"./sandbox.mjs";import{defineSkill as Q,isSkillDefinition as Y}from"./packem_shared/defineSkill-DGGvDWNq.mjs";import{default as $}from"./packem_shared/VoiceSessionDO-Ci1gaR3m.mjs";import{r as oe}from"./packem_shared/voice-turn-CYXdylKF.mjs";import{default as re}from"./packem_shared/compileAgentWorkflow-CzfL6bQS.mjs";export{I as AGENT_MODULE,P as DEFAULT_AGENT_FUNCTION_PATHS,X as SANDBOX_INVOKE_PATH,y as SANDBOX_MODULE,$ as VoiceSessionDO,F as adaptMcpResult,l as agentAsTool,R as agentBindingName,V as agentClassName,c as agentComponent,b as agentDefaultName,x as agentExtension,j as browserTool,k as buildModelMessages,m as codeTool,a as collectAgenticMemoryTools,re as compileAgentWorkflow,q as containerTool,A as createAgentContext,M as createAgentGenerate,O as createEpisodeExtract,_ as createGraphExtract,C as createStreamGenerate,d as defineAgent,u as defineAgentTool,Q as defineSkill,z as fsTool,D as functionTool,N as isAgentDefinition,Y as isSkillDefinition,L as mcpTools,G as resolveAgentModel,t as runAgentLoop,oe as runVoiceTurn,r as splitForCompaction,K as toFunctionReference,i as toSearchResults,h as voiceBindingName,w as voiceClassName};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createAi as A}from"@lunora/ai";import{t as b}from"./createDispatchRunner-BxtGxAQi-DXXP7SxZ.mjs";import{t as x}from"./base64-5eyBfWO3.mjs";import{p as T,d as _,a as v,i as p,b as y,c as E,e as k,f as M,r as w,t as I}from"./voice-turn-
|
|
1
|
+
import{createAi as A}from"@lunora/ai";import{t as b}from"./createDispatchRunner-BxtGxAQi-DXXP7SxZ.mjs";import{t as x}from"./base64-5eyBfWO3.mjs";import{p as T,d as _,a as v,i as p,b as y,c as E,e as k,f as M,r as w,t as I}from"./voice-turn-CYXdylKF.mjs";import{createStreamGenerate as C,createCompact as R}from"./createAgentGenerate-BOILDUZj.mjs";import{DEFAULT_AGENT_FUNCTION_PATHS as L,toFunctionReference as m}from"./AGENT_MODULE-M4D1EejI.mjs";const N="@cf/openai/whisper-large-v3-turbo",O="@cf/deepgram/aura-1",U=8*1024*1024,B=100,f=4e3,g=f*4+1024,F=4002,D=4003,z=4004,W=256*1024,S=15,G=5e3,X=h=>{if(h===null||typeof h!="object")return!1;const{text:t,type:e}=h;return e==="commit"||e==="interrupt"||e==="text"&&typeof t=="string"};class Y{agent;ai;env;exportName;paths;streamGenerate;sttModel;ttsModel;maxSessionTurns;audioBuffers=new Map;bufferedBytes=new Map;controllers=new Map;state;constructor(t,e,r,s){this.state=t,this.env=e,this.agent=r,this.exportName=s,this.paths=L,this.ai=A({binding:e.AI,env:e}),this.streamGenerate=C(r,e),this.sttModel=r.voice?.stt??N,this.ttsModel=r.voice?.tts??O,this.maxSessionTurns=r.voice?.maxTurns??B}fetch(t){if(t.headers.get("Upgrade")!=="websocket")return new Response("Expected a WebSocket upgrade",{status:426});const r=new URL(t.url).searchParams.get("threadKey");if(!r)return new Response("Missing threadKey",{status:400});const s=globalThis.WebSocketPair,i=new s,n=i[0],o=i[1];this.state.acceptWebSocket(o);const c=crypto.randomUUID(),d=T(t.headers.get("x-lunora-identity")),a=_(t.headers.get("x-lunora-userid")),u=v(t.headers.get("x-lunora-identity-exp"));if(p(u))return y(o),new Response(null,{status:101,webSocket:n});o.serializeAttachment?.({connectionId:c,threadKey:r,turn:0,...u===void 0?{}:{expiresAt:u},...d===void 0?{}:{identity:d},...a===void 0?{}:{userId:a}}),this.send(o,{audioFormat:this.agent.voice?.audioFormat??"mp3",type:"ready"});const l=this.agent.voice?.greeting;return l&&l.length>0&&this.state.waitUntil?.(this.speakGreeting(o,c,r,a,d,l)),new Response(null,{status:101,webSocket:n})}async webSocketMessage(t,e){const r=t.deserializeAttachment?.();if(r){if(p(r.expiresAt)){y(t);return}try{if(typeof e=="string"){await this.handleControl(t,r,e);return}this.bufferAudio(r.connectionId,new Uint8Array(e),t)}catch(s){this.send(t,{message:s instanceof Error?s.message:String(s),type:"error"})}}}webSocketClose(t){this.cleanupSocket(t)}webSocketError(t){this.cleanupSocket(t)}resolveRun(t,e){const r=t===void 0&&e===void 0?void 0:{...e===void 0?{}:{claims:e},...t===void 0?{}:{userId:t}};return b({env:this.env,label:"@lunora/agent voice",...r===void 0?{}:{identity:r}})}async transcribe(t){const e=E(t);return k(await this.ai.run(this.sttModel,{audio:x(e)}))}async synthesize(t,e){const r=this.agent.voice?.speaker;return M(await this.ai.run(this.ttsModel,{text:t,...r===void 0?{}:{speaker:r}},e===void 0?void 0:{signal:e}))}async handleControl(t,e,r){if(r.length>g){this.send(t,{message:`control frame exceeds the maximum of ${String(g)} characters`,type:"error"}),this.closeSocket(t,z,"control_frame_limit");return}let s;try{s=JSON.parse(r)}catch{return}if(!X(s)){this.send(t,{message:'unsupported control frame — expected { type: "text", text }, { type: "commit" } or { type: "interrupt" }',type:"error"});return}const i=s;if(i.type==="interrupt"){this.controllers.get(e.connectionId)?.abort();return}if(i.type==="text"&&i.text.length>f){this.send(t,{message:`text frame exceeds the maximum of ${String(f)} characters`,type:"error"});return}if(e.turn>=this.maxSessionTurns){this.send(t,{message:`voice session reached its ${String(this.maxSessionTurns)}-turn limit — reconnect to continue`,type:"error"}),this.closeSocket(t,F,"turn_limit");return}if(this.controllers.has(e.connectionId)){i.type==="commit"&&this.drainAudio(e.connectionId),this.send(t,{message:"a turn is already in progress — send an interrupt before the next utterance",type:"error"});return}if(i.type==="commit"){const n=this.drainAudio(e.connectionId);await this.runTurn(t,e,{pcm:n});return}await this.runTurn(t,e,{text:i.text})}bufferAudio(t,e,r){const s=(this.bufferedBytes.get(t)??0)+e.byteLength;if(s>U){this.audioBuffers.delete(t),this.bufferedBytes.delete(t),this.send(r,{message:"utterance exceeded the maximum buffer — send a commit sooner",type:"error"}),this.closeSocket(r,D,"utterance_too_large");return}const i=this.audioBuffers.get(t)??[];i.push(e),this.audioBuffers.set(t,i),this.bufferedBytes.set(t,s)}drainAudio(t){const e=this.audioBuffers.get(t)??[];this.audioBuffers.delete(t),this.bufferedBytes.delete(t);const r=e.reduce((n,o)=>n+o.byteLength,0),s=new Uint8Array(r);let i=0;for(const n of e)s.set(n,i),i+=n.byteLength;return s}async runTurn(t,e,r){const s=new AbortController;this.controllers.set(e.connectionId,s);try{await w({agent:this.agent,compact:R(),connectionId:e.connectionId,env:this.env,exportName:this.exportName,paths:this.paths,run:this.resolveRun(e.userId,e.identity),send:i=>{this.send(t,i)},sendAudio:i=>{this.sendAudio(t,i)},signal:s.signal,streamGenerate:this.streamGenerate,synthesize:async(i,n)=>this.synthesizeWithSignal(i,n),threadKey:e.threadKey,transcribe:async i=>this.transcribe(i),turn:e.turn,waitForDrain:async()=>this.waitForSocketDrain(t),...e.userId===void 0?{}:{owner:e.userId},...r.pcm===void 0?{}:{pcm:r.pcm},...r.text===void 0?{}:{text:r.text}})}finally{this.controllers.get(e.connectionId)===s&&this.controllers.delete(e.connectionId),t.serializeAttachment?.({...e,turn:e.turn+1})}}async speakGreeting(t,e,r,s,i,n){const o=this.resolveRun(s,i),c=new AbortController,d=()=>c.signal.aborted;this.controllers.set(e,c);try{if((await o(m(this.paths.ensureThread),{agent:this.exportName,key:r,...this.agent.initialState===void 0?{}:{initialState:this.agent.initialState},...s===void 0?{}:{owner:s}}))?.outcome!=="created")return;for await(const u of I(await this.synthesizeWithSignal(n,c.signal))){if(d()||(await this.waitForSocketDrain(t),d()))break;this.sendAudio(t,u)}d()||(await o(m(this.paths.appendMessage),{content:n,messageKey:"voice:greeting:assistant",role:"assistant",threadKey:r}),this.send(t,{text:n,type:"assistant_done"}))}catch(a){this.send(t,{message:a instanceof Error?a.message:String(a),type:"error"})}finally{this.controllers.get(e)===c&&this.controllers.delete(e)}}async synthesizeWithSignal(t,e){return e.aborted?new Uint8Array(0):this.synthesize(t,e)}cleanupSocket(t){const e=t.deserializeAttachment?.();e&&(this.controllers.get(e.connectionId)?.abort(),this.controllers.delete(e.connectionId),this.audioBuffers.delete(e.connectionId),this.bufferedBytes.delete(e.connectionId))}closeSocket(t,e,r){try{t.close?.(e,r)}catch{}}send(t,e){try{t.send(JSON.stringify(e))}catch{}}sendAudio(t,e){try{t.send(e)}catch{}}async waitForSocketDrain(t){const e=t;let r=0;for(;typeof e.bufferedAmount=="number"&&e.bufferedAmount>W&&r<G;)await new Promise(s=>{setTimeout(s,S)}),r+=S}}export{Y as default};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{e as tt}from"./createDispatchRunner-BxtGxAQi-DXXP7SxZ.mjs";import{c as q,d as et}from"./component-shared-G8ngerkU.mjs";import{resolveAgentModel as ot}from"./createAgentGenerate-BOILDUZj.mjs";import{buildModelMessages as L}from"./buildModelMessages-Y4tGo1T9.mjs";import{agentBindingName as W}from"../naming.mjs";import{toFunctionReference as h}from"./AGENT_MODULE-M4D1EejI.mjs";import{i as nt}from"./positive-integer-ztHqqpBk.mjs";import{combineTelemetry as at}from"./combineTelemetry-DgE9W9G8.mjs";import{c as b}from"./tool-output-Cmk3JWMG.mjs";const st=e=>e.kind==="graph"||e.kind==="episodic"||e.mode!=="agentic",P=e=>e.memorySources?e.memorySources:e.memory&&st(e.memory)?[{key:"default",...e.memory}]:[],rt=e=>P(e).find(t=>t.kind==="graph"),it=e=>P(e).find(t=>t.kind==="episodic"),S=(e,t)=>t==="default"?e:`${e}:${t}`,ct=e=>{if(e===void 0||e.isEnabled===!1)return;const{integrations:t}=e;if(t===void 0)return;const n=Array.isArray(t)?t:[t];return n.length===0?void 0:at(...n)},ut=async(e,t,n)=>{const o=ct(e);if(o===void 0)return n();const a={dynamic:!0,input:t.input,toolCallId:t.id,toolName:t.name,type:"tool-call"},s={callId:t.id,messages:[],toolCall:a,toolContext:void 0},u=Date.now();await o.onToolExecutionStart?.(s);let d;const c=()=>(d??=n(),d);try{if(o.executeTool===void 0)await c();else try{await o.executeTool({...s,execute:c,toolCallId:t.id})}catch{}const i=await c();return await o.onToolExecutionEnd?.({...s,toolExecutionMs:Date.now()-u,toolOutput:{dynamic:!0,input:t.input,output:i,toolCallId:t.id,toolName:t.name,type:"tool-result"}}),i}catch(i){throw await o.onToolExecutionEnd?.({...s,toolExecutionMs:Date.now()-u,toolOutput:{dynamic:!0,error:i,input:t.input,toolCallId:t.id,toolName:t.name,type:"tool-error"}}),i}},dt=8,lt=e=>nt(e)?e:0,z=e=>e===void 0?"null":JSON.stringify(e),pt=async(e,t,n)=>{try{await e({error:t instanceof Error?t.message:String(t),status:"error",...n===void 0?{}:{usage:n}})}catch(o){t instanceof Error&&t.cause===void 0&&(t.cause=o)}},mt=e=>e===void 0?[]:[e].flat(),yt=async(e,t)=>(await Promise.all(e.map(async o=>o({steps:t})))).some(Boolean),ft=(e,t)=>{if(t===void 0)return e;if(e===void 0)return{...t};const n={};for(const o of["inputTokens","outputTokens","totalTokens"])(e[o]!==void 0||t[o]!==void 0)&&(n[o]=(e[o]??0)+(t[o]??0));return n},vt=async(e,t,n,o,a)=>{const{needsApproval:s}=e;return s===void 0||s===!1?!1:s===!0?!0:n.do(o,async()=>s(t,a))},ht="WorkflowTimeoutError",gt=e=>e instanceof Error&&e.name===ht,B=4320*60*1e3,wt={day:864e5,hour:36e5,minute:6e4,month:30*864e5,second:1e3,week:7*864e5,year:365*864e5},Tt=/^(\d+(?:\.\d+)?) (day|hour|minute|month|second|week|year)s?$/u,xt=e=>{if(e===void 0)return B;if(typeof e=="number")return Math.min(e,q);const t=Tt.exec(e);return t===null?B:Math.min(Number(t[1])*wt[t[2]],q)},Ct=async(e,t)=>{const{agent:n,deleteMessage:o,instanceId:a,patchThread:s,persist:u,step:d}=e;await u({content:`Awaiting approval to run tool "${t.name}".`,messageKey:`${a}:approval:${t.id}`,role:"tool",status:"awaiting_approval",toolCallId:t.id,toolName:t.name}),await s({status:"awaiting_input"});const c=await d.waitForEvent(`approval:${t.id}`,{timeout:xt(n.approvalTimeout),type:`agent-approval:${t.id}`}).then(i=>({decision:i.payload.decision,...i.payload.note===void 0?{}:{note:i.payload.note}})).catch(i=>{if(!gt(i))throw i;return{decision:"reject",note:"approval timed out"}});return await o(`${a}:approval:${t.id}`),await s({status:"running"}),c},A="lunoraToolOutcome",St=e=>typeof e=="object"&&e!==null&&A in e?e[A]:{ok:e},Et=async(e,t)=>{const{agent:n,depth:o,env:a,getState:s,instanceId:u,onTokenDelta:d,owner:c,persist:i,run:r,setState:l,step:p,threadKey:m,tools:w}=e,v=`tool:${t.name}:${t.id}`,T=w[t.name],y=`${u}:tool:${t.id}`;if(!T){await i({content:`Error: unknown tool "${t.name}"`,messageKey:y,role:"tool",stepName:v,toolCallId:t.id,toolName:t.name});return}if(t.invalid!==void 0){await i({content:`Error: invalid input for tool "${t.name}" — it was not run. ${t.invalid}`,messageKey:y,role:"tool",stepName:v,toolCallId:t.id,toolName:t.name});return}const M={depth:o,env:a,getState:s,idempotencyKey:v,owner:c,reportProgress:g=>{d?.({data:g,kind:"progress",threadKey:m,toolCallId:t.id})},run:r,setState:l,step:p,threadKey:m,toolCallId:t.id},O={depth:o,env:a,getState:s,idempotencyKey:v,run:r,threadKey:m,toolCallId:t.id},_=`tool:approval-gate:${t.id}`;let x;if(await vt(T,t.input,p,_,O)){const{decision:g,note:E}=await Ct(e,t);if(g==="reject"){const U=E===void 0?"":` Reason: ${E}`;await i({content:`Tool "${t.name}" was rejected by the user and not run.${U}`,messageKey:y,role:"tool",status:"rejected",stepName:v,toolCallId:t.id,toolName:t.name});return}x="approved"}const $=St(await p.do(v,async()=>{try{const g=()=>Promise.resolve(T.execute(t.input,M)),E=await ut(n.telemetry,{id:t.id,input:t.input,name:t.name},g);return{[A]:{ok:E}}}catch(g){if(tt(g))return{[A]:{failed:g.message}};throw g}}));if("failed"in $){await i({content:b(`Error: tool "${t.name}" failed and will not be retried. ${$.failed}`),messageKey:y,role:"tool",stepName:v,...x===void 0?{}:{status:x},toolCallId:t.id,toolName:t.name});return}const R=$.ok;await i({content:b(typeof R=="string"?R:z(R)),messageKey:y,role:"tool",stepName:v,...x===void 0?{}:{status:x},toolCallId:t.id,toolName:t.name})},kt=(e,t,n)=>{if(!t)return e;let{messages:o}=e;return t.messages!==void 0&&(o=t.messages),t.system!==void 0&&(o=[{content:t.system,role:"system"},...o]),{activeTools:t.activeTools??e.activeTools,messages:o,model:t.model===void 0?e.model:ot(t.model,n),toolChoice:t.toolChoice??e.toolChoice}},Mt=(e,t)=>{if(t===void 0||e.length<=t.maxMessages)return;const n=Math.max(1,t.keepRecent??Math.ceil(t.maxMessages/2));if(e.length<=n)return;let o=e.length-n;for(;o>0&&e[o]?.role==="tool";)o-=1;if(!(o<=0))return{older:e.slice(0,o),recent:e.slice(o)}},$t=async(e,t)=>{const{agent:n,compact:o,env:a}=e,s=Mt(t,n.compaction);if(s===void 0||o===void 0)return{history:t,summary:void 0};try{const u=await o({env:a,messages:L({history:s.older}),model:n.compaction?.model??n.model});return u.length>0?{history:s.recent,summary:u}:{history:t,summary:void 0}}catch{return{history:t,summary:void 0}}},Rt=async(e,t,n)=>{const{agent:o,env:a,generate:s,instructions:u,listMessages:d,memoryContext:c,onTokenDelta:i,run:r,step:l,streamGenerate:p,threadKey:m}=e;return l.do(`llm:turn:${String(t)}`,async()=>{const w=await r(d,{key:m}),{history:v,summary:T}=await $t(e,w);let y={activeTools:o.activeTools,messages:L({history:v,instructions:u,memoryContext:c,summary:T}),model:void 0,toolChoice:o.toolChoice};o.prepareStep&&(y=kt(y,await o.prepareStep({messages:y.messages,stepNumber:t,steps:n}),a));const k={messages:y.messages,...y.activeTools===void 0?{}:{activeTools:y.activeTools},...y.model===void 0?{}:{model:y.model},...y.toolChoice===void 0?{}:{toolChoice:y.toolChoice}};return p&&i?p(k,M=>{i({text:M,threadKey:m,turn:t})}):s(k)})},G=async(e,t)=>{const{agent:n,step:o}=e;n.onStepFinish&&await o.do(`agent:step-finish:${String(t.turn)}`,async()=>(await n.onStepFinish?.(t),!0))},It=e=>({text:e.text,toolCalls:e.toolCalls.map(t=>({input:t.input,toolCallId:t.id,toolName:t.name})),...e.usage===void 0?{}:{usage:e.usage}}),F=e=>{const t=e?.context;return typeof t=="string"&&t.length>0?t:void 0},Kt=e=>et({depth:e?.depth,fanOut:e?.fanOut,maxNodes:e?.maxNodes,maxSeeds:e?.maxSeeds}),Nt=async(e,t,n,o)=>{if(e.source===void 0)return;const a=h(e.source),{topK:s}=e,u=S("memory:retrieve",e.key),d=await n.do(u,async()=>o(a,{query:t,...s===void 0?{}:{topK:s}}));return F(d)},At=async(e,t,n,o,a,s)=>{if(n===void 0)return;const u=S("memory:traverse",e.key),d=await a.do(u,async()=>s(o,{owner:n,query:t,...Kt(e.graph)}));return F(d)},Ot=async(e,t,n,o,a)=>{if(t===void 0)return;const s=S("memory:recall",e.key),u={owner:t,...e.episodic?.recall===void 0?{}:{limit:e.episodic.recall}},d=await o.do(s,async()=>a(n,u));return F(d)},_t=async(e,t)=>e.kind==="episodic"?Ot(e,t.owner,t.episodeRecall,t.step,t.run):e.kind==="graph"?At(e,t.input,t.owner,t.graphTraverse,t.step,t.run):Nt(e,t.input,t.step,t.run),Ut=e=>{const t=e.findIndex(n=>n.kind==="episodic");return e.filter((n,o)=>n.kind!=="episodic"||o===t)},Dt=async(e,t,n,o,a,s)=>{const u=Ut(P(e));if(u.length===0)return;const d=h(o.graphTraverse),c=h(o.episodeRecall),i=[];for(const r of u){const l=await _t(r,{episodeRecall:c,graphTraverse:d,input:t,owner:n,run:s,step:a});l!==void 0&&i.push(l)}return i.length>0?i.join(`
|
|
2
|
+
|
|
3
|
+
`):void 0},Pt=async e=>{const{agent:t,env:n,extractGraph:o,finalText:a,input:s,instanceId:u,owner:d,paths:c,run:i,step:r}=e;if(o===void 0||d===void 0||a===void 0||a.length===0)return;const l=rt(t);if(l!==void 0)try{const p={assistantText:a,env:n,model:l.graph?.extractionModel??t.model,userInput:s},m=await r.do(S("memory:extract",l.key),async()=>o(p));await i(h(c.graphUpsert),{...m,messageKey:`${u}:${S("extract",l.key)}`,owner:d})}catch{}},Ft=async e=>{const{agent:t,env:n,extractEpisode:o,finalText:a,input:s,instanceId:u,owner:d,paths:c,run:i,step:r,threadKey:l}=e;if(o===void 0||d===void 0||a===void 0||a.length===0)return;const p=it(t);if(p!==void 0)try{const m={assistantText:a,env:n,model:p.episodic?.extractionModel??t.model,userInput:s},{summary:w}=await r.do(S("memory:episode",p.key),async()=>o(m));await i(h(c.episodeUpsert),{messageKey:`${u}:${S("episode",p.key)}`,owner:d,summary:w,threadKey:l})}catch{}},jt=async(e,t,n)=>{const o=e[W(t)];if(!(!o||typeof o.get!="function"))try{await(await o.get(n)).terminate()}catch{}},qt="12 hours",bt=async(e,t,n)=>{await e.waitForEvent(`dequeue:${n}`,{timeout:qt,type:`agent-dequeue:${t}:${n}`})},Bt=async(e,t,n)=>{const o=e.env[W(e.exportName)];if(!o||typeof o.get!="function")return;const a=o.get.bind(o);try{await e.step.do(`dequeue-wake:${n}`,async()=>(await(await a(n)).sendEvent({payload:{threadKey:t},type:`agent-dequeue:${t}:${n}`}),n))}catch{}},Gt=async(e,t,n)=>{const{onReply:o}=e,{replyRef:a}=t.params;if(!(o===void 0||a===void 0))try{await t.step.do("agent:reply",async()=>(await o({env:t.env,replyRef:a,result:n,threadKey:t.params.threadKey}),a.channel))}catch{}},Lt=async(e,t,n,o,a)=>{const{instanceId:s,persist:u}=e,d=n.usage===void 0?{}:{usage:n.usage};if(n.toolCalls.length===0){const c=n.output!==void 0&&n.text.length===0?z(n.output):n.text;return await u({content:c,messageKey:`${s}:assistant:${String(t)}`,role:"assistant"}),await G(e,{text:n.text,toolCalls:[],turn:t,...d}),{final:{stopped:"final",text:n.text,turns:t+1,...n.output===void 0?{}:{output:n.output}}}}await u({content:n.text,messageKey:`${s}:assistant:${String(t)}`,role:"assistant",toolCalls:n.toolCalls});for(const c of n.toolCalls)await Et(e,c);if(await G(e,{text:n.text,toolCalls:n.toolCalls,turn:t,...d}),o.push(It(n)),a.length>0&&await yt(a,o))return"stopCondition"},Wt=async(e,t,n,o)=>{const a=[];let s,u=!1,d=0;for(let c=0;c<t;c+=1){const i=await Rt(e,c,a);o.value=ft(o.value,i.usage),d=c+1;const r=await Lt(e,c,i,a,n);if(r==="stopCondition"){u=!0;break}if(r!==void 0){s=r.final;break}}return{final:s,stoppedByCondition:u,turnsRun:d}},ee=async e=>{const{agent:t,compact:n,env:o,exportName:a,extractEpisode:s,extractGraph:u,generate:d,instanceId:c,onTokenDelta:i,params:r,paths:l,run:p,step:m,streamGenerate:w}=e,v=t.maxTurns??dt,T=mt(t.stopWhen),y=h(l.appendMessage),k=h(l.completeRun),M=h(l.ensureThread),O=h(l.listMessages),_=h(l.deleteMessage),x=h(l.patchThread),$=h(l.setState),R=h(l.state),g=async f=>{await p(y,{threadKey:r.threadKey,...f})},E=async f=>{await p(x,{key:r.threadKey,...f})},U=async f=>{await p(_,{messageKey:f,threadKey:r.threadKey})},H=async()=>{await g({content:r.input,messageKey:`${c}:user`,role:"user"})},j={dispatched:!1},I=async f=>{j.dispatched=!0;const N=await p(k,{instanceId:c,key:r.threadKey,...f});N?.dequeued!==void 0&&await Bt({env:o,exportName:a,step:m},r.threadKey,N.dequeued)},V=async()=>await p(R,{key:r.threadKey}),X=async f=>{await p($,{key:r.threadKey,state:f})},D=await p(M,{agent:a,instanceId:c,key:r.threadKey,...t.initialState===void 0?{}:{initialState:t.initialState},...t.onConcurrentRun===void 0?{}:{onConcurrentRun:t.onConcurrentRun},...r.owner===void 0?{}:{owner:r.owner},...r.title===void 0?{}:{title:r.title}});D?.outcome==="replaced"&&await jt(o,a,D.priorInstanceId);const J=await Dt(t,r.input,r.owner,l,m,p),Q=typeof t.instructions=="function"?t.instructions({env:o,input:r.input,threadKey:r.threadKey}):t.instructions,Y={agent:t,compact:n,depth:lt(r.depth),env:o,generate:d,getState:V,instanceId:c,instructions:Q,listMessages:O,memoryContext:J,onTokenDelta:i,owner:r.owner,deleteMessage:U,patchThread:E,persist:g,run:p,setState:X,step:m,streamGenerate:w,threadKey:r.threadKey,tools:t.tools??{}},K={value:void 0};try{D?.outcome==="queued"&&await bt(m,r.threadKey,c),await H();const{final:f,stoppedByCondition:N,turnsRun:Z}=await Wt(Y,v,T,K),C=K.value===void 0?{}:{usage:K.value};return await Pt({agent:t,env:o,extractGraph:u,finalText:f?.text,input:r.input,instanceId:c,owner:r.owner,paths:l,run:p,step:m}),await Ft({agent:t,env:o,extractEpisode:s,finalText:f?.text,input:r.input,instanceId:c,owner:r.owner,paths:l,run:p,step:m,threadKey:r.threadKey}),f?(await Gt(t,{env:o,params:r,step:m},{...f,...C}),await I({status:"idle",...C}),{...f,...C}):N?(await I({status:"idle",...C}),{stopped:"stopCondition",turns:Z,...C}):(await I({error:`agent stopped: maxTurns (${String(v)}) reached`,status:"error",...C}),{stopped:"maxTurns",turns:v,...C})}catch(f){throw j.dispatched||await pt(I,f,K.value),f}};export{xt as a,$t as c,st as i,ee as r,Mt as s};
|
package/dist/packem_shared/{compileAgentWorkflow-D_4LPcGV.mjs → compileAgentWorkflow-CzfL6bQS.mjs}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineWorkflow as i}from"@lunora/workflow";import{r as m}from"./agent-loop-
|
|
1
|
+
import{defineWorkflow as i}from"@lunora/workflow";import{r as m}from"./agent-loop-ByRhLA54.mjs";import{createStreamGenerate as p,createAgentGenerate as l,createEpisodeExtract as f,createGraphExtract as d,createCompact as c}from"./createAgentGenerate-BOILDUZj.mjs";import{agentDefaultName as u}from"../naming.mjs";import{DEFAULT_AGENT_FUNCTION_PATHS as A}from"./AGENT_MODULE-M4D1EejI.mjs";import{t as T}from"./createDispatchRunner-BxtGxAQi-DXXP7SxZ.mjs";import{otlpTelemetry as y}from"./otlpTelemetry-ByqrB-72.mjs";const E=(t,r)=>T({env:r,label:"@lunora/agent",...t===void 0?{}:{identity:{userId:t}}}),O=(t,r,n)=>{const e=r.LUNORA_OTLP_ENDPOINT;if(typeof e!="string"||e===""||t.telemetry?.isEnabled===!1)return t;const a=typeof r.LUNORA_OTLP_TOKEN=="string"?r.LUNORA_OTLP_TOKEN:void 0,o=[t.telemetry?.integrations].flat().filter(s=>s!==void 0);return{...t,telemetry:{...t.telemetry,integrations:[...o,y({conversationId:n,endpoint:e,token:a})],isEnabled:!0}}},I=(t,r,n)=>i({handler:async e=>{const a=O(t,e.env,e.params.threadKey);return m({agent:a,compact:c(),env:e.env,exportName:r,extractGraph:d(),extractEpisode:f(),generate:l(a,e.env),instanceId:e.event.instanceId,params:e.params,paths:n?.paths??A,run:E(e.params.owner,e.env),step:e.step,streamGenerate:p(a,e.env)})},name:t.name??u(r)});export{I as default};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{LunoraError as r}from"@lunora/errors";import{a as f,i as m}from"./agent-loop-
|
|
1
|
+
import{LunoraError as r}from"@lunora/errors";import{a as f,i as m}from"./agent-loop-ByRhLA54.mjs";import{collectAgenticMemoryTools as g}from"./collectAgenticMemoryTools-BeMWT2qt.mjs";import{agentAsTool as p}from"./agentAsTool-CgZb6ycK.mjs";import{i as u}from"./positive-integer-ztHqqpBk.mjs";import{SKILL_NAME_PATTERN as w,RESERVED_SKILL_NAME as c}from"./defineSkill-DGGvDWNq.mjs";const T=/^[a-zA-Z][\w-]*$/u,N=(e,n)=>{const o={...e.tools};for(const t of n)for(const[s,a]of Object.entries(t.tools??{})){if(Object.hasOwn(o,s))throw new r("INTERNAL",`@lunora/agent: skill "${t.name}" tool "${s}" collides with an existing tool — rename one (the agent's tool namespace is flat)`);o[s]=a}return o},A=(e,n)=>{const o=[];for(const t of[e.instructions,...n.map(s=>s.instructions)])t&&o.push(t);return o.length<=1?o[0]:t=>o.map(s=>typeof s=="function"?s(t):s).filter(s=>s.length>0).join(`
|
|
2
2
|
|
|
3
3
|
`)},k=(e,n)=>{const o=[];e.memory&&m(e.memory)&&o.push({key:"default",...e.memory});for(const t of n)t.knowledge&&m(t.knowledge)&&o.push({key:t.name,...t.knowledge});return o},y=e=>{const n=new Set;for(const o of e){if(typeof o.name!="string"||!w.test(o.name))throw new r("INTERNAL",`@lunora/agent: skill \`name\` must be a valid identifier (letters, digits, _ or -, starting with a letter), got ${JSON.stringify(o.name)}`);if(o.name===c)throw new r("INTERNAL",`@lunora/agent: skill name "${c}" is reserved (it keys the agent's own \`memory\` source / the \`memory:retrieve\` step) — choose another name`);if(n.has(o.name))throw new r("INTERNAL",`@lunora/agent: skill name "${o.name}" is used by more than one skill — rename one (a skill name keys its knowledge memory source, which must be unique)`);n.add(o.name)}},v=(e,n)=>{if(e===void 0)return;const o=Object.keys(n).filter(t=>!e.includes(t));if(o.length>0)throw new r("INTERNAL",`@lunora/agent: \`activeTools\` omits the agentic-memory tool(s) ${o.map(t=>`"${t}"`).join(", ")} — the model could never call them; add them to \`activeTools\` (or drop \`activeTools\` to expose every tool)`)},E=(e,n)=>{const o=(t,s)=>{if(t&&t.kind!=="graph"&&t.kind!=="episodic"&&t.source===void 0)throw new r("INTERNAL",`@lunora/agent: ${s} requires a \`source\` action unless \`kind: "graph"\` or \`kind: "episodic"\``)};o(e.memory,"`memory`");for(const t of n)o(t.knowledge,`skill "${t.name}" \`knowledge\``)},L=e=>{if(e===void 0)return;const n=f(e);if(!Number.isFinite(n)||n<=0)throw new r("INTERNAL","@lunora/agent: `approvalTimeout` must resolve to a positive duration")},$=e=>{const n=e.model;if(n==null||typeof n=="string"&&n.length===0)throw new r("INTERNAL","@lunora/agent: defineAgent requires a `model` (a Workers AI id, an AI SDK LanguageModel, or an (env) => model thunk)");if(e.maxTurns!==void 0&&!u(e.maxTurns))throw new r("INTERNAL","@lunora/agent: `maxTurns` must be a positive integer");if(e.voice?.maxTurns!==void 0&&!u(e.voice.maxTurns))throw new r("INTERNAL","@lunora/agent: `voice.maxTurns` must be a positive integer");L(e.approvalTimeout);const o=e.skills??[];y(o),E(e,o);const t=N(e,o),s=g(e,o);for(const[i,h]of Object.entries(s)){if(Object.hasOwn(t,i))throw new r("INTERNAL",`@lunora/agent: agentic-memory tool "${i}" collides with an existing tool — rename one (the agent's tool namespace is flat)`);t[i]=h}const a=Object.keys(s).length>0;v(e.activeTools,s);for(const i of Object.keys(t))if(!T.test(i))throw new r("INTERNAL",`@lunora/agent: tool name "${i}" is not a valid identifier (letters, digits, _ or -, starting with a letter)`);const l=k(e,o),d=A(e,o);return{...e,asTool:p,isLunoraAgent:!0,...o.some(i=>!!i.instructions)?{instructions:d}:{},...l.length>0?{memorySources:l}:{},...o.length>0||a?{tools:t}:{}}},j=e=>typeof e=="object"&&e!==null&&e.isLunoraAgent===!0,M=e=>{if(typeof e.execute!="function")throw new r("INTERNAL","@lunora/agent: defineAgentTool requires an `execute` function");if(typeof e.description!="string"||e.description.length===0)throw new r("INTERNAL","@lunora/agent: defineAgentTool requires a non-empty `description` (the model decides from it)");return{...e,isLunoraAgentTool:!0}};export{$ as defineAgent,M as defineAgentTool,j as isAgentDefinition};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./createDispatchRunner-BxtGxAQi-DXXP7SxZ.mjs";import"./component-shared-G8ngerkU.mjs";import"./createAgentGenerate-BOILDUZj.mjs";import{a as n,c as l,r as u,s as f}from"./agent-loop-
|
|
1
|
+
import"./createDispatchRunner-BxtGxAQi-DXXP7SxZ.mjs";import"./component-shared-G8ngerkU.mjs";import"./createAgentGenerate-BOILDUZj.mjs";import{a as n,c as l,r as u,s as f}from"./agent-loop-ByRhLA54.mjs";import"./buildModelMessages-Y4tGo1T9.mjs";import"../naming.mjs";import"./AGENT_MODULE-M4D1EejI.mjs";import"./positive-integer-ztHqqpBk.mjs";import"./tool-output-Cmk3JWMG.mjs";export{n as approvalTimeoutMs,l as compactHistory,u as runAgentLoop,f as splitForCompaction};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./base64-5eyBfWO3.mjs";import{p as s,c as p,f as m,e as n,r as c,t as d}from"./voice-turn-
|
|
1
|
+
import"./base64-5eyBfWO3.mjs";import{p as s,c as p,f as m,e as n,r as c,t as d}from"./voice-turn-CYXdylKF.mjs";import"./agent-loop-ByRhLA54.mjs";import"./buildModelMessages-Y4tGo1T9.mjs";import"./AGENT_MODULE-M4D1EejI.mjs";export{s as parseIdentity,p as pcmToWav,m as readSynthesisAudio,n as readTranscriptionText,c as runVoiceTurn,d as toByteIterable};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{f as P,a as q}from"./base64-5eyBfWO3.mjs";import{c as z}from"./agent-loop-
|
|
1
|
+
import{f as P,a as q}from"./base64-5eyBfWO3.mjs";import{c as z}from"./agent-loop-ByRhLA54.mjs";import{buildModelMessages as G}from"./buildModelMessages-Y4tGo1T9.mjs";import{toFunctionReference as T}from"./AGENT_MODULE-M4D1EejI.mjs";const D=new TextDecoder;new TextEncoder;const N="=",Q=t=>{if(t)try{const e=t[0]==="{"?t:D.decode(P(t)),n=JSON.parse(e);if(n&&typeof n=="object"&&!Array.isArray(n))return n}catch{}},ct=t=>{if(t){if(!t.startsWith(N))return t;try{return D.decode(P(t.slice(N.length)))}catch{return}}},dt=t=>{const e=Number(t);return Number.isFinite(e)&&e>0?e:void 0},ut=t=>typeof t=="number"&&Date.now()>=t,ft=t=>{try{t.send(JSON.stringify({code:"TOKEN_EXPIRED",error:{code:"TOKEN_EXPIRED",message:"authentication token expired"},message:"authentication token expired",type:"error"})),t.close?.(4001,"token_expired")}catch{}},Y=16e3,Z=1,tt=16,M=/[.!?]\s/u,et=/\s/u,nt=async function*(t){if(t instanceof Uint8Array){yield t;return}if(t instanceof ReadableStream){const e=t.getReader();try{for(;;){const{done:n,value:r}=await e.read();if(n)break;yield r}}finally{e.releaseLock()}return}yield*t},yt=(t,e=Y,n=Z,r=tt)=>{const i=n*r/8,p=e*i,m=new ArrayBuffer(44+t.byteLength),s=new DataView(m),u=(l,E)=>{for(let d=0;d<E.length;d+=1)s.setUint8(l+d,E.codePointAt(d)??0)};u(0,"RIFF"),s.setUint32(4,36+t.byteLength,!0),u(8,"WAVE"),u(12,"fmt "),s.setUint32(16,16,!0),s.setUint16(20,1,!0),s.setUint16(22,n,!0),s.setUint32(24,e,!0),s.setUint32(28,p,!0),s.setUint16(32,i,!0),s.setUint16(34,r,!0),u(36,"data"),s.setUint32(40,t.byteLength,!0);const a=new Uint8Array(m);return a.set(t,44),a},st=t=>{const e=[];let n=t,r=M.exec(n);for(;r;){let i=r.index+1;for(;i<n.length&&et.test(n[i]??"");)i+=1;const p=n.slice(0,i).trim();p.length>0&&e.push(p),n=n.slice(i),r=M.exec(n)}return{rest:n,sentences:e}},pt=async t=>{const{agent:e,compact:n,connectionId:r,env:i,exportName:p,owner:m,paths:s,pcm:u,run:a,send:l,sendAudio:E,signal:d,streamGenerate:C,synthesize:H,text:L,threadKey:o,transcribe:F,turn:U,waitForDrain:O}=t,h=()=>d.aborted,v=T(s.appendMessage),$=T(s.ensureThread),B=T(s.listMessages),b=T(s.patchThread);await a($,{agent:p,key:o,...e.initialState===void 0?{}:{initialState:e.initialState},...m===void 0?{}:{owner:m}});try{const f=(L??(u?await F(u):"")).trim();if(f.length===0)return await a(b,{key:o,status:"idle"}),{assistantText:"",interrupted:!1,userText:""};l({text:f,type:"user_transcript"}),await a(v,{content:f,messageKey:`voice:${r}:${String(U)}:user`,role:"user",threadKey:o}),await a(b,{key:o,status:"running"});const I=typeof e.instructions=="function"?e.instructions({env:i,input:f,threadKey:o}):e.instructions,K=await a(B,{key:o}),{history:j,summary:R}=await z({agent:e,compact:n,env:i},K),W=G({history:j,...I===void 0?{}:{instructions:I},...R===void 0?{}:{summary:R}});let g="",w="",S=Promise.resolve();const V=async c=>{if(h()||c.length===0)return;let x=!1;try{for await(const y of nt(await H(c,d))){if(h()||(await O?.(),h()))break;E(y),x=!0}}catch(y){l({message:y instanceof Error?y.message:String(y),type:"error"})}x&&(w=w.length>0?`${w} ${c}`:c)},_=c=>{S=S.then(async()=>V(c))},X=await C({messages:W,signal:d},c=>{if(h())return;l({text:c,type:"assistant_delta"}),g+=c;const{rest:x,sentences:y}=st(g);g=x;for(const J of y)_(J)});!h()&&g.trim().length>0&&_(g.trim()),g="",await S;const k=h(),A=k?w:X.text;return await a(v,{content:A,messageKey:`voice:${r}:${String(U)}:assistant`,role:"assistant",threadKey:o}),await a(b,{key:o,status:"idle"}),l(k?{type:"interrupted"}:{text:A,type:"assistant_done"}),{assistantText:A,interrupted:k,userText:f}}catch(f){throw await a(b,{key:o,status:"idle"}),f}},lt=t=>Q(t),ht=t=>{if(typeof t=="object"&&t!==null&&"text"in t){const{text:e}=t;return typeof e=="string"?e:""}return""},gt=t=>{if(t instanceof Uint8Array||t instanceof ReadableStream)return t;if(t instanceof Response&&t.body)return t.body;if(typeof t=="object"&&t!==null&&"audio"in t){const{audio:e}=t;if(typeof e=="string")return q(e);if(e instanceof ReadableStream||e instanceof Uint8Array)return e}return new Uint8Array(0)};export{dt as a,ft as b,yt as c,ct as d,ht as e,gt as f,ut as i,lt as p,pt as r,nt as t};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lunora/agent",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.122",
|
|
4
4
|
"description": "Durable AI agents for Lunora: defineAgent compiles a replay-safe tool-loop onto Cloudflare Workflows, with DO SQLite threads and live message subscriptions",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{e as Z}from"./createDispatchRunner-BxtGxAQi-DXXP7SxZ.mjs";import{c as j,d as tt}from"./component-shared-G8ngerkU.mjs";import{resolveAgentModel as et}from"./createAgentGenerate-BOILDUZj.mjs";import{buildModelMessages as G}from"./buildModelMessages-Y4tGo1T9.mjs";import{agentBindingName as L}from"../naming.mjs";import{toFunctionReference as h}from"./AGENT_MODULE-M4D1EejI.mjs";import{i as ot}from"./positive-integer-ztHqqpBk.mjs";import{combineTelemetry as nt}from"./combineTelemetry-DgE9W9G8.mjs";import{c as q}from"./tool-output-Cmk3JWMG.mjs";const at=e=>e.kind==="graph"||e.kind==="episodic"||e.mode!=="agentic",P=e=>e.memorySources?e.memorySources:e.memory&&at(e.memory)?[{key:"default",...e.memory}]:[],st=e=>P(e).find(t=>t.kind==="graph"),rt=e=>P(e).find(t=>t.kind==="episodic"),S=(e,t)=>t==="default"?e:`${e}:${t}`,it=e=>{if(e===void 0||e.isEnabled===!1)return;const{integrations:t}=e;if(t===void 0)return;const n=Array.isArray(t)?t:[t];return n.length===0?void 0:nt(...n)},ct=async(e,t,n)=>{const o=it(e);if(o===void 0)return n();const a={dynamic:!0,input:t.input,toolCallId:t.id,toolName:t.name,type:"tool-call"},s={callId:t.id,messages:[],toolCall:a,toolContext:void 0},u=Date.now();await o.onToolExecutionStart?.(s);let d;const c=()=>(d??=n(),d);try{if(o.executeTool===void 0)await c();else try{await o.executeTool({...s,execute:c,toolCallId:t.id})}catch{}const i=await c();return await o.onToolExecutionEnd?.({...s,toolExecutionMs:Date.now()-u,toolOutput:{dynamic:!0,input:t.input,output:i,toolCallId:t.id,toolName:t.name,type:"tool-result"}}),i}catch(i){throw await o.onToolExecutionEnd?.({...s,toolExecutionMs:Date.now()-u,toolOutput:{dynamic:!0,error:i,input:t.input,toolCallId:t.id,toolName:t.name,type:"tool-error"}}),i}},ut=8,dt=e=>ot(e)?e:0,W=e=>e===void 0?"null":JSON.stringify(e),lt=async(e,t,n)=>{try{await e({error:t instanceof Error?t.message:String(t),status:"error",...n===void 0?{}:{usage:n}})}catch(o){t instanceof Error&&t.cause===void 0&&(t.cause=o)}},pt=e=>e===void 0?[]:[e].flat(),mt=async(e,t)=>(await Promise.all(e.map(async o=>o({steps:t})))).some(Boolean),yt=(e,t)=>{if(t===void 0)return e;if(e===void 0)return{...t};const n={};for(const o of["inputTokens","outputTokens","totalTokens"])(e[o]!==void 0||t[o]!==void 0)&&(n[o]=(e[o]??0)+(t[o]??0));return n},ft=async(e,t,n,o,a)=>{const{needsApproval:s}=e;return s===void 0||s===!1?!1:s===!0?!0:n.do(o,async()=>s(t,a))},vt="WorkflowTimeoutError",ht=e=>e instanceof Error&&e.name===vt,b=4320*60*1e3,gt={day:864e5,hour:36e5,minute:6e4,month:30*864e5,second:1e3,week:7*864e5,year:365*864e5},wt=/^(\d+(?:\.\d+)?) (day|hour|minute|month|second|week|year)s?$/u,Tt=e=>{if(e===void 0)return b;if(typeof e=="number")return Math.min(e,j);const t=wt.exec(e);return t===null?b:Math.min(Number(t[1])*gt[t[2]],j)},xt=async(e,t)=>{const{agent:n,deleteMessage:o,instanceId:a,patchThread:s,persist:u,step:d}=e;await u({content:`Awaiting approval to run tool "${t.name}".`,messageKey:`${a}:approval:${t.id}`,role:"tool",status:"awaiting_approval",toolCallId:t.id,toolName:t.name}),await s({status:"awaiting_input"});const c=await d.waitForEvent(`approval:${t.id}`,{timeout:Tt(n.approvalTimeout),type:`agent-approval:${t.id}`}).then(i=>({decision:i.payload.decision,...i.payload.note===void 0?{}:{note:i.payload.note}})).catch(i=>{if(!ht(i))throw i;return{decision:"reject",note:"approval timed out"}});return await o(`${a}:approval:${t.id}`),await s({status:"running"}),c},A="lunoraToolOutcome",Ct=e=>typeof e=="object"&&e!==null&&A in e?e[A]:{ok:e},St=async(e,t)=>{const{agent:n,depth:o,env:a,getState:s,instanceId:u,onTokenDelta:d,owner:c,persist:i,run:r,setState:l,step:p,threadKey:m,tools:w}=e,v=`tool:${t.name}:${t.id}`,T=w[t.name],y=`${u}:tool:${t.id}`;if(!T){await i({content:`Error: unknown tool "${t.name}"`,messageKey:y,role:"tool",stepName:v,toolCallId:t.id,toolName:t.name});return}if(t.invalid!==void 0){await i({content:`Error: invalid input for tool "${t.name}" — it was not run. ${t.invalid}`,messageKey:y,role:"tool",stepName:v,toolCallId:t.id,toolName:t.name});return}const M={depth:o,env:a,getState:s,idempotencyKey:v,owner:c,reportProgress:g=>{d?.({data:g,kind:"progress",threadKey:m,toolCallId:t.id})},run:r,setState:l,step:p,threadKey:m,toolCallId:t.id},O={depth:o,env:a,getState:s,idempotencyKey:v,run:r,threadKey:m,toolCallId:t.id},_=`tool:approval-gate:${t.id}`;let x;if(await ft(T,t.input,p,_,O)){const{decision:g,note:E}=await xt(e,t);if(g==="reject"){const U=E===void 0?"":` Reason: ${E}`;await i({content:`Tool "${t.name}" was rejected by the user and not run.${U}`,messageKey:y,role:"tool",status:"rejected",stepName:v,toolCallId:t.id,toolName:t.name});return}x="approved"}const $=Ct(await p.do(v,async()=>{try{const g=()=>Promise.resolve(T.execute(t.input,M)),E=await ct(n.telemetry,{id:t.id,input:t.input,name:t.name},g);return{[A]:{ok:E}}}catch(g){if(Z(g))return{[A]:{failed:g.message}};throw g}}));if("failed"in $){await i({content:q(`Error: tool "${t.name}" failed and will not be retried. ${$.failed}`),messageKey:y,role:"tool",stepName:v,...x===void 0?{}:{status:x},toolCallId:t.id,toolName:t.name});return}const R=$.ok;await i({content:q(typeof R=="string"?R:W(R)),messageKey:y,role:"tool",stepName:v,...x===void 0?{}:{status:x},toolCallId:t.id,toolName:t.name})},Et=(e,t,n)=>{if(!t)return e;let{messages:o}=e;return t.messages!==void 0&&(o=t.messages),t.system!==void 0&&(o=[{content:t.system,role:"system"},...o]),{activeTools:t.activeTools??e.activeTools,messages:o,model:t.model===void 0?e.model:et(t.model,n),toolChoice:t.toolChoice??e.toolChoice}},kt=(e,t)=>{if(t===void 0||e.length<=t.maxMessages)return;const n=Math.max(1,t.keepRecent??Math.ceil(t.maxMessages/2));if(e.length<=n)return;let o=e.length-n;for(;o>0&&e[o]?.role==="tool";)o-=1;if(!(o<=0))return{older:e.slice(0,o),recent:e.slice(o)}},Mt=async(e,t)=>{const{agent:n,compact:o,env:a}=e,s=kt(t,n.compaction);if(s===void 0||o===void 0)return{history:t,summary:void 0};try{const u=await o({env:a,messages:G({history:s.older}),model:n.compaction?.model??n.model});return u.length>0?{history:s.recent,summary:u}:{history:t,summary:void 0}}catch{return{history:t,summary:void 0}}},$t=async(e,t,n)=>{const{agent:o,env:a,generate:s,instructions:u,listMessages:d,memoryContext:c,onTokenDelta:i,run:r,step:l,streamGenerate:p,threadKey:m}=e;return l.do(`llm:turn:${String(t)}`,async()=>{const w=await r(d,{key:m}),{history:v,summary:T}=await Mt(e,w);let y={activeTools:o.activeTools,messages:G({history:v,instructions:u,memoryContext:c,summary:T}),model:void 0,toolChoice:o.toolChoice};o.prepareStep&&(y=Et(y,await o.prepareStep({messages:y.messages,stepNumber:t,steps:n}),a));const k={messages:y.messages,...y.activeTools===void 0?{}:{activeTools:y.activeTools},...y.model===void 0?{}:{model:y.model},...y.toolChoice===void 0?{}:{toolChoice:y.toolChoice}};return p&&i?p(k,M=>{i({text:M,threadKey:m,turn:t})}):s(k)})},B=async(e,t)=>{const{agent:n,step:o}=e;n.onStepFinish&&await o.do(`agent:step-finish:${String(t.turn)}`,async()=>(await n.onStepFinish?.(t),!0))},Rt=e=>({text:e.text,toolCalls:e.toolCalls.map(t=>({input:t.input,toolCallId:t.id,toolName:t.name})),...e.usage===void 0?{}:{usage:e.usage}}),F=e=>{const t=e?.context;return typeof t=="string"&&t.length>0?t:void 0},It=e=>tt({depth:e?.depth,fanOut:e?.fanOut,maxNodes:e?.maxNodes,maxSeeds:e?.maxSeeds}),Kt=async(e,t,n,o)=>{if(e.source===void 0)return;const a=h(e.source),{topK:s}=e,u=S("memory:retrieve",e.key),d=await n.do(u,async()=>o(a,{query:t,...s===void 0?{}:{topK:s}}));return F(d)},Nt=async(e,t,n,o,a,s)=>{if(n===void 0)return;const u=S("memory:traverse",e.key),d=await a.do(u,async()=>s(o,{owner:n,query:t,...It(e.graph)}));return F(d)},At=async(e,t,n,o,a)=>{if(t===void 0)return;const s=S("memory:recall",e.key),u={owner:t,...e.episodic?.recall===void 0?{}:{limit:e.episodic.recall}},d=await o.do(s,async()=>a(n,u));return F(d)},Ot=async(e,t)=>e.kind==="episodic"?At(e,t.owner,t.episodeRecall,t.step,t.run):e.kind==="graph"?Nt(e,t.input,t.owner,t.graphTraverse,t.step,t.run):Kt(e,t.input,t.step,t.run),_t=e=>{const t=e.findIndex(n=>n.kind==="episodic");return e.filter((n,o)=>n.kind!=="episodic"||o===t)},Ut=async(e,t,n,o,a,s)=>{const u=_t(P(e));if(u.length===0)return;const d=h(o.graphTraverse),c=h(o.episodeRecall),i=[];for(const r of u){const l=await Ot(r,{episodeRecall:c,graphTraverse:d,input:t,owner:n,run:s,step:a});l!==void 0&&i.push(l)}return i.length>0?i.join(`
|
|
2
|
-
|
|
3
|
-
`):void 0},Dt=async e=>{const{agent:t,env:n,extractGraph:o,finalText:a,input:s,instanceId:u,owner:d,paths:c,run:i,step:r}=e;if(o===void 0||d===void 0||a===void 0||a.length===0)return;const l=st(t);if(l!==void 0)try{const p={assistantText:a,env:n,model:l.graph?.extractionModel??t.model,userInput:s},m=await r.do(S("memory:extract",l.key),async()=>o(p));await i(h(c.graphUpsert),{...m,messageKey:`${u}:${S("extract",l.key)}`,owner:d})}catch{}},Pt=async e=>{const{agent:t,env:n,extractEpisode:o,finalText:a,input:s,instanceId:u,owner:d,paths:c,run:i,step:r,threadKey:l}=e;if(o===void 0||d===void 0||a===void 0||a.length===0)return;const p=rt(t);if(p!==void 0)try{const m={assistantText:a,env:n,model:p.episodic?.extractionModel??t.model,userInput:s},{summary:w}=await r.do(S("memory:episode",p.key),async()=>o(m));await i(h(c.episodeUpsert),{messageKey:`${u}:${S("episode",p.key)}`,owner:d,summary:w,threadKey:l})}catch{}},Ft=async(e,t,n)=>{const o=e[L(t)];if(!(!o||typeof o.get!="function"))try{await(await o.get(n)).terminate()}catch{}},jt="12 hours",qt=async(e,t,n)=>{await e.waitForEvent(`dequeue:${n}`,{timeout:jt,type:`agent-dequeue:${t}:${n}`})},bt=async(e,t,n)=>{const o=e.env[L(e.exportName)];if(!o||typeof o.get!="function")return;const a=o.get.bind(o);try{await e.step.do(`dequeue-wake:${n}`,async()=>(await(await a(n)).sendEvent({payload:{threadKey:t},type:`agent-dequeue:${t}:${n}`}),n))}catch{}},Bt=async(e,t,n)=>{const{onReply:o}=e,{replyRef:a}=t.params;if(!(o===void 0||a===void 0))try{await t.step.do("agent:reply",async()=>(await o({env:t.env,replyRef:a,result:n,threadKey:t.params.threadKey}),a.channel))}catch{}},Gt=async(e,t,n,o,a)=>{const{instanceId:s,persist:u}=e,d=n.usage===void 0?{}:{usage:n.usage};if(n.toolCalls.length===0){const c=n.output!==void 0&&n.text.length===0?W(n.output):n.text;return await u({content:c,messageKey:`${s}:assistant:${String(t)}`,role:"assistant"}),await B(e,{text:n.text,toolCalls:[],turn:t,...d}),{final:{stopped:"final",text:n.text,turns:t+1,...n.output===void 0?{}:{output:n.output}}}}await u({content:n.text,messageKey:`${s}:assistant:${String(t)}`,role:"assistant",toolCalls:n.toolCalls});for(const c of n.toolCalls)await St(e,c);if(await B(e,{text:n.text,toolCalls:n.toolCalls,turn:t,...d}),o.push(Rt(n)),a.length>0&&await mt(a,o))return"stopCondition"},Lt=async(e,t,n,o)=>{const a=[];let s,u=!1,d=0;for(let c=0;c<t;c+=1){const i=await $t(e,c,a);o.value=yt(o.value,i.usage),d=c+1;const r=await Gt(e,c,i,a,n);if(r==="stopCondition"){u=!0;break}if(r!==void 0){s=r.final;break}}return{final:s,stoppedByCondition:u,turnsRun:d}},te=async e=>{const{agent:t,compact:n,env:o,exportName:a,extractEpisode:s,extractGraph:u,generate:d,instanceId:c,onTokenDelta:i,params:r,paths:l,run:p,step:m,streamGenerate:w}=e,v=t.maxTurns??ut,T=pt(t.stopWhen),y=h(l.appendMessage),k=h(l.completeRun),M=h(l.ensureThread),O=h(l.listMessages),_=h(l.deleteMessage),x=h(l.patchThread),$=h(l.setState),R=h(l.state),g=async f=>{await p(y,{threadKey:r.threadKey,...f})},E=async f=>{await p(x,{key:r.threadKey,...f})},U=async f=>{await p(_,{messageKey:f,threadKey:r.threadKey})},z=async()=>{await g({content:r.input,messageKey:`${c}:user`,role:"user"})},I=async f=>{const N=await p(k,{instanceId:c,key:r.threadKey,...f});N?.dequeued!==void 0&&await bt({env:o,exportName:a,step:m},r.threadKey,N.dequeued)},H=async()=>await p(R,{key:r.threadKey}),V=async f=>{await p($,{key:r.threadKey,state:f})},D=await p(M,{agent:a,instanceId:c,key:r.threadKey,...t.initialState===void 0?{}:{initialState:t.initialState},...t.onConcurrentRun===void 0?{}:{onConcurrentRun:t.onConcurrentRun},...r.owner===void 0?{}:{owner:r.owner},...r.title===void 0?{}:{title:r.title}});D?.outcome==="replaced"&&await Ft(o,a,D.priorInstanceId);const X=await Ut(t,r.input,r.owner,l,m,p),J=typeof t.instructions=="function"?t.instructions({env:o,input:r.input,threadKey:r.threadKey}):t.instructions,Q={agent:t,compact:n,depth:dt(r.depth),env:o,generate:d,getState:H,instanceId:c,instructions:J,listMessages:O,memoryContext:X,onTokenDelta:i,owner:r.owner,deleteMessage:U,patchThread:E,persist:g,run:p,setState:V,step:m,streamGenerate:w,threadKey:r.threadKey,tools:t.tools??{}},K={value:void 0};try{D?.outcome==="queued"&&await qt(m,r.threadKey,c),await z();const{final:f,stoppedByCondition:N,turnsRun:Y}=await Lt(Q,v,T,K),C=K.value===void 0?{}:{usage:K.value};return await Dt({agent:t,env:o,extractGraph:u,finalText:f?.text,input:r.input,instanceId:c,owner:r.owner,paths:l,run:p,step:m}),await Pt({agent:t,env:o,extractEpisode:s,finalText:f?.text,input:r.input,instanceId:c,owner:r.owner,paths:l,run:p,step:m,threadKey:r.threadKey}),f?(await Bt(t,{env:o,params:r,step:m},{...f,...C}),await I({status:"idle",...C}),{...f,...C}):N?(await I({status:"idle",...C}),{stopped:"stopCondition",turns:Y,...C}):(await I({error:`agent stopped: maxTurns (${String(v)}) reached`,status:"error",...C}),{stopped:"maxTurns",turns:v,...C})}catch(f){throw await lt(I,f,K.value),f}};export{Tt as a,Mt as c,at as i,te as r,kt as s};
|