morpheus-cli 0.8.0 → 0.8.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.
@@ -7,6 +7,7 @@ import { DisplayManager } from "../display.js";
7
7
  import { ConfigManager } from "../../config/manager.js";
8
8
  import { Trinity } from "../trinity.js";
9
9
  import { ChannelRegistry } from "../../channels/registry.js";
10
+ import { AuditRepository } from "../audit/repository.js";
10
11
  const TRINITY_BASE_DESCRIPTION = `Delegate a database task to Trinity, the specialized database subagent, asynchronously.
11
12
 
12
13
  This tool enqueues a background task and returns an acknowledgement with task id.
@@ -71,7 +72,21 @@ export const TrinityDelegateTool = tool(async ({ task, context }) => {
71
72
  source: 'TrinityDelegateTool',
72
73
  level: 'info',
73
74
  });
74
- return result;
75
+ if (result.usage) {
76
+ AuditRepository.getInstance().insert({
77
+ session_id: sessionId,
78
+ event_type: 'llm_call',
79
+ agent: 'trinity',
80
+ provider: result.usage.provider,
81
+ model: result.usage.model,
82
+ input_tokens: result.usage.inputTokens,
83
+ output_tokens: result.usage.outputTokens,
84
+ duration_ms: result.usage.durationMs,
85
+ status: 'success',
86
+ metadata: { step_count: result.usage.stepCount, mode: 'sync' },
87
+ });
88
+ }
89
+ return result.output;
75
90
  }
76
91
  catch (syncErr) {
77
92
  // Still count as sync delegation so Oracle passes through the error message
@@ -210,31 +210,46 @@ ${context ? `CONTEXT FROM ORACLE:\n${context}` : ''}
210
210
  const userMessage = new HumanMessage(task);
211
211
  const messages = [systemMessage, userMessage];
212
212
  try {
213
+ const startMs = Date.now();
213
214
  const response = await this.agent.invoke({ messages });
215
+ const durationMs = Date.now() - startMs;
214
216
  const lastMessage = response.messages[response.messages.length - 1];
215
217
  const content = typeof lastMessage.content === 'string'
216
218
  ? lastMessage.content
217
219
  : JSON.stringify(lastMessage.content);
220
+ const rawUsage = lastMessage.usage_metadata
221
+ ?? lastMessage.response_metadata?.usage
222
+ ?? lastMessage.response_metadata?.tokenUsage
223
+ ?? lastMessage.usage;
224
+ const inputTokens = rawUsage?.input_tokens ?? 0;
225
+ const outputTokens = rawUsage?.output_tokens ?? 0;
226
+ const stepCount = response.messages.filter((m) => m instanceof AIMessage).length;
218
227
  const targetSession = sessionId ?? Trinity.currentSessionId ?? 'trinity';
219
228
  const history = new SQLiteChatMessageHistory({ sessionId: targetSession });
220
229
  try {
221
230
  const persisted = new AIMessage(content);
222
- persisted.usage_metadata =
223
- lastMessage.usage_metadata ??
224
- lastMessage.response_metadata?.usage ??
225
- lastMessage.response_metadata?.tokenUsage ??
226
- lastMessage.usage;
227
- persisted.provider_metadata = {
228
- provider: trinityConfig.provider,
229
- model: trinityConfig.model,
230
- };
231
+ if (rawUsage)
232
+ persisted.usage_metadata = rawUsage;
233
+ persisted.provider_metadata = { provider: trinityConfig.provider, model: trinityConfig.model };
234
+ persisted.agent_metadata = { agent: 'trinity' };
235
+ persisted.duration_ms = durationMs;
231
236
  await history.addMessage(persisted);
232
237
  }
233
238
  finally {
234
239
  history.close();
235
240
  }
236
241
  this.display.log('Trinity task completed.', { source: 'Trinity' });
237
- return content;
242
+ return {
243
+ output: content,
244
+ usage: {
245
+ provider: trinityConfig.provider,
246
+ model: trinityConfig.model,
247
+ inputTokens,
248
+ outputTokens,
249
+ durationMs,
250
+ stepCount,
251
+ },
252
+ };
238
253
  }
239
254
  catch (err) {
240
255
  throw new ProviderError(trinityConfig.provider, err, 'Trinity task execution failed');