@elizaos/plugin-auto-trader 2.0.0-alpha.2 → 2.0.0-alpha.3

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 (34) hide show
  1. package/dist/MeanReversionStrategy-DWMTVZBR.js +9 -0
  2. package/dist/MomentumBreakoutStrategy-FCWYC6D6.js +9 -0
  3. package/dist/RandomStrategy-JJCJEW5V.js +9 -0
  4. package/dist/RuleBasedStrategy-3OB4HZLT.js +9 -0
  5. package/dist/{chunk-AS6N6A3H.js → chunk-5LMMYSSD.js} +1 -1
  6. package/dist/chunk-5LMMYSSD.js.map +1 -0
  7. package/dist/{chunk-KB2EBQUN.js → chunk-7YO3Q6ZS.js} +1 -1
  8. package/dist/chunk-7YO3Q6ZS.js.map +1 -0
  9. package/dist/{chunk-7GI4G3ZN.js → chunk-GAGDUXA5.js} +8 -3
  10. package/dist/chunk-GAGDUXA5.js.map +1 -0
  11. package/dist/{chunk-GYTZTIWK.js → chunk-IQWCSPU4.js} +25 -8
  12. package/dist/chunk-IQWCSPU4.js.map +1 -0
  13. package/dist/{chunk-Z6SUPK5O.js → chunk-PPB7RNSR.js} +56 -34
  14. package/dist/chunk-PPB7RNSR.js.map +1 -0
  15. package/dist/index.js +657 -311
  16. package/dist/index.js.map +1 -1
  17. package/dist/{index.node-YLFTRMAZ.js → index.node-P3CSHIDI.js} +4 -6
  18. package/dist/index.node-P3CSHIDI.js.map +1 -0
  19. package/package.json +14 -6
  20. package/LICENSE +0 -21
  21. package/dist/MeanReversionStrategy-VQJGG3DE.js +0 -9
  22. package/dist/MomentumBreakoutStrategy-O7I3EMGB.js +0 -9
  23. package/dist/RandomStrategy-GPGG56MV.js +0 -9
  24. package/dist/RuleBasedStrategy-7O47DGTU.js +0 -9
  25. package/dist/chunk-7GI4G3ZN.js.map +0 -1
  26. package/dist/chunk-AS6N6A3H.js.map +0 -1
  27. package/dist/chunk-GYTZTIWK.js.map +0 -1
  28. package/dist/chunk-KB2EBQUN.js.map +0 -1
  29. package/dist/chunk-Z6SUPK5O.js.map +0 -1
  30. package/dist/index.node-YLFTRMAZ.js.map +0 -1
  31. /package/dist/{MeanReversionStrategy-VQJGG3DE.js.map → MeanReversionStrategy-DWMTVZBR.js.map} +0 -0
  32. /package/dist/{MomentumBreakoutStrategy-O7I3EMGB.js.map → MomentumBreakoutStrategy-FCWYC6D6.js.map} +0 -0
  33. /package/dist/{RandomStrategy-GPGG56MV.js.map → RandomStrategy-JJCJEW5V.js.map} +0 -0
  34. /package/dist/{RuleBasedStrategy-7O47DGTU.js.map → RuleBasedStrategy-3OB4HZLT.js.map} +0 -0
@@ -26,15 +26,13 @@ function wrapActionWithLogging(action, _trajectoryLogger) {
26
26
  handler: async (runtime, message, state, options, callback) => {
27
27
  const context = getTrajectoryContext(runtime);
28
28
  if (!context) {
29
- const result = await originalHandler(runtime, message, state, options, callback);
30
- return result ?? void 0;
29
+ return await originalHandler(runtime, message, state, options, callback);
31
30
  }
32
31
  const { trajectoryId, logger: loggerService } = context;
33
32
  const stepId = loggerService.getCurrentStepId(trajectoryId);
34
33
  if (!stepId) {
35
34
  logger.warn({ action: action.name, trajectoryId }, "No active step for action execution");
36
- const result = await originalHandler(runtime, message, state, options, callback);
37
- return result ?? void 0;
35
+ return await originalHandler(runtime, message, state, options, callback);
38
36
  }
39
37
  const successHandler = () => {
40
38
  const stateSnapshot = state ? JSON.parse(JSON.stringify(state)) : null;
@@ -70,7 +68,7 @@ function wrapActionWithLogging(action, _trajectoryLogger) {
70
68
  try {
71
69
  const result = await originalHandler(runtime, message, state, options, callback);
72
70
  successHandler();
73
- return result ?? void 0;
71
+ return result;
74
72
  } catch (err) {
75
73
  if (err instanceof Error) {
76
74
  return errorHandler(err);
@@ -833,4 +831,4 @@ export {
833
831
  wrapPluginProviders,
834
832
  wrapProviderWithLogging
835
833
  };
836
- //# sourceMappingURL=index.node-YLFTRMAZ.js.map
834
+ //# sourceMappingURL=index.node-P3CSHIDI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../plugin-trajectory-logger/typescript/dist/node/index.node.js"],"sourcesContent":["// action-interceptor.ts\nimport { logger } from \"@elizaos/core\";\nvar trajectoryContexts = new WeakMap;\nfunction setTrajectoryContext(runtime, trajectoryId, trajectoryLogger) {\n trajectoryContexts.set(runtime, { trajectoryId, logger: trajectoryLogger });\n}\nfunction getTrajectoryContext(runtime) {\n return trajectoryContexts.get(runtime) || null;\n}\nfunction clearTrajectoryContext(runtime) {\n trajectoryContexts.delete(runtime);\n}\nfunction wrapActionWithLogging(action, _trajectoryLogger) {\n const originalHandler = action.handler;\n return {\n ...action,\n handler: async (runtime, message, state, options, callback) => {\n const context = getTrajectoryContext(runtime);\n if (!context) {\n return await originalHandler(runtime, message, state, options, callback);\n }\n const { trajectoryId, logger: loggerService } = context;\n const stepId = loggerService.getCurrentStepId(trajectoryId);\n if (!stepId) {\n logger.warn({ action: action.name, trajectoryId }, \"No active step for action execution\");\n return await originalHandler(runtime, message, state, options, callback);\n }\n const successHandler = () => {\n const stateSnapshot = state ? JSON.parse(JSON.stringify(state)) : null;\n loggerService.completeStep(trajectoryId, stepId, {\n actionType: action.name,\n actionName: action.name,\n parameters: {\n message: message.content.text || \"\",\n state: stateSnapshot\n },\n success: true,\n result: { executed: true },\n reasoning: `Action ${action.name} executed via ${action.description || \"handler\"}`\n }, { reward: 0.1 });\n };\n const errorHandler = (err) => {\n const error = err instanceof Error ? err.message : typeof err === \"string\" ? err : err.message || String(err);\n logger.error({ action: action.name, trajectoryId, error }, \"Action execution failed\");\n const stateSnapshot = state ? JSON.parse(JSON.stringify(state)) : null;\n loggerService.completeStep(trajectoryId, stepId, {\n actionType: action.name,\n actionName: action.name,\n parameters: {\n message: message.content.text || \"\",\n state: stateSnapshot\n },\n success: false,\n result: { error },\n reasoning: `Action ${action.name} failed: ${error}`\n }, { reward: -0.1 });\n throw err;\n };\n try {\n const result = await originalHandler(runtime, message, state, options, callback);\n successHandler();\n return result;\n } catch (err) {\n if (err instanceof Error) {\n return errorHandler(err);\n }\n if (typeof err === \"string\") {\n return errorHandler(err);\n }\n return errorHandler(err);\n }\n }\n };\n}\nfunction wrapPluginActions(plugin, trajectoryLogger) {\n if (!plugin.actions || plugin.actions.length === 0) {\n return plugin;\n }\n return {\n ...plugin,\n actions: plugin.actions.map((action) => wrapActionWithLogging(action, trajectoryLogger))\n };\n}\nfunction logLLMCallFromAction(actionContext, trajectoryLogger, trajectoryId) {\n const stepId = trajectoryLogger.getCurrentStepId(trajectoryId);\n if (!stepId) {\n logger.warn({ trajectoryId }, \"No active step for LLM call from action\");\n return;\n }\n trajectoryLogger.logLLMCall(stepId, {\n model: actionContext.model || \"unknown\",\n systemPrompt: actionContext.systemPrompt || \"\",\n userPrompt: actionContext.userPrompt || \"\",\n response: actionContext.response || \"\",\n reasoning: actionContext.reasoning || undefined,\n temperature: actionContext.temperature || 0.7,\n maxTokens: actionContext.maxTokens || 8192,\n purpose: actionContext.purpose || \"action\",\n actionType: actionContext.actionType || undefined,\n promptTokens: actionContext.promptTokens || undefined,\n completionTokens: actionContext.completionTokens || undefined,\n latencyMs: actionContext.latencyMs || undefined\n });\n}\nfunction logProviderFromAction(actionContext, trajectoryLogger, trajectoryId) {\n const stepId = trajectoryLogger.getCurrentStepId(trajectoryId);\n if (!stepId) {\n logger.warn({ trajectoryId }, \"No active step for provider access from action\");\n return;\n }\n trajectoryLogger.logProviderAccess(stepId, {\n providerName: actionContext.providerName || \"unknown\",\n data: actionContext.data || {},\n purpose: actionContext.purpose || \"action\",\n query: actionContext.query || undefined\n });\n}\nfunction wrapProviderWithLogging(provider, _trajectoryLogger) {\n const originalGet = provider.get;\n return {\n ...provider,\n get: async (runtime, message, state) => {\n const context = getTrajectoryContext(runtime);\n if (!context) {\n return originalGet?.(runtime, message, state) || { text: \"\" };\n }\n const { trajectoryId, logger: loggerService } = context;\n const stepId = loggerService.getCurrentStepId(trajectoryId);\n if (!stepId) {\n logger.warn({ provider: provider.name, trajectoryId }, \"No active step for provider access\");\n return originalGet?.(runtime, message, state) || { text: \"\" };\n }\n const result = await originalGet?.(runtime, message, state) || { text: \"\" };\n const stateSnapshot = state ? JSON.parse(JSON.stringify(state)) : null;\n loggerService.logProviderAccess(stepId, {\n providerName: provider.name,\n data: {\n text: result.text || \"\",\n success: true\n },\n purpose: `Provider ${provider.name} accessed for context`,\n query: {\n message: message.content.text || \"\",\n state: stateSnapshot\n }\n });\n return result;\n }\n };\n}\nfunction wrapPluginProviders(plugin, trajectoryLogger) {\n if (!plugin.providers || plugin.providers.length === 0) {\n return plugin;\n }\n return {\n ...plugin,\n providers: plugin.providers.map((provider) => wrapProviderWithLogging(provider, trajectoryLogger))\n };\n}\n// art-format.ts\nfunction toARTMessages(trajectory) {\n const messages = [];\n const systemMessage = buildSystemMessage(trajectory);\n if (systemMessage) {\n messages.push(systemMessage);\n }\n for (const step of trajectory.steps) {\n const userContent = buildUserMessage(step);\n if (userContent) {\n messages.push({ role: \"user\", content: userContent });\n }\n const assistantContent = buildAssistantMessage(step);\n if (assistantContent) {\n messages.push({ role: \"assistant\", content: assistantContent });\n }\n }\n return messages;\n}\nfunction buildSystemMessage(trajectory) {\n const firstStep = trajectory.steps[0];\n const firstLLMCall = firstStep?.llmCalls?.[0];\n if (firstLLMCall?.systemPrompt) {\n return { role: \"system\", content: firstLLMCall.systemPrompt };\n }\n const agentName = trajectory.metadata.agentName || \"Agent\";\n const goal = trajectory.metadata.goalDescription || \"make good decisions\";\n return {\n role: \"system\",\n content: `You are ${agentName}, an autonomous agent. Your goal is to ${goal}.`\n };\n}\nfunction buildUserMessage(step) {\n const llmCall = step.llmCalls.find((call) => call.purpose === \"action\");\n if (llmCall?.userPrompt) {\n return llmCall.userPrompt;\n }\n const parts = [];\n parts.push(\"Current state:\");\n parts.push(`- Balance: $${step.environmentState.agentBalance}`);\n parts.push(`- P&L: $${step.environmentState.agentPnL}`);\n parts.push(`- Open Positions: ${step.environmentState.openPositions}`);\n for (const provider of step.providerAccesses) {\n parts.push(`\n${provider.providerName} data:`);\n parts.push(JSON.stringify(provider.data, null, 2));\n }\n parts.push(`\nWhat action should you take?`);\n return parts.join(`\n`);\n}\nfunction buildAssistantMessage(step) {\n const llmCall = step.llmCalls.find((call) => call.purpose === \"action\");\n if (llmCall?.response) {\n return llmCall.response;\n }\n const action = step.action;\n const parts = [];\n parts.push(`I will ${action.actionType}.`);\n if (action.reasoning) {\n parts.push(`Reasoning: ${action.reasoning}`);\n }\n parts.push(`Parameters: ${JSON.stringify(action.parameters)}`);\n return parts.join(`\n`);\n}\nfunction toARTTrajectory(trajectory) {\n return {\n messages: toARTMessages(trajectory),\n reward: trajectory.totalReward,\n metadata: {\n trajectoryId: trajectory.trajectoryId,\n agentId: trajectory.agentId,\n scenarioId: trajectory.scenarioId,\n groupIndex: trajectory.groupIndex,\n environmentContext: {\n initialBalance: trajectory.steps[0]?.environmentState.agentBalance || 0,\n finalBalance: trajectory.metrics.finalBalance || 0,\n initialPnL: trajectory.steps[0]?.environmentState.agentPnL || 0,\n finalPnL: trajectory.metrics.finalPnL || 0,\n actionsTaken: trajectory.steps.map((s) => s.action.actionType),\n errors: trajectory.steps.filter((s) => !s.action.success).map((s) => s.action.error || \"Unknown error\")\n },\n gameKnowledge: extractGameKnowledge(trajectory),\n metrics: JSON.parse(JSON.stringify(trajectory.metrics))\n },\n metrics: filterNumericMetrics(trajectory.metrics)\n };\n}\nfunction filterNumericMetrics(metrics) {\n const numericMetrics = {};\n for (const [key, value] of Object.entries(metrics)) {\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n numericMetrics[key] = value;\n }\n }\n return numericMetrics;\n}\nfunction extractGameKnowledge(trajectory) {\n const knowledge = {};\n if (trajectory.metadata.trueProbabilities) {\n knowledge.trueProbabilities = trajectory.metadata.trueProbabilities;\n }\n if (trajectory.metadata.futureOutcomes) {\n knowledge.actualOutcomes = trajectory.metadata.futureOutcomes;\n }\n if (trajectory.metadata.hiddenVariables) {\n knowledge.hiddenVariables = trajectory.metadata.hiddenVariables;\n }\n const gameEvents = trajectory.steps.map((s) => s.metadata?.gameEvent).filter((e) => !!e);\n if (gameEvents.length > 0) {\n knowledge.gameEvents = gameEvents;\n }\n return knowledge;\n}\nfunction groupTrajectories(trajectories) {\n const groups = new Map;\n for (const traj of trajectories) {\n const scenarioId = traj.scenarioId || \"default\";\n if (!groups.has(scenarioId)) {\n groups.set(scenarioId, []);\n }\n groups.get(scenarioId)?.push(traj);\n }\n return Array.from(groups.entries()).map(([scenarioId, trajs], idx) => ({\n groupId: `group-${idx}`,\n scenarioId,\n trajectories: trajs,\n sharedPrefix: extractSharedPrefix(trajs),\n createdAt: Date.now()\n }));\n}\nfunction extractSharedPrefix(trajectories) {\n if (trajectories.length === 0)\n return [];\n const allMessages = trajectories.map((t) => toARTMessages(t));\n if (allMessages.length === 0)\n return [];\n const firstMessages = allMessages[0];\n if (!firstMessages)\n return [];\n const sharedPrefix = [];\n for (let i = 0;i < firstMessages.length; i++) {\n const message = firstMessages[i];\n if (!message)\n break;\n const allMatch = allMessages.every((msgs) => msgs[i] && msgs[i]?.role === message.role && msgs[i]?.content === message.content);\n if (allMatch) {\n sharedPrefix.push(message);\n } else {\n break;\n }\n }\n return sharedPrefix;\n}\nfunction removeSharedPrefix(messages, sharedPrefix) {\n return messages.slice(sharedPrefix.length);\n}\nfunction prepareForRULER(group) {\n const artTrajs = group.trajectories.map((t) => toARTTrajectory(t));\n const sharedPrefix = group.sharedPrefix || extractSharedPrefix(group.trajectories);\n return {\n sharedPrefix,\n suffixes: artTrajs.map((art) => removeSharedPrefix(art.messages, sharedPrefix)),\n metadata: artTrajs.map((art) => art.metadata)\n };\n}\nfunction toARTJSONL(trajectory) {\n return JSON.stringify(toARTTrajectory(trajectory));\n}\nfunction validateARTCompatibility(trajectory) {\n const errors = [];\n const warnings = [];\n if (trajectory.steps.length === 0) {\n errors.push(\"Trajectory has no steps\");\n }\n for (const [idx, step] of trajectory.steps.entries()) {\n if (step.llmCalls.length === 0) {\n errors.push(`Step ${idx} has no LLM calls - can't extract messages`);\n }\n for (const llmCall of step.llmCalls) {\n if (!llmCall.userPrompt || llmCall.userPrompt.length < 10) {\n warnings.push(`Step ${idx} has very short user prompt`);\n }\n if (!llmCall.response || llmCall.response.length < 5) {\n warnings.push(`Step ${idx} has very short response`);\n }\n }\n }\n if (trajectory.totalReward === undefined || Number.isNaN(trajectory.totalReward)) {\n errors.push(\"Trajectory has no valid reward\");\n }\n const artTraj = toARTTrajectory(trajectory);\n if (artTraj.messages.length < 2) {\n warnings.push(\"Trajectory converts to very few messages (< 2)\");\n }\n return {\n valid: errors.length === 0,\n errors,\n warnings\n };\n}\n// export.ts\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nasync function exportToHuggingFace(options) {\n return exportForOpenPipeART(options);\n}\nasync function exportGroupedByScenario(options) {\n const trajectories = filterTrajectories(options.trajectories || [], options);\n const outPath = resolveOutputPath(options, \"grouped-by-scenario.json\");\n const grouped = {};\n for (const t of trajectories) {\n const scenarioId = t.scenarioId || \"default\";\n if (!grouped[scenarioId])\n grouped[scenarioId] = [];\n grouped[scenarioId]?.push(t);\n }\n await writeJson(outPath, grouped);\n return { success: true, trajectoriesExported: trajectories.length, datasetUrl: outPath };\n}\nasync function exportForOpenPipeART(options) {\n const trajectories = filterTrajectories(options.trajectories || [], options);\n const outPath = resolveOutputPath(options, \"trajectories.art.jsonl\");\n const lines = `${trajectories.map((t) => toARTJSONL(t)).join(`\n`)}\n`;\n await writeText(outPath, lines);\n return { success: true, trajectoriesExported: trajectories.length, datasetUrl: outPath };\n}\nasync function exportGroupedForGRPO(options) {\n const trajectories = filterTrajectories(options.trajectories || [], options);\n const outPath = resolveOutputPath(options, \"trajectories.grpo.groups.json\");\n const groups = groupTrajectories(trajectories);\n await writeJson(outPath, groups);\n return { success: true, trajectoriesExported: trajectories.length, datasetUrl: outPath };\n}\nfunction filterTrajectories(trajectories, options) {\n let out = trajectories.slice();\n if (options.startDate) {\n const startMs = options.startDate.getTime();\n out = out.filter((t) => t.startTime >= startMs);\n }\n if (options.endDate) {\n const endMs = options.endDate.getTime();\n out = out.filter((t) => t.startTime <= endMs);\n }\n if (options.agentIds && options.agentIds.length > 0) {\n const set = new Set(options.agentIds);\n out = out.filter((t) => set.has(t.agentId));\n }\n if (options.scenarioIds && options.scenarioIds.length > 0) {\n const set = new Set(options.scenarioIds);\n out = out.filter((t) => t.scenarioId && set.has(t.scenarioId));\n }\n if (typeof options.minReward === \"number\") {\n const minReward = options.minReward;\n out = out.filter((t) => t.totalReward >= minReward);\n }\n if (typeof options.maxReward === \"number\") {\n const maxReward = options.maxReward;\n out = out.filter((t) => t.totalReward <= maxReward);\n }\n const limit = options.maxTrajectories || out.length;\n return out.slice(0, limit);\n}\nfunction resolveOutputPath(options, fallbackFileName) {\n if (options.outputPath)\n return options.outputPath;\n if (options.outputDir)\n return join(options.outputDir, fallbackFileName);\n const safeName = options.datasetName.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n return join(process.cwd(), `${safeName}.${fallbackFileName}`);\n}\nasync function writeText(path, content) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, content, \"utf8\");\n}\nasync function writeJson(path, data) {\n await writeText(path, `${JSON.stringify(data, null, 2)}\n`);\n}\n// game-rewards.ts\nfunction computeTrajectoryReward(trajectory) {\n return trajectory.totalReward;\n}\nfunction computeStepReward(step) {\n return step.reward || 0;\n}\nasync function buildGameStateFromDB(_trajectoryId) {\n return {};\n}\nasync function recomputeTrajectoryRewards(_trajectoryIds) {}\n// integration.ts\nimport { logger as logger2 } from \"@elizaos/core\";\nfunction startAutonomousTick(trajectoryLogger, context) {\n const trajectoryId = trajectoryLogger.startTrajectory(context.agentId, {\n scenarioId: context.scenarioId,\n episodeId: context.episodeId,\n batchId: context.batchId,\n metadata: context.metadata\n });\n const envState = {\n timestamp: Date.now(),\n agentBalance: 0,\n agentPoints: 0,\n agentPnL: 0,\n openPositions: 0\n };\n trajectoryLogger.startStep(trajectoryId, envState);\n logger2.info({ trajectoryId, agentId: context.agentId }, \"Started autonomous tick trajectory\");\n return trajectoryId;\n}\nasync function endAutonomousTick(trajectoryLogger, trajectoryId, status = \"completed\", finalMetrics) {\n await trajectoryLogger.endTrajectory(trajectoryId, status, finalMetrics);\n logger2.info({ trajectoryId, status }, \"Ended autonomous tick trajectory\");\n}\nasync function loggedLLMCall(trajectoryLogger, trajectoryId, options, llmCallFn) {\n const stepId = trajectoryLogger.getCurrentStepId(trajectoryId);\n if (!stepId) {\n logger2.warn({ trajectoryId }, \"No active step for LLM call\");\n const result2 = await llmCallFn();\n return result2.text;\n }\n const startTime = Date.now();\n const result = await llmCallFn();\n const latencyMs = Date.now() - startTime;\n trajectoryLogger.logLLMCall(stepId, {\n model: options.model,\n modelVersion: options.modelVersion,\n systemPrompt: options.systemPrompt,\n userPrompt: options.userPrompt,\n response: result.text,\n reasoning: result.reasoning,\n temperature: options.temperature || 0.7,\n maxTokens: options.maxTokens || 8192,\n purpose: options.purpose || \"action\",\n actionType: options.actionType,\n promptTokens: result.tokens?.prompt,\n completionTokens: result.tokens?.completion,\n latencyMs: result.latencyMs || latencyMs\n });\n return result.text;\n}\nfunction logProviderAccess(trajectoryLogger, trajectoryId, access) {\n trajectoryLogger.logProviderAccessByTrajectoryId(trajectoryId, access);\n}\nfunction withTrajectoryLogging(fn, trajectoryLogger, trajectoryId, context = {}) {\n return async (...args) => {\n const stepId = trajectoryLogger.getCurrentStepId(trajectoryId);\n if (!stepId) {\n return fn(...args);\n }\n const result = await fn(...args);\n trajectoryLogger.completeStep(trajectoryId, stepId, {\n actionType: context.actionType || \"function_call\",\n actionName: fn.name || \"anonymous\",\n parameters: { args },\n success: true,\n result: result !== undefined ? { result } : { result: null }\n }, { reward: 0.05 });\n return result;\n };\n}\n// reward-service.ts\nclass RewardService {\n options;\n constructor(options = {}) {\n this.options = options;\n }\n async scoreTrajectory(trajectory) {\n if (this.options.useHeuristics !== false) {\n return this.computeHeuristicReward(trajectory);\n }\n return this.computeHeuristicReward(trajectory);\n }\n async scoreTrajectoryGroup(trajectories) {\n if (trajectories.length === 0) {\n return [];\n }\n if (trajectories.length === 1) {\n const first = trajectories[0];\n if (!first)\n return [];\n const score = await this.scoreTrajectory(first);\n return [this.normalizeScore(score)];\n }\n const rawScores = await Promise.all(trajectories.map((t) => this.scoreTrajectory(t)));\n return this.normalizeScoresForGroup(rawScores);\n }\n computeHeuristicReward(trajectory) {\n const components = trajectory.rewardComponents;\n const metrics = trajectory.metrics;\n let reward = 0;\n let weightSum = 0;\n if (metrics.finalPnL !== undefined) {\n const pnlScore = this.normalizePnL(metrics.finalPnL);\n reward += pnlScore * 0.4;\n weightSum += 0.4;\n }\n if (metrics.successRate !== undefined) {\n const successScore = metrics.successRate * 2 - 1;\n reward += successScore * 0.3;\n weightSum += 0.3;\n }\n const completionScore = metrics.finalStatus === \"completed\" ? 1 : -0.5;\n reward += completionScore * 0.2;\n weightSum += 0.2;\n if (components.environmentReward !== undefined) {\n const envScore = Math.max(-1, Math.min(1, components.environmentReward));\n reward += envScore * 0.1;\n weightSum += 0.1;\n }\n if (weightSum > 0) {\n reward = reward / weightSum;\n }\n return Math.max(-1, Math.min(1, reward));\n }\n normalizePnL(pnl) {\n return Math.tanh(pnl / 500);\n }\n normalizeScore(score) {\n return (score + 1) / 2;\n }\n normalizeScoresForGroup(scores) {\n const min = Math.min(...scores);\n const max = Math.max(...scores);\n const range = max - min;\n if (range === 0) {\n return scores.map(() => 0.5);\n }\n return scores.map((s) => (s - min) / range);\n }\n}\nfunction createRewardService(options = {}) {\n return new RewardService(options);\n}\nasync function scoreTrajectory(trajectory) {\n const service = new RewardService;\n return service.scoreTrajectory(trajectory);\n}\nasync function scoreTrajectoryGroup(trajectories) {\n const service = new RewardService;\n return service.scoreTrajectoryGroup(trajectories);\n}\n// TrajectoryLoggerService.ts\nimport { asUUID, logger as logger3 } from \"@elizaos/core\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nclass TrajectoryLoggerService {\n activeTrajectories = new Map;\n activeStepIds = new Map;\n startTrajectory(agentId, options = {}) {\n const trajectoryId = uuidv4();\n const now = Date.now();\n const trajectory = {\n trajectoryId: asUUID(trajectoryId),\n agentId: asUUID(agentId),\n startTime: now,\n endTime: now,\n durationMs: 0,\n episodeId: options.episodeId,\n scenarioId: options.scenarioId,\n batchId: options.batchId,\n groupIndex: options.groupIndex,\n steps: [],\n totalReward: 0,\n rewardComponents: {\n environmentReward: 0\n },\n metrics: {\n episodeLength: 0,\n finalStatus: \"completed\"\n },\n metadata: options.metadata || {}\n };\n this.activeTrajectories.set(trajectoryId, trajectory);\n return trajectoryId;\n }\n startStep(trajectoryId, envState) {\n const stepId = uuidv4();\n const trajectory = this.activeTrajectories.get(trajectoryId);\n if (!trajectory) {\n throw new Error(`Trajectory ${trajectoryId} not found`);\n }\n const step = {\n stepId: asUUID(stepId),\n stepNumber: trajectory.steps.length,\n timestamp: envState.timestamp || Date.now(),\n environmentState: envState,\n observation: {},\n llmCalls: [],\n providerAccesses: [],\n action: {\n attemptId: \"\",\n timestamp: 0,\n actionType: \"pending\",\n actionName: \"pending\",\n parameters: {},\n success: false\n },\n reward: 0,\n done: false\n };\n trajectory.steps.push(step);\n this.activeStepIds.set(trajectoryId, stepId);\n return stepId;\n }\n logLLMCall(stepId, llmCall) {\n const trajectory = this.findTrajectoryByStepId(stepId);\n if (!trajectory) {\n logger3.warn({ stepId }, \"Trajectory not found for LLM call\");\n return;\n }\n const step = trajectory.steps.find((s) => s.stepId === stepId);\n if (!step) {\n logger3.warn({ stepId }, \"Step not found for LLM call\");\n return;\n }\n const fullLLMCall = {\n callId: uuidv4(),\n timestamp: Date.now(),\n ...llmCall\n };\n step.llmCalls.push(fullLLMCall);\n }\n logProviderAccess(stepId, access) {\n const trajectory = this.findTrajectoryByStepId(stepId);\n if (!trajectory) {\n logger3.warn({ stepId }, \"Trajectory not found for provider access\");\n return;\n }\n const step = trajectory.steps.find((s) => s.stepId === stepId);\n if (!step) {\n logger3.warn({ stepId }, \"Step not found for provider access\");\n return;\n }\n const fullAccess = {\n providerId: uuidv4(),\n timestamp: Date.now(),\n ...access\n };\n step.providerAccesses.push(fullAccess);\n }\n logLLMCallByTrajectoryId(trajectoryId, llmCall) {\n const stepId = this.activeStepIds.get(trajectoryId);\n if (!stepId) {\n logger3.warn({ trajectoryId }, \"No active step for trajectory\");\n return;\n }\n this.logLLMCall(stepId, llmCall);\n }\n logProviderAccessByTrajectoryId(trajectoryId, access) {\n const stepId = this.activeStepIds.get(trajectoryId);\n if (!stepId) {\n logger3.warn({ trajectoryId }, \"No active step for trajectory\");\n return;\n }\n this.logProviderAccess(stepId, access);\n }\n getCurrentStepId(trajectoryId) {\n return this.activeStepIds.get(trajectoryId) || null;\n }\n completeStep(trajectoryId, stepId, action, rewardInfo) {\n const trajectory = this.activeTrajectories.get(trajectoryId);\n if (!trajectory) {\n logger3.warn({ trajectoryId }, \"Trajectory not found for completeStep\");\n return;\n }\n const step = trajectory.steps.find((s) => s.stepId === stepId);\n if (!step) {\n logger3.warn({ trajectoryId, stepId }, \"Step not found for completeStep\");\n return;\n }\n step.action = {\n attemptId: uuidv4(),\n timestamp: Date.now(),\n ...action\n };\n if (rewardInfo?.reward !== undefined) {\n step.reward = rewardInfo.reward;\n trajectory.totalReward += rewardInfo.reward;\n }\n if (rewardInfo?.components) {\n trajectory.rewardComponents = {\n ...trajectory.rewardComponents,\n ...rewardInfo.components\n };\n }\n this.activeStepIds.delete(trajectoryId);\n }\n completeCurrentStep(trajectoryId, action, rewardInfo) {\n const stepId = this.activeStepIds.get(trajectoryId);\n if (!stepId) {\n logger3.warn({ trajectoryId }, \"No active step for trajectory\");\n return;\n }\n this.completeStep(trajectoryId, stepId, action, rewardInfo);\n }\n async endTrajectory(trajectoryId, status, finalMetrics) {\n const trajectory = this.activeTrajectories.get(trajectoryId);\n if (!trajectory) {\n logger3.warn({ trajectoryId }, \"Trajectory not found for endTrajectory\");\n return;\n }\n trajectory.endTime = Date.now();\n trajectory.durationMs = trajectory.endTime - trajectory.startTime;\n trajectory.metrics.finalStatus = status;\n trajectory.metrics.episodeLength = trajectory.steps.length;\n if (finalMetrics) {\n trajectory.metrics = {\n ...trajectory.metrics,\n ...finalMetrics\n };\n }\n this.activeStepIds.delete(trajectoryId);\n }\n getActiveTrajectory(trajectoryId) {\n return this.activeTrajectories.get(trajectoryId) || null;\n }\n findTrajectoryByStepId(stepId) {\n for (const trajectory of this.activeTrajectories.values()) {\n if (trajectory.steps.some((s) => s.stepId === stepId)) {\n return trajectory;\n }\n }\n return null;\n }\n}\n\n// index.ts\nvar trajectoryLoggerPlugin = {\n name: \"@elizaos/plugin-trajectory-logger\",\n description: \"Collects complete agent interaction trajectory data for RL training. Records LLM calls, provider access, actions, environment state, and computes rewards.\",\n dependencies: [],\n services: []\n};\nvar typescript_default = trajectoryLoggerPlugin;\nexport {\n wrapProviderWithLogging,\n wrapPluginProviders,\n wrapPluginActions,\n wrapActionWithLogging,\n withTrajectoryLogging,\n validateARTCompatibility,\n trajectoryLoggerPlugin,\n toARTTrajectory,\n toARTMessages,\n toARTJSONL,\n startAutonomousTick,\n setTrajectoryContext,\n scoreTrajectoryGroup,\n scoreTrajectory,\n removeSharedPrefix,\n recomputeTrajectoryRewards,\n prepareForRULER,\n loggedLLMCall,\n logProviderFromAction,\n logProviderAccess,\n logLLMCallFromAction,\n groupTrajectories,\n getTrajectoryContext,\n extractSharedPrefix,\n exportToHuggingFace,\n exportGroupedForGRPO,\n exportGroupedByScenario,\n exportForOpenPipeART,\n endAutonomousTick,\n typescript_default as default,\n createRewardService,\n computeTrajectoryReward,\n computeStepReward,\n clearTrajectoryContext,\n buildGameStateFromDB,\n TrajectoryLoggerService,\n RewardService\n};\n\n//# debugId=FD4F0CC606B13C7564756E2164756E21\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elizaos/plugin-auto-trader",
3
3
  "description": "Autonomous trading plugin with LLM-powered strategies for Solana",
4
- "version": "2.0.0-alpha.2",
4
+ "version": "2.0.0-alpha.3",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -31,17 +31,17 @@
31
31
  "dist"
32
32
  ],
33
33
  "dependencies": {
34
- "@elizaos/core": "2.0.0-alpha.2",
35
- "@elizaos/plugin-solana": "2.0.0-alpha.2",
34
+ "@elizaos/core": "2.0.0-alpha.3",
35
+ "@elizaos/plugin-solana": "2.0.0-alpha.3",
36
36
  "@solana/spl-token": "^0.4.0",
37
37
  "@solana/web3.js": "^1.95.0",
38
38
  "bignumber.js": "^9.1.0",
39
39
  "bs58": "^6.0.0",
40
40
  "technicalindicators": "^3.1.0",
41
- "zod": "^3.23.0"
41
+ "zod": "^4.3.6"
42
42
  },
43
43
  "optionalDependencies": {
44
- "@elizaos/plugin-trajectory-logger": "2.0.0-alpha.2"
44
+ "@elizaos/plugin-trajectory-logger": "2.0.0-alpha.3"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@biomejs/biome": "^2.3.11",
@@ -62,5 +62,13 @@
62
62
  "publishConfig": {
63
63
  "access": "public"
64
64
  },
65
- "gitHead": "bc6cac8d36845d7cbde51a64307c6a57c16378ad"
65
+ "milaidy": {
66
+ "platforms": [
67
+ "node"
68
+ ],
69
+ "runtime": "node",
70
+ "platformDetails": {
71
+ "node": "ESM build available via exports.import"
72
+ }
73
+ }
66
74
  }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Shaw Walters and elizaOS Contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,9 +0,0 @@
1
- import {
2
- MeanReversionStrategy
3
- } from "./chunk-7GI4G3ZN.js";
4
- import "./chunk-AS6N6A3H.js";
5
- import "./chunk-PZ5AY32C.js";
6
- export {
7
- MeanReversionStrategy
8
- };
9
- //# sourceMappingURL=MeanReversionStrategy-VQJGG3DE.js.map
@@ -1,9 +0,0 @@
1
- import {
2
- MomentumBreakoutStrategy
3
- } from "./chunk-Z6SUPK5O.js";
4
- import "./chunk-AS6N6A3H.js";
5
- import "./chunk-PZ5AY32C.js";
6
- export {
7
- MomentumBreakoutStrategy
8
- };
9
- //# sourceMappingURL=MomentumBreakoutStrategy-O7I3EMGB.js.map
@@ -1,9 +0,0 @@
1
- import {
2
- RandomStrategy
3
- } from "./chunk-KB2EBQUN.js";
4
- import "./chunk-AS6N6A3H.js";
5
- import "./chunk-PZ5AY32C.js";
6
- export {
7
- RandomStrategy
8
- };
9
- //# sourceMappingURL=RandomStrategy-GPGG56MV.js.map
@@ -1,9 +0,0 @@
1
- import {
2
- RuleBasedStrategy
3
- } from "./chunk-GYTZTIWK.js";
4
- import "./chunk-AS6N6A3H.js";
5
- import "./chunk-PZ5AY32C.js";
6
- export {
7
- RuleBasedStrategy
8
- };
9
- //# sourceMappingURL=RuleBasedStrategy-7O47DGTU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/strategies/MeanReversionStrategy.ts"],"sourcesContent":["import type { AgentRuntime } from \"@elizaos/core\";\nimport * as talib from \"technicalindicators\";\nimport {\n type AgentState,\n type OHLCV,\n OrderType,\n type PortfolioSnapshot,\n type StrategyContextMarketData,\n type TradeOrder,\n TradeType,\n type TradingStrategy,\n} from \"../types.ts\";\n\nexport interface MeanReversionConfig {\n // Bollinger Bands settings\n bbPeriod: number;\n bbStdDev: number;\n\n // RSI settings\n rsiPeriod: number;\n rsiOversold: number;\n rsiOverbought: number;\n\n // Risk management\n positionSizePercent: number;\n stopLossPercent: number;\n takeProfitPercent: number;\n\n // Market condition filters\n minVolatility: number;\n maxVolatility: number;\n minVolumeRatio: number;\n\n // Entry/exit thresholds\n bbEntryThreshold: number; // How far outside BB for entry\n rsiConfirmation: boolean;\n}\n\nexport class MeanReversionStrategy implements TradingStrategy {\n public readonly id = \"mean-reversion-strategy\";\n public readonly name = \"MeanReversionStrategy\";\n public readonly description =\n \"A strategy that trades on mean reversion patterns using Bollinger Bands and RSI\";\n private config: MeanReversionConfig;\n private initialized = false;\n\n constructor(config?: Partial<MeanReversionConfig>) {\n this.config = {\n // Default configuration\n bbPeriod: 20,\n bbStdDev: 2,\n rsiPeriod: 14,\n rsiOversold: 30,\n rsiOverbought: 70,\n positionSizePercent: 0.02,\n stopLossPercent: 0.03,\n takeProfitPercent: 0.02,\n minVolatility: 0.01,\n maxVolatility: 0.05,\n minVolumeRatio: 1.2,\n bbEntryThreshold: 0.95,\n rsiConfirmation: true,\n ...config,\n };\n }\n\n async initialize(runtime: AgentRuntime): Promise<void> {\n this.runtime = runtime;\n this.initialized = true;\n console.log(`[${this.name}] Initialized with config:`, this.config);\n }\n\n isReady(): boolean {\n return this.initialized;\n }\n\n async decide(params: {\n marketData: StrategyContextMarketData;\n agentState: AgentState;\n portfolioSnapshot: PortfolioSnapshot;\n agentRuntime?: AgentRuntime;\n }): Promise<TradeOrder | null> {\n const { marketData, agentState, portfolioSnapshot } = params;\n const { priceData, currentPrice } = marketData;\n\n if (\n !priceData ||\n priceData.length < Math.max(this.config.bbPeriod, this.config.rsiPeriod) + 10\n ) {\n return null;\n }\n\n // Extract price arrays\n const closes = priceData.map((c: OHLCV) => c.close);\n const _highs = priceData.map((c: OHLCV) => c.high);\n const _lows = priceData.map((c: OHLCV) => c.low);\n const volumes = priceData.map((c: OHLCV) => c.volume);\n\n // Calculate indicators\n const bb = this.calculateBollingerBands(closes);\n const rsi = this.calculateRSI(closes);\n const volatility = agentState.volatility;\n const volumeRatio = this.calculateVolumeRatio(volumes);\n\n if (!bb || !rsi || rsi.length === 0) return null;\n\n const currentRSI = rsi[rsi.length - 1];\n const { upper, lower, middle } = bb;\n\n // Market condition checks\n if (volatility < this.config.minVolatility || volatility > this.config.maxVolatility) {\n console.log(\n `[${this.name}] Volatility ${volatility.toFixed(4)} outside range [${this.config.minVolatility}, ${this.config.maxVolatility}]`,\n );\n return null;\n }\n\n if (volumeRatio < this.config.minVolumeRatio) {\n console.log(\n `[${this.name}] Volume ratio ${volumeRatio.toFixed(2)} below minimum ${this.config.minVolumeRatio}`,\n );\n return null;\n }\n\n // Check for mean reversion opportunities\n const distanceFromUpper = (upper - currentPrice) / currentPrice;\n const distanceFromLower = (currentPrice - lower) / currentPrice;\n const distanceFromMiddle = Math.abs(currentPrice - middle) / middle;\n\n // Buy signal: Price near lower band + RSI oversold\n if (currentPrice <= lower * (1 + (1 - this.config.bbEntryThreshold))) {\n const rsiCondition = !this.config.rsiConfirmation || currentRSI < this.config.rsiOversold;\n\n if (rsiCondition) {\n const positionSize = this.calculatePositionSize(portfolioSnapshot.totalValue, currentPrice);\n\n console.log(`[${this.name}] BUY SIGNAL - Price at lower BB, RSI: ${currentRSI.toFixed(2)}`);\n\n return {\n action: TradeType.BUY,\n orderType: OrderType.MARKET,\n pair: \"SOL/USDC\", // This should come from context\n quantity: positionSize,\n reason: `Mean reversion buy: Price ${distanceFromLower.toFixed(2)}% below lower BB, RSI: ${currentRSI.toFixed(2)}`,\n timestamp: Date.now(),\n };\n }\n }\n\n // Sell signal: Price near upper band + RSI overbought\n if (currentPrice >= upper * (1 - (1 - this.config.bbEntryThreshold))) {\n const rsiCondition = !this.config.rsiConfirmation || currentRSI > this.config.rsiOverbought;\n\n if (rsiCondition) {\n const currentHolding = portfolioSnapshot.holdings.SOL || 0;\n\n if (currentHolding > 0) {\n console.log(\n `[${this.name}] SELL SIGNAL - Price at upper BB, RSI: ${currentRSI.toFixed(2)}`,\n );\n\n return {\n action: TradeType.SELL,\n orderType: OrderType.MARKET,\n pair: \"SOL/USDC\",\n quantity: currentHolding,\n reason: `Mean reversion sell: Price ${distanceFromUpper.toFixed(2)}% above upper BB, RSI: ${currentRSI.toFixed(2)}`,\n timestamp: Date.now(),\n };\n }\n }\n }\n\n // Exit position if price returns to mean\n const currentHolding = portfolioSnapshot.holdings.SOL || 0;\n if (currentHolding > 0 && distanceFromMiddle < 0.01) {\n console.log(`[${this.name}] Price returned to mean, exiting position`);\n\n return {\n action: TradeType.SELL,\n orderType: OrderType.MARKET,\n pair: \"SOL/USDC\",\n quantity: currentHolding,\n reason: `Price returned to mean (${distanceFromMiddle.toFixed(2)}% from middle BB)`,\n timestamp: Date.now(),\n };\n }\n\n return null;\n }\n\n private calculateBollingerBands(\n closes: number[],\n ): { upper: number; middle: number; lower: number } | null {\n if (closes.length < this.config.bbPeriod) return null;\n\n const bb = talib.BollingerBands.calculate({\n period: this.config.bbPeriod,\n values: closes,\n stdDev: this.config.bbStdDev,\n });\n\n if (!bb || bb.length === 0) return null;\n\n const lastBB = bb[bb.length - 1];\n return {\n upper: lastBB.upper,\n middle: lastBB.middle,\n lower: lastBB.lower,\n };\n }\n\n private calculateRSI(closes: number[]): number[] {\n const rsi = talib.RSI.calculate({\n period: this.config.rsiPeriod,\n values: closes,\n });\n return rsi;\n }\n\n private calculateVolumeRatio(volumes: number[]): number {\n if (volumes.length < 20) return 0;\n\n const recentVolume = volumes.slice(-5).reduce((a, b) => a + b, 0) / 5;\n const avgVolume = volumes.slice(-20).reduce((a, b) => a + b, 0) / 20;\n\n return avgVolume > 0 ? recentVolume / avgVolume : 0;\n }\n\n private calculatePositionSize(portfolioValue: number, price: number): number {\n const positionValue = portfolioValue * this.config.positionSizePercent;\n return positionValue / price;\n }\n\n updateConfig(config: Partial<MeanReversionConfig>): void {\n this.config = { ...this.config, ...config };\n console.log(`[${this.name}] Config updated:`, this.config);\n }\n\n getConfig(): MeanReversionConfig {\n return { ...this.config };\n }\n}\n"],"mappings":"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","names":["currentHolding"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["// Import core types\nimport type { IAgentRuntime as AgentRuntime, UUID } from \"@elizaos/core\";\n\n// Define wallet and token types locally since they're not exported from @elizaos/core\nexport interface TokenBalance {\n mint: string;\n balance: string;\n decimals: number;\n uiAmount: number;\n}\n\nexport interface TokenData {\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n price?: number;\n volume24h?: number;\n liquidity?: number;\n}\n\nexport interface WalletAsset {\n mint: string;\n balance: number;\n decimals: number;\n uiAmount: number;\n}\n\nexport interface IWalletService {\n getBalance(): Promise<number>;\n getTokenBalances(): Promise<TokenBalance[]>;\n}\n\n// #region --- Portfolio and Trading Data Interfaces ---\n\n/**\n * Core types for simulations and backtesting\n */\n\nexport interface OHLCV {\n timestamp: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\nexport interface StrategyContextMarketData {\n currentPrice: number;\n lastPrices: number[];\n indicators?: { [indicatorName: string]: number };\n priceData?: OHLCV[]; // Full price data for custom analysis\n}\n\nexport interface AgentState {\n portfolioValue: number;\n volatility: number;\n confidenceLevel: number;\n recentTrades: number;\n lastAction?: string;\n sentiment?: number;\n}\n\nexport interface TradingStrategy {\n id: string;\n name: string;\n description: string;\n decide(params: {\n marketData: StrategyContextMarketData;\n agentState: AgentState;\n portfolioSnapshot: PortfolioSnapshot;\n agentRuntime?: AgentRuntime;\n }): Promise<TradeOrder | null>;\n initialize?(agentRuntime?: AgentRuntime): Promise<void>;\n isReady(): boolean;\n configure?(params: any): void;\n}\n\nexport enum TradeType {\n BUY = \"BUY\",\n SELL = \"SELL\",\n}\n\nexport enum OrderType {\n MARKET = \"MARKET\",\n LIMIT = \"LIMIT\",\n STOP = \"STOP\",\n}\n\nexport interface TradeOrder {\n pair: string;\n action: TradeType;\n quantity: number;\n orderType: OrderType;\n price?: number;\n stopPrice?: number;\n timestamp: number;\n reason?: string;\n}\n\nexport interface Trade extends TradeOrder {\n executedPrice: number;\n executedTimestamp: number;\n fees: number;\n feeCurrency?: string; // Add optional feeCurrency\n tradeId?: string; // Add optional tradeId\n realizedPnl?: number; // Profit or loss realized on this trade (typically for SELL trades)\n}\n\nexport interface PortfolioSnapshot {\n timestamp: number;\n holdings: { [assetSymbol: string]: number };\n totalValue: number;\n}\n\nexport interface PerformanceMetrics {\n totalPnlAbsolute: number;\n totalPnlPercentage: number;\n sharpeRatio?: number;\n sortinoRatio?: number;\n winLossRatio: number;\n averageWinAmount: number;\n averageLossAmount: number;\n maxDrawdown: number;\n totalTrades: number;\n winningTrades: number;\n losingTrades: number;\n firstAssetPrice?: number;\n lastAssetPrice?: number;\n buyAndHoldPnlPercentage?: number;\n}\n\nexport interface SimulationReport {\n strategy: string;\n pair: string;\n startDate: number;\n endDate: number;\n trades: Trade[];\n portfolioSnapshots: PortfolioSnapshot[];\n finalPortfolioValue: number;\n metrics: PerformanceMetrics;\n}\n\n// HistoricalDataService\nexport interface HistoricalDataService {\n fetchData(\n pair: string,\n interval: string,\n startDate: Date,\n endDate: Date,\n dataSource: string,\n ): Promise<OHLCV[]>;\n}\n\n// #endregion --- Portfolio and Trading Data Interfaces ---\n\n// #region --- Service & Other Interfaces ---\n\nexport interface TradeSimulationResult {\n isValid: boolean;\n reason?: string;\n updatedBalance?: number;\n updatedPortfolio?: { [assetSymbol: string]: PortfolioAssetHolding };\n}\n\n// Wallet portfolio for auto-trader\nexport interface WalletPortfolio {\n totalUsd: string;\n totalSol?: string;\n items: Array<{\n name: string;\n address: string;\n symbol: string;\n decimals: number;\n balance: string;\n uiAmount: string;\n priceUsd: string;\n valueUsd: string;\n valueSol?: string;\n }>;\n}\n\nexport interface PortfolioAssetHolding {\n mint: string;\n balance: number;\n decimals: number;\n uiAmount: number;\n averagePrice: number;\n symbol?: string;\n assetAddress: string;\n}\n\nexport interface Position {\n id: UUID;\n tokenAddress: string;\n amount: number;\n entryPrice: number;\n currentPrice?: number;\n unrealizedPnl?: number;\n realizedPnl?: number;\n}\n\nexport interface WalletOperationResult {\n success: boolean;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface PortfolioHolding {\n tokenAddress: string;\n tokenSymbol: string;\n tokenName: string;\n amount: number;\n decimals: number;\n usdValue: number;\n tokenPriceUsd: number;\n}\n\nexport interface TrackedPosition {\n tokenAddress: string;\n symbol: string;\n entryPrice: number;\n currentPrice: number;\n quantity: number;\n value: number;\n pnl: number;\n pnlPercentage: number;\n}\n\n// Strategy-specific parameters\nexport interface RandomStrategyParams {\n buyProbability?: number;\n sellProbability?: number;\n maxTradeSize?: number;\n minTradeSize?: number;\n randomSeed?: number;\n}\n\nexport interface RuleBasedStrategyParams {\n indicators?: string[];\n buyConditions?: {\n [indicator: string]: { threshold: number; condition: \"above\" | \"below\" };\n };\n sellConditions?: {\n [indicator: string]: { threshold: number; condition: \"above\" | \"below\" };\n };\n riskSettings?: {\n maxPositionSize?: number;\n stopLossPercentage?: number;\n takeProfitPercentage?: number;\n };\n}\n\nexport interface LLMStrategyParams {\n modelName?: string;\n customPromptPrefix?: string;\n customPromptSuffix?: string;\n maxTokens?: number;\n temperature?: number;\n defaultTradeSizePercentage?: number;\n defaultFixedTradeQuantity?: number;\n structuredOutputSchema?: any;\n systemPrompt?: string;\n}\n\n// #endregion --- Service & Other Interfaces ---\n"],"mappings":";AA+EO,IAAK,YAAL,kBAAKA,eAAL;AACL,EAAAA,WAAA,SAAM;AACN,EAAAA,WAAA,UAAO;AAFG,SAAAA;AAAA,GAAA;AAKL,IAAK,YAAL,kBAAKC,eAAL;AACL,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,UAAO;AAHG,SAAAA;AAAA,GAAA;","names":["TradeType","OrderType"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/strategies/RuleBasedStrategy.ts"],"sourcesContent":["import * as ti from \"technicalindicators\";\nimport {\n type AgentState,\n type OHLCV,\n OrderType,\n type PortfolioSnapshot,\n type StrategyContextMarketData,\n type TradeOrder,\n TradeType,\n type TradingStrategy,\n} from \"../types.ts\";\n\n// Mock/placeholder for technical indicator calculation results\ninterface TAResults {\n rsi?: number;\n smaShort?: number;\n smaLong?: number;\n prevSmaShort?: number;\n prevSmaLong?: number;\n emaShort?: number;\n emaLong?: number;\n prevEmaShort?: number;\n prevEmaLong?: number;\n macd?: {\n MACD?: number;\n signal?: number;\n histogram?: number;\n };\n prevMacd?: {\n MACD?: number;\n signal?: number;\n histogram?: number;\n };\n // ema?: number[]; // Keep as array if EMA logic will also be array-based initially\n // macd?: { macd: number[]; signal: number[]; histogram: number[] };\n // Add other indicators as needed\n}\n\n// Assume a technicalindicators-like library structure\n// This is a conceptual placeholder for actual library usage.\n// REMOVED - no longer needed\n// interface TechnicalIndicatorsLib { ... }\n// const tiLibrary: TechnicalIndicatorsLib | null = null;\n\nexport interface RuleCondition {\n type: \"RSI\" | \"SMA_CROSSOVER\" | \"EMA_CROSSOVER\" | \"VOLUME\" | \"PRICE_ACTION\" | \"MACD_CROSS\";\n // RSI\n rsiPeriod?: number;\n rsiOverbought?: number; // e.g., 70 (for sell)\n rsiOversold?: number; // e.g., 30 (for buy)\n // SMA/EMA\n shortMAPeriod?: number;\n longMAPeriod?: number;\n maType?: \"SMA\" | \"EMA\"; // Specify MA type for crossover rules\n // VOLUME\n minVolume24h?: number;\n // PRICE_ACTION\n priceBreaksNDayHigh?: number; // N days for high (e.g., 7-day high)\n priceBreaksNDayLow?: number; // N days for low\n // MACD\n macdFastPeriod?: number;\n macdSlowPeriod?: number;\n macdSignalPeriod?: number;\n\n action: TradeType; // BUY or SELL if this condition is met\n}\n\nexport interface StopLossTakeProfitConfig {\n stopLossPercentage?: number; // e.g., 0.05 for 5%\n takeProfitPercentage?: number; // e.g., 0.10 for 10%\n}\n\nexport interface RuleBasedStrategyParams {\n rules: RuleCondition[];\n stopLossTakeProfit?: StopLossTakeProfitConfig;\n /** Percentage of available capital for a trade, or fixed quantity if capital/price info is missing */\n tradeSizePercentage?: number;\n fixedTradeQuantity?: number;\n /** Minimum number of data points required for indicators to be considered valid */\n minIndicatorDataPoints?: number;\n indicators?: string[];\n buyConditions?: Record<string, { threshold: number; condition: string }>;\n sellConditions?: Record<string, { threshold: number; condition: string }>;\n riskSettings?: {\n maxPositionSize?: number;\n stopLossPercentage?: number;\n takeProfitPercentage?: number;\n };\n}\n\nconst DEFAULT_TRADE_SIZE_PERCENTAGE = 0.01; // 1%\nconst DEFAULT_FIXED_TRADE_QUANTITY = 1;\nconst DEFAULT_MIN_INDICATOR_DATA_POINTS = 20;\nconst MIN_TRADE_QUANTITY_THRESHOLD = 1e-8; // Added threshold\n\nexport class RuleBasedStrategy implements TradingStrategy {\n public readonly id = \"rule-based-v1\";\n public readonly name = \"Rule-Based Trading Strategy\";\n public readonly description =\n \"Makes trading decisions based on technical indicators and thresholds.\";\n\n private params: RuleBasedStrategyParams = {\n rules: [],\n tradeSizePercentage: DEFAULT_TRADE_SIZE_PERCENTAGE,\n fixedTradeQuantity: DEFAULT_FIXED_TRADE_QUANTITY,\n minIndicatorDataPoints: DEFAULT_MIN_INDICATOR_DATA_POINTS,\n indicators: [\"sma\", \"ema\", \"rsi\", \"macd\"],\n buyConditions: {\n rsi: { threshold: 30, condition: \"below\" },\n macd: { threshold: 0, condition: \"above\" },\n },\n sellConditions: {\n rsi: { threshold: 70, condition: \"above\" },\n macd: { threshold: 0, condition: \"below\" },\n },\n riskSettings: {\n maxPositionSize: 0.05,\n stopLossPercentage: 0.02,\n takeProfitPercentage: 0.05,\n },\n };\n\n // The actual TI library is now used directly.\n private indicators: typeof ti = ti;\n\n isReady(): boolean {\n return true; // Rule-based strategy is always ready\n }\n\n configure(params: RuleBasedStrategyParams): void {\n console.error(\n \"[RuleBasedStrategy DIAG] configure called. Incoming params:\",\n JSON.stringify(params),\n );\n console.error(\n \"[RuleBasedStrategy DIAG] configure: this.params BEFORE merge:\",\n JSON.stringify(this.params),\n );\n if (!params.rules || params.rules.length === 0) {\n throw new Error(\"At least one rule must be configured.\");\n }\n\n // Validate individual rule parameters first\n params.rules.forEach((rule) => {\n if (rule.rsiPeriod !== undefined && rule.rsiPeriod <= 0)\n throw new Error(\"RSI period must be positive.\");\n if (rule.shortMAPeriod !== undefined && rule.shortMAPeriod <= 0)\n throw new Error(\"Short MA period must be positive.\");\n if (rule.longMAPeriod !== undefined && rule.longMAPeriod <= 0)\n throw new Error(\"Long MA period must be positive.\");\n if (rule.type === \"SMA_CROSSOVER\" || rule.type === \"EMA_CROSSOVER\") {\n if (!rule.shortMAPeriod || !rule.longMAPeriod) {\n throw new Error(\"Short and Long MA periods are required for crossover rules.\");\n }\n if (rule.shortMAPeriod >= rule.longMAPeriod) {\n throw new Error(\"Short MA period must be less than Long MA period for crossovers.\");\n }\n if (!rule.maType) {\n console.warn(\n `[RuleBasedStrategy] maType not specified for crossover rule, defaulting to SMA.`,\n );\n rule.maType = \"SMA\";\n }\n }\n if (rule.rsiOverbought !== undefined && (rule.rsiOverbought <= 0 || rule.rsiOverbought > 100))\n throw new Error(\"RSI overbought must be between 0 and 100\");\n if (rule.rsiOversold !== undefined && (rule.rsiOversold <= 0 || rule.rsiOversold > 100))\n throw new Error(\"RSI oversold must be between 0 and 100\");\n if (rule.rsiOversold && rule.rsiOverbought && rule.rsiOversold >= rule.rsiOverbought)\n throw new Error(\"RSI oversold must be less than RSI overbought\");\n });\n\n // Validate overall strategy parameters from input params\n if (\n params.tradeSizePercentage !== undefined &&\n (params.tradeSizePercentage <= 0 || params.tradeSizePercentage > 1)\n ) {\n throw new Error(\"tradeSizePercentage must be between 0 (exclusive) and 1 (inclusive).\");\n }\n if (params.fixedTradeQuantity !== undefined && params.fixedTradeQuantity <= 0) {\n throw new Error(\"fixedTradeQuantity must be positive.\");\n }\n // Validate minIndicatorDataPoints from input params before merging params\n if (params.minIndicatorDataPoints !== undefined && params.minIndicatorDataPoints < 1) {\n throw new Error(\"minIndicatorDataPoints must be at least 1.\");\n }\n\n const tempParams = { ...this.params, ...params }; // Merge incoming params over current defaults/settings\n\n const currentRulesLongestPeriod = tempParams.rules.reduce(\n (max, r) => Math.max(max, r.longMAPeriod || 0, r.rsiPeriod || 0),\n 0,\n );\n const pointsNeededByCurrentRules =\n currentRulesLongestPeriod > 0 ? currentRulesLongestPeriod + 1 : 1;\n\n if (params.minIndicatorDataPoints !== undefined) {\n if (params.minIndicatorDataPoints < pointsNeededByCurrentRules) {\n console.warn(\n `[RuleBasedStrategy] User-defined minIndicatorDataPoints (${params.minIndicatorDataPoints}) is less than required by current rules (${pointsNeededByCurrentRules}). Adjusting to ${pointsNeededByCurrentRules}.`,\n );\n tempParams.minIndicatorDataPoints = pointsNeededByCurrentRules;\n } else {\n tempParams.minIndicatorDataPoints = params.minIndicatorDataPoints;\n }\n } else {\n tempParams.minIndicatorDataPoints = Math.max(\n DEFAULT_MIN_INDICATOR_DATA_POINTS,\n pointsNeededByCurrentRules,\n );\n }\n\n if (params.indicators) {\n this.params.indicators = params.indicators;\n }\n if (params.buyConditions) {\n this.params.buyConditions = { ...params.buyConditions };\n }\n if (params.sellConditions) {\n this.params.sellConditions = { ...params.sellConditions };\n }\n if (params.riskSettings) {\n this.params.riskSettings = {\n ...this.params.riskSettings,\n ...params.riskSettings,\n };\n }\n\n this.params = tempParams; // Assign fully validated and adjusted params\n console.error(\n \"[RuleBasedStrategy DIAG] configure: this.params AFTER merge and adjustments:\",\n JSON.stringify(this.params),\n );\n }\n\n private calculateIndicators(ohlcvData: OHLCV[], rules: RuleCondition[]): TAResults {\n // No need to check for this.indicators, we are using the imported library directly.\n\n const minDataPointsForAnyCalc = rules.reduce((minOverall, r) => {\n const periodReq = Math.max(r.longMAPeriod || 0, r.rsiPeriod || 0, r.macdSlowPeriod || 0);\n return Math.min(minOverall, periodReq > 0 ? periodReq + 1 : Infinity);\n }, Infinity);\n\n if (\n ohlcvData.length <\n (this.params.minIndicatorDataPoints ?? DEFAULT_MIN_INDICATOR_DATA_POINTS) ||\n ohlcvData.length < minDataPointsForAnyCalc\n ) {\n return {};\n }\n\n const closePrices = ohlcvData.map((d) => d.close);\n const results: TAResults = {};\n\n // --- RSI Calculation ---\n const rsiRule = rules.find((r) => r.type === \"RSI\" && r.rsiPeriod);\n if (rsiRule?.rsiPeriod && closePrices.length >= rsiRule.rsiPeriod) {\n const rsiResult = this.indicators.rsi({\n values: closePrices,\n period: rsiRule.rsiPeriod,\n });\n if (rsiResult.length > 0) {\n results.rsi = rsiResult[rsiResult.length - 1];\n }\n }\n\n // --- MA Crossover Calculation (SMA & EMA) ---\n const crossoverRules = rules.filter(\n (r) =>\n (r.type === \"SMA_CROSSOVER\" || r.type === \"EMA_CROSSOVER\") &&\n r.shortMAPeriod &&\n r.longMAPeriod,\n );\n\n for (const rule of crossoverRules) {\n if (rule.shortMAPeriod && rule.longMAPeriod && closePrices.length >= rule.longMAPeriod + 1) {\n const maIndicator = rule.maType === \"EMA\" ? this.indicators.ema : this.indicators.sma;\n\n const shortMA = maIndicator({\n values: closePrices,\n period: rule.shortMAPeriod,\n });\n const longMA = maIndicator({\n values: closePrices,\n period: rule.longMAPeriod,\n });\n\n if (shortMA.length >= 2 && longMA.length >= 2) {\n if (rule.maType === \"EMA\") {\n results.emaShort = shortMA[shortMA.length - 1];\n results.prevEmaShort = shortMA[shortMA.length - 2];\n results.emaLong = longMA[longMA.length - 1];\n results.prevEmaLong = longMA[longMA.length - 2];\n } else {\n results.smaShort = shortMA[shortMA.length - 1];\n results.prevSmaShort = shortMA[shortMA.length - 2];\n results.smaLong = longMA[longMA.length - 1];\n results.prevSmaLong = longMA[longMA.length - 2];\n }\n }\n }\n }\n\n // --- MACD Calculation ---\n const macdRule = rules.find((r) => r.type === \"MACD_CROSS\");\n if (\n macdRule?.macdFastPeriod &&\n macdRule.macdSlowPeriod &&\n macdRule.macdSignalPeriod &&\n closePrices.length >= macdRule.macdSlowPeriod\n ) {\n const macdResult = this.indicators.macd({\n values: closePrices,\n fastPeriod: macdRule.macdFastPeriod,\n slowPeriod: macdRule.macdSlowPeriod,\n signalPeriod: macdRule.macdSignalPeriod,\n SimpleMAOscillator: false,\n SimpleMASignal: false,\n });\n if (macdResult.length >= 2) {\n results.macd = macdResult[macdResult.length - 1];\n results.prevMacd = macdResult[macdResult.length - 2];\n }\n }\n\n return results;\n }\n\n async decide(params: {\n marketData: StrategyContextMarketData;\n agentState: AgentState;\n portfolioSnapshot: PortfolioSnapshot;\n agentRuntime?: any;\n }): Promise<TradeOrder | null> {\n const { marketData, portfolioSnapshot } = params;\n\n if (!marketData.priceData || marketData.priceData.length < 20) {\n return null; // Not enough data for indicators\n }\n\n const indicators = this.calculateIndicators(marketData.priceData, this.params.rules);\n\n // Check each rule to see if any conditions are met\n let shouldBuy = false;\n let shouldSell = false;\n let buyReason = \"\";\n let sellReason = \"\";\n\n for (const rule of this.params.rules) {\n switch (rule.type) {\n case \"RSI\":\n if (indicators.rsi !== undefined) {\n if (\n rule.rsiOversold &&\n indicators.rsi < rule.rsiOversold &&\n rule.action === TradeType.BUY\n ) {\n shouldBuy = true;\n buyReason = `RSI oversold (${indicators.rsi.toFixed(2)} < ${rule.rsiOversold})`;\n }\n if (\n rule.rsiOverbought &&\n indicators.rsi > rule.rsiOverbought &&\n rule.action === TradeType.SELL\n ) {\n shouldSell = true;\n sellReason = `RSI overbought (${indicators.rsi.toFixed(2)} > ${rule.rsiOverbought})`;\n }\n }\n break;\n case \"VOLUME\":\n // Volume rules are not currently implemented in the indicator calculation\n // so they should not trigger\n break;\n // Add other rule types as needed\n }\n }\n\n // Extract asset from portfolio snapshot or use a default\n const assetSymbol =\n Object.keys(portfolioSnapshot.holdings).find(\n (key) => key !== \"USDC\" && portfolioSnapshot.holdings[key] > 0,\n ) || \"SOL\";\n\n const pair = `${assetSymbol}/USDC`;\n\n // Execute buy if conditions are met\n if (shouldBuy) {\n const cashHolding = portfolioSnapshot.holdings.USDC || 0;\n if (cashHolding > 10 && marketData.currentPrice) {\n const quantity = this.calculateTradeQuantity(marketData, portfolioSnapshot);\n\n if (quantity && quantity > MIN_TRADE_QUANTITY_THRESHOLD) {\n return {\n pair,\n action: TradeType.BUY,\n quantity: parseFloat(quantity.toFixed(8)),\n orderType: OrderType.MARKET,\n timestamp: Date.now(),\n reason: buyReason || \"Technical indicators suggest buy signal\",\n };\n }\n }\n }\n\n // Execute sell if conditions are met\n if (shouldSell) {\n const holding = portfolioSnapshot.holdings[assetSymbol] || 0;\n if (holding > 0) {\n return {\n pair,\n action: TradeType.SELL,\n quantity: holding,\n orderType: OrderType.MARKET,\n timestamp: Date.now(),\n reason: sellReason || \"Technical indicators suggest sell signal\",\n };\n }\n }\n\n return null;\n }\n\n private calculateTradeQuantity(\n marketData: StrategyContextMarketData,\n portfolioSnapshot: PortfolioSnapshot,\n ): number | null {\n // Use USDC balance from portfolio snapshot\n const usdcBalance = portfolioSnapshot.holdings.USDC || 0;\n\n if (\n this.params.tradeSizePercentage &&\n usdcBalance > 0 &&\n marketData.currentPrice &&\n marketData.currentPrice > 0\n ) {\n const capitalToUse = usdcBalance * this.params.tradeSizePercentage;\n const quantity = capitalToUse / marketData.currentPrice;\n if (quantity < MIN_TRADE_QUANTITY_THRESHOLD) {\n return null;\n }\n return quantity;\n } else if (this.params.fixedTradeQuantity && this.params.fixedTradeQuantity > 0) {\n return this.params.fixedTradeQuantity;\n } else {\n // Default to small fixed quantity\n return 0.1;\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/strategies/RandomStrategy.ts"],"sourcesContent":["import {\n type AgentState,\n OrderType,\n type PortfolioSnapshot,\n type StrategyContextMarketData,\n type TradeOrder,\n TradeType,\n type TradingStrategy,\n} from \"../types.ts\";\n\nexport interface RandomStrategyParams {\n /**\n * Probability (0.0 to 1.0) of attempting a trade at any given `shouldExecute` call.\n * Default: 0.1 (10% chance)\n */\n tradeAttemptProbability?: number;\n /**\n * Probability (0.0 to 1.0) of the attempted trade being a BUY order. SELL is 1 - this value.\n * Default: 0.5 (50% chance of BUY, 50% chance of SELL)\n */\n buyProbability?: number;\n /**\n * Maximum percentage of available capital to use for a single trade.\n * Expressed as a decimal (e.g., 0.05 for 5%).\n * Default: 0.01 (1% of available capital)\n * Requires `agentState.availableCapital` to be set.\n */\n maxTradeSizePercentage?: number;\n /**\n * Fixed quantity to trade if `maxTradeSizePercentage` is not used or capital is not available.\n * If this is set, `maxTradeSizePercentage` might be ignored or used as a cap.\n * Default: 1 (e.g., 1 unit of the base asset)\n */\n fixedTradeQuantity?: number;\n}\n\nconst DEFAULT_TRADE_ATTEMPT_PROBABILITY = 0.1;\nconst DEFAULT_BUY_PROBABILITY = 0.5;\nconst DEFAULT_MAX_TRADE_SIZE_PERCENTAGE = 0.01; // 1%\nconst DEFAULT_FIXED_TRADE_QUANTITY = 1;\nconst MIN_TRADE_QUANTITY_THRESHOLD = 1e-8; // Define a threshold for minimum tradeable quantity\n\nexport class RandomStrategy implements TradingStrategy {\n public readonly id = \"random-v1\";\n public readonly name = \"Random Trading Strategy\";\n public readonly description =\n \"Makes random buy or sell decisions based on configured probabilities.\";\n\n private params: RandomStrategyParams = {\n tradeAttemptProbability: DEFAULT_TRADE_ATTEMPT_PROBABILITY,\n buyProbability: DEFAULT_BUY_PROBABILITY,\n maxTradeSizePercentage: DEFAULT_MAX_TRADE_SIZE_PERCENTAGE,\n fixedTradeQuantity: DEFAULT_FIXED_TRADE_QUANTITY,\n };\n\n private useFixedQuantity = false;\n\n configure(params: RandomStrategyParams): void {\n if (params.tradeAttemptProbability !== undefined) {\n if (params.tradeAttemptProbability < 0 || params.tradeAttemptProbability > 1) {\n throw new Error(\"tradeAttemptProbability must be between 0 and 1.\");\n }\n this.params.tradeAttemptProbability = params.tradeAttemptProbability;\n }\n if (params.buyProbability !== undefined) {\n if (params.buyProbability < 0 || params.buyProbability > 1) {\n throw new Error(\"buyProbability must be between 0 and 1.\");\n }\n this.params.buyProbability = params.buyProbability;\n }\n if (params.maxTradeSizePercentage !== undefined) {\n if (params.maxTradeSizePercentage < 0 || params.maxTradeSizePercentage > 1) {\n throw new Error(\"maxTradeSizePercentage must be between 0 and 1.\");\n }\n this.params.maxTradeSizePercentage = params.maxTradeSizePercentage;\n // If percentage is explicitly set, prefer it over fixed quantity\n this.useFixedQuantity = false;\n }\n if (params.fixedTradeQuantity !== undefined) {\n if (params.fixedTradeQuantity <= 0) {\n throw new Error(\"fixedTradeQuantity must be positive.\");\n }\n this.params.fixedTradeQuantity = params.fixedTradeQuantity;\n // Only use fixed quantity if percentage is not explicitly set in this configure call\n if (params.maxTradeSizePercentage === undefined) {\n this.useFixedQuantity = true;\n }\n }\n }\n\n isReady(): boolean {\n return true; // Random strategy is always ready\n }\n\n async decide(params: {\n marketData: StrategyContextMarketData;\n agentState: AgentState;\n portfolioSnapshot: PortfolioSnapshot;\n agentRuntime?: any;\n }): Promise<TradeOrder | null> {\n const { marketData, portfolioSnapshot } = params;\n\n if (\n Math.random() >= (this.params.tradeAttemptProbability ?? DEFAULT_TRADE_ATTEMPT_PROBABILITY)\n ) {\n return null; // No trade attempt this time\n }\n\n const tradeType: TradeType =\n Math.random() < (this.params.buyProbability ?? DEFAULT_BUY_PROBABILITY)\n ? TradeType.BUY\n : TradeType.SELL;\n\n // Calculate quantity\n let quantity: number | undefined;\n if (\n this.useFixedQuantity &&\n this.params.fixedTradeQuantity &&\n this.params.fixedTradeQuantity > 0\n ) {\n // Use fixed quantity when explicitly set\n quantity = this.params.fixedTradeQuantity;\n } else if (\n !this.useFixedQuantity &&\n this.params.maxTradeSizePercentage &&\n portfolioSnapshot.totalValue > 0 &&\n marketData.currentPrice &&\n marketData.currentPrice > 0\n ) {\n // Calculate percentage-based quantity\n const tradeValue = portfolioSnapshot.totalValue * this.params.maxTradeSizePercentage;\n quantity = tradeValue / marketData.currentPrice;\n } else {\n // Default: 1% of portfolio or minimal amount\n const defaultPercentage = 0.01;\n const tradeValue = portfolioSnapshot.totalValue * defaultPercentage;\n quantity = marketData.currentPrice > 0 ? tradeValue / marketData.currentPrice : 0.01;\n }\n\n // Check minimum quantity threshold\n if (!quantity || quantity <= MIN_TRADE_QUANTITY_THRESHOLD) {\n return null;\n }\n\n // Extract asset from portfolio snapshot or use a default\n const assetSymbol =\n Object.keys(portfolioSnapshot.holdings).find(\n (key) => key !== \"USDC\" && portfolioSnapshot.holdings[key] > 0,\n ) || \"SOL\";\n\n const pair = `${assetSymbol}/USDC`;\n\n // For SELL orders, check if we have sufficient holdings\n if (tradeType === TradeType.SELL) {\n const holding = portfolioSnapshot.holdings[assetSymbol] || 0;\n if (holding < quantity) {\n return null;\n }\n }\n\n // Apply precision limit\n const roundedQuantity = parseFloat(quantity.toFixed(8));\n\n // Check again after rounding\n if (roundedQuantity <= MIN_TRADE_QUANTITY_THRESHOLD) {\n return null;\n }\n\n return {\n pair,\n action: tradeType,\n quantity: roundedQuantity,\n orderType: OrderType.MARKET, // Random strategy uses market orders for simplicity\n timestamp: Date.now(),\n reason: \"Random trading decision\",\n };\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/strategies/MomentumBreakoutStrategy.ts"],"sourcesContent":["import {\n type AgentState,\n type OHLCV,\n OrderType,\n type PortfolioSnapshot,\n type StrategyContextMarketData,\n type TradeOrder,\n TradeType,\n type TradingStrategy,\n} from \"../types.ts\";\n\ninterface MomentumIndicators {\n // Price momentum\n priceChange1h: number;\n priceChange5m: number;\n priceChange15m: number;\n\n // Volume analysis\n volumeRatio: number;\n volumeSpike: boolean;\n volumeTrend: \"increasing\" | \"decreasing\" | \"stable\";\n\n // Volatility\n atr: number;\n volatilityPercentile: number;\n\n // Trend strength\n adx: number;\n trendDirection: \"bullish\" | \"bearish\" | \"neutral\";\n trendStrength: number;\n\n // Market structure\n resistance: number;\n support: number;\n nearResistance: boolean;\n nearSupport: boolean;\n}\n\nexport class MomentumBreakoutStrategy implements TradingStrategy {\n public readonly id = \"momentum-breakout-v1\";\n public readonly name = \"Momentum Breakout Strategy\";\n public readonly description =\n \"Captures momentum moves in volatile meme coins with volume confirmation\";\n\n // Strategy parameters - adjusted for more realistic trading\n private readonly minVolumeRatio = 1.1; // Further reduced\n private readonly minPriceChange = 0.002; // Reduced to 0.2%\n private readonly maxRiskPerTrade = 0.02; // Increased to 2% for more trades\n private readonly profitTarget = 0.01; // Reduced to 1%\n private readonly stopLoss = 0.005; // Reduced to 0.5%\n\n // Position tracking\n private activePosition: {\n entryPrice: number;\n entryTime: number;\n highestPrice: number;\n pair: string; // Add pair tracking\n } | null = null;\n\n // Add debug mode\n private debugMode = true; // Enable by default for testing\n private tradeAttempts = 0;\n private hasLoggedStart = false;\n\n isReady(): boolean {\n return true;\n }\n\n private inferTradingPair(portfolioSnapshot: PortfolioSnapshot): string {\n // The SimulationService uses token addresses as keys in holdings\n // We need to find the non-USDC key which represents the token being traded\n const holdings = Object.keys(portfolioSnapshot.holdings);\n\n // Look for existing position first\n const existingPosition = holdings.find(\n (key) => key !== \"USDC\" && portfolioSnapshot.holdings[key] > 0,\n );\n\n if (existingPosition) {\n return existingPosition;\n }\n\n // If no position, look for any non-USDC key (even with 0 balance)\n // This happens when we have historical trades but currently flat\n const potentialToken = holdings.find((key) => key !== \"USDC\");\n\n if (potentialToken) {\n return potentialToken;\n }\n\n // If we only have USDC, we're likely at the start of a simulation\n // The token address should be inferred from the context\n // For now, we'll return a placeholder that will be replaced\n console.warn(\"[MomentumBreakout] Could not infer trading pair from portfolio\");\n return \"UNKNOWN\";\n }\n\n async decide(params: {\n marketData: StrategyContextMarketData;\n agentState: AgentState;\n portfolioSnapshot: PortfolioSnapshot;\n agentRuntime?: any;\n }): Promise<TradeOrder | null> {\n const { marketData, portfolioSnapshot } = params;\n const { priceData, currentPrice } = marketData;\n\n // Log initial info once\n if (!this.hasLoggedStart && this.debugMode) {\n console.log(`[MomentumBreakout] Strategy started:`, {\n minPriceChange: `${(this.minPriceChange * 100).toFixed(1)}%`,\n minVolumeRatio: this.minVolumeRatio,\n dataPoints: priceData?.length || 0,\n initialPrice: currentPrice,\n });\n this.hasLoggedStart = true;\n }\n\n // Need at least 100 candles for analysis\n if (!priceData || priceData.length < 100) {\n if (this.debugMode && this.tradeAttempts === 0) {\n console.log(`[MomentumBreakout] Not enough data: ${priceData?.length || 0} candles`);\n }\n return null;\n }\n\n // Infer the trading pair from the portfolio\n const tradingPair = this.inferTradingPair(portfolioSnapshot);\n\n // Calculate momentum indicators\n const indicators = this.calculateMomentumIndicators(priceData);\n\n // Get current position - look for any non-USDC holding\n const holdings = Object.entries(portfolioSnapshot.holdings);\n const assetHolding = holdings.find(([key, value]) => key !== \"USDC\" && value > 0);\n const hasPosition = assetHolding && assetHolding[1] > 0;\n const assetSymbol = assetHolding ? assetHolding[0] : null;\n\n // Position management\n if (hasPosition && this.activePosition && assetSymbol) {\n return this.managePosition(currentPrice, indicators, assetSymbol, portfolioSnapshot);\n }\n\n // Entry logic - look for momentum breakout\n const shouldEnter = this.shouldEnter(indicators, currentPrice);\n\n // Log first few evaluations for debugging\n if (this.debugMode && this.tradeAttempts < 5) {\n const conditions = this.evaluateEntryConditions(indicators);\n console.log(`[MomentumBreakout] Early evaluation #${this.tradeAttempts + 1}:`, {\n shouldEnter,\n price: currentPrice.toFixed(6),\n indicators: {\n priceChange5m: `${(indicators.priceChange5m * 100).toFixed(3)}%`,\n priceChange15m: `${(indicators.priceChange15m * 100).toFixed(3)}%`,\n volumeRatio: indicators.volumeRatio.toFixed(2),\n trend: indicators.trendDirection,\n adx: indicators.adx.toFixed(1),\n },\n conditions: {\n momentum: conditions.hasMomentum,\n volume: conditions.hasVolume,\n trend: conditions.trendAligned,\n notAtResistance: conditions.goodEntry,\n metCount: `${conditions.metConditions}/4`,\n },\n });\n }\n\n if (!hasPosition && shouldEnter) {\n const positionSize = this.calculatePositionSize(portfolioSnapshot.totalValue, currentPrice);\n\n if (positionSize > 0.001) {\n this.activePosition = {\n entryPrice: currentPrice,\n entryTime: Date.now(),\n highestPrice: currentPrice,\n pair: tradingPair,\n };\n\n console.log(`[MomentumBreakout] 🎯 BUY SIGNAL:`, {\n price: currentPrice,\n positionSize: positionSize.toFixed(4),\n totalValue: portfolioSnapshot.totalValue.toFixed(2),\n indicators: {\n priceChange5m: `${(indicators.priceChange5m * 100).toFixed(2)}%`,\n priceChange15m: `${(indicators.priceChange15m * 100).toFixed(2)}%`,\n volumeRatio: indicators.volumeRatio.toFixed(2),\n trend: indicators.trendDirection,\n adx: indicators.adx.toFixed(1),\n },\n });\n\n return {\n action: TradeType.BUY,\n pair: tradingPair,\n quantity: positionSize,\n orderType: OrderType.MARKET,\n timestamp: Date.now(),\n reason: `Momentum breakout: ${(indicators.priceChange5m * 100).toFixed(1)}% move on ${indicators.volumeRatio.toFixed(1)}x volume`,\n };\n }\n }\n\n // Log entry evaluation periodically for debugging\n this.tradeAttempts++;\n if (this.debugMode && this.tradeAttempts % 200 === 0) {\n const conditions = this.evaluateEntryConditions(indicators);\n console.log(`[MomentumBreakout] Periodic evaluation #${this.tradeAttempts}:`, {\n shouldEnter: conditions.metConditions >= 2,\n price: currentPrice.toFixed(6),\n conditions: {\n momentum: conditions.hasMomentum,\n volume: conditions.hasVolume,\n trend: conditions.trendAligned,\n notAtResistance: conditions.goodEntry,\n metCount: `${conditions.metConditions}/4`,\n },\n });\n }\n\n return null;\n }\n\n private evaluateEntryConditions(indicators: MomentumIndicators) {\n const hasMomentum =\n indicators.priceChange5m > this.minPriceChange && indicators.priceChange15m > -0.01; // Allow more negative 15m\n\n const hasVolume =\n indicators.volumeRatio > this.minVolumeRatio ||\n (indicators.volumeRatio > 1.0 && indicators.volumeTrend === \"increasing\");\n\n const trendAligned =\n (indicators.trendDirection === \"bullish\" && indicators.adx > 15) || // Reduced ADX requirement\n indicators.priceChange5m > this.minPriceChange * 1.5; // Lower threshold\n\n const goodEntry = !indicators.nearResistance || indicators.priceChange5m > 0.005; // Allow entry near resistance if strong momentum\n\n const conditions = [hasMomentum, hasVolume, trendAligned, goodEntry];\n const metConditions = conditions.filter((c) => c).length;\n\n return {\n hasMomentum,\n hasVolume,\n trendAligned,\n goodEntry,\n metConditions,\n };\n }\n\n private calculateMomentumIndicators(priceData: OHLCV[]): MomentumIndicators {\n const currentPrice = priceData[priceData.length - 1].close;\n\n // Price momentum over different timeframes\n const price5mAgo = priceData[Math.max(0, priceData.length - 5)]?.close || currentPrice;\n const price15mAgo = priceData[Math.max(0, priceData.length - 15)]?.close || currentPrice;\n const price60mAgo = priceData[Math.max(0, priceData.length - 60)]?.close || currentPrice;\n\n const priceChange5m = (currentPrice - price5mAgo) / price5mAgo;\n const priceChange15m = (currentPrice - price15mAgo) / price15mAgo;\n const priceChange1h = (currentPrice - price60mAgo) / price60mAgo;\n\n // Volume analysis\n const recentVolumes = priceData.slice(-20).map((c) => c.volume);\n const avgVolume = recentVolumes.reduce((a, b) => a + b) / recentVolumes.length;\n const currentVolume = priceData[priceData.length - 1].volume;\n const volumeRatio = currentVolume / avgVolume;\n\n // Volume trend\n const volumeTrend5 = recentVolumes.slice(-5).reduce((a, b) => a + b) / 5;\n const volumeTrend10 = recentVolumes.slice(-10).reduce((a, b) => a + b) / 10;\n let volumeTrend: \"increasing\" | \"decreasing\" | \"stable\";\n\n if (volumeTrend5 > volumeTrend10 * 1.2) {\n volumeTrend = \"increasing\";\n } else if (volumeTrend5 < volumeTrend10 * 0.8) {\n volumeTrend = \"decreasing\";\n } else {\n volumeTrend = \"stable\";\n }\n\n // ATR for volatility\n const atr = this.calculateATR(priceData.slice(-14));\n const atrPercentage = atr / currentPrice;\n\n // ADX for trend strength\n const adx = this.calculateADX(priceData.slice(-20));\n\n // Market structure\n const recentHighs = priceData.slice(-20).map((c) => c.high);\n const recentLows = priceData.slice(-20).map((c) => c.low);\n const resistance = Math.max(...recentHighs);\n const support = Math.min(...recentLows);\n\n // Trend direction\n const ema9 = this.calculateEMA(\n priceData.slice(-20).map((c) => c.close),\n 9,\n );\n const ema21 = this.calculateEMA(\n priceData.slice(-30).map((c) => c.close),\n 21,\n );\n\n let trendDirection: \"bullish\" | \"bearish\" | \"neutral\";\n if (ema9 > ema21 * 1.01 && priceChange15m > 0) {\n trendDirection = \"bullish\";\n } else if (ema9 < ema21 * 0.99 && priceChange15m < 0) {\n trendDirection = \"bearish\";\n } else {\n trendDirection = \"neutral\";\n }\n\n return {\n priceChange1h,\n priceChange5m,\n priceChange15m,\n volumeRatio,\n volumeSpike: volumeRatio > 3,\n volumeTrend,\n atr,\n volatilityPercentile: atrPercentage > 0.02 ? 0.8 : 0.5,\n adx,\n trendDirection,\n trendStrength: (Math.abs(priceChange15m) * adx) / 25,\n resistance,\n support,\n nearResistance: (resistance - currentPrice) / currentPrice < 0.01,\n nearSupport: (currentPrice - support) / currentPrice < 0.01,\n };\n }\n\n private shouldEnter(indicators: MomentumIndicators, _currentPrice: number): boolean {\n const conditions = this.evaluateEntryConditions(indicators);\n return conditions.metConditions >= 2; // Reduced from 3 to 2 out of 4\n }\n\n private managePosition(\n currentPrice: number,\n indicators: MomentumIndicators,\n assetSymbol: string,\n portfolio: PortfolioSnapshot,\n ): TradeOrder | null {\n if (!this.activePosition) return null;\n\n const { entryPrice, highestPrice } = this.activePosition;\n const profitPercent = (currentPrice - entryPrice) / entryPrice;\n const drawdownFromHigh = (highestPrice - currentPrice) / highestPrice;\n\n // Update highest price\n if (currentPrice > highestPrice) {\n this.activePosition.highestPrice = currentPrice;\n }\n\n // Exit conditions\n let shouldExit = false;\n let exitReason = \"\";\n\n // 1. Hit profit target\n if (profitPercent >= this.profitTarget) {\n shouldExit = true;\n exitReason = `Profit target reached: +${(profitPercent * 100).toFixed(1)}%`;\n }\n\n // 2. Stop loss\n else if (profitPercent <= -this.stopLoss) {\n shouldExit = true;\n exitReason = `Stop loss triggered: ${(profitPercent * 100).toFixed(1)}%`;\n }\n\n // 3. Trailing stop (if profit > 1.5%)\n else if (profitPercent > 0.015 && drawdownFromHigh > 0.01) {\n shouldExit = true;\n exitReason = `Trailing stop: -${(drawdownFromHigh * 100).toFixed(1)}% from high`;\n }\n\n // 4. Momentum reversal\n else if (indicators.priceChange5m < -0.01 && indicators.volumeRatio > 2) {\n shouldExit = true;\n exitReason = \"Momentum reversal detected\";\n }\n\n if (shouldExit) {\n this.activePosition = null;\n\n return {\n action: TradeType.SELL,\n pair: `${assetSymbol}/USDC`,\n quantity: portfolio.holdings[assetSymbol],\n orderType: OrderType.MARKET,\n timestamp: Date.now(),\n reason: exitReason,\n };\n }\n\n return null;\n }\n\n private calculatePositionSize(portfolioValue: number, currentPrice: number): number {\n // Risk-based position sizing\n // We want to risk maxRiskPerTrade of our portfolio\n // If we hit our stop loss, we should lose exactly that amount\n\n // Calculate the position value that would result in our max risk if stopped out\n const riskAmount = portfolioValue * this.maxRiskPerTrade;\n const positionValue = riskAmount / this.stopLoss;\n\n // But we can't use more than a reasonable portion of our portfolio\n // Use the lesser of our risk-based size or 25% of portfolio\n const maxPositionValue = portfolioValue * 0.25;\n const actualPositionValue = Math.min(positionValue, maxPositionValue);\n\n const quantity = actualPositionValue / currentPrice;\n\n if (this.debugMode) {\n console.log(`[MomentumBreakout] Position sizing:`, {\n portfolioValue: portfolioValue.toFixed(2),\n riskAmount: riskAmount.toFixed(2),\n calculatedPositionValue: positionValue.toFixed(2),\n actualPositionValue: actualPositionValue.toFixed(2),\n currentPrice: currentPrice.toFixed(6),\n quantity: quantity.toFixed(4),\n });\n }\n\n return quantity;\n }\n\n private calculateATR(candles: OHLCV[]): number {\n if (candles.length < 2) return 0;\n\n const trueRanges = [];\n for (let i = 1; i < candles.length; i++) {\n const highLow = candles[i].high - candles[i].low;\n const highClose = Math.abs(candles[i].high - candles[i - 1].close);\n const lowClose = Math.abs(candles[i].low - candles[i - 1].close);\n trueRanges.push(Math.max(highLow, highClose, lowClose));\n }\n\n return trueRanges.reduce((a, b) => a + b) / trueRanges.length;\n }\n\n private calculateEMA(values: number[], period: number): number {\n if (values.length < period) return values[values.length - 1];\n\n const multiplier = 2 / (period + 1);\n let ema = values.slice(0, period).reduce((a, b) => a + b) / period;\n\n for (let i = period; i < values.length; i++) {\n ema = (values[i] - ema) * multiplier + ema;\n }\n\n return ema;\n }\n\n private calculateADX(candles: OHLCV[], period: number = 14): number {\n if (candles.length < period + 1) return 0;\n\n // Simplified ADX calculation\n const priceChanges = [];\n for (let i = 1; i < candles.length; i++) {\n priceChanges.push(Math.abs(candles[i].close - candles[i - 1].close) / candles[i - 1].close);\n }\n\n const avgChange = priceChanges.reduce((a, b) => a + b) / priceChanges.length;\n return Math.min(avgChange * 1000, 100); // Scale to 0-100\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../plugin-trajectory-logger/typescript/dist/node/index.node.js"],"sourcesContent":["// action-interceptor.ts\nimport { logger } from \"@elizaos/core\";\nvar trajectoryContexts = new WeakMap;\nfunction setTrajectoryContext(runtime, trajectoryId, trajectoryLogger) {\n trajectoryContexts.set(runtime, { trajectoryId, logger: trajectoryLogger });\n}\nfunction getTrajectoryContext(runtime) {\n return trajectoryContexts.get(runtime) || null;\n}\nfunction clearTrajectoryContext(runtime) {\n trajectoryContexts.delete(runtime);\n}\nfunction wrapActionWithLogging(action, _trajectoryLogger) {\n const originalHandler = action.handler;\n return {\n ...action,\n handler: async (runtime, message, state, options, callback) => {\n const context = getTrajectoryContext(runtime);\n if (!context) {\n const result = await originalHandler(runtime, message, state, options, callback);\n return result ?? undefined;\n }\n const { trajectoryId, logger: loggerService } = context;\n const stepId = loggerService.getCurrentStepId(trajectoryId);\n if (!stepId) {\n logger.warn({ action: action.name, trajectoryId }, \"No active step for action execution\");\n const result = await originalHandler(runtime, message, state, options, callback);\n return result ?? undefined;\n }\n const successHandler = () => {\n const stateSnapshot = state ? JSON.parse(JSON.stringify(state)) : null;\n loggerService.completeStep(trajectoryId, stepId, {\n actionType: action.name,\n actionName: action.name,\n parameters: {\n message: message.content.text || \"\",\n state: stateSnapshot\n },\n success: true,\n result: { executed: true },\n reasoning: `Action ${action.name} executed via ${action.description || \"handler\"}`\n }, { reward: 0.1 });\n };\n const errorHandler = (err) => {\n const error = err instanceof Error ? err.message : typeof err === \"string\" ? err : err.message || String(err);\n logger.error({ action: action.name, trajectoryId, error }, \"Action execution failed\");\n const stateSnapshot = state ? JSON.parse(JSON.stringify(state)) : null;\n loggerService.completeStep(trajectoryId, stepId, {\n actionType: action.name,\n actionName: action.name,\n parameters: {\n message: message.content.text || \"\",\n state: stateSnapshot\n },\n success: false,\n result: { error },\n reasoning: `Action ${action.name} failed: ${error}`\n }, { reward: -0.1 });\n throw err;\n };\n try {\n const result = await originalHandler(runtime, message, state, options, callback);\n successHandler();\n return result ?? undefined;\n } catch (err) {\n if (err instanceof Error) {\n return errorHandler(err);\n }\n if (typeof err === \"string\") {\n return errorHandler(err);\n }\n return errorHandler(err);\n }\n }\n };\n}\nfunction wrapPluginActions(plugin, trajectoryLogger) {\n if (!plugin.actions || plugin.actions.length === 0) {\n return plugin;\n }\n return {\n ...plugin,\n actions: plugin.actions.map((action) => wrapActionWithLogging(action, trajectoryLogger))\n };\n}\nfunction logLLMCallFromAction(actionContext, trajectoryLogger, trajectoryId) {\n const stepId = trajectoryLogger.getCurrentStepId(trajectoryId);\n if (!stepId) {\n logger.warn({ trajectoryId }, \"No active step for LLM call from action\");\n return;\n }\n trajectoryLogger.logLLMCall(stepId, {\n model: actionContext.model || \"unknown\",\n systemPrompt: actionContext.systemPrompt || \"\",\n userPrompt: actionContext.userPrompt || \"\",\n response: actionContext.response || \"\",\n reasoning: actionContext.reasoning || undefined,\n temperature: actionContext.temperature || 0.7,\n maxTokens: actionContext.maxTokens || 8192,\n purpose: actionContext.purpose || \"action\",\n actionType: actionContext.actionType || undefined,\n promptTokens: actionContext.promptTokens || undefined,\n completionTokens: actionContext.completionTokens || undefined,\n latencyMs: actionContext.latencyMs || undefined\n });\n}\nfunction logProviderFromAction(actionContext, trajectoryLogger, trajectoryId) {\n const stepId = trajectoryLogger.getCurrentStepId(trajectoryId);\n if (!stepId) {\n logger.warn({ trajectoryId }, \"No active step for provider access from action\");\n return;\n }\n trajectoryLogger.logProviderAccess(stepId, {\n providerName: actionContext.providerName || \"unknown\",\n data: actionContext.data || {},\n purpose: actionContext.purpose || \"action\",\n query: actionContext.query || undefined\n });\n}\nfunction wrapProviderWithLogging(provider, _trajectoryLogger) {\n const originalGet = provider.get;\n return {\n ...provider,\n get: async (runtime, message, state) => {\n const context = getTrajectoryContext(runtime);\n if (!context) {\n return originalGet?.(runtime, message, state) || { text: \"\" };\n }\n const { trajectoryId, logger: loggerService } = context;\n const stepId = loggerService.getCurrentStepId(trajectoryId);\n if (!stepId) {\n logger.warn({ provider: provider.name, trajectoryId }, \"No active step for provider access\");\n return originalGet?.(runtime, message, state) || { text: \"\" };\n }\n const result = await originalGet?.(runtime, message, state) || { text: \"\" };\n const stateSnapshot = state ? JSON.parse(JSON.stringify(state)) : null;\n loggerService.logProviderAccess(stepId, {\n providerName: provider.name,\n data: {\n text: result.text || \"\",\n success: true\n },\n purpose: `Provider ${provider.name} accessed for context`,\n query: {\n message: message.content.text || \"\",\n state: stateSnapshot\n }\n });\n return result;\n }\n };\n}\nfunction wrapPluginProviders(plugin, trajectoryLogger) {\n if (!plugin.providers || plugin.providers.length === 0) {\n return plugin;\n }\n return {\n ...plugin,\n providers: plugin.providers.map((provider) => wrapProviderWithLogging(provider, trajectoryLogger))\n };\n}\n// art-format.ts\nfunction toARTMessages(trajectory) {\n const messages = [];\n const systemMessage = buildSystemMessage(trajectory);\n if (systemMessage) {\n messages.push(systemMessage);\n }\n for (const step of trajectory.steps) {\n const userContent = buildUserMessage(step);\n if (userContent) {\n messages.push({ role: \"user\", content: userContent });\n }\n const assistantContent = buildAssistantMessage(step);\n if (assistantContent) {\n messages.push({ role: \"assistant\", content: assistantContent });\n }\n }\n return messages;\n}\nfunction buildSystemMessage(trajectory) {\n const firstStep = trajectory.steps[0];\n const firstLLMCall = firstStep?.llmCalls?.[0];\n if (firstLLMCall?.systemPrompt) {\n return { role: \"system\", content: firstLLMCall.systemPrompt };\n }\n const agentName = trajectory.metadata.agentName || \"Agent\";\n const goal = trajectory.metadata.goalDescription || \"make good decisions\";\n return {\n role: \"system\",\n content: `You are ${agentName}, an autonomous agent. Your goal is to ${goal}.`\n };\n}\nfunction buildUserMessage(step) {\n const llmCall = step.llmCalls.find((call) => call.purpose === \"action\");\n if (llmCall?.userPrompt) {\n return llmCall.userPrompt;\n }\n const parts = [];\n parts.push(\"Current state:\");\n parts.push(`- Balance: $${step.environmentState.agentBalance}`);\n parts.push(`- P&L: $${step.environmentState.agentPnL}`);\n parts.push(`- Open Positions: ${step.environmentState.openPositions}`);\n for (const provider of step.providerAccesses) {\n parts.push(`\n${provider.providerName} data:`);\n parts.push(JSON.stringify(provider.data, null, 2));\n }\n parts.push(`\nWhat action should you take?`);\n return parts.join(`\n`);\n}\nfunction buildAssistantMessage(step) {\n const llmCall = step.llmCalls.find((call) => call.purpose === \"action\");\n if (llmCall?.response) {\n return llmCall.response;\n }\n const action = step.action;\n const parts = [];\n parts.push(`I will ${action.actionType}.`);\n if (action.reasoning) {\n parts.push(`Reasoning: ${action.reasoning}`);\n }\n parts.push(`Parameters: ${JSON.stringify(action.parameters)}`);\n return parts.join(`\n`);\n}\nfunction toARTTrajectory(trajectory) {\n return {\n messages: toARTMessages(trajectory),\n reward: trajectory.totalReward,\n metadata: {\n trajectoryId: trajectory.trajectoryId,\n agentId: trajectory.agentId,\n scenarioId: trajectory.scenarioId,\n groupIndex: trajectory.groupIndex,\n environmentContext: {\n initialBalance: trajectory.steps[0]?.environmentState.agentBalance || 0,\n finalBalance: trajectory.metrics.finalBalance || 0,\n initialPnL: trajectory.steps[0]?.environmentState.agentPnL || 0,\n finalPnL: trajectory.metrics.finalPnL || 0,\n actionsTaken: trajectory.steps.map((s) => s.action.actionType),\n errors: trajectory.steps.filter((s) => !s.action.success).map((s) => s.action.error || \"Unknown error\")\n },\n gameKnowledge: extractGameKnowledge(trajectory),\n metrics: JSON.parse(JSON.stringify(trajectory.metrics))\n },\n metrics: filterNumericMetrics(trajectory.metrics)\n };\n}\nfunction filterNumericMetrics(metrics) {\n const numericMetrics = {};\n for (const [key, value] of Object.entries(metrics)) {\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n numericMetrics[key] = value;\n }\n }\n return numericMetrics;\n}\nfunction extractGameKnowledge(trajectory) {\n const knowledge = {};\n if (trajectory.metadata.trueProbabilities) {\n knowledge.trueProbabilities = trajectory.metadata.trueProbabilities;\n }\n if (trajectory.metadata.futureOutcomes) {\n knowledge.actualOutcomes = trajectory.metadata.futureOutcomes;\n }\n if (trajectory.metadata.hiddenVariables) {\n knowledge.hiddenVariables = trajectory.metadata.hiddenVariables;\n }\n const gameEvents = trajectory.steps.map((s) => s.metadata?.gameEvent).filter((e) => !!e);\n if (gameEvents.length > 0) {\n knowledge.gameEvents = gameEvents;\n }\n return knowledge;\n}\nfunction groupTrajectories(trajectories) {\n const groups = new Map;\n for (const traj of trajectories) {\n const scenarioId = traj.scenarioId || \"default\";\n if (!groups.has(scenarioId)) {\n groups.set(scenarioId, []);\n }\n groups.get(scenarioId)?.push(traj);\n }\n return Array.from(groups.entries()).map(([scenarioId, trajs], idx) => ({\n groupId: `group-${idx}`,\n scenarioId,\n trajectories: trajs,\n sharedPrefix: extractSharedPrefix(trajs),\n createdAt: Date.now()\n }));\n}\nfunction extractSharedPrefix(trajectories) {\n if (trajectories.length === 0)\n return [];\n const allMessages = trajectories.map((t) => toARTMessages(t));\n if (allMessages.length === 0)\n return [];\n const firstMessages = allMessages[0];\n if (!firstMessages)\n return [];\n const sharedPrefix = [];\n for (let i = 0;i < firstMessages.length; i++) {\n const message = firstMessages[i];\n if (!message)\n break;\n const allMatch = allMessages.every((msgs) => msgs[i] && msgs[i]?.role === message.role && msgs[i]?.content === message.content);\n if (allMatch) {\n sharedPrefix.push(message);\n } else {\n break;\n }\n }\n return sharedPrefix;\n}\nfunction removeSharedPrefix(messages, sharedPrefix) {\n return messages.slice(sharedPrefix.length);\n}\nfunction prepareForRULER(group) {\n const artTrajs = group.trajectories.map((t) => toARTTrajectory(t));\n const sharedPrefix = group.sharedPrefix || extractSharedPrefix(group.trajectories);\n return {\n sharedPrefix,\n suffixes: artTrajs.map((art) => removeSharedPrefix(art.messages, sharedPrefix)),\n metadata: artTrajs.map((art) => art.metadata)\n };\n}\nfunction toARTJSONL(trajectory) {\n return JSON.stringify(toARTTrajectory(trajectory));\n}\nfunction validateARTCompatibility(trajectory) {\n const errors = [];\n const warnings = [];\n if (trajectory.steps.length === 0) {\n errors.push(\"Trajectory has no steps\");\n }\n for (const [idx, step] of trajectory.steps.entries()) {\n if (step.llmCalls.length === 0) {\n errors.push(`Step ${idx} has no LLM calls - can't extract messages`);\n }\n for (const llmCall of step.llmCalls) {\n if (!llmCall.userPrompt || llmCall.userPrompt.length < 10) {\n warnings.push(`Step ${idx} has very short user prompt`);\n }\n if (!llmCall.response || llmCall.response.length < 5) {\n warnings.push(`Step ${idx} has very short response`);\n }\n }\n }\n if (trajectory.totalReward === undefined || Number.isNaN(trajectory.totalReward)) {\n errors.push(\"Trajectory has no valid reward\");\n }\n const artTraj = toARTTrajectory(trajectory);\n if (artTraj.messages.length < 2) {\n warnings.push(\"Trajectory converts to very few messages (< 2)\");\n }\n return {\n valid: errors.length === 0,\n errors,\n warnings\n };\n}\n// export.ts\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nasync function exportToHuggingFace(options) {\n return exportForOpenPipeART(options);\n}\nasync function exportGroupedByScenario(options) {\n const trajectories = filterTrajectories(options.trajectories || [], options);\n const outPath = resolveOutputPath(options, \"grouped-by-scenario.json\");\n const grouped = {};\n for (const t of trajectories) {\n const scenarioId = t.scenarioId || \"default\";\n if (!grouped[scenarioId])\n grouped[scenarioId] = [];\n grouped[scenarioId]?.push(t);\n }\n await writeJson(outPath, grouped);\n return { success: true, trajectoriesExported: trajectories.length, datasetUrl: outPath };\n}\nasync function exportForOpenPipeART(options) {\n const trajectories = filterTrajectories(options.trajectories || [], options);\n const outPath = resolveOutputPath(options, \"trajectories.art.jsonl\");\n const lines = `${trajectories.map((t) => toARTJSONL(t)).join(`\n`)}\n`;\n await writeText(outPath, lines);\n return { success: true, trajectoriesExported: trajectories.length, datasetUrl: outPath };\n}\nasync function exportGroupedForGRPO(options) {\n const trajectories = filterTrajectories(options.trajectories || [], options);\n const outPath = resolveOutputPath(options, \"trajectories.grpo.groups.json\");\n const groups = groupTrajectories(trajectories);\n await writeJson(outPath, groups);\n return { success: true, trajectoriesExported: trajectories.length, datasetUrl: outPath };\n}\nfunction filterTrajectories(trajectories, options) {\n let out = trajectories.slice();\n if (options.startDate) {\n const startMs = options.startDate.getTime();\n out = out.filter((t) => t.startTime >= startMs);\n }\n if (options.endDate) {\n const endMs = options.endDate.getTime();\n out = out.filter((t) => t.startTime <= endMs);\n }\n if (options.agentIds && options.agentIds.length > 0) {\n const set = new Set(options.agentIds);\n out = out.filter((t) => set.has(t.agentId));\n }\n if (options.scenarioIds && options.scenarioIds.length > 0) {\n const set = new Set(options.scenarioIds);\n out = out.filter((t) => t.scenarioId && set.has(t.scenarioId));\n }\n if (typeof options.minReward === \"number\") {\n const minReward = options.minReward;\n out = out.filter((t) => t.totalReward >= minReward);\n }\n if (typeof options.maxReward === \"number\") {\n const maxReward = options.maxReward;\n out = out.filter((t) => t.totalReward <= maxReward);\n }\n const limit = options.maxTrajectories || out.length;\n return out.slice(0, limit);\n}\nfunction resolveOutputPath(options, fallbackFileName) {\n if (options.outputPath)\n return options.outputPath;\n if (options.outputDir)\n return join(options.outputDir, fallbackFileName);\n const safeName = options.datasetName.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n return join(process.cwd(), `${safeName}.${fallbackFileName}`);\n}\nasync function writeText(path, content) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, content, \"utf8\");\n}\nasync function writeJson(path, data) {\n await writeText(path, `${JSON.stringify(data, null, 2)}\n`);\n}\n// game-rewards.ts\nfunction computeTrajectoryReward(trajectory) {\n return trajectory.totalReward;\n}\nfunction computeStepReward(step) {\n return step.reward || 0;\n}\nasync function buildGameStateFromDB(_trajectoryId) {\n return {};\n}\nasync function recomputeTrajectoryRewards(_trajectoryIds) {}\n// integration.ts\nimport { logger as logger2 } from \"@elizaos/core\";\nfunction startAutonomousTick(trajectoryLogger, context) {\n const trajectoryId = trajectoryLogger.startTrajectory(context.agentId, {\n scenarioId: context.scenarioId,\n episodeId: context.episodeId,\n batchId: context.batchId,\n metadata: context.metadata\n });\n const envState = {\n timestamp: Date.now(),\n agentBalance: 0,\n agentPoints: 0,\n agentPnL: 0,\n openPositions: 0\n };\n trajectoryLogger.startStep(trajectoryId, envState);\n logger2.info({ trajectoryId, agentId: context.agentId }, \"Started autonomous tick trajectory\");\n return trajectoryId;\n}\nasync function endAutonomousTick(trajectoryLogger, trajectoryId, status = \"completed\", finalMetrics) {\n await trajectoryLogger.endTrajectory(trajectoryId, status, finalMetrics);\n logger2.info({ trajectoryId, status }, \"Ended autonomous tick trajectory\");\n}\nasync function loggedLLMCall(trajectoryLogger, trajectoryId, options, llmCallFn) {\n const stepId = trajectoryLogger.getCurrentStepId(trajectoryId);\n if (!stepId) {\n logger2.warn({ trajectoryId }, \"No active step for LLM call\");\n const result2 = await llmCallFn();\n return result2.text;\n }\n const startTime = Date.now();\n const result = await llmCallFn();\n const latencyMs = Date.now() - startTime;\n trajectoryLogger.logLLMCall(stepId, {\n model: options.model,\n modelVersion: options.modelVersion,\n systemPrompt: options.systemPrompt,\n userPrompt: options.userPrompt,\n response: result.text,\n reasoning: result.reasoning,\n temperature: options.temperature || 0.7,\n maxTokens: options.maxTokens || 8192,\n purpose: options.purpose || \"action\",\n actionType: options.actionType,\n promptTokens: result.tokens?.prompt,\n completionTokens: result.tokens?.completion,\n latencyMs: result.latencyMs || latencyMs\n });\n return result.text;\n}\nfunction logProviderAccess(trajectoryLogger, trajectoryId, access) {\n trajectoryLogger.logProviderAccessByTrajectoryId(trajectoryId, access);\n}\nfunction withTrajectoryLogging(fn, trajectoryLogger, trajectoryId, context = {}) {\n return async (...args) => {\n const stepId = trajectoryLogger.getCurrentStepId(trajectoryId);\n if (!stepId) {\n return fn(...args);\n }\n const result = await fn(...args);\n trajectoryLogger.completeStep(trajectoryId, stepId, {\n actionType: context.actionType || \"function_call\",\n actionName: fn.name || \"anonymous\",\n parameters: { args },\n success: true,\n result: result !== undefined ? { result } : { result: null }\n }, { reward: 0.05 });\n return result;\n };\n}\n// reward-service.ts\nclass RewardService {\n options;\n constructor(options = {}) {\n this.options = options;\n }\n async scoreTrajectory(trajectory) {\n if (this.options.useHeuristics !== false) {\n return this.computeHeuristicReward(trajectory);\n }\n return this.computeHeuristicReward(trajectory);\n }\n async scoreTrajectoryGroup(trajectories) {\n if (trajectories.length === 0) {\n return [];\n }\n if (trajectories.length === 1) {\n const first = trajectories[0];\n if (!first)\n return [];\n const score = await this.scoreTrajectory(first);\n return [this.normalizeScore(score)];\n }\n const rawScores = await Promise.all(trajectories.map((t) => this.scoreTrajectory(t)));\n return this.normalizeScoresForGroup(rawScores);\n }\n computeHeuristicReward(trajectory) {\n const components = trajectory.rewardComponents;\n const metrics = trajectory.metrics;\n let reward = 0;\n let weightSum = 0;\n if (metrics.finalPnL !== undefined) {\n const pnlScore = this.normalizePnL(metrics.finalPnL);\n reward += pnlScore * 0.4;\n weightSum += 0.4;\n }\n if (metrics.successRate !== undefined) {\n const successScore = metrics.successRate * 2 - 1;\n reward += successScore * 0.3;\n weightSum += 0.3;\n }\n const completionScore = metrics.finalStatus === \"completed\" ? 1 : -0.5;\n reward += completionScore * 0.2;\n weightSum += 0.2;\n if (components.environmentReward !== undefined) {\n const envScore = Math.max(-1, Math.min(1, components.environmentReward));\n reward += envScore * 0.1;\n weightSum += 0.1;\n }\n if (weightSum > 0) {\n reward = reward / weightSum;\n }\n return Math.max(-1, Math.min(1, reward));\n }\n normalizePnL(pnl) {\n return Math.tanh(pnl / 500);\n }\n normalizeScore(score) {\n return (score + 1) / 2;\n }\n normalizeScoresForGroup(scores) {\n const min = Math.min(...scores);\n const max = Math.max(...scores);\n const range = max - min;\n if (range === 0) {\n return scores.map(() => 0.5);\n }\n return scores.map((s) => (s - min) / range);\n }\n}\nfunction createRewardService(options = {}) {\n return new RewardService(options);\n}\nasync function scoreTrajectory(trajectory) {\n const service = new RewardService;\n return service.scoreTrajectory(trajectory);\n}\nasync function scoreTrajectoryGroup(trajectories) {\n const service = new RewardService;\n return service.scoreTrajectoryGroup(trajectories);\n}\n// TrajectoryLoggerService.ts\nimport { asUUID, logger as logger3 } from \"@elizaos/core\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nclass TrajectoryLoggerService {\n activeTrajectories = new Map;\n activeStepIds = new Map;\n startTrajectory(agentId, options = {}) {\n const trajectoryId = uuidv4();\n const now = Date.now();\n const trajectory = {\n trajectoryId: asUUID(trajectoryId),\n agentId: asUUID(agentId),\n startTime: now,\n endTime: now,\n durationMs: 0,\n episodeId: options.episodeId,\n scenarioId: options.scenarioId,\n batchId: options.batchId,\n groupIndex: options.groupIndex,\n steps: [],\n totalReward: 0,\n rewardComponents: {\n environmentReward: 0\n },\n metrics: {\n episodeLength: 0,\n finalStatus: \"completed\"\n },\n metadata: options.metadata || {}\n };\n this.activeTrajectories.set(trajectoryId, trajectory);\n return trajectoryId;\n }\n startStep(trajectoryId, envState) {\n const stepId = uuidv4();\n const trajectory = this.activeTrajectories.get(trajectoryId);\n if (!trajectory) {\n throw new Error(`Trajectory ${trajectoryId} not found`);\n }\n const step = {\n stepId: asUUID(stepId),\n stepNumber: trajectory.steps.length,\n timestamp: envState.timestamp || Date.now(),\n environmentState: envState,\n observation: {},\n llmCalls: [],\n providerAccesses: [],\n action: {\n attemptId: \"\",\n timestamp: 0,\n actionType: \"pending\",\n actionName: \"pending\",\n parameters: {},\n success: false\n },\n reward: 0,\n done: false\n };\n trajectory.steps.push(step);\n this.activeStepIds.set(trajectoryId, stepId);\n return stepId;\n }\n logLLMCall(stepId, llmCall) {\n const trajectory = this.findTrajectoryByStepId(stepId);\n if (!trajectory) {\n logger3.warn({ stepId }, \"Trajectory not found for LLM call\");\n return;\n }\n const step = trajectory.steps.find((s) => s.stepId === stepId);\n if (!step) {\n logger3.warn({ stepId }, \"Step not found for LLM call\");\n return;\n }\n const fullLLMCall = {\n callId: uuidv4(),\n timestamp: Date.now(),\n ...llmCall\n };\n step.llmCalls.push(fullLLMCall);\n }\n logProviderAccess(stepId, access) {\n const trajectory = this.findTrajectoryByStepId(stepId);\n if (!trajectory) {\n logger3.warn({ stepId }, \"Trajectory not found for provider access\");\n return;\n }\n const step = trajectory.steps.find((s) => s.stepId === stepId);\n if (!step) {\n logger3.warn({ stepId }, \"Step not found for provider access\");\n return;\n }\n const fullAccess = {\n providerId: uuidv4(),\n timestamp: Date.now(),\n ...access\n };\n step.providerAccesses.push(fullAccess);\n }\n logLLMCallByTrajectoryId(trajectoryId, llmCall) {\n const stepId = this.activeStepIds.get(trajectoryId);\n if (!stepId) {\n logger3.warn({ trajectoryId }, \"No active step for trajectory\");\n return;\n }\n this.logLLMCall(stepId, llmCall);\n }\n logProviderAccessByTrajectoryId(trajectoryId, access) {\n const stepId = this.activeStepIds.get(trajectoryId);\n if (!stepId) {\n logger3.warn({ trajectoryId }, \"No active step for trajectory\");\n return;\n }\n this.logProviderAccess(stepId, access);\n }\n getCurrentStepId(trajectoryId) {\n return this.activeStepIds.get(trajectoryId) || null;\n }\n completeStep(trajectoryId, stepId, action, rewardInfo) {\n const trajectory = this.activeTrajectories.get(trajectoryId);\n if (!trajectory) {\n logger3.warn({ trajectoryId }, \"Trajectory not found for completeStep\");\n return;\n }\n const step = trajectory.steps.find((s) => s.stepId === stepId);\n if (!step) {\n logger3.warn({ trajectoryId, stepId }, \"Step not found for completeStep\");\n return;\n }\n step.action = {\n attemptId: uuidv4(),\n timestamp: Date.now(),\n ...action\n };\n if (rewardInfo?.reward !== undefined) {\n step.reward = rewardInfo.reward;\n trajectory.totalReward += rewardInfo.reward;\n }\n if (rewardInfo?.components) {\n trajectory.rewardComponents = {\n ...trajectory.rewardComponents,\n ...rewardInfo.components\n };\n }\n this.activeStepIds.delete(trajectoryId);\n }\n completeCurrentStep(trajectoryId, action, rewardInfo) {\n const stepId = this.activeStepIds.get(trajectoryId);\n if (!stepId) {\n logger3.warn({ trajectoryId }, \"No active step for trajectory\");\n return;\n }\n this.completeStep(trajectoryId, stepId, action, rewardInfo);\n }\n async endTrajectory(trajectoryId, status, finalMetrics) {\n const trajectory = this.activeTrajectories.get(trajectoryId);\n if (!trajectory) {\n logger3.warn({ trajectoryId }, \"Trajectory not found for endTrajectory\");\n return;\n }\n trajectory.endTime = Date.now();\n trajectory.durationMs = trajectory.endTime - trajectory.startTime;\n trajectory.metrics.finalStatus = status;\n trajectory.metrics.episodeLength = trajectory.steps.length;\n if (finalMetrics) {\n trajectory.metrics = {\n ...trajectory.metrics,\n ...finalMetrics\n };\n }\n this.activeStepIds.delete(trajectoryId);\n }\n getActiveTrajectory(trajectoryId) {\n return this.activeTrajectories.get(trajectoryId) || null;\n }\n findTrajectoryByStepId(stepId) {\n for (const trajectory of this.activeTrajectories.values()) {\n if (trajectory.steps.some((s) => s.stepId === stepId)) {\n return trajectory;\n }\n }\n return null;\n }\n}\n\n// index.ts\nvar trajectoryLoggerPlugin = {\n name: \"@elizaos/plugin-trajectory-logger\",\n description: \"Collects complete agent interaction trajectory data for RL training. Records LLM calls, provider access, actions, environment state, and computes rewards.\",\n dependencies: [],\n services: []\n};\nvar typescript_default = trajectoryLoggerPlugin;\nexport {\n wrapProviderWithLogging,\n wrapPluginProviders,\n wrapPluginActions,\n wrapActionWithLogging,\n withTrajectoryLogging,\n validateARTCompatibility,\n trajectoryLoggerPlugin,\n toARTTrajectory,\n toARTMessages,\n toARTJSONL,\n startAutonomousTick,\n setTrajectoryContext,\n scoreTrajectoryGroup,\n scoreTrajectory,\n removeSharedPrefix,\n recomputeTrajectoryRewards,\n prepareForRULER,\n loggedLLMCall,\n logProviderFromAction,\n logProviderAccess,\n logLLMCallFromAction,\n groupTrajectories,\n getTrajectoryContext,\n extractSharedPrefix,\n exportToHuggingFace,\n exportGroupedForGRPO,\n exportGroupedByScenario,\n exportForOpenPipeART,\n endAutonomousTick,\n typescript_default as default,\n createRewardService,\n computeTrajectoryReward,\n computeStepReward,\n clearTrajectoryContext,\n buildGameStateFromDB,\n TrajectoryLoggerService,\n RewardService\n};\n\n//# debugId=8E8ACF830258000B64756E2164756E21\n"],"mappings":"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","names":[]}