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

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.
package/changelog.json CHANGED
@@ -1,6 +1,14 @@
1
1
  {
2
2
  "_note": "This changelog is maintained as part of the PR/version-bump workflow. Agent-curated, not auto-generated. Agents read this file directly via read_file to understand what changed between versions.",
3
3
  "versions": [
4
+ {
5
+ "version": "0.1.0-alpha.317",
6
+ "changes": [
7
+ "feat(mind): annotate conversation messages with relative timestamps. Messages now include human-readable time deltas (e.g., '2 hours ago') in prompt context, giving the model temporal awareness of conversation flow.",
8
+ "fix(tui): handle Opt+Enter newline when terminal sends \\x1b\\r as a single event instead of two separate bytes.",
9
+ "fix(ci): resolve @testing-library/react peer dependency conflicts and add jsdom to root devDependencies for outlook-ui test environment."
10
+ ]
11
+ },
4
12
  {
5
13
  "version": "0.1.0-alpha.316",
6
14
  "changes": [
@@ -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,19 @@ 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
+ timeZone: "America/Los_Angeles",
459
+ year: "numeric",
460
+ month: "2-digit",
461
+ day: "2-digit",
462
+ hour: "2-digit",
463
+ minute: "2-digit",
464
+ hour12: false,
465
+ });
466
+ const parts = Object.fromEntries(fmt.formatToParts(now).map((p) => [p.type, p.value]));
467
+ const pacific = `${parts.year}-${parts.month}-${parts.day} ${parts.hour}:${parts.minute} PT`;
468
+ return `current date and time: ${pacific}`;
458
469
  }
459
470
  function toolsSection(channel, options, context) {
460
471
  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.317",
4
4
  "main": "dist/heart/daemon/ouro-entry.js",
5
5
  "bin": {
6
6
  "cli": "dist/heart/daemon/ouro-bot-entry.js",