@ouro.bot/cli 0.1.0-alpha.316 → 0.1.0-alpha.318

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.
@@ -130,9 +130,15 @@ const router = new message_router_1.FileMessageRouter();
130
130
  const senseManager = new sense_manager_1.DaemonSenseManager({
131
131
  agents: [...managedAgents],
132
132
  });
133
- /* v8 ignore next 2 -- entry-point wiring: probe factory and HealthMonitor both have full unit tests @preserve */
134
- const bbChannelConfig = (0, config_1.getBlueBubblesChannelConfig)();
135
- const bbProbe = (0, http_health_probe_1.createHttpHealthProbe)("bluebubbles", bbChannelConfig.port);
133
+ /* v8 ignore next 5 -- entry-point wiring: probe factory and HealthMonitor both have full unit tests @preserve */
134
+ let bbPort = 18790;
135
+ try {
136
+ bbPort = (0, config_1.getBlueBubblesChannelConfig)().port;
137
+ }
138
+ catch {
139
+ // Daemon runs without --agent; agent-scoped config may not be available.
140
+ }
141
+ const bbProbe = (0, http_health_probe_1.createHttpHealthProbe)("bluebubbles", bbPort);
136
142
  const healthMonitor = new health_monitor_1.HealthMonitor({
137
143
  processManager,
138
144
  scheduler,
@@ -39,6 +39,7 @@ exports.repairSessionMessages = repairSessionMessages;
39
39
  exports.migrateToolNames = migrateToolNames;
40
40
  exports.sanitizeProviderMessages = sanitizeProviderMessages;
41
41
  exports.projectProviderMessages = projectProviderMessages;
42
+ exports.annotateMessageTimestamps = annotateMessageTimestamps;
42
43
  exports.bestEventTimestamp = bestEventTimestamp;
43
44
  exports.formatSessionEventTimestamp = formatSessionEventTimestamp;
44
45
  exports.extractEventText = extractEventText;
@@ -430,6 +431,46 @@ function projectProviderMessages(envelope) {
430
431
  hadToolCallsField: event.toolCalls.length > 0,
431
432
  }));
432
433
  }
434
+ /**
435
+ * Annotate user and assistant messages with a relative time offset tag.
436
+ * System and tool messages are untouched.
437
+ */
438
+ function annotateMessageTimestamps(envelope, messages, nowMs = Date.now()) {
439
+ const eventIds = envelope.projection.eventIds.length > 0
440
+ ? envelope.projection.eventIds
441
+ : envelope.events.map((event) => event.id);
442
+ const byId = new Map(envelope.events.map((event) => [event.id, event]));
443
+ const events = eventIds
444
+ .map((id) => byId.get(id))
445
+ .filter((event) => Boolean(event));
446
+ return messages.map((msg, i) => {
447
+ const event = events[i];
448
+ if (!event)
449
+ return msg;
450
+ if (event.role !== "user" && event.role !== "assistant")
451
+ return msg;
452
+ const ts = bestEventTimestamp(event);
453
+ const elapsed = nowMs - Date.parse(ts);
454
+ if (elapsed < 0)
455
+ return msg;
456
+ const tag = elapsed < 60000 ? "[just now]" : `[-${formatElapsedCompact(elapsed)}]`;
457
+ if (typeof msg.content === "string" && msg.content.length > 0) {
458
+ return { ...msg, content: `${tag} ${msg.content}` };
459
+ }
460
+ return msg;
461
+ });
462
+ }
463
+ /** Compact elapsed format for message annotations: "3m", "2h", "1d". */
464
+ function formatElapsedCompact(ms) {
465
+ const minutes = Math.max(1, Math.floor(ms / 60000));
466
+ if (minutes < 60)
467
+ return `${minutes}m`;
468
+ const hours = Math.floor(minutes / 60);
469
+ if (hours < 24)
470
+ return `${hours}h`;
471
+ const days = Math.floor(hours / 24);
472
+ return `${days}d`;
473
+ }
433
474
  function bestEventTimestamp(event) {
434
475
  return event.time.authoredAt ?? event.time.observedAt ?? event.time.recordedAt;
435
476
  }
@@ -237,7 +237,7 @@ function loadSession(filePath) {
237
237
  if (!envelope)
238
238
  return null;
239
239
  return {
240
- messages: (0, session_events_1.projectProviderMessages)(envelope),
240
+ messages: (0, session_events_1.annotateMessageTimestamps)(envelope, (0, session_events_1.projectProviderMessages)(envelope)),
241
241
  events: envelope.events,
242
242
  lastUsage: envelope.lastUsage ?? undefined,
243
243
  state: denormalizeContinuityState(envelope.state),
@@ -453,8 +453,20 @@ function providerSection(channel) {
453
453
  return `## my provider\n${(0, core_1.getProviderDisplayLabel)((0, channel_1.channelToFacing)(channel))}`;
454
454
  }
455
455
  function dateSection() {
456
- const today = new Date().toISOString().slice(0, 10);
457
- return `current date: ${today}`;
456
+ const now = new Date();
457
+ const fmt = new Intl.DateTimeFormat("en-US", {
458
+ year: "numeric",
459
+ month: "2-digit",
460
+ day: "2-digit",
461
+ hour: "2-digit",
462
+ minute: "2-digit",
463
+ hour12: false,
464
+ timeZoneName: "short",
465
+ });
466
+ const parts = Object.fromEntries(fmt.formatToParts(now).map((p) => [p.type, p.value]));
467
+ /* v8 ignore next -- Intl hour-24 bug only triggers at midnight @preserve */
468
+ const hour = parts.hour === "24" ? "00" : parts.hour;
469
+ return `current date and time: ${parts.year}-${parts.month}-${parts.day} ${hour}:${parts.minute} ${parts.timeZoneName}`;
458
470
  }
459
471
  function toolsSection(channel, options, context) {
460
472
  const channelTools = (0, tools_1.getToolsForChannel)((0, channel_1.getChannelCapabilities)(channel), undefined, context, options?.providerCapabilities, undefined, options?.chatModel);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.316",
3
+ "version": "0.1.0-alpha.318",
4
4
  "main": "dist/heart/daemon/ouro-entry.js",
5
5
  "bin": {
6
6
  "cli": "dist/heart/daemon/ouro-bot-entry.js",