@lssm/lib.ai-agent 0.3.0 → 0.4.1
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/README.md +3 -1
- package/dist/approval/workflow.d.ts +1 -2
- package/dist/approval/workflow.js +1 -2
- package/dist/memory/in-memory.d.ts +1 -2
- package/dist/memory/in-memory.js +1 -2
- package/dist/memory/manager.d.ts +1 -2
- package/dist/memory/manager.js +1 -2
- package/dist/runner.d.ts +1 -2
- package/dist/runner.js +1 -2
- package/dist/spec.d.ts +1 -2
- package/dist/spec.js +1 -2
- package/dist/tools/executor.d.ts +1 -2
- package/dist/tools/executor.js +1 -2
- package/dist/types.d.ts +1 -2
- package/package.json +10 -7
- package/dist/approval/workflow.d.ts.map +0 -1
- package/dist/approval/workflow.js.map +0 -1
- package/dist/memory/in-memory.d.ts.map +0 -1
- package/dist/memory/in-memory.js.map +0 -1
- package/dist/memory/manager.d.ts.map +0 -1
- package/dist/memory/manager.js.map +0 -1
- package/dist/runner.d.ts.map +0 -1
- package/dist/runner.js.map +0 -1
- package/dist/spec.d.ts.map +0 -1
- package/dist/spec.js.map +0 -1
- package/dist/tools/executor.d.ts.map +0 -1
- package/dist/tools/executor.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# @lssm/lib.ai-agent
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**AI governance for ContractSpec** — Constrain what AI agents can change, enforce contracts they must respect.
|
|
4
|
+
|
|
5
|
+
Stateful AI agent orchestration with type-safe specs, tool execution, knowledge bindings, and per-tenant guardrails. Agents read contracts as their source of truth, enabling triage, growth experiments, and DevOps automation with contract-enforced safety.
|
|
4
6
|
|
|
5
7
|
## Features
|
|
6
8
|
|
|
@@ -37,5 +37,4 @@ declare class ApprovalWorkflow {
|
|
|
37
37
|
listPending(): Promise<ApprovalRequest[]>;
|
|
38
38
|
}
|
|
39
39
|
//#endregion
|
|
40
|
-
export { ApprovalRequest, ApprovalStatus, ApprovalStore, ApprovalWorkflow, ApprovalWorkflowOptions, InMemoryApprovalStore };
|
|
41
|
-
//# sourceMappingURL=workflow.d.ts.map
|
|
40
|
+
export { ApprovalRequest, ApprovalStatus, ApprovalStore, ApprovalWorkflow, ApprovalWorkflowOptions, InMemoryApprovalStore };
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{randomUUID as e}from"node:crypto";var t=class{items=[];async create(e){this.items.push(e)}async update(e,t){let n=this.items.findIndex(t=>t.id===e);n!==-1&&(this.items[n]={...this.items[n],...t})}async list(e){return e?this.items.filter(t=>t.status===e):[...this.items]}},n=class{constructor(e=new t){this.store=e}async requestApproval(t,n,r){let i={id:e(),sessionId:t.sessionId,agent:t.agent,tenantId:t.tenantId,reason:n,requestedAt:new Date,status:`pending`,payload:r};return await this.store.create(i),i}async resolve(e,t,n,r){await this.store.update(e,{status:t,reviewer:n,resolvedAt:new Date,notes:r})}async listPending(){return this.store.list(`pending`)}};export{n as ApprovalWorkflow,t as InMemoryApprovalStore};
|
|
2
|
-
//# sourceMappingURL=workflow.js.map
|
|
1
|
+
import{randomUUID as e}from"node:crypto";var t=class{items=[];async create(e){this.items.push(e)}async update(e,t){let n=this.items.findIndex(t=>t.id===e);n!==-1&&(this.items[n]={...this.items[n],...t})}async list(e){return e?this.items.filter(t=>t.status===e):[...this.items]}},n=class{constructor(e=new t){this.store=e}async requestApproval(t,n,r){let i={id:e(),sessionId:t.sessionId,agent:t.agent,tenantId:t.tenantId,reason:n,requestedAt:new Date,status:`pending`,payload:r};return await this.store.create(i),i}async resolve(e,t,n,r){await this.store.update(e,{status:t,reviewer:n,resolvedAt:new Date,notes:r})}async listPending(){return this.store.list(`pending`)}};export{n as ApprovalWorkflow,t as InMemoryApprovalStore};
|
|
@@ -18,5 +18,4 @@ declare class InMemoryAgentMemory extends BaseAgentMemoryManager {
|
|
|
18
18
|
private evictExpired;
|
|
19
19
|
}
|
|
20
20
|
//#endregion
|
|
21
|
-
export { InMemoryAgentMemory, InMemoryAgentMemoryOptions };
|
|
22
|
-
//# sourceMappingURL=in-memory.d.ts.map
|
|
21
|
+
export { InMemoryAgentMemory, InMemoryAgentMemoryOptions };
|
package/dist/memory/in-memory.js
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
1
|
import{BaseAgentMemoryManager as e}from"./manager.js";var t=class extends e{ttlMs;maxEntries;store=new Map;constructor(e){super(),this.ttlMs=(e?.ttlMinutes??60)*60*1e3,this.maxEntries=e?.maxEntries??250}async load(e){this.evictExpired();let t=this.store.get(e);return t?(t.data.session.updatedAt=new Date,t.expiresAt=Date.now()+this.ttlMs,t.data):null}async save(e){this.trim(e.memory.entries),this.store.set(e.session.sessionId,{data:e,expiresAt:Date.now()+this.ttlMs})}async summarize(e){let t=await this.load(e.sessionId)??this.bootstrapMemory(e),n=t.memory.entries.slice(-10).map(e=>`- ${e.type}: ${e.content}`).join(`
|
|
2
|
-
`);return t.memory.summary=n,t.memory.lastSummarizedAt=new Date,await this.save(t),t.memory}trim(e){e.length<=this.maxEntries||e.splice(0,e.length-this.maxEntries)}evictExpired(){let e=Date.now();for(let[t,n]of this.store.entries())n.expiresAt<=e&&this.store.delete(t)}};export{t as InMemoryAgentMemory};
|
|
3
|
-
//# sourceMappingURL=in-memory.js.map
|
|
2
|
+
`);return t.memory.summary=n,t.memory.lastSummarizedAt=new Date,await this.save(t),t.memory}trim(e){e.length<=this.maxEntries||e.splice(0,e.length-this.maxEntries)}evictExpired(){let e=Date.now();for(let[t,n]of this.store.entries())n.expiresAt<=e&&this.store.delete(t)}};export{t as InMemoryAgentMemory};
|
package/dist/memory/manager.d.ts
CHANGED
|
@@ -38,5 +38,4 @@ declare abstract class BaseAgentMemoryManager implements AgentMemoryManager {
|
|
|
38
38
|
}
|
|
39
39
|
declare function trackMessageInMemory(manager: AgentMemoryManager | undefined, session: AgentSessionState, message: AgentMessage): void;
|
|
40
40
|
//#endregion
|
|
41
|
-
export { AgentMemoryEntry, AgentMemoryManager, AgentMemorySnapshot, AgentSessionMemory, BaseAgentMemoryManager, trackMessageInMemory };
|
|
42
|
-
//# sourceMappingURL=manager.d.ts.map
|
|
41
|
+
export { AgentMemoryEntry, AgentMemoryManager, AgentMemorySnapshot, AgentSessionMemory, BaseAgentMemoryManager, trackMessageInMemory };
|
package/dist/memory/manager.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{randomUUID as e}from"node:crypto";var t=class{async append(t,n){let r=await this.load(t.sessionId)??this.bootstrapMemory(t),i={id:e(),createdAt:n.createdAt??new Date,...n};return r.memory.entries.push(i),await this.save(r),r}async summarize(e){}async prune(e){}bootstrapMemory(t){return{session:t,memory:{entries:t.messages.map(t=>({id:e(),createdAt:new Date,type:t.role===`assistant`?`assistant`:`user`,content:t.content.map(e=>`text`in e?e.text:``).join(``),metadata:t.metadata}))}}}};function n(e,t,n){e&&e.append(t,{type:n.role,content:n.content.map(e=>`text`in e?e.text:``).join(``),metadata:n.metadata})}export{t as BaseAgentMemoryManager,n as trackMessageInMemory};
|
|
2
|
-
//# sourceMappingURL=manager.js.map
|
|
1
|
+
import{randomUUID as e}from"node:crypto";var t=class{async append(t,n){let r=await this.load(t.sessionId)??this.bootstrapMemory(t),i={id:e(),createdAt:n.createdAt??new Date,...n};return r.memory.entries.push(i),await this.save(r),r}async summarize(e){}async prune(e){}bootstrapMemory(t){return{session:t,memory:{entries:t.messages.map(t=>({id:e(),createdAt:new Date,type:t.role===`assistant`?`assistant`:`user`,content:t.content.map(e=>`text`in e?e.text:``).join(``),metadata:t.metadata}))}}}};function n(e,t,n){e&&e.append(t,{type:n.role,content:n.content.map(e=>`text`in e?e.text:``).join(``),metadata:n.metadata})}export{t as BaseAgentMemoryManager,n as trackMessageInMemory};
|
package/dist/runner.d.ts
CHANGED
package/dist/runner.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import"./tools/executor.js";import{trackMessageInMemory as e}from"./memory/manager.js";import{randomUUID as t}from"node:crypto";var n=class{store=new Map;async get(e){return this.store.get(e)??null}async save(e){this.store.set(e.sessionId,{...e})}},r=class{registry;llm;toolExecutor;memoryManager;sessionStore;eventEmitter;maxIterations;defaultSystemPrompt;approvalWorkflow;constructor(e){this.registry=e.registry,this.llm=e.llm,this.toolExecutor=e.toolExecutor,this.memoryManager=e.memoryManager,this.sessionStore=e.sessionStore??new n,this.eventEmitter=e.eventEmitter,this.maxIterations=e.maxIterations??6,this.defaultSystemPrompt=e.defaultSystemPrompt??`You are a ContractSpec agent. Follow policies, cite sources, and escalate when unsure.`,this.approvalWorkflow=e.approvalWorkflow}async run(t){let n=this.registry.require(t.agent,t.version);this.ensureTools(n);let r=await this.loadSession(n,t);this.appendUserMessage(r,t),await this.persistSession(r);let l=[],u=null,d;for(let f=0;f<this.maxIterations;f++){await this.emit(`agent.iteration.started`,{sessionId:r.sessionId,agent:n.meta.name,iteration:f+1,tenantId:t.tenantId}),u=await this.llm.chat(this.buildMessages(n,r,t),{tools:this.toolExecutor.listLLMTools(n.tools.map(e=>e.name)),metadata:{agent:n.meta.name,tenantId:t.tenantId??``},userId:t.actorId});let p=u.message;r.messages.push(p),r.iterations+=1,r.updatedAt=new Date,e(this.memoryManager,r,p),await this.persistSession(r);let m=i(p);if(m.length>0){for(let i of m){let o=a(i.arguments),{invocation:s,result:c}=await this.toolExecutor.execute(i.name,o,{session:r,tenantId:t.tenantId,actorId:t.actorId,metadata:t.metadata,emit:(e,t)=>this.emit(e,t)});l.push(s);let u={role:`tool`,name:i.name,toolCallId:i.id,content:[{type:`tool-result`,toolCallId:i.id,output:JSON.stringify(c??{})}]};r.messages.push(u),e(this.memoryManager,r,u),await this.persistSession(r),await this.emit(`agent.tool.completed`,{sessionId:r.sessionId,agent:n.meta.name,toolName:i.name,tenantId:t.tenantId})}continue}let h=o(p),g=s(p,n.policy?.confidence),_=c(g,n);if(r.status=_?`escalated`:`completed`,r.lastConfidence=g,await this.persistSession(r),_&&this.approvalWorkflow){let e=await this.approvalWorkflow.requestApproval(r,`Low confidence response`,{confidence:g,outputText:h});d=e.id,await this.emit(`agent.approval_requested`,{sessionId:r.sessionId,agent:n.meta.name,tenantId:t.tenantId,metadata:{approvalId:e.id}})}return await this.emit(_?`agent.escalated`:`agent.completed`,{sessionId:r.sessionId,agent:n.meta.name,tenantId:t.tenantId,metadata:{confidence:g,finishReason:u.finishReason??`stop`}}),{session:r,response:u,outputText:h,confidence:g,iterations:r.iterations,requiresEscalation:_,approvalRequestId:d,finishReason:u.finishReason??`stop`,toolInvocations:l}}return r.status=`failed`,await this.persistSession(r),await this.emit(`agent.failed`,{sessionId:r.sessionId,agent:n.meta.name,tenantId:t.tenantId,metadata:{reason:`max_iterations`}}),{session:r,response:u??{message:{role:`assistant`,content:[{type:`text`,text:``}]}},outputText:u?o(u.message):``,confidence:r.lastConfidence??0,iterations:r.iterations,requiresEscalation:!0,approvalRequestId:d,finishReason:`max_iterations`,toolInvocations:l}}async loadSession(e,n){if(n.sessionId){let e=await this.sessionStore.get(n.sessionId);if(e)return e}let r=new Date,i={sessionId:n.sessionId??t(),agent:e.meta.name,version:e.meta.version,tenantId:n.tenantId,status:`running`,messages:[],createdAt:r,updatedAt:r,iterations:0,metadata:n.metadata};return await this.emit(`agent.session.created`,{sessionId:i.sessionId,agent:e.meta.name,tenantId:n.tenantId}),i}appendUserMessage(t,n){let r={role:`user`,content:[{type:`text`,text:n.input}],metadata:n.metadata};t.messages.push(r),e(this.memoryManager,t,r)}buildMessages(e,t,n){return[{role:`system`,content:[{type:`text`,text:[this.defaultSystemPrompt,e.instructions,n.instructionsOverride,this.renderKnowledgeInstructions(e)].filter(Boolean).join(`
|
|
2
2
|
|
|
3
3
|
`)}]},...t.messages]}renderKnowledgeInstructions(e){return e.knowledge?.length?`Knowledge spaces available:\n${e.knowledge.map(e=>{let t=e.category??`unspecified`,n=e.instructions?` Guidance: ${e.instructions}`:``;return`- ${e.key} (category: ${t})${n}`}).join(`
|
|
4
|
-
`)}`:``}async persistSession(e){e.updatedAt=new Date,await this.sessionStore.save(e),await this.emit(`agent.session.updated`,{sessionId:e.sessionId,agent:e.agent,tenantId:e.tenantId,metadata:{status:e.status}})}async emit(e,t){await this.eventEmitter?.(e,t)}ensureTools(e){for(let t of e.tools)if(!this.toolExecutor.has(t.name))throw Error(`Agent ${e.meta.name} requires tool "${t.name}" but it is not registered.`)}};function i(e){return e.content.filter(e=>e.type===`tool-call`)}function a(e){if(!e)return{};try{return JSON.parse(e)}catch{return e}}function o(e){return e.content.map(e=>`text`in e?e.text:``).join(``).trim()}function s(e,t){let n=e.metadata?.confidence??e.metadata?.Confidence,r=n?Number.parseFloat(n):NaN;return Number.isNaN(r)?t?.default??.5:Math.max(0,Math.min(1,r))}function c(e,t){let n=t.policy?.confidence?.min??.7;return e<(t.policy?.escalation?.confidenceThreshold??n)}export{r as AgentRunner};
|
|
5
|
-
//# sourceMappingURL=runner.js.map
|
|
4
|
+
`)}`:``}async persistSession(e){e.updatedAt=new Date,await this.sessionStore.save(e),await this.emit(`agent.session.updated`,{sessionId:e.sessionId,agent:e.agent,tenantId:e.tenantId,metadata:{status:e.status}})}async emit(e,t){await this.eventEmitter?.(e,t)}ensureTools(e){for(let t of e.tools)if(!this.toolExecutor.has(t.name))throw Error(`Agent ${e.meta.name} requires tool "${t.name}" but it is not registered.`)}};function i(e){return e.content.filter(e=>e.type===`tool-call`)}function a(e){if(!e)return{};try{return JSON.parse(e)}catch{return e}}function o(e){return e.content.map(e=>`text`in e?e.text:``).join(``).trim()}function s(e,t){let n=e.metadata?.confidence??e.metadata?.Confidence,r=n?Number.parseFloat(n):NaN;return Number.isNaN(r)?t?.default??.5:Math.max(0,Math.min(1,r))}function c(e,t){let n=t.policy?.confidence?.min??.7;return e<(t.policy?.escalation?.confidenceThreshold??n)}export{r as AgentRunner};
|
package/dist/spec.d.ts
CHANGED
|
@@ -74,5 +74,4 @@ declare class AgentRegistry {
|
|
|
74
74
|
require(name: string, version?: number): AgentSpec;
|
|
75
75
|
}
|
|
76
76
|
//#endregion
|
|
77
|
-
export { AgentConfidencePolicy, AgentEscalationPolicy, AgentKnowledgeRef, AgentMemoryConfig, AgentMeta, AgentPolicy, AgentRegistry, AgentSpec, AgentToolConfig, defineAgent };
|
|
78
|
-
//# sourceMappingURL=spec.d.ts.map
|
|
77
|
+
export { AgentConfidencePolicy, AgentEscalationPolicy, AgentKnowledgeRef, AgentMemoryConfig, AgentMeta, AgentPolicy, AgentRegistry, AgentSpec, AgentToolConfig, defineAgent };
|
package/dist/spec.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
const e=e=>`${e.name}.v${e.version}`;function t(e){if(!e.meta?.name)throw Error(`Agent name is required`);if(!Number.isFinite(e.meta.version))throw Error(`Agent ${e.meta.name} is missing a numeric version`);if(!e.instructions?.trim())throw Error(`Agent ${e.meta.name} requires instructions`);if(!e.tools?.length)throw Error(`Agent ${e.meta.name} must expose at least one tool`);return Object.freeze(e)}var n=class{specs=new Map;register(t){let n=e(t.meta);if(this.specs.has(n))throw Error(`Duplicate agent spec registered for ${n}`);return this.specs.set(n,t),this}list(){return[...this.specs.values()]}get(e,t){if(t!=null)return this.specs.get(`${e}.v${t}`);let n,r=-1/0;for(let t of this.specs.values())t.meta.name===e&&t.meta.version>r&&(n=t,r=t.meta.version);return n}require(e,t){let n=this.get(e,t);if(!n)throw Error(`Agent spec not found for ${e}${t?`.v${t}`:``}`);return n}};export{n as AgentRegistry,t as defineAgent};
|
|
2
|
-
//# sourceMappingURL=spec.js.map
|
|
1
|
+
const e=e=>`${e.name}.v${e.version}`;function t(e){if(!e.meta?.name)throw Error(`Agent name is required`);if(!Number.isFinite(e.meta.version))throw Error(`Agent ${e.meta.name} is missing a numeric version`);if(!e.instructions?.trim())throw Error(`Agent ${e.meta.name} requires instructions`);if(!e.tools?.length)throw Error(`Agent ${e.meta.name} must expose at least one tool`);return Object.freeze(e)}var n=class{specs=new Map;register(t){let n=e(t.meta);if(this.specs.has(n))throw Error(`Duplicate agent spec registered for ${n}`);return this.specs.set(n,t),this}list(){return[...this.specs.values()]}get(e,t){if(t!=null)return this.specs.get(`${e}.v${t}`);let n,r=-1/0;for(let t of this.specs.values())t.meta.name===e&&t.meta.version>r&&(n=t,r=t.meta.version);return n}require(e,t){let n=this.get(e,t);if(!n)throw Error(`Agent spec not found for ${e}${t?`.v${t}`:``}`);return n}};export{n as AgentRegistry,t as defineAgent};
|
package/dist/tools/executor.d.ts
CHANGED
package/dist/tools/executor.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{setTimeout as e}from"node:timers/promises";var t=class{tools=new Map;abortGracePeriodMs;constructor(e){this.abortGracePeriodMs=e?.abortGracePeriodMs??250,e?.tools?.forEach(e=>this.register(e))}register(e){return this.tools.set(e.definition.name,e),this}listLLMTools(e){return e?.length?e.map(e=>this.tools.get(e)?.definition).filter(e=>!!e):[...this.tools.values()].map(e=>e.definition)}has(e){return this.tools.has(e)}async execute(t,n,r){let i=this.tools.get(t);if(!i)throw Error(`Agent tool ${t} is not registered`);let a={name:t,arguments:n,startedAt:new Date,success:!1};try{let t=new AbortController,o=i.timeoutMs??1e4,s=setTimeout(()=>t.abort(),o);try{let e=await Promise.race([i.handler(n,{...r,emit:r.emit}),this.rejectOnAbort(t.signal,o)]);return a.success=!0,{invocation:a,result:e}}finally{clearTimeout(s),t.signal.aborted&&await e(this.abortGracePeriodMs).catch(()=>void 0)}}catch(e){throw a.error=e instanceof Error?e.message:String(e),e}finally{a.completedAt=new Date,a.durationMs=a.completedAt.getTime()-a.startedAt.getTime()}}async rejectOnAbort(e,t){if(e.aborted)throw Error(`Tool execution aborted`);return new Promise((n,r)=>{e.addEventListener(`abort`,()=>r(Error(`Tool execution timed out after ${t}ms`)),{once:!0})})}};export{t as ToolExecutor};
|
|
2
|
-
//# sourceMappingURL=executor.js.map
|
|
1
|
+
import{setTimeout as e}from"node:timers/promises";var t=class{tools=new Map;abortGracePeriodMs;constructor(e){this.abortGracePeriodMs=e?.abortGracePeriodMs??250,e?.tools?.forEach(e=>this.register(e))}register(e){return this.tools.set(e.definition.name,e),this}listLLMTools(e){return e?.length?e.map(e=>this.tools.get(e)?.definition).filter(e=>!!e):[...this.tools.values()].map(e=>e.definition)}has(e){return this.tools.has(e)}async execute(t,n,r){let i=this.tools.get(t);if(!i)throw Error(`Agent tool ${t} is not registered`);let a={name:t,arguments:n,startedAt:new Date,success:!1};try{let t=new AbortController,o=i.timeoutMs??1e4,s=setTimeout(()=>t.abort(),o);try{let e=await Promise.race([i.handler(n,{...r,emit:r.emit}),this.rejectOnAbort(t.signal,o)]);return a.success=!0,{invocation:a,result:e}}finally{clearTimeout(s),t.signal.aborted&&await e(this.abortGracePeriodMs).catch(()=>void 0)}}catch(e){throw a.error=e instanceof Error?e.message:String(e),e}finally{a.completedAt=new Date,a.durationMs=a.completedAt.getTime()-a.startedAt.getTime()}}async rejectOnAbort(e,t){if(e.aborted)throw Error(`Tool execution aborted`);return new Promise((n,r)=>{e.addEventListener(`abort`,()=>r(Error(`Tool execution timed out after ${t}ms`)),{once:!0})})}};export{t as ToolExecutor};
|
package/dist/types.d.ts
CHANGED
|
@@ -92,5 +92,4 @@ interface AgentToolDefinitionWithHandler {
|
|
|
92
92
|
}
|
|
93
93
|
type AgentRunnerEventEmitter = (event: AgentEventName, payload: AgentEventPayload) => void | Promise<void>;
|
|
94
94
|
//#endregion
|
|
95
|
-
export { AgentEventName, AgentEventPayload, AgentMessage, AgentMessageMetadata, AgentRunRequestInput, AgentRunResult, AgentRunnerEventEmitter, AgentSessionState, AgentStatus, AgentToolContext, AgentToolDefinitionWithHandler, AgentToolInvocation, AgentToolResult };
|
|
96
|
-
//# sourceMappingURL=types.d.ts.map
|
|
95
|
+
export { AgentEventName, AgentEventPayload, AgentMessage, AgentMessageMetadata, AgentRunRequestInput, AgentRunResult, AgentRunnerEventEmitter, AgentSessionState, AgentStatus, AgentToolContext, AgentToolDefinitionWithHandler, AgentToolInvocation, AgentToolResult };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lssm/lib.ai-agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"README.md"
|
|
11
11
|
],
|
|
12
12
|
"scripts": {
|
|
13
|
+
"publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
|
|
13
14
|
"build": "bun build:bundle && bun build:types",
|
|
14
15
|
"build:bundle": "tsdown",
|
|
15
16
|
"build:types": "tsc --noEmit",
|
|
@@ -18,17 +19,16 @@
|
|
|
18
19
|
"lint": "bun lint:fix",
|
|
19
20
|
"lint:fix": "eslint src --fix",
|
|
20
21
|
"lint:check": "eslint src",
|
|
21
|
-
"test": "
|
|
22
|
+
"test": "bun run"
|
|
22
23
|
},
|
|
23
24
|
"dependencies": {
|
|
24
|
-
"@lssm/lib.contracts": "
|
|
25
|
+
"@lssm/lib.contracts": "1.11.1"
|
|
25
26
|
},
|
|
26
27
|
"devDependencies": {
|
|
27
|
-
"@lssm/tool.tsdown": "
|
|
28
|
-
"@lssm/tool.typescript": "
|
|
28
|
+
"@lssm/tool.tsdown": "0.12.1",
|
|
29
|
+
"@lssm/tool.typescript": "0.11.1",
|
|
29
30
|
"tsdown": "^0.16.6",
|
|
30
|
-
"typescript": "^5.9.3"
|
|
31
|
-
"vitest": "^1.6.0"
|
|
31
|
+
"typescript": "^5.9.3"
|
|
32
32
|
},
|
|
33
33
|
"exports": {
|
|
34
34
|
".": "./dist/index.js",
|
|
@@ -43,5 +43,8 @@
|
|
|
43
43
|
"./tools/executor": "./dist/tools/executor.js",
|
|
44
44
|
"./types": "./dist/types.js",
|
|
45
45
|
"./*": "./*"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
46
49
|
}
|
|
47
50
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","names":[],"sources":["../../src/approval/workflow.ts"],"sourcesContent":[],"mappings":";;;KAGY,cAAA;UAEK,eAAA;EAFL,EAAA,EAAA,MAAA;EAEK,SAAA,EAAA,MAAA;EAMF,KAAA,EAAA,MAAA;EACL,QAAA,CAAA,EAAA,MAAA;EACE,MAAA,EAAA,MAAA;EAEG,WAAA,EAJA,IAIA;EAAI,MAAA,EAHT,cAGS;EAIF,OAAA,CAAA,EANL,MAMkB,CAAA,MAAA,EAAA,OAAA,CAAA;EACZ,QAAA,CAAA,EAAA,MAAA;EAAkB,UAAA,CAAA,EALrB,IAKqB;EAGV,KAAA,CAAA,EAAA,MAAA;;AAAb,UAJI,aAAA,CAIJ;EACR,MAAA,CAAA,OAAA,EAJa,eAIb,CAAA,EAJ+B,OAI/B,CAAA,IAAA,CAAA;EACW,MAAA,CAAA,EAAA,EAAA,MAAA,EAAA,OAAA,EAFH,OAEG,CAFK,IAEL,CAFU,eAEV,EAAA,IAAA,GAAA,WAAA,CAAA,CAAA,CAAA,EADX,OACW,CAAA,IAAA,CAAA;EAAyB,IAAA,CAAA,MAAA,CAAA,EAAzB,cAAyB,CAAA,EAAR,OAAQ,CAAA,eAAA,EAAA,CAAA;;AAAD,cAG3B,qBAAA,YAAiC,aAHN,CAAA;EAG3B,iBAAA,KAAA;EAGW,MAAA,CAAA,OAAA,EAAA,eAAA,CAAA,EAAkB,OAAlB,CAAA,IAAA,CAAA;EAAkB,MAAA,CAAA,EAAA,EAAA,MAAA,EAAA,OAAA,EAM7B,OAN6B,CAMrB,IANqB,CAMhB,eANgB,EAAA,IAAA,GAAA,WAAA,CAAA,CAAA,CAAA,EAOrC,OAPqC,CAAA,IAAA,CAAA;EAMhB,IAAA,CAAA,MAAA,CAAA,EAOJ,cAPI,CAAA,EAOa,OAPb,CAOqB,eAPrB,EAAA,CAAA;;AAAb,UAcI,uBAAA,CAdJ;EACR,KAAA,CAAA,EAcK,aAdL;;AAM0C,cAWlC,gBAAA,CAXkC;EAAR,iBAAA,KAAA;EAhBO,WAAA,CAAA,KAAA,CAAA,EA6BlB,aA7BkB;EAAa,eAAA,CAAA,OAAA,EAiC9C,iBAjC8C,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAmC7C,MAnC6C,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAmCtB,OAnCsB,CAmCtB,eAnCsB,CAAA;EAuB1C,OAAA,CAAA,EAAA,EAAA,MAAA,EAAA,MAAuB,EA8B5B,OA9B4B,CA8BpB,cA7BV,EAAa,SAAA,CAAA,EAAA,QAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,MAAA,CAAA,EA+BL,OA/BK,CAAA,IAAA,CAAA;EAGV,WAAA,CAAA,CAAA,EAsCM,OAtCU,CAsCV,eAtCU,EAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.js","names":["store: ApprovalStore","request: ApprovalRequest"],"sources":["../../src/approval/workflow.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { AgentSessionState } from '../types';\n\nexport type ApprovalStatus = 'pending' | 'approved' | 'rejected';\n\nexport interface ApprovalRequest {\n id: string;\n sessionId: string;\n agent: string;\n tenantId?: string;\n reason: string;\n requestedAt: Date;\n status: ApprovalStatus;\n payload?: Record<string, unknown>;\n reviewer?: string;\n resolvedAt?: Date;\n notes?: string;\n}\n\nexport interface ApprovalStore {\n create(request: ApprovalRequest): Promise<void>;\n update(\n id: string,\n updates: Partial<Omit<ApprovalRequest, 'id' | 'sessionId'>>\n ): Promise<void>;\n list(status?: ApprovalStatus): Promise<ApprovalRequest[]>;\n}\n\nexport class InMemoryApprovalStore implements ApprovalStore {\n private readonly items: ApprovalRequest[] = [];\n\n async create(request: ApprovalRequest): Promise<void> {\n this.items.push(request);\n }\n\n async update(\n id: string,\n updates: Partial<Omit<ApprovalRequest, 'id' | 'sessionId'>>\n ): Promise<void> {\n const index = this.items.findIndex((item) => item.id === id);\n if (index === -1) return;\n this.items[index] = { ...this.items[index], ...updates } as ApprovalRequest;\n }\n\n async list(status?: ApprovalStatus): Promise<ApprovalRequest[]> {\n return status\n ? this.items.filter((item) => item.status === status)\n : [...this.items];\n }\n}\n\nexport interface ApprovalWorkflowOptions {\n store?: ApprovalStore;\n}\n\nexport class ApprovalWorkflow {\n constructor(\n private readonly store: ApprovalStore = new InMemoryApprovalStore()\n ) {}\n\n async requestApproval(\n session: AgentSessionState,\n reason: string,\n payload?: Record<string, unknown>\n ) {\n const request: ApprovalRequest = {\n id: randomUUID(),\n sessionId: session.sessionId,\n agent: session.agent,\n tenantId: session.tenantId,\n reason,\n requestedAt: new Date(),\n status: 'pending',\n payload,\n };\n await this.store.create(request);\n return request;\n }\n\n async resolve(\n id: string,\n status: Exclude<ApprovalStatus, 'pending'>,\n reviewer: string,\n notes?: string\n ) {\n await this.store.update(id, {\n status,\n reviewer,\n resolvedAt: new Date(),\n notes,\n });\n }\n\n async listPending() {\n return this.store.list('pending');\n }\n}\n"],"mappings":"yCA4BA,IAAa,EAAb,KAA4D,CAC1D,MAA4C,EAAE,CAE9C,MAAM,OAAO,EAAyC,CACpD,KAAK,MAAM,KAAK,EAAQ,CAG1B,MAAM,OACJ,EACA,EACe,CACf,IAAM,EAAQ,KAAK,MAAM,UAAW,GAAS,EAAK,KAAO,EAAG,CACxD,IAAU,KACd,KAAK,MAAM,GAAS,CAAE,GAAG,KAAK,MAAM,GAAQ,GAAG,EAAS,EAG1D,MAAM,KAAK,EAAqD,CAC9D,OAAO,EACH,KAAK,MAAM,OAAQ,GAAS,EAAK,SAAW,EAAO,CACnD,CAAC,GAAG,KAAK,MAAM,GAQV,EAAb,KAA8B,CAC5B,YACE,EAAwC,IAAI,EAC5C,CADiB,KAAA,MAAA,EAGnB,MAAM,gBACJ,EACA,EACA,EACA,CACA,IAAMC,EAA2B,CAC/B,GAAI,GAAY,CAChB,UAAW,EAAQ,UACnB,MAAO,EAAQ,MACf,SAAU,EAAQ,SAClB,SACA,YAAa,IAAI,KACjB,OAAQ,UACR,UACD,CAED,OADA,MAAM,KAAK,MAAM,OAAO,EAAQ,CACzB,EAGT,MAAM,QACJ,EACA,EACA,EACA,EACA,CACA,MAAM,KAAK,MAAM,OAAO,EAAI,CAC1B,SACA,WACA,WAAY,IAAI,KAChB,QACD,CAAC,CAGJ,MAAM,aAAc,CAClB,OAAO,KAAK,MAAM,KAAK,UAAU"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory.d.ts","names":[],"sources":["../../src/memory/in-memory.ts"],"sourcesContent":[],"mappings":";;;;UAaiB,0BAAA;;EAAA,UAAA,CAAA,EAAA,MAAA;AAKjB;AAKwB,cALX,mBAAA,SAA4B,sBAAA,CAKjB;EAMiB,iBAAA,KAAA;EAAR,iBAAA,UAAA;EASV,iBAAA,KAAA;EAAqB,WAAA,CAAA,OAAA,CAAA,EAfpB,0BAeoB;EAQjB,IAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAjBM,OAiBN,CAjBc,kBAiBd,GAAA,IAAA,CAAA;EAA4B,IAAA,CAAA,QAAA,EARhC,kBAQgC,CAAA,EARX,OAQW,CAAA,IAAA,CAAA;EAAR,SAAA,CAAA,OAAA,EAApB,iBAAoB,CAAA,EAAA,OAAA,CAAQ,mBAAR,CAAA;EA5BN,QAAA,IAAA;EAAsB,QAAA,YAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory.js","names":[],"sources":["../../src/memory/in-memory.ts"],"sourcesContent":["import type { AgentSessionState } from '../types';\nimport {\n BaseAgentMemoryManager,\n type AgentMemoryEntry,\n type AgentMemorySnapshot,\n type AgentSessionMemory,\n} from './manager';\n\ninterface StoredSession {\n data: AgentSessionMemory;\n expiresAt: number;\n}\n\nexport interface InMemoryAgentMemoryOptions {\n ttlMinutes?: number;\n maxEntries?: number;\n}\n\nexport class InMemoryAgentMemory extends BaseAgentMemoryManager {\n private readonly ttlMs: number;\n private readonly maxEntries: number;\n private readonly store = new Map<string, StoredSession>();\n\n constructor(options?: InMemoryAgentMemoryOptions) {\n super();\n this.ttlMs = (options?.ttlMinutes ?? 60) * 60 * 1000;\n this.maxEntries = options?.maxEntries ?? 250;\n }\n\n async load(sessionId: string): Promise<AgentSessionMemory | null> {\n this.evictExpired();\n const stored = this.store.get(sessionId);\n if (!stored) return null;\n stored.data.session.updatedAt = new Date();\n stored.expiresAt = Date.now() + this.ttlMs;\n return stored.data;\n }\n\n async save(snapshot: AgentSessionMemory): Promise<void> {\n this.trim(snapshot.memory.entries);\n this.store.set(snapshot.session.sessionId, {\n data: snapshot,\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n async summarize(session: AgentSessionState): Promise<AgentMemorySnapshot> {\n const current =\n (await this.load(session.sessionId)) ?? this.bootstrapMemory(session);\n const content = current.memory.entries\n .slice(-10)\n .map((entry) => `- ${entry.type}: ${entry.content}`)\n .join('\\n');\n current.memory.summary = content;\n current.memory.lastSummarizedAt = new Date();\n await this.save(current);\n return current.memory;\n }\n\n private trim(entries: AgentMemoryEntry[]) {\n if (entries.length <= this.maxEntries) return;\n entries.splice(0, entries.length - this.maxEntries);\n }\n\n private evictExpired() {\n const now = Date.now();\n for (const [sessionId, stored] of this.store.entries()) {\n if (stored.expiresAt <= now) {\n this.store.delete(sessionId);\n }\n }\n }\n}\n"],"mappings":"sDAkBA,IAAa,EAAb,cAAyC,CAAuB,CAC9D,MACA,WACA,MAAyB,IAAI,IAE7B,YAAY,EAAsC,CAChD,OAAO,CACP,KAAK,OAAS,GAAS,YAAc,IAAM,GAAK,IAChD,KAAK,WAAa,GAAS,YAAc,IAG3C,MAAM,KAAK,EAAuD,CAChE,KAAK,cAAc,CACnB,IAAM,EAAS,KAAK,MAAM,IAAI,EAAU,CAIxC,OAHK,GACL,EAAO,KAAK,QAAQ,UAAY,IAAI,KACpC,EAAO,UAAY,KAAK,KAAK,CAAG,KAAK,MAC9B,EAAO,MAHM,KAMtB,MAAM,KAAK,EAA6C,CACtD,KAAK,KAAK,EAAS,OAAO,QAAQ,CAClC,KAAK,MAAM,IAAI,EAAS,QAAQ,UAAW,CACzC,KAAM,EACN,UAAW,KAAK,KAAK,CAAG,KAAK,MAC9B,CAAC,CAGJ,MAAM,UAAU,EAA0D,CACxE,IAAM,EACH,MAAM,KAAK,KAAK,EAAQ,UAAU,EAAK,KAAK,gBAAgB,EAAQ,CACjE,EAAU,EAAQ,OAAO,QAC5B,MAAM,IAAI,CACV,IAAK,GAAU,KAAK,EAAM,KAAK,IAAI,EAAM,UAAU,CACnD,KAAK;EAAK,CAIb,MAHA,GAAQ,OAAO,QAAU,EACzB,EAAQ,OAAO,iBAAmB,IAAI,KACtC,MAAM,KAAK,KAAK,EAAQ,CACjB,EAAQ,OAGjB,KAAa,EAA6B,CACpC,EAAQ,QAAU,KAAK,YAC3B,EAAQ,OAAO,EAAG,EAAQ,OAAS,KAAK,WAAW,CAGrD,cAAuB,CACrB,IAAM,EAAM,KAAK,KAAK,CACtB,IAAK,GAAM,CAAC,EAAW,KAAW,KAAK,MAAM,SAAS,CAChD,EAAO,WAAa,GACtB,KAAK,MAAM,OAAO,EAAU"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","names":[],"sources":["../../src/memory/manager.ts"],"sourcesContent":[],"mappings":";;;UAGiB,gBAAA;;EAAA,IAAA,EAAA,MAAA,GAAA,WAAgB,GAAA,MAIpB,GACA,QAAM;EAGF,OAAA,EAAA,MAAA;EAMA,SAAA,EAVJ,IAUI;EAKA,QAAA,CAAA,EAdJ,MAcI,CAAA,MAAkB,EAAA,MAAA,CAAA;;AACR,UAZV,mBAAA,CAYU;EACV,OAAA,EAZN,gBAYM,EAAA;EAAqB,OAAA,CAAA,EAAA,MAAA;EAEzB,gBAAA,CAAA,EAZQ,IAYR;;AACF,UAVM,kBAAA,CAUN;EAA2D,OAAA,EAT3D,iBAS2D;EACzD,MAAA,EATH,mBASG;;AAEA,UARI,kBAAA,CAQJ;EACA,IAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EARc,OAQd,CARsB,kBAQtB,GAAA,IAAA,CAAA;EAAR,IAAA,CAAA,QAAA,EAPY,kBAOZ,CAAA,EAPiC,OAOjC,CAAA,IAAA,CAAA;EACY,MAAA,CAAA,OAAA,EANJ,iBAMI,EAAA,KAAA,EALN,IAKM,CALD,gBAKC,EAAA,IAAA,GAAA,WAAA,CAAA,GAAA;IAAoB,SAAA,CAAA,EALiC,IAKjC;EAAO,CAAA,CAAA,EAJvC,OAIuC,CAJ/B,kBAI+B,CAAA;EAGtB,SAAA,CAAA,OAAA,EALT,iBAKgC,CAAA,EAJxC,OAIwC,CAJhC,mBAIgC,GAAA,SAAA,CAAA;EACD,KAAA,CAAA,OAAA,EAJ3B,iBAI2B,CAAA,EAJP,OAIO,CAAA,IAAA,CAAA;;AAClB,uBAFJ,sBAAA,YAAkC,kBAE9B,CAAA;EAAqB,SAAA,IAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EADX,OACW,CADH,kBACG,GAAA,IAAA,CAAA;EAGlC,SAAA,IAAA,CAAA,QAAA,EAHa,kBAGb,CAAA,EAHkC,OAGlC,CAAA,IAAA,CAAA;EACG,MAAA,CAAA,OAAA,EADH,iBACG,EAAA,KAAA,EAAL,IAAK,CAAA,gBAAA,EAAA,IAAA,GAAA,WAAA,CAAA,GAAA;IAAL,SAAA,CAAA,EAA2D,IAA3D;EAA2D,CAAA,CAAA,EACjE,OADiE,CACzD,kBADyD,CAAA;EACzD,SAAA,CAAA,QAAA,EAcC,iBAdD,CAAA,EAeR,OAfQ,CAeA,mBAfA,GAAA,SAAA,CAAA;EAAR,KAAA,CAAA,QAAA,EAmBmB,iBAnBnB,CAAA,EAmBuC,OAnBvC,CAAA,IAAA,CAAA;EAcS,UAAA,eAAA,CAAA,OAAA,EASuB,iBATvB,CAAA,EAS2C,kBAT3C;;AACT,iBA0BW,oBAAA,CA1BX,OAAA,EA2BM,kBA3BN,GAAA,SAAA,EAAA,OAAA,EA4BM,iBA5BN,EAAA,OAAA,EA6BM,YA7BN,CAAA,EAAA,IAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","names":["finalEntry: AgentMemoryEntry"],"sources":["../../src/memory/manager.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { AgentMessage, AgentSessionState } from '../types';\n\nexport interface AgentMemoryEntry {\n id: string;\n type: 'user' | 'assistant' | 'tool' | 'system';\n content: string;\n createdAt: Date;\n metadata?: Record<string, string>;\n}\n\nexport interface AgentMemorySnapshot {\n entries: AgentMemoryEntry[];\n summary?: string;\n lastSummarizedAt?: Date;\n}\n\nexport interface AgentSessionMemory {\n session: AgentSessionState;\n memory: AgentMemorySnapshot;\n}\n\nexport interface AgentMemoryManager {\n load(sessionId: string): Promise<AgentSessionMemory | null>;\n save(snapshot: AgentSessionMemory): Promise<void>;\n append(\n session: AgentSessionState,\n entry: Omit<AgentMemoryEntry, 'id' | 'createdAt'> & { createdAt?: Date }\n ): Promise<AgentSessionMemory>;\n summarize(\n session: AgentSessionState\n ): Promise<AgentMemorySnapshot | undefined>;\n prune(session: AgentSessionState): Promise<void>;\n}\n\nexport abstract class BaseAgentMemoryManager implements AgentMemoryManager {\n abstract load(sessionId: string): Promise<AgentSessionMemory | null>;\n abstract save(snapshot: AgentSessionMemory): Promise<void>;\n\n async append(\n session: AgentSessionState,\n entry: Omit<AgentMemoryEntry, 'id' | 'createdAt'> & { createdAt?: Date }\n ): Promise<AgentSessionMemory> {\n const current =\n (await this.load(session.sessionId)) ?? this.bootstrapMemory(session);\n const finalEntry: AgentMemoryEntry = {\n id: randomUUID(),\n createdAt: entry.createdAt ?? new Date(),\n ...entry,\n };\n current.memory.entries.push(finalEntry);\n await this.save(current);\n return current;\n }\n\n async summarize(\n _session: AgentSessionState\n ): Promise<AgentMemorySnapshot | undefined> {\n return undefined;\n }\n\n async prune(_session: AgentSessionState): Promise<void> {\n // noop by default\n }\n\n protected bootstrapMemory(session: AgentSessionState): AgentSessionMemory {\n return {\n session,\n memory: {\n entries: session.messages.map<AgentMemoryEntry>((message) => ({\n id: randomUUID(),\n createdAt: new Date(),\n type: message.role === 'assistant' ? 'assistant' : 'user',\n content: message.content\n .map((part) => ('text' in part ? part.text : ''))\n .join(''),\n metadata: message.metadata,\n })),\n },\n };\n }\n}\n\nexport function trackMessageInMemory(\n manager: AgentMemoryManager | undefined,\n session: AgentSessionState,\n message: AgentMessage\n) {\n if (!manager) return;\n void manager.append(session, {\n type: message.role,\n content: message.content\n .map((part) => ('text' in part ? part.text : ''))\n .join(''),\n metadata: message.metadata,\n });\n}\n"],"mappings":"yCAmCA,IAAsB,EAAtB,KAA2E,CAIzE,MAAM,OACJ,EACA,EAC6B,CAC7B,IAAM,EACH,MAAM,KAAK,KAAK,EAAQ,UAAU,EAAK,KAAK,gBAAgB,EAAQ,CACjEA,EAA+B,CACnC,GAAI,GAAY,CAChB,UAAW,EAAM,WAAa,IAAI,KAClC,GAAG,EACJ,CAGD,OAFA,EAAQ,OAAO,QAAQ,KAAK,EAAW,CACvC,MAAM,KAAK,KAAK,EAAQ,CACjB,EAGT,MAAM,UACJ,EAC0C,EAI5C,MAAM,MAAM,EAA4C,EAIxD,gBAA0B,EAAgD,CACxE,MAAO,CACL,UACA,OAAQ,CACN,QAAS,EAAQ,SAAS,IAAuB,IAAa,CAC5D,GAAI,GAAY,CAChB,UAAW,IAAI,KACf,KAAM,EAAQ,OAAS,YAAc,YAAc,OACnD,QAAS,EAAQ,QACd,IAAK,GAAU,SAAU,EAAO,EAAK,KAAO,GAAI,CAChD,KAAK,GAAG,CACX,SAAU,EAAQ,SACnB,EAAE,CACJ,CACF,GAIL,SAAgB,EACd,EACA,EACA,EACA,CACK,GACA,EAAQ,OAAO,EAAS,CAC3B,KAAM,EAAQ,KACd,QAAS,EAAQ,QACd,IAAK,GAAU,SAAU,EAAO,EAAK,KAAO,GAAI,CAChD,KAAK,GAAG,CACX,SAAU,EAAQ,SACnB,CAAC"}
|
package/dist/runner.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","names":[],"sources":["../src/runner.ts"],"sourcesContent":[],"mappings":";;;;;;;;UAuBU,iBAAA;0BACgB,QAAQ;EADxB,IAAA,CAAA,OAAA,EAEM,iBAFW,CAAA,EAES,OAFT,CAAA,IAAA,CAAA;;AACD,UAgBT,iBAAA,CAhBS;EACV,QAAA,EAgBJ,aAhBI;EAAoB,GAAA,EAiB7B,WAjB6B;EAAO,YAAA,EAkB3B,YAlB2B;EAe1B,aAAA,CAAA,EAIC,kBAJgB;EACtB,YAAA,CAAA,EAIK,iBAJL;EACL,YAAA,CAAA,EAIU,uBAJV;EACS,aAAA,CAAA,EAAA,MAAA;EACE,mBAAA,CAAA,EAAA,MAAA;EACD,gBAAA,CAAA,EAII,gBAJJ;;AAII,cAGR,WAAA,CAHQ;EAAgB,iBAAA,QAAA;EAGxB,iBAAW,GAAA;EAWF,iBAAA,YAAA;EAcD,iBAAA,aAAA;EAA+B,iBAAA,YAAA;EAAR,iBAAA,YAAA;EAAO,iBAAA,aAAA;;;sBAd7B;eAcD,uBAAuB,QAAQ"}
|
package/dist/runner.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","names":["toolInvocations: AgentToolInvocation[]","response: LLMResponse | null","approvalRequestId: string | undefined","toolMessage: AgentMessage","session: AgentSessionState","userMessage: AgentMessage"],"sources":["../src/runner.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type {\n LLMMessage,\n LLMProvider,\n LLMResponse,\n LLMToolCallPart,\n} from '@lssm/lib.contracts/integrations/providers/llm';\nimport type { AgentSpec, AgentRegistry } from './spec';\nimport type {\n AgentEventName,\n AgentEventPayload,\n AgentMessage,\n AgentRunRequestInput,\n AgentRunResult,\n AgentSessionState,\n AgentToolInvocation,\n AgentRunnerEventEmitter,\n} from './types';\nimport { ToolExecutor } from './tools/executor';\nimport type { AgentMemoryManager } from './memory/manager';\nimport { trackMessageInMemory } from './memory/manager';\nimport type { ApprovalWorkflow } from './approval';\n\ninterface AgentSessionStore {\n get(sessionId: string): Promise<AgentSessionState | null>;\n save(session: AgentSessionState): Promise<void>;\n}\n\nclass InMemoryAgentSessionStore implements AgentSessionStore {\n private readonly store = new Map<string, AgentSessionState>();\n\n async get(sessionId: string): Promise<AgentSessionState | null> {\n return this.store.get(sessionId) ?? null;\n }\n\n async save(session: AgentSessionState): Promise<void> {\n this.store.set(session.sessionId, { ...session });\n }\n}\n\nexport interface AgentRunnerConfig {\n registry: AgentRegistry;\n llm: LLMProvider;\n toolExecutor: ToolExecutor;\n memoryManager?: AgentMemoryManager;\n sessionStore?: AgentSessionStore;\n eventEmitter?: AgentRunnerEventEmitter;\n maxIterations?: number;\n defaultSystemPrompt?: string;\n approvalWorkflow?: ApprovalWorkflow;\n}\n\nexport class AgentRunner {\n private readonly registry: AgentRegistry;\n private readonly llm: LLMProvider;\n private readonly toolExecutor: ToolExecutor;\n private readonly memoryManager?: AgentMemoryManager;\n private readonly sessionStore: AgentSessionStore;\n private readonly eventEmitter?: AgentRunnerEventEmitter;\n private readonly maxIterations: number;\n private readonly defaultSystemPrompt: string;\n private readonly approvalWorkflow?: ApprovalWorkflow;\n\n constructor(config: AgentRunnerConfig) {\n this.registry = config.registry;\n this.llm = config.llm;\n this.toolExecutor = config.toolExecutor;\n this.memoryManager = config.memoryManager;\n this.sessionStore = config.sessionStore ?? new InMemoryAgentSessionStore();\n this.eventEmitter = config.eventEmitter;\n this.maxIterations = config.maxIterations ?? 6;\n this.defaultSystemPrompt =\n config.defaultSystemPrompt ??\n 'You are a ContractSpec agent. Follow policies, cite sources, and escalate when unsure.';\n this.approvalWorkflow = config.approvalWorkflow;\n }\n\n async run(request: AgentRunRequestInput): Promise<AgentRunResult> {\n const spec = this.registry.require(request.agent, request.version);\n this.ensureTools(spec);\n const session = await this.loadSession(spec, request);\n this.appendUserMessage(session, request);\n await this.persistSession(session);\n\n const toolInvocations: AgentToolInvocation[] = [];\n let response: LLMResponse | null = null;\n let approvalRequestId: string | undefined;\n\n for (let iteration = 0; iteration < this.maxIterations; iteration++) {\n await this.emit('agent.iteration.started', {\n sessionId: session.sessionId,\n agent: spec.meta.name,\n iteration: iteration + 1,\n tenantId: request.tenantId,\n });\n\n response = await this.llm.chat(\n this.buildMessages(spec, session, request),\n {\n tools: this.toolExecutor.listLLMTools(\n spec.tools.map((tool) => tool.name)\n ),\n metadata: {\n agent: spec.meta.name,\n tenantId: request.tenantId ?? '',\n },\n userId: request.actorId,\n }\n );\n\n const assistantMessage = response.message as AgentMessage;\n session.messages.push(assistantMessage);\n session.iterations += 1;\n session.updatedAt = new Date();\n trackMessageInMemory(this.memoryManager, session, assistantMessage);\n await this.persistSession(session);\n\n const toolCalls = extractToolCalls(assistantMessage);\n if (toolCalls.length > 0) {\n for (const call of toolCalls) {\n const args = safeParse(call.arguments);\n const { invocation, result } = await this.toolExecutor.execute(\n call.name,\n args,\n {\n session,\n tenantId: request.tenantId,\n actorId: request.actorId,\n metadata: request.metadata,\n emit: (event, payload) => this.emit(event, payload),\n }\n );\n toolInvocations.push(invocation);\n const toolMessage: AgentMessage = {\n role: 'tool',\n name: call.name,\n toolCallId: call.id,\n content: [\n {\n type: 'tool-result',\n toolCallId: call.id,\n output: JSON.stringify(result ?? {}),\n },\n ],\n } as LLMMessage;\n session.messages.push(toolMessage);\n trackMessageInMemory(this.memoryManager, session, toolMessage);\n await this.persistSession(session);\n await this.emit('agent.tool.completed', {\n sessionId: session.sessionId,\n agent: spec.meta.name,\n toolName: call.name,\n tenantId: request.tenantId,\n });\n }\n continue;\n }\n\n const outputText = getAssistantText(assistantMessage);\n const confidence = deriveConfidence(\n assistantMessage,\n spec.policy?.confidence\n );\n const requiresEscalation = shouldEscalate(confidence, spec);\n session.status = requiresEscalation ? 'escalated' : 'completed';\n session.lastConfidence = confidence;\n await this.persistSession(session);\n if (requiresEscalation && this.approvalWorkflow) {\n const approval = await this.approvalWorkflow.requestApproval(\n session,\n 'Low confidence response',\n {\n confidence,\n outputText,\n }\n );\n approvalRequestId = approval.id;\n await this.emit('agent.approval_requested', {\n sessionId: session.sessionId,\n agent: spec.meta.name,\n tenantId: request.tenantId,\n metadata: { approvalId: approval.id },\n });\n }\n await this.emit(\n requiresEscalation ? 'agent.escalated' : 'agent.completed',\n {\n sessionId: session.sessionId,\n agent: spec.meta.name,\n tenantId: request.tenantId,\n metadata: {\n confidence,\n finishReason: response.finishReason ?? 'stop',\n },\n }\n );\n\n return {\n session,\n response,\n outputText,\n confidence,\n iterations: session.iterations,\n requiresEscalation,\n approvalRequestId,\n finishReason: response.finishReason ?? 'stop',\n toolInvocations,\n };\n }\n\n session.status = 'failed';\n await this.persistSession(session);\n await this.emit('agent.failed', {\n sessionId: session.sessionId,\n agent: spec.meta.name,\n tenantId: request.tenantId,\n metadata: { reason: 'max_iterations' },\n });\n\n return {\n session,\n response:\n response ??\n ({\n message: { role: 'assistant', content: [{ type: 'text', text: '' }] },\n } as LLMResponse),\n outputText: response\n ? getAssistantText(response.message as AgentMessage)\n : '',\n confidence: session.lastConfidence ?? 0,\n iterations: session.iterations,\n requiresEscalation: true,\n approvalRequestId,\n finishReason: 'max_iterations',\n toolInvocations,\n };\n }\n\n private async loadSession(\n spec: AgentSpec,\n request: AgentRunRequestInput\n ): Promise<AgentSessionState> {\n if (request.sessionId) {\n const existing = await this.sessionStore.get(request.sessionId);\n if (existing) return existing;\n }\n const now = new Date();\n const session: AgentSessionState = {\n sessionId: request.sessionId ?? randomUUID(),\n agent: spec.meta.name,\n version: spec.meta.version,\n tenantId: request.tenantId,\n status: 'running',\n messages: [],\n createdAt: now,\n updatedAt: now,\n iterations: 0,\n metadata: request.metadata,\n };\n await this.emit('agent.session.created', {\n sessionId: session.sessionId,\n agent: spec.meta.name,\n tenantId: request.tenantId,\n });\n return session;\n }\n\n private appendUserMessage(\n session: AgentSessionState,\n request: AgentRunRequestInput\n ) {\n const userMessage: AgentMessage = {\n role: 'user',\n content: [{ type: 'text', text: request.input }],\n metadata: request.metadata,\n } as LLMMessage;\n session.messages.push(userMessage);\n trackMessageInMemory(this.memoryManager, session, userMessage);\n }\n\n private buildMessages(\n spec: AgentSpec,\n session: AgentSessionState,\n request: AgentRunRequestInput\n ): AgentMessage[] {\n const systemPrompt = [\n this.defaultSystemPrompt,\n spec.instructions,\n request.instructionsOverride,\n this.renderKnowledgeInstructions(spec),\n ]\n .filter(Boolean)\n .join('\\n\\n');\n\n const systemMessage: AgentMessage = {\n role: 'system',\n content: [{ type: 'text', text: systemPrompt }],\n } as LLMMessage;\n\n return [systemMessage, ...session.messages];\n }\n\n private renderKnowledgeInstructions(spec: AgentSpec): string {\n if (!spec.knowledge?.length) return '';\n const bullets = spec.knowledge\n .map((binding) => {\n const category = binding.category ?? 'unspecified';\n const instruction = binding.instructions\n ? ` Guidance: ${binding.instructions}`\n : '';\n return `- ${binding.key} (category: ${category})${instruction}`;\n })\n .join('\\n');\n return `Knowledge spaces available:\\n${bullets}`;\n }\n\n private async persistSession(session: AgentSessionState) {\n session.updatedAt = new Date();\n await this.sessionStore.save(session);\n await this.emit('agent.session.updated', {\n sessionId: session.sessionId,\n agent: session.agent,\n tenantId: session.tenantId,\n metadata: { status: session.status },\n });\n }\n\n private async emit(event: AgentEventName, payload: AgentEventPayload) {\n await this.eventEmitter?.(event, payload);\n }\n\n private ensureTools(spec: AgentSpec) {\n for (const tool of spec.tools) {\n if (!this.toolExecutor.has(tool.name)) {\n throw new Error(\n `Agent ${spec.meta.name} requires tool \"${tool.name}\" but it is not registered.`\n );\n }\n }\n }\n}\n\nfunction extractToolCalls(message: AgentMessage): LLMToolCallPart[] {\n return message.content.filter(\n (part): part is LLMToolCallPart => part.type === 'tool-call'\n );\n}\n\nfunction safeParse(payload?: string): unknown {\n if (!payload) return {};\n try {\n return JSON.parse(payload);\n } catch {\n return payload;\n }\n}\n\nfunction getAssistantText(message: AgentMessage): string {\n return message.content\n .map((part) => ('text' in part ? part.text : ''))\n .join('')\n .trim();\n}\n\nfunction deriveConfidence(\n message: AgentMessage,\n config?: { min?: number; default?: number }\n): number {\n const raw = message.metadata?.confidence ?? message.metadata?.Confidence;\n const parsed = raw ? Number.parseFloat(raw) : NaN;\n if (!Number.isNaN(parsed)) return Math.max(0, Math.min(1, parsed));\n return config?.default ?? 0.5;\n}\n\nfunction shouldEscalate(confidence: number, spec: AgentSpec): boolean {\n const min = spec.policy?.confidence?.min ?? 0.7;\n const threshold = spec.policy?.escalation?.confidenceThreshold ?? min;\n return confidence < threshold;\n}\n"],"mappings":"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"}
|
package/dist/spec.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spec.d.ts","names":[],"sources":["../src/spec.ts"],"sourcesContent":[],"mappings":";;;;;UAIiB,SAAA,SAAkB;;EAAlB,OAAA,EAAA,MAAU;AAK3B;AAciB,UAdA,eAAA,CAciB;EASjB,IAAA,EAAA,MAAA;EAOA,WAAA,CAAA,EAAA,MAAA;EAOA;EAWA,MAAA,CAAA,EA5CN,MA4CiB,CAAA,MAAA,EAAA,OACb,CAAA;EAKE;EACT,UAAA,CAAA,EAAA,MAAA;EAIC,SAAA,CAAA,EAAA,MAAA;EACE;EACG,cAAA,CAAA,EAAA,OAAA;EACH;EAAW,MAAA,CAAA,EAnDX,SAmDW;AAKtB;AAca,UAnEI,iBAAA,CAmES;EAGT,GAAA,EAAA,MAAA;EASP,OAAA,CAAA,EAAA,MAAA;EAI6B,QAAA,CAAA,EAhF1B,iBAgF0B;EAgBI,QAAA,CAAA,EAAA,OAAA;EAAS;;;UA1FnC,iBAAA;;;;;;UAOA,qBAAA;;;;;;UAOA,qBAAA;;;;;;;;;;UAWA,WAAA;eACF;eACA;;;UAIE,SAAA;QACT;;;;SAIC;WACE;cACG;WACH;;iBAKK,WAAA,OAAkB,YAAY;cAcjC,aAAA;;iBAGI;UASP;uCAI6B;2CAgBI"}
|
package/dist/spec.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spec.js","names":["latest: AgentSpec | undefined"],"sources":["../src/spec.ts"],"sourcesContent":["import type { OwnerShipMeta } from '@lssm/lib.contracts/ownership';\nimport type { KnowledgeCategory } from '@lssm/lib.contracts/knowledge/spec';\nimport type { PolicyRef } from '@lssm/lib.contracts/policy/spec';\n\nexport interface AgentMeta extends OwnerShipMeta {\n name: string;\n version: number;\n}\n\nexport interface AgentToolConfig {\n name: string;\n description?: string;\n /** JSON Schema fragment forwarded to the LLM tool definition. */\n schema?: Record<string, unknown>;\n /** Optional cooldown in milliseconds. */\n cooldownMs?: number;\n timeoutMs?: number;\n /** Whether the tool can be executed without human approval. */\n automationSafe?: boolean;\n /** Optional policy guard that must evaluate to allow the tool call. */\n policy?: PolicyRef;\n}\n\nexport interface AgentKnowledgeRef {\n key: string;\n version?: number;\n category?: KnowledgeCategory;\n required?: boolean;\n /** Additional instructions appended when the space is available. */\n instructions?: string;\n}\n\nexport interface AgentMemoryConfig {\n maxEntries?: number;\n ttlMinutes?: number;\n summaryTrigger?: number;\n persistLongTerm?: boolean;\n}\n\nexport interface AgentConfidencePolicy {\n /** Minimum acceptable confidence before escalation. Defaults to 0.7. */\n min?: number;\n /** Default value used when provider does not report confidence. */\n default?: number;\n}\n\nexport interface AgentEscalationPolicy {\n /** Auto escalate when confidence < threshold. */\n confidenceThreshold?: number;\n /** Escalate when a tool throws irrecoverable errors. */\n onToolFailure?: boolean;\n /** Escalate when iteration budget exceeded. */\n onTimeout?: boolean;\n /** Optional human approval workflow ID. */\n approvalWorkflow?: string;\n}\n\nexport interface AgentPolicy {\n confidence?: AgentConfidencePolicy;\n escalation?: AgentEscalationPolicy;\n flags?: string[];\n}\n\nexport interface AgentSpec {\n meta: AgentMeta;\n instructions: string;\n description?: string;\n tags?: string[];\n tools: AgentToolConfig[];\n memory?: AgentMemoryConfig;\n knowledge?: AgentKnowledgeRef[];\n policy?: AgentPolicy;\n}\n\nconst agentKey = (meta: AgentMeta) => `${meta.name}.v${meta.version}`;\n\nexport function defineAgent(spec: AgentSpec): AgentSpec {\n if (!spec.meta?.name) throw new Error('Agent name is required');\n if (!Number.isFinite(spec.meta.version)) {\n throw new Error(`Agent ${spec.meta.name} is missing a numeric version`);\n }\n if (!spec.instructions?.trim()) {\n throw new Error(`Agent ${spec.meta.name} requires instructions`);\n }\n if (!spec.tools?.length) {\n throw new Error(`Agent ${spec.meta.name} must expose at least one tool`);\n }\n return Object.freeze(spec);\n}\n\nexport class AgentRegistry {\n private readonly specs = new Map<string, AgentSpec>();\n\n register(spec: AgentSpec): this {\n const key = agentKey(spec.meta);\n if (this.specs.has(key)) {\n throw new Error(`Duplicate agent spec registered for ${key}`);\n }\n this.specs.set(key, spec);\n return this;\n }\n\n list(): AgentSpec[] {\n return [...this.specs.values()];\n }\n\n get(name: string, version?: number): AgentSpec | undefined {\n if (version != null) {\n return this.specs.get(`${name}.v${version}`);\n }\n let latest: AgentSpec | undefined;\n let maxVersion = -Infinity;\n for (const spec of this.specs.values()) {\n if (spec.meta.name !== name) continue;\n if (spec.meta.version > maxVersion) {\n latest = spec;\n maxVersion = spec.meta.version;\n }\n }\n return latest;\n }\n\n require(name: string, version?: number): AgentSpec {\n const spec = this.get(name, version);\n if (!spec) {\n throw new Error(\n `Agent spec not found for ${name}${version ? `.v${version}` : ''}`\n );\n }\n return spec;\n }\n}\n"],"mappings":"AA0EA,MAAM,EAAY,GAAoB,GAAG,EAAK,KAAK,IAAI,EAAK,UAE5D,SAAgB,EAAY,EAA4B,CACtD,GAAI,CAAC,EAAK,MAAM,KAAM,MAAU,MAAM,yBAAyB,CAC/D,GAAI,CAAC,OAAO,SAAS,EAAK,KAAK,QAAQ,CACrC,MAAU,MAAM,SAAS,EAAK,KAAK,KAAK,+BAA+B,CAEzE,GAAI,CAAC,EAAK,cAAc,MAAM,CAC5B,MAAU,MAAM,SAAS,EAAK,KAAK,KAAK,wBAAwB,CAElE,GAAI,CAAC,EAAK,OAAO,OACf,MAAU,MAAM,SAAS,EAAK,KAAK,KAAK,gCAAgC,CAE1E,OAAO,OAAO,OAAO,EAAK,CAG5B,IAAa,EAAb,KAA2B,CACzB,MAAyB,IAAI,IAE7B,SAAS,EAAuB,CAC9B,IAAM,EAAM,EAAS,EAAK,KAAK,CAC/B,GAAI,KAAK,MAAM,IAAI,EAAI,CACrB,MAAU,MAAM,uCAAuC,IAAM,CAG/D,OADA,KAAK,MAAM,IAAI,EAAK,EAAK,CAClB,KAGT,MAAoB,CAClB,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAGjC,IAAI,EAAc,EAAyC,CACzD,GAAI,GAAW,KACb,OAAO,KAAK,MAAM,IAAI,GAAG,EAAK,IAAI,IAAU,CAE9C,IAAIA,EACA,EAAa,KACjB,IAAK,IAAM,KAAQ,KAAK,MAAM,QAAQ,CAChC,EAAK,KAAK,OAAS,GACnB,EAAK,KAAK,QAAU,IACtB,EAAS,EACT,EAAa,EAAK,KAAK,SAG3B,OAAO,EAGT,QAAQ,EAAc,EAA6B,CACjD,IAAM,EAAO,KAAK,IAAI,EAAM,EAAQ,CACpC,GAAI,CAAC,EACH,MAAU,MACR,4BAA4B,IAAO,EAAU,KAAK,IAAY,KAC/D,CAEH,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","names":[],"sources":["../../src/tools/executor.ts"],"sourcesContent":[],"mappings":";;;;UASiB,mBAAA;UACP;EADO;EAMJ,kBAAY,CAAA,EAAA,MAAA;;AASR,cATJ,YAAA,CASI;EAKmB,iBAAA,KAAA;EAgB3B,iBAAA,kBAAA;EACkB,WAAA,CAAA,OAAA,CAAA,EA3BH,mBA2BG;EAA8B,QAAA,CAAA,IAAA,EAtBxC,8BAsBwC,CAAA,EAAA,IAAA;EAApD,YAAA,CAAA,OAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAjB+B,iBAiB/B,EAAA;EAAO,GAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA,OAAA;4CADH,mBACJ;gBAAsB;aAA8B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","names":["invocation: AgentToolInvocation","delay"],"sources":["../../src/tools/executor.ts"],"sourcesContent":["import { setTimeout as delay } from 'node:timers/promises';\nimport type { LLMToolDefinition } from '@lssm/lib.contracts/integrations/providers/llm';\nimport type {\n AgentToolContext,\n AgentToolDefinitionWithHandler,\n AgentToolInvocation,\n AgentToolResult,\n} from '../types';\n\nexport interface ToolExecutorOptions {\n tools?: AgentToolDefinitionWithHandler[];\n /** Maximum time to wait for graceful cancellation after timeout. */\n abortGracePeriodMs?: number;\n}\n\nexport class ToolExecutor {\n private readonly tools = new Map<string, AgentToolDefinitionWithHandler>();\n private readonly abortGracePeriodMs: number;\n\n constructor(options?: ToolExecutorOptions) {\n this.abortGracePeriodMs = options?.abortGracePeriodMs ?? 250;\n options?.tools?.forEach((tool) => this.register(tool));\n }\n\n register(tool: AgentToolDefinitionWithHandler): this {\n this.tools.set(tool.definition.name, tool);\n return this;\n }\n\n listLLMTools(allowed?: string[]): LLMToolDefinition[] {\n if (!allowed?.length) {\n return [...this.tools.values()].map((tool) => tool.definition);\n }\n return allowed\n .map((name) => this.tools.get(name)?.definition)\n .filter((tool): tool is LLMToolDefinition => Boolean(tool));\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n async execute(\n name: string,\n args: unknown,\n ctx: AgentToolContext\n ): Promise<{ invocation: AgentToolInvocation; result?: AgentToolResult }> {\n const tool = this.tools.get(name);\n if (!tool) {\n throw new Error(`Agent tool ${name} is not registered`);\n }\n\n const invocation: AgentToolInvocation = {\n name,\n arguments: args,\n startedAt: new Date(),\n success: false,\n };\n\n try {\n const controller = new AbortController();\n const timeout = tool.timeoutMs ?? 10_000;\n const timer = setTimeout(() => controller.abort(), timeout);\n try {\n const result = await Promise.race([\n tool.handler(args, {\n ...ctx,\n emit: ctx.emit,\n }),\n this.rejectOnAbort(controller.signal, timeout),\n ]);\n invocation.success = true;\n return { invocation, result };\n } finally {\n clearTimeout(timer);\n if (controller.signal.aborted) {\n await delay(this.abortGracePeriodMs).catch(() => undefined);\n }\n }\n } catch (error) {\n invocation.error = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n invocation.completedAt = new Date();\n invocation.durationMs =\n invocation.completedAt.getTime() - invocation.startedAt.getTime();\n }\n }\n\n private async rejectOnAbort(signal: AbortSignal, timeout: number) {\n if (signal.aborted) {\n throw new Error('Tool execution aborted');\n }\n return new Promise<never>((_, reject) => {\n signal.addEventListener(\n 'abort',\n () => reject(new Error(`Tool execution timed out after ${timeout}ms`)),\n { once: true }\n );\n });\n }\n}\n"],"mappings":"kDAeA,IAAa,EAAb,KAA0B,CACxB,MAAyB,IAAI,IAC7B,mBAEA,YAAY,EAA+B,CACzC,KAAK,mBAAqB,GAAS,oBAAsB,IACzD,GAAS,OAAO,QAAS,GAAS,KAAK,SAAS,EAAK,CAAC,CAGxD,SAAS,EAA4C,CAEnD,OADA,KAAK,MAAM,IAAI,EAAK,WAAW,KAAM,EAAK,CACnC,KAGT,aAAa,EAAyC,CAIpD,OAHK,GAAS,OAGP,EACJ,IAAK,GAAS,KAAK,MAAM,IAAI,EAAK,EAAE,WAAW,CAC/C,OAAQ,GAAoC,EAAQ,EAAM,CAJpD,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC,IAAK,GAAS,EAAK,WAAW,CAOlE,IAAI,EAAuB,CACzB,OAAO,KAAK,MAAM,IAAI,EAAK,CAG7B,MAAM,QACJ,EACA,EACA,EACwE,CACxE,IAAM,EAAO,KAAK,MAAM,IAAI,EAAK,CACjC,GAAI,CAAC,EACH,MAAU,MAAM,cAAc,EAAK,oBAAoB,CAGzD,IAAMA,EAAkC,CACtC,OACA,UAAW,EACX,UAAW,IAAI,KACf,QAAS,GACV,CAED,GAAI,CACF,IAAM,EAAa,IAAI,gBACjB,EAAU,EAAK,WAAa,IAC5B,EAAQ,eAAiB,EAAW,OAAO,CAAE,EAAQ,CAC3D,GAAI,CACF,IAAM,EAAS,MAAM,QAAQ,KAAK,CAChC,EAAK,QAAQ,EAAM,CACjB,GAAG,EACH,KAAM,EAAI,KACX,CAAC,CACF,KAAK,cAAc,EAAW,OAAQ,EAAQ,CAC/C,CAAC,CAEF,MADA,GAAW,QAAU,GACd,CAAE,aAAY,SAAQ,QACrB,CACR,aAAa,EAAM,CACf,EAAW,OAAO,SACpB,MAAMC,EAAM,KAAK,mBAAmB,CAAC,UAAY,IAAA,GAAU,QAGxD,EAAO,CAEd,KADA,GAAW,MAAQ,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACnE,SACE,CACR,EAAW,YAAc,IAAI,KAC7B,EAAW,WACT,EAAW,YAAY,SAAS,CAAG,EAAW,UAAU,SAAS,EAIvE,MAAc,cAAc,EAAqB,EAAiB,CAChE,GAAI,EAAO,QACT,MAAU,MAAM,yBAAyB,CAE3C,OAAO,IAAI,SAAgB,EAAG,IAAW,CACvC,EAAO,iBACL,YACM,EAAW,MAAM,kCAAkC,EAAQ,IAAI,CAAC,CACtE,CAAE,KAAM,GAAM,CACf,EACD"}
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;KAMY,WAAA;KAQA,cAAA;AARA,UAsBK,iBAAA,CAtBM;EAQX,SAAA,EAAA,MAAc;EAcT,KAAA,EAAA,MAAA;EASL,QAAA,CAAA,EAAA,MAAA;EAEK,SAAA,CAAA,EAAA,MAAa;EAAa,QAAA,CAAA,EAAA,MAAA;EAC9B,QAAA,CAAA,EANA,MAMA,CAAA,MAAA,EAAA,OAAA,CAAA;;AAD6B,KAF9B,oBAAA,GAAuB,MAEO,CAAA,MAAA,EAAA,MAAA,CAAA;AAIzB,UAJA,YAAA,SAAqB,IAIJ,CAJS,UAIT,EAAA,UAAA,CAAA,CAAA;EAKxB,QAAA,CAAA,EARG,oBAQH;;AAEG,UAPI,iBAAA,CAOJ;EACA,SAAA,EAAA,MAAA;EAIA,KAAA,EAAA,MAAA;EAAM,OAAA,EAAA,MAAA;EAGF,QAAA,CAAA,EAAA,MAAA;EAmBA,MAAA,EA7BP,WA6BqB;EACpB,QAAA,EA7BC,YA6BD,EAAA;EACC,SAAA,EA7BC,IA6BD;EAaO,SAAA,EAzCN,IAyCM;EAAmB,UAAA,EAAA,MAAA;EAGrB,cAAA,CAAA,EAAA,MAAmB;EAUnB,YAAA,CAAA,EAAA,MAAgB;EACtB,QAAA,CAAA,EAnDE,MAmDF,CAAA,MAAA,EAAA,MAAA,CAAA;;AAIK,UApDC,oBAAA,CAoDD;EAAyB;EAAiB,KAAA,EAAA,MAAA;EAGzC;EAMA,OAAA,CAAA,EAAA,MAAA;EACH;EAImB,KAAA,EAAA,MAAA;EAA6B;EAAR,QAAA,CAAA,EAAA,MAAA;EAAO;EAGjD,OAAA,CAAA,EAAA,MAAA;EACH;EACE,SAAA,CAAA,EAAA,MAAA;EACC;EAAO,QAAA,CAAA,EA1DN,MA0DM,CAAA,MAAA,EAAA,MAAA,CAAA;;;;UArDF,cAAA;WACN;YACC;;;;;;;mBAaO;;UAGF,mBAAA;;;aAGJ;gBACG;;;;;UAMC,gBAAA;WACN;;;aAGE;gBACG,yBAAyB;;UAGxB,eAAA;;;;;;;aAGJ;;UAGI,8BAAA;cACH;;;;iCAImB,qBAAqB,QAAQ;;KAGlD,uBAAA,WACH,yBACE,6BACC"}
|