@elizaos/plugin-trajectory-logger 2.0.0-alpha.20 → 2.0.0-alpha.21

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.
@@ -14,7 +14,7 @@ var __export = (target, all) => {
14
14
  };
15
15
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
16
16
 
17
- // ../../../../node_modules/drizzle-orm/entity.js
17
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/entity.js
18
18
  function is(value, type) {
19
19
  if (!value || typeof value !== "object") {
20
20
  return false;
@@ -42,7 +42,7 @@ var init_entity = __esm(() => {
42
42
  hasOwnEntityKind = Symbol.for("drizzle:hasOwnEntityKind");
43
43
  });
44
44
 
45
- // ../../../../node_modules/drizzle-orm/column.js
45
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/column.js
46
46
  var Column;
47
47
  var init_column = __esm(() => {
48
48
  init_entity();
@@ -96,7 +96,7 @@ var init_column = __esm(() => {
96
96
  };
97
97
  });
98
98
 
99
- // ../../../../node_modules/drizzle-orm/column-builder.js
99
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/column-builder.js
100
100
  var ColumnBuilder;
101
101
  var init_column_builder = __esm(() => {
102
102
  init_entity();
@@ -156,19 +156,19 @@ var init_column_builder = __esm(() => {
156
156
  };
157
157
  });
158
158
 
159
- // ../../../../node_modules/drizzle-orm/table.utils.js
159
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/table.utils.js
160
160
  var TableName;
161
161
  var init_table_utils = __esm(() => {
162
162
  TableName = Symbol.for("drizzle:Name");
163
163
  });
164
164
 
165
- // ../../../../node_modules/drizzle-orm/tracing-utils.js
165
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/tracing-utils.js
166
166
  function iife(fn, ...args) {
167
167
  return fn(...args);
168
168
  }
169
169
  var init_tracing_utils = () => {};
170
170
 
171
- // ../../../../node_modules/drizzle-orm/pg-core/unique-constraint.js
171
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/pg-core/unique-constraint.js
172
172
  function uniqueKeyName(table, columns) {
173
173
  return `${table[TableName]}_${columns.join("_")}_unique`;
174
174
  }
@@ -176,7 +176,7 @@ var init_unique_constraint = __esm(() => {
176
176
  init_table_utils();
177
177
  });
178
178
 
179
- // ../../../../node_modules/drizzle-orm/pg-core/columns/common.js
179
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/pg-core/columns/common.js
180
180
  var PgColumn, ExtraConfigColumn;
181
181
  var init_common = __esm(() => {
182
182
  init_column();
@@ -230,7 +230,7 @@ var init_common = __esm(() => {
230
230
  };
231
231
  });
232
232
 
233
- // ../../../../node_modules/drizzle-orm/pg-core/columns/enum.js
233
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/pg-core/columns/enum.js
234
234
  function isPgEnum(obj) {
235
235
  return !!obj && typeof obj === "function" && isPgEnumSym in obj && obj[isPgEnumSym] === true;
236
236
  }
@@ -265,7 +265,7 @@ var init_enum = __esm(() => {
265
265
  };
266
266
  });
267
267
 
268
- // ../../../../node_modules/drizzle-orm/subquery.js
268
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/subquery.js
269
269
  var Subquery, WithSubquery;
270
270
  var init_subquery = __esm(() => {
271
271
  init_entity();
@@ -287,11 +287,11 @@ var init_subquery = __esm(() => {
287
287
  };
288
288
  });
289
289
 
290
- // ../../../../node_modules/drizzle-orm/version.js
290
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/version.js
291
291
  var version = "0.45.1";
292
292
  var init_version = () => {};
293
293
 
294
- // ../../../../node_modules/drizzle-orm/tracing.js
294
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/tracing.js
295
295
  var otel, rawTracer, tracer;
296
296
  var init_tracing = __esm(() => {
297
297
  init_tracing_utils();
@@ -321,13 +321,13 @@ var init_tracing = __esm(() => {
321
321
  };
322
322
  });
323
323
 
324
- // ../../../../node_modules/drizzle-orm/view-common.js
324
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/view-common.js
325
325
  var ViewBaseConfig;
326
326
  var init_view_common = __esm(() => {
327
327
  ViewBaseConfig = Symbol.for("drizzle:ViewBaseConfig");
328
328
  });
329
329
 
330
- // ../../../../node_modules/drizzle-orm/table.js
330
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/table.js
331
331
  function isTable(table) {
332
332
  return typeof table === "object" && table !== null && IsDrizzleTable in table;
333
333
  }
@@ -378,7 +378,7 @@ var init_table = __esm(() => {
378
378
  };
379
379
  });
380
380
 
381
- // ../../../../node_modules/drizzle-orm/sql/sql.js
381
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/sql/sql.js
382
382
  function isSQLWrapper(value) {
383
383
  return value !== null && value !== undefined && typeof value.getSQL === "function";
384
384
  }
@@ -780,7 +780,7 @@ var init_sql = __esm(() => {
780
780
  };
781
781
  });
782
782
 
783
- // ../../../../node_modules/drizzle-orm/alias.js
783
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/alias.js
784
784
  function aliasedTable(table, tableAlias) {
785
785
  return new Proxy(table, new TableAliasProxyHandler(tableAlias, false));
786
786
  }
@@ -881,7 +881,7 @@ var init_alias = __esm(() => {
881
881
  };
882
882
  });
883
883
 
884
- // ../../../../node_modules/drizzle-orm/errors.js
884
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/errors.js
885
885
  var DrizzleError, DrizzleQueryError, TransactionRollbackError;
886
886
  var init_errors = __esm(() => {
887
887
  init_entity();
@@ -913,7 +913,7 @@ params: ${params}`);
913
913
  };
914
914
  });
915
915
 
916
- // ../../../../node_modules/drizzle-orm/logger.js
916
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/logger.js
917
917
  var ConsoleLogWriter, DefaultLogger, NoopLogger;
918
918
  var init_logger = __esm(() => {
919
919
  init_entity();
@@ -947,7 +947,7 @@ var init_logger = __esm(() => {
947
947
  };
948
948
  });
949
949
 
950
- // ../../../../node_modules/drizzle-orm/query-promise.js
950
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/query-promise.js
951
951
  var QueryPromise;
952
952
  var init_query_promise = __esm(() => {
953
953
  init_entity();
@@ -972,7 +972,7 @@ var init_query_promise = __esm(() => {
972
972
  };
973
973
  });
974
974
 
975
- // ../../../../node_modules/drizzle-orm/utils.js
975
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/utils.js
976
976
  function mapResultRow(columns, row, joinsNotNullableMap) {
977
977
  const nullifyMap = {};
978
978
  const result = columns.reduce((result2, { path, field }, columnIndex) => {
@@ -1138,7 +1138,7 @@ var init_utils = __esm(() => {
1138
1138
  textDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder;
1139
1139
  });
1140
1140
 
1141
- // ../../../../node_modules/drizzle-orm/pg-core/table.js
1141
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/pg-core/table.js
1142
1142
  var InlineForeignKeys, EnableRLS, PgTable;
1143
1143
  var init_table2 = __esm(() => {
1144
1144
  init_entity();
@@ -1158,7 +1158,7 @@ var init_table2 = __esm(() => {
1158
1158
  };
1159
1159
  });
1160
1160
 
1161
- // ../../../../node_modules/drizzle-orm/pg-core/primary-keys.js
1161
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/pg-core/primary-keys.js
1162
1162
  var PrimaryKeyBuilder, PrimaryKey;
1163
1163
  var init_primary_keys = __esm(() => {
1164
1164
  init_entity();
@@ -1190,7 +1190,7 @@ var init_primary_keys = __esm(() => {
1190
1190
  };
1191
1191
  });
1192
1192
 
1193
- // ../../../../node_modules/drizzle-orm/sql/expressions/conditions.js
1193
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/sql/expressions/conditions.js
1194
1194
  function bindIfParam(value, column) {
1195
1195
  if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
1196
1196
  return new Param(value, column);
@@ -1326,7 +1326,7 @@ var init_conditions = __esm(() => {
1326
1326
  init_sql();
1327
1327
  });
1328
1328
 
1329
- // ../../../../node_modules/drizzle-orm/sql/expressions/select.js
1329
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/sql/expressions/select.js
1330
1330
  function asc(column) {
1331
1331
  return sql`${column} asc`;
1332
1332
  }
@@ -1337,13 +1337,13 @@ var init_select = __esm(() => {
1337
1337
  init_sql();
1338
1338
  });
1339
1339
 
1340
- // ../../../../node_modules/drizzle-orm/sql/expressions/index.js
1340
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/sql/expressions/index.js
1341
1341
  var init_expressions = __esm(() => {
1342
1342
  init_conditions();
1343
1343
  init_select();
1344
1344
  });
1345
1345
 
1346
- // ../../../../node_modules/drizzle-orm/relations.js
1346
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/relations.js
1347
1347
  function getOperators() {
1348
1348
  return {
1349
1349
  and,
@@ -1575,7 +1575,7 @@ var init_relations = __esm(() => {
1575
1575
  };
1576
1576
  });
1577
1577
 
1578
- // ../../../../node_modules/drizzle-orm/sql/functions/aggregate.js
1578
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/sql/functions/aggregate.js
1579
1579
  function count(expression) {
1580
1580
  return sql`count(${expression || sql.raw("*")})`.mapWith(Number);
1581
1581
  }
@@ -1606,7 +1606,7 @@ var init_aggregate = __esm(() => {
1606
1606
  init_sql();
1607
1607
  });
1608
1608
 
1609
- // ../../../../node_modules/drizzle-orm/sql/functions/vector.js
1609
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/sql/functions/vector.js
1610
1610
  function toSql(value) {
1611
1611
  return JSON.stringify(value);
1612
1612
  }
@@ -1650,20 +1650,20 @@ var init_vector = __esm(() => {
1650
1650
  init_sql();
1651
1651
  });
1652
1652
 
1653
- // ../../../../node_modules/drizzle-orm/sql/functions/index.js
1653
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/sql/functions/index.js
1654
1654
  var init_functions = __esm(() => {
1655
1655
  init_aggregate();
1656
1656
  init_vector();
1657
1657
  });
1658
1658
 
1659
- // ../../../../node_modules/drizzle-orm/sql/index.js
1659
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/sql/index.js
1660
1660
  var init_sql2 = __esm(() => {
1661
1661
  init_expressions();
1662
1662
  init_functions();
1663
1663
  init_sql();
1664
1664
  });
1665
1665
 
1666
- // ../../../../node_modules/drizzle-orm/index.js
1666
+ // ../../../node_modules/.bun/drizzle-orm@0.45.1+6e0ea2f0f122d214/node_modules/drizzle-orm/index.js
1667
1667
  var exports_drizzle_orm = {};
1668
1668
  __export(exports_drizzle_orm, {
1669
1669
  textDecoder: () => textDecoder,
@@ -1808,8 +1808,24 @@ import {
1808
1808
  import crypto from "node:crypto";
1809
1809
 
1810
1810
  // TrajectoryLoggerService.ts
1811
- import { logger as logger2, Service } from "@elizaos/core";
1811
+ import {
1812
+ logger as logger2,
1813
+ Service,
1814
+ getTrajectoryContext,
1815
+ runWithTrajectoryContext,
1816
+ setTrajectoryContextManager
1817
+ } from "@elizaos/core";
1812
1818
  import { v4 as uuidv4 } from "uuid";
1819
+ import { AsyncLocalStorage } from "node:async_hooks";
1820
+ var trajectoryStorage = new AsyncLocalStorage;
1821
+ setTrajectoryContextManager({
1822
+ run(context, fn) {
1823
+ return trajectoryStorage.run(context, fn);
1824
+ },
1825
+ active() {
1826
+ return trajectoryStorage.getStore();
1827
+ }
1828
+ });
1813
1829
  function asNumber(value) {
1814
1830
  if (typeof value === "number" && Number.isFinite(value))
1815
1831
  return value;
@@ -1865,11 +1881,49 @@ class TrajectoryLoggerService extends Service {
1865
1881
  return TrajectoryLoggerService.serviceType;
1866
1882
  }
1867
1883
  capabilityDescription = "Captures and persists LLM calls, provider accesses, and full trajectories for debugging, analysis, and RL training";
1884
+ static resolveFromRuntime(runtime) {
1885
+ const first = runtime.getService(TrajectoryLoggerService.serviceType);
1886
+ if (first && typeof first.startTrajectory === "function") {
1887
+ return first;
1888
+ }
1889
+ const all = typeof runtime.getServicesByType === "function" ? runtime.getServicesByType(TrajectoryLoggerService.serviceType) : [];
1890
+ for (const svc of all) {
1891
+ if (typeof svc.startTrajectory === "function") {
1892
+ return svc;
1893
+ }
1894
+ }
1895
+ return null;
1896
+ }
1897
+ static async waitForService(runtime, timeoutMs = 1e4) {
1898
+ const deadline = Date.now() + timeoutMs;
1899
+ while (Date.now() < deadline) {
1900
+ const svc = TrajectoryLoggerService.resolveFromRuntime(runtime);
1901
+ if (svc)
1902
+ return svc;
1903
+ await new Promise((r) => setTimeout(r, 50));
1904
+ }
1905
+ return null;
1906
+ }
1868
1907
  enabled = true;
1869
1908
  initialized = false;
1870
1909
  activeStepIds = new Map;
1871
1910
  stepToTrajectory = new Map;
1872
1911
  writeQueues = new Map;
1912
+ exposeBoundMethods() {
1913
+ const service = this;
1914
+ service.startTrajectory = this.startTrajectory.bind(this);
1915
+ service.endTrajectory = this.endTrajectory.bind(this);
1916
+ service.startStep = this.startStep.bind(this);
1917
+ service.getCurrentStepId = this.getCurrentStepId.bind(this);
1918
+ service.completeStep = this.completeStep.bind(this);
1919
+ service.logLLMCall = this.logLLMCall.bind(this);
1920
+ service.logProviderAccess = this.logProviderAccess.bind(this);
1921
+ service.logProviderAccessByTrajectoryId = this.logProviderAccessByTrajectoryId.bind(this);
1922
+ service.isEnabled = this.isEnabled.bind(this);
1923
+ service.listTrajectories = this.listTrajectories.bind(this);
1924
+ service.getTrajectoryDetail = this.getTrajectoryDetail.bind(this);
1925
+ service.flushWriteQueue = this.flushWriteQueue.bind(this);
1926
+ }
1873
1927
  static async start(runtime) {
1874
1928
  const service = new this(runtime);
1875
1929
  await service.initialize();
@@ -1904,6 +1958,7 @@ class TrajectoryLoggerService extends Service {
1904
1958
  async initialize() {
1905
1959
  if (this.initialized)
1906
1960
  return;
1961
+ this.exposeBoundMethods();
1907
1962
  const runtime = this.runtime;
1908
1963
  if (!runtime?.adapter) {
1909
1964
  logger2.warn("[trajectory-logger] No runtime adapter available, skipping initialization");
@@ -1911,6 +1966,29 @@ class TrajectoryLoggerService extends Service {
1911
1966
  }
1912
1967
  await this.ensureTablesExist();
1913
1968
  await this.backfillTrajectoriesMissingLlmCalls();
1969
+ const originalUseModel = runtime.useModel;
1970
+ if (typeof originalUseModel === "function") {
1971
+ const patchedUseModel = async function(...args) {
1972
+ const context = getTrajectoryContext();
1973
+ if (context?.trajectoryStepId) {
1974
+ return originalUseModel.call(this, ...args);
1975
+ }
1976
+ const trajLogger = TrajectoryLoggerService.resolveFromRuntime(runtime);
1977
+ if (!trajLogger || !trajLogger.isEnabled()) {
1978
+ return originalUseModel.call(this, ...args);
1979
+ }
1980
+ const stepId = await trajLogger.startTrajectory(runtime.agentId, {
1981
+ source: "chat-orphan",
1982
+ metadata: { autoPatch: true }
1983
+ });
1984
+ try {
1985
+ return await runWithTrajectoryContext({ trajectoryStepId: stepId }, () => originalUseModel.call(this, ...args));
1986
+ } finally {
1987
+ await trajLogger.endTrajectory(stepId, "completed");
1988
+ }
1989
+ };
1990
+ runtime.useModel = patchedUseModel;
1991
+ }
1914
1992
  this.initialized = true;
1915
1993
  logger2.info("[trajectory-logger] Trajectory logger service initialized");
1916
1994
  }
@@ -2178,7 +2256,15 @@ class TrajectoryLoggerService extends Service {
2178
2256
  completionTokens: 0,
2179
2257
  latencyMs: 0,
2180
2258
  purpose: "other",
2181
- actionType: "TRAJECTORY_FALLBACK"
2259
+ actionType: "TRAJECTORY_FALLBACK",
2260
+ stepType: "synthetic",
2261
+ tags: [
2262
+ "llm",
2263
+ "step:synthetic",
2264
+ "purpose:other",
2265
+ "action:trajectory_fallback",
2266
+ "synthetic"
2267
+ ]
2182
2268
  };
2183
2269
  step.llmCalls.push(syntheticCall);
2184
2270
  if (!step.metadata)
@@ -2214,6 +2300,12 @@ class TrajectoryLoggerService extends Service {
2214
2300
  totalCompletionTokens
2215
2301
  };
2216
2302
  }
2303
+ async flushWriteQueue(trajectoryId) {
2304
+ const pending = this.writeQueues.get(trajectoryId);
2305
+ if (pending) {
2306
+ await pending.catch(() => {});
2307
+ }
2308
+ }
2217
2309
  async withTrajectoryWriteLock(trajectoryId, task) {
2218
2310
  const previous = this.writeQueues.get(trajectoryId) ?? Promise.resolve();
2219
2311
  const next = previous.catch(() => {}).then(task);
@@ -2364,41 +2456,49 @@ class TrajectoryLoggerService extends Service {
2364
2456
  logLlmCall(params) {
2365
2457
  if (!this.enabled)
2366
2458
  return;
2367
- (async () => {
2368
- const trajectoryId = await this.resolveTrajectoryId(params.stepId);
2369
- if (!trajectoryId) {
2370
- logger2.debug({ stepId: params.stepId }, "[trajectory-logger] No trajectory mapping for LLM call");
2371
- return;
2372
- }
2373
- await this.withTrajectoryWriteLock(trajectoryId, async () => {
2374
- const trajectory = await this.getTrajectoryById(trajectoryId);
2375
- if (!trajectory)
2459
+ const trajectoryId = this.stepToTrajectory.get(params.stepId);
2460
+ if (!trajectoryId) {
2461
+ (async () => {
2462
+ const resolved = await this.resolveTrajectoryId(params.stepId);
2463
+ if (!resolved)
2376
2464
  return;
2377
- const step = await this.ensureStepExists(trajectory, params.stepId);
2378
- const llmCall = {
2379
- callId: uuidv4(),
2380
- timestamp: Date.now(),
2381
- model: params.model,
2382
- modelVersion: params.modelVersion,
2383
- systemPrompt: params.systemPrompt,
2384
- userPrompt: params.userPrompt,
2385
- response: params.response,
2386
- reasoning: params.reasoning,
2387
- temperature: params.temperature,
2388
- maxTokens: params.maxTokens,
2389
- purpose: this.normalizePurpose(params.purpose),
2390
- actionType: params.actionType,
2391
- promptTokens: params.promptTokens,
2392
- completionTokens: params.completionTokens,
2393
- latencyMs: params.latencyMs
2394
- };
2395
- step.llmCalls.push(llmCall);
2396
- await this.persistTrajectory(trajectoryId, trajectory, "active");
2465
+ await this._persistLlmCall(resolved, params);
2466
+ })().catch((err) => {
2467
+ logger2.warn({ err, stepId: params.stepId }, "[trajectory-logger] Failed to persist LLM call (fallback)");
2397
2468
  });
2398
- })().catch((err) => {
2469
+ return;
2470
+ }
2471
+ this._persistLlmCall(trajectoryId, params).catch((err) => {
2399
2472
  logger2.warn({ err, stepId: params.stepId }, "[trajectory-logger] Failed to persist LLM call");
2400
2473
  });
2401
2474
  }
2475
+ async _persistLlmCall(trajectoryId, params) {
2476
+ await this.withTrajectoryWriteLock(trajectoryId, async () => {
2477
+ const trajectory = await this.getTrajectoryById(trajectoryId);
2478
+ if (!trajectory)
2479
+ return;
2480
+ const step = await this.ensureStepExists(trajectory, params.stepId);
2481
+ const llmCall = {
2482
+ callId: uuidv4(),
2483
+ timestamp: Date.now(),
2484
+ model: params.model,
2485
+ modelVersion: params.modelVersion,
2486
+ systemPrompt: params.systemPrompt,
2487
+ userPrompt: params.userPrompt,
2488
+ response: params.response,
2489
+ reasoning: params.reasoning,
2490
+ temperature: params.temperature,
2491
+ maxTokens: params.maxTokens,
2492
+ purpose: this.normalizePurpose(params.purpose),
2493
+ actionType: params.actionType,
2494
+ promptTokens: params.promptTokens,
2495
+ completionTokens: params.completionTokens,
2496
+ latencyMs: params.latencyMs
2497
+ };
2498
+ step.llmCalls.push(llmCall);
2499
+ await this.persistTrajectory(trajectoryId, trajectory, "active");
2500
+ });
2501
+ }
2402
2502
  logLLMCall(stepId, details) {
2403
2503
  this.logLlmCall({
2404
2504
  stepId,
@@ -2632,21 +2732,28 @@ class TrajectoryLoggerService extends Service {
2632
2732
  return;
2633
2733
  }
2634
2734
  const now = Date.now();
2635
- trajectory.endTime = now;
2636
- trajectory.durationMs = now - trajectory.startTime;
2637
- trajectory.metrics.finalStatus = status;
2638
- trajectory.metrics.episodeLength = trajectory.steps.length;
2735
+ const durationMs = now - trajectory.startTime;
2736
+ const metrics = { ...trajectory.metrics, finalStatus: status, episodeLength: trajectory.steps.length };
2639
2737
  if (finalMetrics) {
2640
- trajectory.metrics = {
2641
- ...trajectory.metrics,
2642
- ...finalMetrics
2643
- };
2738
+ Object.assign(metrics, finalMetrics);
2644
2739
  }
2645
2740
  await this.markAllStepsInactive(trajectoryId);
2646
2741
  this.activeStepIds.delete(trajectoryId);
2647
- await this.persistTrajectory(trajectoryId, trajectory, status);
2742
+ const updatedAtIso = new Date().toISOString();
2743
+ await this.executeRawSql(`
2744
+ UPDATE trajectories SET
2745
+ status = ${sqlLiteral(status)},
2746
+ end_time = ${now},
2747
+ duration_ms = ${durationMs},
2748
+ metrics_json = ${sqlLiteral(metrics)},
2749
+ updated_at = ${sqlLiteral(updatedAtIso)}
2750
+ WHERE id = ${sqlLiteral(trajectoryId)}
2751
+ `);
2648
2752
  });
2649
- for (const [stepId, mappedTrajectoryId] of this.stepToTrajectory.entries()) {
2753
+ for (const [
2754
+ stepId,
2755
+ mappedTrajectoryId
2756
+ ] of this.stepToTrajectory.entries()) {
2650
2757
  if (mappedTrajectoryId === trajectoryId) {
2651
2758
  this.stepToTrajectory.delete(stepId);
2652
2759
  }
@@ -3067,7 +3174,7 @@ var trajectoryContexts = new WeakMap;
3067
3174
  function setTrajectoryContext(runtime, trajectoryId, trajectoryLogger) {
3068
3175
  trajectoryContexts.set(runtime, { trajectoryId, logger: trajectoryLogger });
3069
3176
  }
3070
- function getTrajectoryContext(runtime) {
3177
+ function getTrajectoryContext2(runtime) {
3071
3178
  return trajectoryContexts.get(runtime) || null;
3072
3179
  }
3073
3180
  function clearTrajectoryContext(runtime) {
@@ -3078,7 +3185,7 @@ function wrapActionWithLogging(action, _trajectoryLogger) {
3078
3185
  return {
3079
3186
  ...action,
3080
3187
  handler: async (runtime, message, state, options, callback) => {
3081
- const context = getTrajectoryContext(runtime);
3188
+ const context = getTrajectoryContext2(runtime);
3082
3189
  if (!context) {
3083
3190
  const result = await originalHandler(runtime, message, state, options, callback);
3084
3191
  return result ?? undefined;
@@ -3185,7 +3292,7 @@ function wrapProviderWithLogging(provider, _trajectoryLogger) {
3185
3292
  return {
3186
3293
  ...provider,
3187
3294
  get: async (runtime, message, state) => {
3188
- const context = getTrajectoryContext(runtime);
3295
+ const context = getTrajectoryContext2(runtime);
3189
3296
  if (!context) {
3190
3297
  return originalGet?.(runtime, message, state) || { text: "" };
3191
3298
  }
@@ -3520,6 +3627,7 @@ async function recomputeTrajectoryRewards(_trajectoryIds) {}
3520
3627
  import { logger as logger4 } from "@elizaos/core";
3521
3628
  async function startAutonomousTick(trajectoryLogger, context) {
3522
3629
  const trajectoryId = await trajectoryLogger.startTrajectory(context.agentId, {
3630
+ source: context.source,
3523
3631
  scenarioId: context.scenarioId,
3524
3632
  episodeId: context.episodeId,
3525
3633
  batchId: context.batchId,
@@ -3537,6 +3645,10 @@ async function startAutonomousTick(trajectoryLogger, context) {
3537
3645
  return trajectoryId;
3538
3646
  }
3539
3647
  async function endAutonomousTick(trajectoryLogger, trajectoryId, status = "completed", finalMetrics) {
3648
+ const flush = trajectoryLogger.flushWriteQueue;
3649
+ if (typeof flush === "function") {
3650
+ await flush(trajectoryId);
3651
+ }
3540
3652
  await trajectoryLogger.endTrajectory(trajectoryId, status, finalMetrics);
3541
3653
  logger4.info({ trajectoryId, status }, "Ended autonomous tick trajectory");
3542
3654
  }
@@ -3689,7 +3801,7 @@ var trajectoryLoggerPlugin = {
3689
3801
  };
3690
3802
  }
3691
3803
  const meta = message.metadata;
3692
- const logger5 = runtime.getService("trajectory_logger");
3804
+ const logger5 = TrajectoryLoggerService.resolveFromRuntime(runtime);
3693
3805
  if (!logger5)
3694
3806
  return;
3695
3807
  let trajectoryStepId = crypto.randomUUID();
@@ -3745,7 +3857,7 @@ var trajectoryLoggerPlugin = {
3745
3857
  }
3746
3858
  if (!trajectoryStepId)
3747
3859
  return;
3748
- const logger5 = runtime.getService("trajectory_logger");
3860
+ const logger5 = TrajectoryLoggerService.resolveFromRuntime(runtime);
3749
3861
  if (!logger5)
3750
3862
  return;
3751
3863
  try {
@@ -3790,7 +3902,7 @@ export {
3790
3902
  logProviderAccess,
3791
3903
  logLLMCallFromAction,
3792
3904
  groupTrajectories,
3793
- getTrajectoryContext,
3905
+ getTrajectoryContext2 as getTrajectoryContext,
3794
3906
  extractSharedPrefix,
3795
3907
  exportToHuggingFace,
3796
3908
  exportGroupedForGRPO,
@@ -3807,4 +3919,4 @@ export {
3807
3919
  RewardService
3808
3920
  };
3809
3921
 
3810
- //# debugId=621E07B14B9A695B64756E2164756E21
3922
+ //# debugId=82D6338D5E8EB6DA64756E2164756E21