@ouro.bot/cli 0.1.0-alpha.789 → 0.1.0-alpha.790

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.790",
6
+ "changes": [
7
+ "Bind explicit operator CLI private wakes to their queued daemon message payload so private-runtime turns see the text that woke them.",
8
+ "Add non-destructive daemon inbox peeking for receipt-bound wake routing while preserving queue-only background message delivery.",
9
+ "Keep unreceipted or unmatched operator wakes from fabricating private pending work."
10
+ ]
11
+ },
4
12
  {
5
13
  "version": "0.1.0-alpha.789",
6
14
  "changes": [
@@ -1,5 +1,5 @@
1
1
  {
2
- "runtimeVersion": "0.1.0-alpha.789",
2
+ "runtimeVersion": "0.1.0-alpha.790",
3
3
  "bundleSchemaVersion": 3,
4
4
  "lastUpdated": "2026-09-03T00:00:00.000Z"
5
5
  }
@@ -1,7 +1,7 @@
1
1
  <?xml version="1.0"?>
2
2
  <Container version="2">
3
3
  <Name>Mendelow Cloud Butler</Name>
4
- <Repository>ghcr.io/ourostack/ouroboros-butler:0.1.0-alpha.789</Repository>
4
+ <Repository>ghcr.io/ourostack/ouroboros-butler:0.1.0-alpha.790</Repository>
5
5
  <Registry>https://github.com/ourostack/ouroboros/pkgs/container/ouroboros-butler</Registry>
6
6
  <Network>host</Network>
7
7
  <Shell>sh</Shell>
@@ -1509,6 +1509,27 @@ class OuroDaemon {
1509
1509
  }
1510
1510
  return { type: "message", privateTurnDecision: decision, ...(externalEvent ? { externalEvent } : {}) };
1511
1511
  }
1512
+ queueOperatorCliMessageForPrivateRuntime(command) {
1513
+ if (command.kind !== "private.wake" || command.triggerSource !== "operator-cli")
1514
+ return;
1515
+ const receiptId = command.originRefs?.find((ref) => ref.kind === "daemon-receipt")?.id;
1516
+ if (!receiptId)
1517
+ return;
1518
+ const messages = this.router.peekInbox?.(command.agent) ?? [];
1519
+ const routed = messages.find((message) => message.id === receiptId);
1520
+ if (!routed)
1521
+ return;
1522
+ const pendingDir = path.join(this.bundlesRoot, `${command.agent}.ouro`, "state", "pending", pending_1.PRIVATE_RUNTIME_PENDING.friendId, pending_1.PRIVATE_RUNTIME_PENDING.channel, pending_1.PRIVATE_RUNTIME_PENDING.key);
1523
+ const queuedAtMs = Date.parse(routed.queuedAt);
1524
+ (0, pending_1.queuePendingMessageOnce)(pendingDir, {
1525
+ from: routed.from,
1526
+ content: routed.content,
1527
+ timestamp: Number.isFinite(queuedAtMs) ? queuedAtMs : Date.now(),
1528
+ mode: "relay",
1529
+ requestId: routed.id,
1530
+ packetId: `operator-cli:${command.agent}:${routed.id}`,
1531
+ });
1532
+ }
1512
1533
  queueExternalEventForPrivateRuntime(record, quiet = false) {
1513
1534
  const pendingDir = path.join(this.bundlesRoot, `${record.agent}.ouro`, "state", "pending", pending_1.PRIVATE_RUNTIME_PENDING.friendId, pending_1.PRIVATE_RUNTIME_PENDING.channel, pending_1.PRIVATE_RUNTIME_PENDING.key);
1514
1535
  const originKey = `${record.source}:${record.eventId}`;
@@ -1804,6 +1825,7 @@ class OuroDaemon {
1804
1825
  data: { decision },
1805
1826
  };
1806
1827
  }
1828
+ this.queueOperatorCliMessageForPrivateRuntime(command);
1807
1829
  await beforeDispatch?.(decision);
1808
1830
  await this.processManager.startAgent(command.agent);
1809
1831
  const message = this.buildPrivateRuntimeWorkerWakeMessage(command, decision, externalEvent);
@@ -111,6 +111,26 @@ class FileMessageRouter {
111
111
  });
112
112
  return messages;
113
113
  }
114
+ peekInbox(agent) {
115
+ const inboxPath = this.inboxPath(agent);
116
+ if (!fs.existsSync(inboxPath))
117
+ return [];
118
+ const messages = [];
119
+ const raw = fs.readFileSync(inboxPath, "utf-8");
120
+ for (const line of raw.split("\n")) {
121
+ const trimmed = line.trim();
122
+ if (!trimmed)
123
+ continue;
124
+ try {
125
+ messages.push(JSON.parse(trimmed));
126
+ }
127
+ catch {
128
+ // Preserve pollInbox semantics: malformed lines stay untouched and
129
+ // invisible to callers that need valid routed messages.
130
+ }
131
+ }
132
+ return messages;
133
+ }
114
134
  inboxPath(agent) {
115
135
  return path.join(this.baseDir, `${agent}-inbox.jsonl`);
116
136
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.789",
3
+ "version": "0.1.0-alpha.790",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@ouro.bot/cli",
9
- "version": "0.1.0-alpha.789",
9
+ "version": "0.1.0-alpha.790",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.78.0",
12
12
  "@azure/identity": "^4.13.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.789",
3
+ "version": "0.1.0-alpha.790",
4
4
  "engines": {
5
5
  "node": ">=22"
6
6
  },