@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 +8 -0
- package/dist/heart/session-events.js +41 -0
- package/dist/mind/context.js +1 -1
- package/dist/mind/prompt.js +13 -2
- package/package.json +1 -1
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
|
}
|
package/dist/mind/context.js
CHANGED
|
@@ -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),
|
package/dist/mind/prompt.js
CHANGED
|
@@ -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
|
|
457
|
-
|
|
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);
|