elsium-ai 0.4.3 → 0.5.0

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/index.d.ts CHANGED
@@ -13,8 +13,8 @@ export { ElsiumError, ok, err, isOk, isErr, unwrap, unwrapOr, tryCatch, tryCatch
13
13
  export type { Role, ContentPart, TextContent, ImageContent, AudioContent, DocumentContent, Message, ToolCall, ToolResult, TokenUsage, CostBreakdown, StopReason, LLMResponse, StreamEvent, XRayData, StreamCheckpoint, ProviderConfig, CompletionRequest, ToolDefinition, TenantContext, Middleware, Result, Ok, Err, ElsiumStream, ResilientStreamOptions, LogLevel, Logger, ErrorCode, Registry, ContextStrategy, ContextManagerConfig, ContextManager, } from '@elsium-ai/core';
14
14
  export { gateway, registerProviderFactory, registerProvider, getProviderFactory, listProviders, registerProviderMetadata, getProviderMetadata, calculateCost, registerPricing, composeMiddleware, loggingMiddleware, costTrackingMiddleware, xrayMiddleware, createAnthropicProvider, createOpenAIProvider, createGoogleProvider, createProviderMesh, securityMiddleware, detectPromptInjection, detectJailbreak, redactSecrets, checkBlockedPatterns, cacheMiddleware, createInMemoryCache, outputGuardrailMiddleware, createBatch, } from '@elsium-ai/gateway';
15
15
  export type { LLMProvider, ProviderFactory, ProviderMetadata, ModelPricing, ModelTier, Gateway, GatewayConfig, XRayStore, ProviderMeshConfig, ProviderEntry, RoutingStrategy, ProviderMesh, SecurityMiddlewareConfig, SecurityViolation, SecurityResult, CacheAdapter, CacheStats, CacheMiddlewareConfig, OutputGuardrailConfig, OutputGuardrailRule, OutputViolation, BatchConfig, BatchResult, BatchResultItem, } from '@elsium-ai/gateway';
16
- export { defineAgent, runSequential, runParallel, runSupervisor, createMemory, createSemanticValidator, createAgentSecurity, createConfidenceScorer, executeStateMachine, createInMemoryMemoryStore, createSqliteMemoryStore, } from '@elsium-ai/agents';
17
- export type { Agent, AgentDependencies, AgentConfig, AgentResult, AgentRunOptions, GuardrailConfig, AgentHooks, Memory, MemoryConfig, SemanticGuardrailConfig, SemanticCheck, SemanticCheckResult, SemanticValidationResult, SemanticValidator, AgentSecurityConfig, AgentSecurityResult, ConfidenceConfig, ConfidenceResult, StateDefinition, StateHistoryEntry, StateMachineResult, MemoryStore, SqliteMemoryStoreConfig, } from '@elsium-ai/agents';
16
+ export { defineAgent, runSequential, runParallel, runSupervisor, createMemory, createSemanticValidator, createAgentSecurity, createConfidenceScorer, executeStateMachine, createInMemoryMemoryStore, createSqliteMemoryStore, createAgentStream, createThread, loadThread, createInMemoryThreadStore, createAsyncAgent, } from '@elsium-ai/agents';
17
+ export type { Agent, AgentDependencies, AgentConfig, AgentResult, AgentRunOptions, GuardrailConfig, AgentHooks, Memory, MemoryConfig, SemanticGuardrailConfig, SemanticCheck, SemanticCheckResult, SemanticValidationResult, SemanticValidator, AgentSecurityConfig, AgentSecurityResult, ConfidenceConfig, ConfidenceResult, StateDefinition, StateHistoryEntry, StateMachineResult, MemoryStore, SqliteMemoryStoreConfig, AgentStreamEvent, AgentStream, StreamingAgentDependencies, Thread, ThreadConfig, ThreadStore, ThreadSnapshot, ThreadSummary, AsyncAgent, AsyncAgentConfig, AsyncAgentRunOptions, AgentTask, TaskStatus, TaskProgressEvent, } from '@elsium-ai/agents';
18
18
  export { defineTool, createToolkit, httpFetchTool, calculatorTool, jsonParseTool, currentTimeTool, formatToolResult, formatToolResultAsText, } from '@elsium-ai/tools';
19
19
  export type { Tool, ToolConfig, ToolContext, ToolExecutionResult, Toolkit, } from '@elsium-ai/tools';
20
20
  export { rag, createInMemoryStore, createOpenAIEmbeddings, createMockEmbeddings, vectorStoreRegistry, embeddingProviderRegistry, createPgVectorStore, } from '@elsium-ai/rag';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -8670,6 +8670,219 @@ async function executeToolCalls(toolCalls, toolMap, history, signal, hooks, appr
8670
8670
  return results;
8671
8671
  }
8672
8672
 
8673
+ // ../agents/src/streaming.ts
8674
+ async function accumulateStreamedResponse(stream, emit) {
8675
+ let textContent = "";
8676
+ const toolCalls = [];
8677
+ const toolArgBuffers = {};
8678
+ let usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
8679
+ let stopReason = "end_turn";
8680
+ for await (const event of stream) {
8681
+ switch (event.type) {
8682
+ case "text_delta":
8683
+ textContent += event.text;
8684
+ emit({ type: "text_delta", text: event.text });
8685
+ break;
8686
+ case "tool_call_start":
8687
+ toolArgBuffers[event.toolCall.id] = "";
8688
+ toolCalls.push({ id: event.toolCall.id, name: event.toolCall.name, arguments: {} });
8689
+ emit({ type: "tool_call_start", toolCall: event.toolCall });
8690
+ break;
8691
+ case "tool_call_delta":
8692
+ if (toolArgBuffers[event.toolCallId] !== undefined) {
8693
+ toolArgBuffers[event.toolCallId] += event.arguments;
8694
+ }
8695
+ emit({
8696
+ type: "tool_call_delta",
8697
+ toolCallId: event.toolCallId,
8698
+ arguments: event.arguments
8699
+ });
8700
+ break;
8701
+ case "tool_call_end": {
8702
+ const tc = toolCalls.find((t) => t.id === event.toolCallId);
8703
+ if (tc && toolArgBuffers[event.toolCallId]) {
8704
+ try {
8705
+ tc.arguments = JSON.parse(toolArgBuffers[event.toolCallId]);
8706
+ } catch {
8707
+ tc.arguments = {};
8708
+ }
8709
+ }
8710
+ emit({ type: "tool_call_end", toolCallId: event.toolCallId });
8711
+ break;
8712
+ }
8713
+ case "message_end":
8714
+ usage = event.usage;
8715
+ stopReason = event.stopReason;
8716
+ break;
8717
+ }
8718
+ }
8719
+ return {
8720
+ message: {
8721
+ role: "assistant",
8722
+ content: textContent,
8723
+ ...toolCalls.length ? { toolCalls } : {}
8724
+ },
8725
+ usage,
8726
+ stopReason
8727
+ };
8728
+ }
8729
+ async function executeStreamToolCalls(toolCalls, ctx, emit) {
8730
+ const results = [];
8731
+ const history = [];
8732
+ for (const tc of toolCalls) {
8733
+ const tool = ctx.toolMap.get(tc.name);
8734
+ if (!tool) {
8735
+ const errorResult = {
8736
+ success: false,
8737
+ error: `Unknown tool: ${tc.name}. Available: ${Array.from(ctx.toolMap.keys()).join(", ")}`,
8738
+ toolCallId: tc.id,
8739
+ durationMs: 0
8740
+ };
8741
+ emit({ type: "tool_result", toolCallId: tc.id, name: tc.name, result: errorResult });
8742
+ history.push({ name: tc.name, arguments: tc.arguments, result: errorResult });
8743
+ results.push(formatToolResult(errorResult));
8744
+ continue;
8745
+ }
8746
+ const result = await tool.execute(tc.arguments, {
8747
+ toolCallId: tc.id,
8748
+ signal: ctx.options.signal
8749
+ });
8750
+ emit({ type: "tool_result", toolCallId: tc.id, name: tc.name, result });
8751
+ history.push({ name: tc.name, arguments: tc.arguments, result });
8752
+ results.push(formatToolResult(result));
8753
+ }
8754
+ return {
8755
+ toolMessage: { role: "tool", content: "", toolResults: results },
8756
+ history
8757
+ };
8758
+ }
8759
+ function createAgentStream(messages, ctx) {
8760
+ let resolveResult;
8761
+ let rejectResult;
8762
+ const resultPromise = new Promise((resolve2, reject) => {
8763
+ resolveResult = resolve2;
8764
+ rejectResult = reject;
8765
+ });
8766
+ const events = [];
8767
+ let resolve = null;
8768
+ let done = false;
8769
+ function emit(event) {
8770
+ if (resolve) {
8771
+ const r = resolve;
8772
+ resolve = null;
8773
+ r({ value: event, done: false });
8774
+ } else {
8775
+ events.push(event);
8776
+ }
8777
+ }
8778
+ function finish() {
8779
+ done = true;
8780
+ if (resolve) {
8781
+ const r = resolve;
8782
+ resolve = null;
8783
+ r({ value: undefined, done: true });
8784
+ }
8785
+ }
8786
+ runStreamLoop(messages, ctx, emit).then((agentResult) => {
8787
+ resolveResult(agentResult);
8788
+ finish();
8789
+ }).catch((err2) => {
8790
+ const error = err2 instanceof Error ? err2 : new Error(String(err2));
8791
+ emit({ type: "error", error });
8792
+ rejectResult?.(error);
8793
+ finish();
8794
+ });
8795
+ resultPromise.catch(() => {});
8796
+ const iterable = {
8797
+ [Symbol.asyncIterator]() {
8798
+ return {
8799
+ next() {
8800
+ const next = events.shift();
8801
+ if (next) {
8802
+ return Promise.resolve({ value: next, done: false });
8803
+ }
8804
+ if (done) {
8805
+ return Promise.resolve({ value: undefined, done: true });
8806
+ }
8807
+ return new Promise((r) => {
8808
+ resolve = r;
8809
+ });
8810
+ }
8811
+ };
8812
+ },
8813
+ result() {
8814
+ return resultPromise;
8815
+ }
8816
+ };
8817
+ return iterable;
8818
+ }
8819
+ async function runStreamLoop(messages, ctx, emit) {
8820
+ const { config, deps, memory, options } = ctx;
8821
+ const traceId = options.traceId ?? generateTraceId();
8822
+ let totalInputTokens = 0;
8823
+ let totalOutputTokens = 0;
8824
+ const totalCost = 0;
8825
+ let iterations = 0;
8826
+ const allToolCalls = [];
8827
+ const scopedMessages = [...memory.getMessages()];
8828
+ const conversationMessages = [...scopedMessages, ...messages];
8829
+ while (iterations < ctx.maxIterations) {
8830
+ iterations++;
8831
+ if (options.signal?.aborted) {
8832
+ throw new ElsiumError({
8833
+ code: "VALIDATION_ERROR",
8834
+ message: `Agent "${config.name}" was aborted`,
8835
+ retryable: false
8836
+ });
8837
+ }
8838
+ if (totalInputTokens + totalOutputTokens > ctx.maxTokenBudget) {
8839
+ throw ElsiumError.budgetExceeded(totalInputTokens + totalOutputTokens, ctx.maxTokenBudget);
8840
+ }
8841
+ emit({ type: "iteration_start", iteration: iterations });
8842
+ const request = {
8843
+ messages: conversationMessages,
8844
+ model: config.model,
8845
+ system: config.system,
8846
+ tools: config.tools?.map((t) => t.toDefinition())
8847
+ };
8848
+ const llmStream = deps.stream(request);
8849
+ const { message, usage, stopReason } = await accumulateStreamedResponse(llmStream, emit);
8850
+ totalInputTokens += usage.inputTokens;
8851
+ totalOutputTokens += usage.outputTokens;
8852
+ conversationMessages.push(message);
8853
+ if (!message.toolCalls?.length || stopReason !== "tool_use") {
8854
+ emit({ type: "iteration_end", iteration: iterations });
8855
+ for (const msg of conversationMessages.slice(scopedMessages.length)) {
8856
+ memory.add(msg);
8857
+ }
8858
+ const agentResult = {
8859
+ message,
8860
+ usage: {
8861
+ totalInputTokens,
8862
+ totalOutputTokens,
8863
+ totalTokens: totalInputTokens + totalOutputTokens,
8864
+ totalCost,
8865
+ iterations
8866
+ },
8867
+ toolCalls: allToolCalls,
8868
+ traceId
8869
+ };
8870
+ emit({ type: "agent_end", result: agentResult });
8871
+ return agentResult;
8872
+ }
8873
+ const { toolMessage, history } = await executeStreamToolCalls(message.toolCalls, ctx, emit);
8874
+ allToolCalls.push(...history);
8875
+ conversationMessages.push(toolMessage);
8876
+ emit({ type: "iteration_end", iteration: iterations });
8877
+ }
8878
+ throw new ElsiumError({
8879
+ code: "MAX_ITERATIONS",
8880
+ message: `Agent "${config.name}" reached maximum iterations (${ctx.maxIterations})`,
8881
+ retryable: false,
8882
+ metadata: { iterations, maxIterations: ctx.maxIterations }
8883
+ });
8884
+ }
8885
+
8673
8886
  // ../agents/src/agent.ts
8674
8887
  async function safeHook2(fn) {
8675
8888
  if (!fn)
@@ -8683,7 +8896,10 @@ function resolveDependencies(config, deps) {
8683
8896
  return deps;
8684
8897
  if (typeof config.provider === "object" && config.provider !== null) {
8685
8898
  const provider = config.provider;
8686
- return { complete: (req) => provider.complete(req) };
8899
+ return {
8900
+ complete: (req) => provider.complete(req),
8901
+ stream: (req) => provider.stream(req)
8902
+ };
8687
8903
  }
8688
8904
  if (!config.provider || !config.apiKey) {
8689
8905
  throw ElsiumError.validation("Either provide AgentDependencies as second argument, set provider and apiKey in config, or pass an LLMProvider object as provider");
@@ -8694,7 +8910,10 @@ function resolveDependencies(config, deps) {
8694
8910
  baseUrl: config.baseUrl,
8695
8911
  model: config.model
8696
8912
  });
8697
- return { complete: (req) => gw.complete(req) };
8913
+ return {
8914
+ complete: (req) => gw.complete(req),
8915
+ stream: (req) => gw.stream(req)
8916
+ };
8698
8917
  }
8699
8918
  function defineAgent(config, deps) {
8700
8919
  const resolvedDeps = resolveDependencies(config, deps);
@@ -8934,6 +9153,23 @@ function defineAgent(config, deps) {
8934
9153
  const userMessage = { role: "user", content: input };
8935
9154
  return executeLoop([userMessage], options);
8936
9155
  },
9156
+ stream(input, options = {}) {
9157
+ validateInputText(input);
9158
+ const streamDeps = resolvedDeps;
9159
+ if (!streamDeps.stream) {
9160
+ throw ElsiumError.validation("Streaming requires a stream function in agent dependencies. " + "Pass { complete, stream } or use a provider that supports streaming.");
9161
+ }
9162
+ const userMessage = { role: "user", content: input };
9163
+ return createAgentStream([userMessage], {
9164
+ config,
9165
+ deps: streamDeps,
9166
+ memory,
9167
+ toolMap,
9168
+ options,
9169
+ maxIterations: guardrails.maxIterations,
9170
+ maxTokenBudget: guardrails.maxTokenBudget
9171
+ });
9172
+ },
8937
9173
  async chat(messages, options = {}) {
8938
9174
  for (const msg of messages) {
8939
9175
  if (msg.role !== "user")
@@ -9130,6 +9366,275 @@ async function runSupervisor(supervisor, workers, input, options) {
9130
9366
  };
9131
9367
  return supervisor.run(supervisorInput, agentOptions);
9132
9368
  }
9369
+ // ../agents/src/thread.ts
9370
+ function createThread(config) {
9371
+ const id = config.id ?? generateId("thread");
9372
+ const messages = [];
9373
+ const metadata = { ...config.metadata };
9374
+ const createdAt = Date.now();
9375
+ let updatedAt = createdAt;
9376
+ function addMessage(message) {
9377
+ messages.push(message);
9378
+ updatedAt = Date.now();
9379
+ if (config.store) {
9380
+ config.store.save({
9381
+ id,
9382
+ messages: [...messages],
9383
+ createdAt,
9384
+ updatedAt,
9385
+ metadata
9386
+ }).catch(() => {});
9387
+ }
9388
+ }
9389
+ return {
9390
+ id,
9391
+ metadata,
9392
+ async send(input, options = {}) {
9393
+ const userMessage = { role: "user", content: input };
9394
+ addMessage(userMessage);
9395
+ const result = await config.agent.chat([...messages], options);
9396
+ addMessage(result.message);
9397
+ return result;
9398
+ },
9399
+ stream(input, options = {}) {
9400
+ const userMessage = { role: "user", content: input };
9401
+ addMessage(userMessage);
9402
+ const agentStream = config.agent.stream(input, options);
9403
+ const originalResult = agentStream.result.bind(agentStream);
9404
+ const wrappedStream = {
9405
+ [Symbol.asyncIterator]() {
9406
+ const inner = agentStream[Symbol.asyncIterator]();
9407
+ return {
9408
+ async next() {
9409
+ const iterResult = await inner.next();
9410
+ if (!iterResult.done && iterResult.value.type === "agent_end") {
9411
+ addMessage(iterResult.value.result.message);
9412
+ }
9413
+ return iterResult;
9414
+ }
9415
+ };
9416
+ },
9417
+ async result() {
9418
+ const r = await originalResult();
9419
+ return r;
9420
+ }
9421
+ };
9422
+ return wrappedStream;
9423
+ },
9424
+ getMessages() {
9425
+ return [...messages];
9426
+ },
9427
+ addMessage(message) {
9428
+ addMessage(message);
9429
+ },
9430
+ fork(options) {
9431
+ const forked = createThread({
9432
+ id: options?.id,
9433
+ agent: config.agent,
9434
+ metadata: { ...metadata, forkedFrom: id },
9435
+ store: config.store
9436
+ });
9437
+ for (const msg of messages) {
9438
+ forked.addMessage({ ...msg });
9439
+ }
9440
+ return forked;
9441
+ },
9442
+ clear() {
9443
+ messages.length = 0;
9444
+ updatedAt = Date.now();
9445
+ },
9446
+ async save() {
9447
+ if (!config.store)
9448
+ return;
9449
+ await config.store.save({
9450
+ id,
9451
+ messages: [...messages],
9452
+ createdAt,
9453
+ updatedAt,
9454
+ metadata
9455
+ });
9456
+ }
9457
+ };
9458
+ }
9459
+ async function loadThread(threadId, config) {
9460
+ const snapshot = await config.store.load(threadId);
9461
+ if (!snapshot)
9462
+ return null;
9463
+ const thread = createThread({
9464
+ id: threadId,
9465
+ agent: config.agent,
9466
+ metadata: snapshot.metadata,
9467
+ store: config.store
9468
+ });
9469
+ for (const msg of snapshot.messages) {
9470
+ thread.addMessage(msg);
9471
+ }
9472
+ return thread;
9473
+ }
9474
+ function createInMemoryThreadStore() {
9475
+ const store = new Map;
9476
+ return {
9477
+ async load(threadId) {
9478
+ const snapshot = store.get(threadId);
9479
+ if (!snapshot)
9480
+ return null;
9481
+ return { ...snapshot, messages: [...snapshot.messages] };
9482
+ },
9483
+ async save(snapshot) {
9484
+ store.set(snapshot.id, { ...snapshot, messages: [...snapshot.messages] });
9485
+ },
9486
+ async delete(threadId) {
9487
+ store.delete(threadId);
9488
+ },
9489
+ async list(options) {
9490
+ const limit = options?.limit ?? 50;
9491
+ const offset = options?.offset ?? 0;
9492
+ const entries = [...store.values()].sort((a, b) => b.updatedAt - a.updatedAt).slice(offset, offset + limit);
9493
+ return entries.map((s) => {
9494
+ const lastMsg = s.messages[s.messages.length - 1];
9495
+ const lastMessage = lastMsg ? typeof lastMsg.content === "string" ? lastMsg.content.slice(0, 100) : undefined : undefined;
9496
+ return {
9497
+ id: s.id,
9498
+ messageCount: s.messages.length,
9499
+ createdAt: s.createdAt,
9500
+ updatedAt: s.updatedAt,
9501
+ lastMessage,
9502
+ metadata: s.metadata
9503
+ };
9504
+ });
9505
+ }
9506
+ };
9507
+ }
9508
+ // ../agents/src/async-agent.ts
9509
+ function createAsyncAgent(config) {
9510
+ const tasks = new Map;
9511
+ function emitProgress(task, event) {
9512
+ try {
9513
+ config.onProgress?.(toPublicTask(task), event);
9514
+ } catch {}
9515
+ }
9516
+ function toPublicTask(task) {
9517
+ return {
9518
+ id: task.id,
9519
+ agentName: task.agentName,
9520
+ input: task.input,
9521
+ status: task.status,
9522
+ result: task.result,
9523
+ error: task.error,
9524
+ createdAt: task.createdAt,
9525
+ startedAt: task.startedAt,
9526
+ completedAt: task.completedAt,
9527
+ metadata: task.metadata,
9528
+ cancel() {
9529
+ if (task.status === "pending" || task.status === "running") {
9530
+ task.status = "cancelled";
9531
+ task.completedAt = Date.now();
9532
+ task.abortController.abort();
9533
+ emitProgress(task, { type: "cancelled", taskId: task.id });
9534
+ task.reject(new ElsiumError({
9535
+ code: "VALIDATION_ERROR",
9536
+ message: `Task ${task.id} was cancelled`,
9537
+ retryable: false
9538
+ }));
9539
+ }
9540
+ },
9541
+ wait() {
9542
+ return task.promise;
9543
+ }
9544
+ };
9545
+ }
9546
+ async function executeTask(task) {
9547
+ task.status = "running";
9548
+ task.startedAt = Date.now();
9549
+ emitProgress(task, { type: "started", taskId: task.id });
9550
+ try {
9551
+ const result = await config.agent.run(task.input, {
9552
+ signal: task.abortController.signal,
9553
+ traceId: task.metadata.traceId
9554
+ });
9555
+ if (task.status === "cancelled")
9556
+ return;
9557
+ task.status = "completed";
9558
+ task.result = result;
9559
+ task.completedAt = Date.now();
9560
+ emitProgress(task, { type: "completed", taskId: task.id, result });
9561
+ try {
9562
+ config.onComplete?.(toPublicTask(task));
9563
+ } catch {}
9564
+ task.resolve(result);
9565
+ } catch (err2) {
9566
+ if (task.status === "cancelled")
9567
+ return;
9568
+ const error = err2 instanceof Error ? err2 : new Error(String(err2));
9569
+ task.status = "failed";
9570
+ task.error = error;
9571
+ task.completedAt = Date.now();
9572
+ emitProgress(task, { type: "failed", taskId: task.id, error });
9573
+ try {
9574
+ config.onError?.(toPublicTask(task), error);
9575
+ } catch {}
9576
+ task.reject(error);
9577
+ }
9578
+ }
9579
+ return {
9580
+ submit(input, options = {}) {
9581
+ const taskId = options.taskId ?? generateId("task");
9582
+ const abortController = new AbortController;
9583
+ if (options.signal) {
9584
+ options.signal.addEventListener("abort", () => abortController.abort(), { once: true });
9585
+ }
9586
+ let resolvePromise;
9587
+ let rejectPromise;
9588
+ const promise = new Promise((resolve, reject) => {
9589
+ resolvePromise = resolve;
9590
+ rejectPromise = reject;
9591
+ });
9592
+ const task = {
9593
+ id: taskId,
9594
+ agentName: config.agent.name,
9595
+ input,
9596
+ status: "pending",
9597
+ result: null,
9598
+ error: null,
9599
+ createdAt: Date.now(),
9600
+ startedAt: null,
9601
+ completedAt: null,
9602
+ metadata: { ...options.metadata },
9603
+ abortController,
9604
+ promise,
9605
+ resolve: resolvePromise,
9606
+ reject: rejectPromise
9607
+ };
9608
+ tasks.set(taskId, task);
9609
+ executeTask(task);
9610
+ return toPublicTask(task);
9611
+ },
9612
+ getTask(taskId) {
9613
+ const task = tasks.get(taskId);
9614
+ return task ? toPublicTask(task) : null;
9615
+ },
9616
+ listTasks(filter) {
9617
+ const all = [...tasks.values()];
9618
+ const filtered = filter?.status ? all.filter((t) => t.status === filter.status) : all;
9619
+ return filtered.map(toPublicTask);
9620
+ },
9621
+ cancelAll() {
9622
+ for (const task of tasks.values()) {
9623
+ if (task.status === "pending" || task.status === "running") {
9624
+ task.status = "cancelled";
9625
+ task.completedAt = Date.now();
9626
+ task.abortController.abort();
9627
+ emitProgress(task, { type: "cancelled", taskId: task.id });
9628
+ task.reject(new ElsiumError({
9629
+ code: "VALIDATION_ERROR",
9630
+ message: `Task ${task.id} was cancelled`,
9631
+ retryable: false
9632
+ }));
9633
+ }
9634
+ }
9635
+ }
9636
+ };
9637
+ }
9133
9638
  // ../rag/src/loaders.ts
9134
9639
  function createDocument(content, metadata) {
9135
9640
  return {
@@ -15235,6 +15740,7 @@ export {
15235
15740
  observe,
15236
15741
  mockProvider,
15237
15742
  loggingMiddleware,
15743
+ loadThread,
15238
15744
  loadFixture,
15239
15745
  listProviders,
15240
15746
  jsonParseTool,
@@ -15269,6 +15775,7 @@ export {
15269
15775
  defineAgent,
15270
15776
  currentTimeTool,
15271
15777
  createToolkit,
15778
+ createThread,
15272
15779
  createStream,
15273
15780
  createSqliteMemoryStore,
15274
15781
  createSpan,
@@ -15291,6 +15798,7 @@ export {
15291
15798
  createMCPServer,
15292
15799
  createMCPClient,
15293
15800
  createLogger,
15801
+ createInMemoryThreadStore,
15294
15802
  createInMemoryStore,
15295
15803
  createInMemoryMemoryStore,
15296
15804
  createInMemoryCache,
@@ -15302,8 +15810,10 @@ export {
15302
15810
  createConfidenceScorer,
15303
15811
  createClient,
15304
15812
  createBatch,
15813
+ createAsyncAgent,
15305
15814
  createApp,
15306
15815
  createAnthropicProvider,
15816
+ createAgentStream,
15307
15817
  createAgentSecurity,
15308
15818
  countTokens,
15309
15819
  costTrackingMiddleware,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "elsium-ai",
3
- "version": "0.4.3",
3
+ "version": "0.5.0",
4
4
  "description": "ElsiumAI — A high-performance, TypeScript-first AI framework",
5
5
  "license": "MIT",
6
6
  "author": "Eric Utrera <ebutrera9103@gmail.com>",
@@ -25,17 +25,17 @@
25
25
  "build": "bun build ./src/index.ts --outdir ./dist --target node && bun x tsc -p tsconfig.build.json --emitDeclarationOnly"
26
26
  },
27
27
  "dependencies": {
28
- "@elsium-ai/core": "^0.4.3",
29
- "@elsium-ai/gateway": "^0.4.3",
30
- "@elsium-ai/agents": "^0.4.3",
31
- "@elsium-ai/tools": "^0.4.3",
32
- "@elsium-ai/rag": "^0.4.3",
33
- "@elsium-ai/workflows": "^0.4.3",
34
- "@elsium-ai/observe": "^0.4.3",
35
- "@elsium-ai/app": "^0.4.3",
36
- "@elsium-ai/testing": "^0.4.3",
37
- "@elsium-ai/mcp": "^0.4.3",
38
- "@elsium-ai/client": "^0.4.3"
28
+ "@elsium-ai/core": "^0.5.0",
29
+ "@elsium-ai/gateway": "^0.5.0",
30
+ "@elsium-ai/agents": "^0.5.0",
31
+ "@elsium-ai/tools": "^0.5.0",
32
+ "@elsium-ai/rag": "^0.5.0",
33
+ "@elsium-ai/workflows": "^0.5.0",
34
+ "@elsium-ai/observe": "^0.5.0",
35
+ "@elsium-ai/app": "^0.5.0",
36
+ "@elsium-ai/testing": "^0.5.0",
37
+ "@elsium-ai/mcp": "^0.5.0",
38
+ "@elsium-ai/client": "^0.5.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "typescript": "^5.7.0"