@ouro.bot/cli 0.1.0-alpha.317 → 0.1.0-alpha.319
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 +194 -181
- package/dist/heart/daemon/daemon-entry.js +9 -3
- package/dist/heart/session-events.js +17 -5
- package/dist/mind/prompt.js +4 -3
- package/dist/senses/cli.js +4 -1
- package/dist/senses/pipeline.js +1 -0
- package/dist/senses/shared-turn.js +4 -1
- package/package.json +1 -1
|
@@ -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
|
|
134
|
-
|
|
135
|
-
|
|
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,
|
|
@@ -38,6 +38,8 @@ exports.validateSessionMessages = validateSessionMessages;
|
|
|
38
38
|
exports.repairSessionMessages = repairSessionMessages;
|
|
39
39
|
exports.migrateToolNames = migrateToolNames;
|
|
40
40
|
exports.sanitizeProviderMessages = sanitizeProviderMessages;
|
|
41
|
+
exports.stampIngressTime = stampIngressTime;
|
|
42
|
+
exports.getIngressTime = getIngressTime;
|
|
41
43
|
exports.projectProviderMessages = projectProviderMessages;
|
|
42
44
|
exports.annotateMessageTimestamps = annotateMessageTimestamps;
|
|
43
45
|
exports.bestEventTimestamp = bestEventTimestamp;
|
|
@@ -356,7 +358,14 @@ function sanitizeProviderMessages(messages) {
|
|
|
356
358
|
}
|
|
357
359
|
return migrateToolNames(stripOrphanedToolResults(repairSessionMessages(normalized.map(toProviderMessage))));
|
|
358
360
|
}
|
|
359
|
-
function
|
|
361
|
+
function stampIngressTime(msg) {
|
|
362
|
+
msg._ingressAt = new Date().toISOString();
|
|
363
|
+
}
|
|
364
|
+
function getIngressTime(msg) {
|
|
365
|
+
const value = msg._ingressAt;
|
|
366
|
+
return typeof value === "string" ? value : null;
|
|
367
|
+
}
|
|
368
|
+
function createEventTime(role, recordedAt, captureKind, ingressAt) {
|
|
360
369
|
if (captureKind === "migration") {
|
|
361
370
|
return {
|
|
362
371
|
authoredAt: null,
|
|
@@ -371,7 +380,7 @@ function createEventTime(role, recordedAt, captureKind) {
|
|
|
371
380
|
return {
|
|
372
381
|
authoredAt: null,
|
|
373
382
|
authoredAtSource: "unknown",
|
|
374
|
-
observedAt: recordedAt,
|
|
383
|
+
observedAt: ingressAt ?? recordedAt,
|
|
375
384
|
observedAtSource: "ingest",
|
|
376
385
|
recordedAt,
|
|
377
386
|
recordedAtSource: "save",
|
|
@@ -386,7 +395,7 @@ function createEventTime(role, recordedAt, captureKind) {
|
|
|
386
395
|
recordedAtSource: "save",
|
|
387
396
|
};
|
|
388
397
|
}
|
|
389
|
-
function buildEventFromMessage(message, sequence, recordedAt, captureKind, sourceMessageIndex, legacyVersion) {
|
|
398
|
+
function buildEventFromMessage(message, sequence, recordedAt, captureKind, sourceMessageIndex, legacyVersion, ingressAt) {
|
|
390
399
|
const normalized = normalizeMessage(message);
|
|
391
400
|
const role = normalized.role;
|
|
392
401
|
return {
|
|
@@ -398,7 +407,7 @@ function buildEventFromMessage(message, sequence, recordedAt, captureKind, sourc
|
|
|
398
407
|
toolCallId: role === "tool" ? normalized.toolCallId : null,
|
|
399
408
|
toolCalls: role === "assistant" ? normalized.toolCalls : [],
|
|
400
409
|
attachments: [],
|
|
401
|
-
time: createEventTime(role, recordedAt, captureKind),
|
|
410
|
+
time: createEventTime(role, recordedAt, captureKind, ingressAt),
|
|
402
411
|
relations: {
|
|
403
412
|
replyToEventId: null,
|
|
404
413
|
threadRootEventId: null,
|
|
@@ -666,6 +675,8 @@ function selectProjectedEventIds(currentMessages, currentEventIds, trimmedMessag
|
|
|
666
675
|
}
|
|
667
676
|
function buildCanonicalSessionEnvelope(options) {
|
|
668
677
|
const existing = options.existing;
|
|
678
|
+
// Capture ingress timestamps before sanitization strips extra properties
|
|
679
|
+
const currentIngressTimes = options.currentMessages.map(getIngressTime);
|
|
669
680
|
const previousMessages = sanitizeProviderMessages(options.previousMessages);
|
|
670
681
|
const currentMessages = sanitizeProviderMessages(options.currentMessages);
|
|
671
682
|
const trimmedMessages = sanitizeProviderMessages(options.trimmedMessages);
|
|
@@ -675,8 +686,9 @@ function buildCanonicalSessionEnvelope(options) {
|
|
|
675
686
|
const commonPrefix = findCommonPrefixLength(previousMessages, currentMessages);
|
|
676
687
|
const appendFrom = previousMessages.length === commonPrefix ? previousMessages.length : commonPrefix;
|
|
677
688
|
const newMessages = currentMessages.slice(appendFrom);
|
|
689
|
+
const newIngressTimes = currentIngressTimes.slice(appendFrom);
|
|
678
690
|
const baseSequence = existing?.events.length ?? 0;
|
|
679
|
-
const newEvents = newMessages.map((message, index) => buildEventFromMessage(message, baseSequence + index + 1, options.recordedAt, "live", null, null));
|
|
691
|
+
const newEvents = newMessages.map((message, index) => buildEventFromMessage(message, baseSequence + index + 1, options.recordedAt, "live", null, null, newIngressTimes[index]));
|
|
680
692
|
const events = [...(existing?.events ?? []), ...newEvents];
|
|
681
693
|
const currentEventIds = [
|
|
682
694
|
...previousProjectionIds.slice(0, appendFrom),
|
package/dist/mind/prompt.js
CHANGED
|
@@ -455,17 +455,18 @@ function providerSection(channel) {
|
|
|
455
455
|
function dateSection() {
|
|
456
456
|
const now = new Date();
|
|
457
457
|
const fmt = new Intl.DateTimeFormat("en-US", {
|
|
458
|
-
timeZone: "America/Los_Angeles",
|
|
459
458
|
year: "numeric",
|
|
460
459
|
month: "2-digit",
|
|
461
460
|
day: "2-digit",
|
|
462
461
|
hour: "2-digit",
|
|
463
462
|
minute: "2-digit",
|
|
464
463
|
hour12: false,
|
|
464
|
+
timeZoneName: "short",
|
|
465
465
|
});
|
|
466
466
|
const parts = Object.fromEntries(fmt.formatToParts(now).map((p) => [p.type, p.value]));
|
|
467
|
-
|
|
468
|
-
|
|
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}`;
|
|
469
470
|
}
|
|
470
471
|
function toolsSection(channel, options, context) {
|
|
471
472
|
const channelTools = (0, tools_1.getToolsForChannel)((0, channel_1.getChannelCapabilities)(channel), undefined, context, options?.providerCapabilities, undefined, options?.chatModel);
|
package/dist/senses/cli.js
CHANGED
|
@@ -56,6 +56,7 @@ const prompt_1 = require("../mind/prompt");
|
|
|
56
56
|
const phrases_1 = require("../mind/phrases");
|
|
57
57
|
const format_1 = require("../mind/format");
|
|
58
58
|
const config_1 = require("../heart/config");
|
|
59
|
+
const session_events_1 = require("../heart/session-events");
|
|
59
60
|
const context_1 = require("../mind/context");
|
|
60
61
|
const pending_1 = require("../mind/pending");
|
|
61
62
|
const commands_1 = require("./commands");
|
|
@@ -857,7 +858,9 @@ async function runCliSession(options) {
|
|
|
857
858
|
const userContent = contentParts
|
|
858
859
|
? contentParts
|
|
859
860
|
: (prefix ? `${prefix}\n\n${input}` : input);
|
|
860
|
-
|
|
861
|
+
const userMsg = { role: "user", content: userContent };
|
|
862
|
+
(0, session_events_1.stampIngressTime)(userMsg);
|
|
863
|
+
messages.push(userMsg);
|
|
861
864
|
const traceId = (0, nerves_1.createTraceId)();
|
|
862
865
|
result = await (0, core_1.runAgent)(messages, cliCallbacks, options.skipSystemPromptRefresh ? undefined : "cli", currentAbort.signal, {
|
|
863
866
|
toolChoiceRequired: getEffectiveToolChoiceRequired(),
|
package/dist/senses/pipeline.js
CHANGED
|
@@ -353,6 +353,7 @@ async function handleInboundTurn(input) {
|
|
|
353
353
|
}
|
|
354
354
|
// Append user messages from the inbound turn
|
|
355
355
|
for (const msg of input.messages) {
|
|
356
|
+
(0, session_events_1.stampIngressTime)(msg);
|
|
356
357
|
sessionMessages.push(msg);
|
|
357
358
|
}
|
|
358
359
|
// Step 4b: Continuity pipeline — derive tempo, build start-of-turn packet, snapshot obligations
|
|
@@ -45,6 +45,7 @@ const path = __importStar(require("path"));
|
|
|
45
45
|
const core_1 = require("../heart/core");
|
|
46
46
|
const identity_1 = require("../heart/identity");
|
|
47
47
|
const config_1 = require("../heart/config");
|
|
48
|
+
const session_events_1 = require("../heart/session-events");
|
|
48
49
|
const context_1 = require("../mind/context");
|
|
49
50
|
const prompt_1 = require("../mind/prompt");
|
|
50
51
|
const channel_1 = require("../mind/friends/channel");
|
|
@@ -127,11 +128,13 @@ async function runSenseTurn(options) {
|
|
|
127
128
|
};
|
|
128
129
|
/* v8 ignore stop */
|
|
129
130
|
// Run the pipeline
|
|
131
|
+
const userMsg = { role: "user", content: userMessage };
|
|
132
|
+
(0, session_events_1.stampIngressTime)(userMsg);
|
|
130
133
|
await (0, pipeline_1.handleInboundTurn)({
|
|
131
134
|
channel,
|
|
132
135
|
sessionKey,
|
|
133
136
|
capabilities,
|
|
134
|
-
messages: [
|
|
137
|
+
messages: [userMsg],
|
|
135
138
|
callbacks,
|
|
136
139
|
/* v8 ignore start — delegation wrappers; pipeline integration tested separately */
|
|
137
140
|
friendResolver: { resolve: () => resolver.resolve() },
|