@ouro.bot/cli 0.1.0-alpha.662 → 0.1.0-alpha.664

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,21 @@
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.664",
6
+ "changes": [
7
+ "Coalesce unchanged periodic Arc Sentinel daemon-health receipts so healthy daemons do not keep synced bundles dirty."
8
+ ]
9
+ },
10
+ {
11
+ "version": "0.1.0-alpha.663",
12
+ "changes": [
13
+ "Add deterministic Arc Sentinel recovery receipts, lifecycle refreshes, and Workbench Sentinel history.",
14
+ "Harden Sentinel recovery receipts with canonical POSIX Arc locators, invalid timestamp rejection, inherited blocker provenance, and exact latest-ready recovery after Sentinel-authored blockers.",
15
+ "Make Sentinel's printed `ouro provider check --agent <agent> --lane <lane>` repair command executable, persist non-secret provider readiness under the agent bundle for cross-process recovery, and prefer the freshest exact-matching readiness without mutating orientation-only probes.",
16
+ "Include non-OK generic daemon health results in Sentinel receipts so failures such as crashed managed agents, cron delays, or disk pressure appear in Workbench and start-of-turn recovery context alongside sense health."
17
+ ]
18
+ },
4
19
  {
5
20
  "version": "0.1.0-alpha.662",
6
21
  "changes": [
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.flightRecorderLatestPath = flightRecorderLatestPath;
37
+ exports.isFlightRecorderResume = isFlightRecorderResume;
37
38
  exports.readFlightRecorderResume = readFlightRecorderResume;
38
39
  exports.writeFlightRecorderResume = writeFlightRecorderResume;
39
40
  exports.recordFlightRecorderEvent = recordFlightRecorderEvent;
@@ -123,7 +124,7 @@ function isStringArray(value) {
123
124
  function isNullableString(value) {
124
125
  return value === null || typeof value === "string";
125
126
  }
126
- function isResumeCandidate(value) {
127
+ function isFlightRecorderResume(value) {
127
128
  if (!value || typeof value !== "object" || Array.isArray(value))
128
129
  return false;
129
130
  const record = value;
@@ -217,6 +218,10 @@ function latestFromEvent(event, previous) {
217
218
  const nextSafeActionValue = event.nextSafeAction !== undefined ? event.nextSafeAction : previous.nextSafeAction.value;
218
219
  const currentAskSourceEventIds = event.currentAsk !== undefined ? [event.id] : previous.currentAsk.sourceEventIds;
219
220
  const nextSafeActionSourceEventIds = event.nextSafeAction !== undefined ? [event.id] : previous.nextSafeAction.sourceEventIds;
221
+ const inheritedBlocker = event.blockedBecause === undefined && previous.blockedBecause.length > 0;
222
+ const lastSafeCheckpointEventIds = inheritedBlocker
223
+ ? uniqueStrings([...previous.lastSafeCheckpoint.sourceEventIds, event.id])
224
+ : [event.id];
220
225
  const hasCurrentAsk = typeof currentAskValue === "string" && currentAskValue.trim().length > 0;
221
226
  const hasNextSafeAction = typeof nextSafeActionValue === "string" && nextSafeActionValue.trim().length > 0;
222
227
  return {
@@ -248,7 +253,7 @@ function latestFromEvent(event, previous) {
248
253
  turnId: event.turnId ?? previous.lastSafeCheckpoint.turnId,
249
254
  sessionRef: event.sessionRef ?? previous.lastSafeCheckpoint.sessionRef,
250
255
  recordedAt: event.recordedAt,
251
- sourceEventIds: [event.id],
256
+ sourceEventIds: lastSafeCheckpointEventIds,
252
257
  },
253
258
  recorderHealth: { status: "ok", issues: [] },
254
259
  };
@@ -257,7 +262,7 @@ function readFlightRecorderResume(agentRoot) {
257
262
  const latestPath = flightRecorderLatestPath(agentRoot);
258
263
  try {
259
264
  const parsed = JSON.parse(fs.readFileSync(latestPath, "utf-8"));
260
- if (!isResumeCandidate(parsed)) {
265
+ if (!isFlightRecorderResume(parsed)) {
261
266
  throw new Error("latest.json has invalid flight-recorder resume shape");
262
267
  }
263
268
  const resume = normalizeResumeInvariants(parsed);
@@ -282,7 +282,7 @@ function summarize(verdict) {
282
282
  return "blocked: context-loss recovery would lose or mislead the agent";
283
283
  }
284
284
  function runContextLossGauntlet(agentName, agentRoot, options = {}) {
285
- const flightRecorderResume = (0, flight_recorder_1.readFlightRecorderResume)(agentRoot);
285
+ const flightRecorderResume = options.flightRecorderResume ?? (0, flight_recorder_1.readFlightRecorderResume)(agentRoot);
286
286
  const card = (0, work_card_1.buildWorkCard)(agentName, agentRoot, { ...options, flightRecorderResume });
287
287
  const generatedAt = (options.now ?? (() => new Date()))().toISOString();
288
288
  const checks = [