@elsium-ai/cli 0.12.0 → 0.12.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.
Files changed (2) hide show
  1. package/dist/cli.js +60 -23
  2. package/package.json +4 -4
package/dist/cli.js CHANGED
@@ -6023,6 +6023,15 @@ function createWorkerSandboxRunner(config, defaultTimeoutMs) {
6023
6023
  }
6024
6024
 
6025
6025
  // ../tools/src/define.ts
6026
+ var log7 = createLogger();
6027
+ var IS_BUN = typeof globalThis.Bun !== "undefined" || typeof process !== "undefined" && Boolean(process.versions.bun);
6028
+ var bunSandboxWarningShown = false;
6029
+ function warnBunSandboxOnce(toolName) {
6030
+ if (bunSandboxWarningShown)
6031
+ return;
6032
+ bunSandboxWarningShown = true;
6033
+ log7.warn(`Tool "${toolName}" uses sandbox.mode="worker" under Bun. Crash isolation is incomplete on Bun: process.exit() inside the handler does NOT terminate the worker (it does on Node). Other guarantees (process, memory, closure-state, timeout, abort) hold. Track: https://github.com/elsium-ai/elsium-ai/issues — search for "Bun crash isolation".`);
6034
+ }
6026
6035
  function formatZodErrors(error) {
6027
6036
  return error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", ");
6028
6037
  }
@@ -6042,6 +6051,30 @@ function buildExecutionSuccess(toolCallId, startTime, data) {
6042
6051
  durationMs: Math.round(performance.now() - startTime)
6043
6052
  };
6044
6053
  }
6054
+ function wireUserSignalToController(controller, userSignal) {
6055
+ if (!userSignal)
6056
+ return;
6057
+ if (userSignal.aborted) {
6058
+ controller.abort();
6059
+ return;
6060
+ }
6061
+ userSignal.addEventListener("abort", () => controller.abort(), { once: true });
6062
+ }
6063
+ function createAbortRejection(signal, isTimeout, name, timeoutMs) {
6064
+ return new Promise((_, reject) => {
6065
+ signal.addEventListener("abort", () => {
6066
+ if (isTimeout()) {
6067
+ reject(ElsiumError.timeout(name, timeoutMs));
6068
+ } else {
6069
+ reject(new ElsiumError({
6070
+ code: "TOOL_ERROR",
6071
+ message: `Tool "${name}" was aborted`,
6072
+ retryable: false
6073
+ }));
6074
+ }
6075
+ }, { once: true });
6076
+ });
6077
+ }
6045
6078
  function defineTool(config) {
6046
6079
  const input = config.input ?? config.parameters;
6047
6080
  if (!input) {
@@ -6053,6 +6086,9 @@ function defineTool(config) {
6053
6086
  if (config.sandbox && config.sandbox.mode !== "worker") {
6054
6087
  throw ElsiumError.validation(`Tool "${config.name}" sandbox.mode must be "worker" (received "${config.sandbox.mode}")`);
6055
6088
  }
6089
+ if (config.sandbox && IS_BUN) {
6090
+ warnBunSandboxOnce(config.name);
6091
+ }
6056
6092
  const { name, description, output, sandbox, timeoutMs = 30000 } = config;
6057
6093
  const handler = config.handler;
6058
6094
  let sandboxRunner = null;
@@ -6090,20 +6126,21 @@ function defineTool(config) {
6090
6126
  return buildExecutionFailure(toolCallId, startTime, `Invalid input: ${formatZodErrors(parsed.error)}`);
6091
6127
  }
6092
6128
  const controller = new AbortController;
6093
- const timer = setTimeout(() => controller.abort(), timeoutMs);
6129
+ let timedOut = false;
6130
+ const timer = setTimeout(() => {
6131
+ timedOut = true;
6132
+ controller.abort();
6133
+ }, timeoutMs);
6134
+ wireUserSignalToController(controller, partialCtx?.signal);
6094
6135
  const context = {
6095
6136
  toolCallId,
6096
6137
  traceId: partialCtx?.traceId,
6097
- signal: partialCtx?.signal ?? controller.signal
6138
+ signal: controller.signal
6098
6139
  };
6099
6140
  try {
6100
6141
  const result = await Promise.race([
6101
6142
  runHandler(parsed.data, context),
6102
- new Promise((_, reject) => {
6103
- context.signal?.addEventListener("abort", () => {
6104
- reject(ElsiumError.timeout(name, timeoutMs));
6105
- });
6106
- })
6143
+ createAbortRejection(controller.signal, () => timedOut, name, timeoutMs)
6107
6144
  ]);
6108
6145
  if (output) {
6109
6146
  const validated = output.safeParse(result);
@@ -10462,7 +10499,7 @@ init_src();
10462
10499
  init_src();
10463
10500
  import { createRequire } from "node:module";
10464
10501
  var require2 = createRequire(import.meta.url);
10465
- var log7 = createLogger();
10502
+ var log8 = createLogger();
10466
10503
  var BLOCKED_KEYS2 = new Set(["__proto__", "constructor", "prototype"]);
10467
10504
  // ../agents/src/stores/integrity.ts
10468
10505
  var ZERO_HASH = "0".repeat(64);
@@ -10472,7 +10509,7 @@ init_src();
10472
10509
  init_src();
10473
10510
  // ../agents/src/async-agent.ts
10474
10511
  init_src();
10475
- var log8 = createLogger();
10512
+ var log9 = createLogger();
10476
10513
  // ../agents/src/session.ts
10477
10514
  init_src();
10478
10515
  // ../agents/src/react.ts
@@ -10495,7 +10532,7 @@ var vectorStoreRegistry = createRegistry("vectorStore");
10495
10532
  init_src();
10496
10533
  import { createRequire as createRequire2 } from "node:module";
10497
10534
  var require3 = createRequire2(import.meta.url);
10498
- var log9 = createLogger();
10535
+ var log10 = createLogger();
10499
10536
  var BLOCKED_KEYS3 = new Set(["__proto__", "constructor", "prototype"]);
10500
10537
  // ../rag/src/stores/qdrant.ts
10501
10538
  init_src();
@@ -10710,13 +10747,13 @@ init_src();
10710
10747
  init_src();
10711
10748
  // ../observe/src/tracer.ts
10712
10749
  init_src();
10713
- var log10 = createLogger();
10750
+ var log11 = createLogger();
10714
10751
  // ../observe/src/audit.ts
10715
10752
  import { createHash as createHash5 } from "node:crypto";
10716
10753
 
10717
10754
  // ../observe/src/audit-sink.ts
10718
10755
  init_src();
10719
- var log11 = createLogger();
10756
+ var log12 = createLogger();
10720
10757
  function getRetryDelay2(attempt, baseDelayMs, maxDelayMs) {
10721
10758
  const delay = Math.min(baseDelayMs * 2 ** attempt, maxDelayMs);
10722
10759
  return delay * (0.5 + Math.random() * 0.5);
@@ -10744,14 +10781,14 @@ async function deliverToSink(sink, events, retryConfig, deadLetterSink, onError)
10744
10781
  try {
10745
10782
  await sendWithRetry(sink, filtered, retryConfig);
10746
10783
  } catch (error) {
10747
- log11.error("Audit sink delivery failed", { sink: sink.name });
10784
+ log12.error("Audit sink delivery failed", { sink: sink.name });
10748
10785
  onError?.(sink.name, error);
10749
10786
  if (!deadLetterSink)
10750
10787
  return;
10751
10788
  try {
10752
10789
  await deadLetterSink.send(filtered);
10753
10790
  } catch (dlqError) {
10754
- log11.error("Dead letter sink delivery failed", { sink: deadLetterSink.name });
10791
+ log12.error("Dead letter sink delivery failed", { sink: deadLetterSink.name });
10755
10792
  onError?.(deadLetterSink.name, dlqError);
10756
10793
  }
10757
10794
  }
@@ -10795,7 +10832,7 @@ function createSinkManager(config) {
10795
10832
  dispatch(event) {
10796
10833
  if (buffer.length >= maxBufferSize) {
10797
10834
  buffer.shift();
10798
- log11.warn("Audit sink buffer full, dropping oldest event");
10835
+ log12.warn("Audit sink buffer full, dropping oldest event");
10799
10836
  }
10800
10837
  buffer.push(event);
10801
10838
  if (buffer.length >= batchSize)
@@ -11106,16 +11143,16 @@ function auditMiddleware(auditTrail) {
11106
11143
  }
11107
11144
  // ../observe/src/audit-sink-jsonl.ts
11108
11145
  init_src();
11109
- var log12 = createLogger();
11146
+ var log13 = createLogger();
11110
11147
  // ../observe/src/experiment.ts
11111
11148
  init_src();
11112
- var log13 = createLogger();
11149
+ var log14 = createLogger();
11113
11150
  // ../observe/src/studio-exporter.ts
11114
11151
  init_src();
11115
- var log14 = createLogger();
11152
+ var log15 = createLogger();
11116
11153
  // ../observe/src/otel.ts
11117
11154
  init_src();
11118
- var log15 = createLogger();
11155
+ var log16 = createLogger();
11119
11156
  // ../app/src/app.ts
11120
11157
  init_src();
11121
11158
 
@@ -12876,19 +12913,19 @@ init_src();
12876
12913
  init_src();
12877
12914
 
12878
12915
  // ../app/src/app.ts
12879
- var log16 = createLogger();
12916
+ var log17 = createLogger();
12880
12917
  // ../app/src/rbac.ts
12881
12918
  init_src();
12882
- var log17 = createLogger();
12919
+ var log18 = createLogger();
12883
12920
  // ../app/src/tenant.ts
12884
12921
  init_src();
12885
- var log18 = createLogger();
12922
+ var log19 = createLogger();
12886
12923
  var tenantUsage = new Map;
12887
12924
  // ../mcp/src/client.ts
12888
12925
  init_src();
12889
12926
  // ../mcp/src/server.ts
12890
12927
  init_src();
12891
- var log19 = createLogger();
12928
+ var log20 = createLogger();
12892
12929
  // ../mcp/src/trust.ts
12893
12930
  init_src();
12894
12931
  var MAX_TOOL_OUTPUT_SIZE = 1024 * 1024;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elsium-ai/cli",
3
- "version": "0.12.0",
3
+ "version": "0.12.1",
4
4
  "description": "CLI tool for ElsiumAI projects",
5
5
  "license": "MIT",
6
6
  "author": "Eric Utrera <ebutrera9103@gmail.com>",
@@ -24,9 +24,9 @@
24
24
  "dev": "bun --watch src/cli.ts"
25
25
  },
26
26
  "dependencies": {
27
- "@elsium-ai/core": "^0.12.0",
28
- "@elsium-ai/observe": "^0.12.0",
29
- "elsium-ai": "^0.12.0"
27
+ "@elsium-ai/core": "^0.12.1",
28
+ "@elsium-ai/observe": "^0.12.1",
29
+ "elsium-ai": "^0.12.1"
30
30
  },
31
31
  "devDependencies": {
32
32
  "typescript": "^5.7.0"