@ouro.bot/cli 0.1.0-alpha.681 → 0.1.0-alpha.682

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,12 @@
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.682",
6
+ "changes": [
7
+ "Buffer private-runtime IPC messages during credential bootstrap so external event wakes are not lost, with coverage for filters and child-process-only disconnect behavior."
8
+ ]
9
+ },
4
10
  {
5
11
  "version": "0.1.0-alpha.681",
6
12
  "changes": [
@@ -45,6 +45,51 @@ if (!agentName) {
45
45
  const cli_logging_1 = require("../nerves/cli-logging");
46
46
  const runtime_1 = require("../nerves/runtime");
47
47
  (0, cli_logging_1.configureCliRuntimeLogger)("self");
48
+ const ipcStateKey = Symbol.for("ouro.agentEntry.ipcState");
49
+ const ipcState = (globalThis[ipcStateKey] ??= {
50
+ bufferedMessages: [],
51
+ installed: false,
52
+ workerMessageHandler: null,
53
+ });
54
+ ipcState.bufferedMessages = [];
55
+ ipcState.workerMessageHandler = null;
56
+ function isRuntimeCredentialBootstrapMessage(message) {
57
+ return !!message
58
+ && typeof message === "object"
59
+ && !Array.isArray(message)
60
+ && message.type === "ouro.runtimeCredentialBootstrap";
61
+ }
62
+ function isPrivateRuntimeWorkMessage(message) {
63
+ if (!message || typeof message !== "object" || Array.isArray(message))
64
+ return false;
65
+ const type = message.type;
66
+ return type === "heartbeat"
67
+ || type === "habit"
68
+ || type === "await"
69
+ || type === "shutdown"
70
+ || type === "poke"
71
+ || type === "chat"
72
+ || type === "message";
73
+ }
74
+ function forwardOrBufferRuntimeMessage(message) {
75
+ if (isRuntimeCredentialBootstrapMessage(message))
76
+ return;
77
+ if (!isPrivateRuntimeWorkMessage(message))
78
+ return;
79
+ if (ipcState.workerMessageHandler) {
80
+ ipcState.workerMessageHandler(message);
81
+ return;
82
+ }
83
+ ipcState.bufferedMessages.push(message);
84
+ }
85
+ if (!ipcState.installed) {
86
+ process.on("message", forwardOrBufferRuntimeMessage);
87
+ /* v8 ignore next 3 -- child-process disconnect exits the live worker; default worker listener covers this behavior in process-listener tests @preserve */
88
+ process.on("disconnect", () => {
89
+ process.exit(0);
90
+ });
91
+ ipcState.installed = true;
92
+ }
48
93
  (0, runtime_1.emitNervesEvent)({
49
94
  component: "senses",
50
95
  event: "senses.entry_boot",
@@ -67,7 +112,18 @@ Promise.resolve().then(() => __importStar(require("./runtime-credentials"))).the
67
112
  .catch(() => undefined);
68
113
  }
69
114
  const { startPrivateRuntimeWorker } = await Promise.resolve().then(() => __importStar(require("../senses/private-runtime-worker")));
70
- await startPrivateRuntimeWorker();
115
+ const bufferedMessages = ipcState.bufferedMessages.splice(0);
116
+ const worker = await startPrivateRuntimeWorker({
117
+ attachProcessListeners: false,
118
+ bufferedMessages,
119
+ });
120
+ ipcState.workerMessageHandler = (message) => {
121
+ void worker.handleMessage(message);
122
+ };
123
+ const messagesBufferedDuringStart = ipcState.bufferedMessages.splice(0);
124
+ for (const message of messagesBufferedDuringStart) {
125
+ ipcState.workerMessageHandler(message);
126
+ }
71
127
  })
72
128
  .catch((error) => {
73
129
  (0, runtime_1.emitNervesEvent)({
@@ -567,12 +567,18 @@ function createPrivateRuntimeWorker(runTurn = (options) => (0, private_runtime_1
567
567
  }
568
568
  return { run, handleMessage };
569
569
  }
570
- async function startPrivateRuntimeWorker() {
570
+ async function startPrivateRuntimeWorker(options = {}) {
571
571
  const worker = createPrivateRuntimeWorker();
572
- process.on("message", (message) => {
572
+ if (options.attachProcessListeners ?? true) {
573
+ process.on("message", (message) => {
574
+ void worker.handleMessage(message);
575
+ });
576
+ process.on("disconnect", () => {
577
+ process.exit(0);
578
+ });
579
+ }
580
+ for (const message of options.bufferedMessages ?? []) {
573
581
  void worker.handleMessage(message);
574
- });
575
- process.on("disconnect", () => {
576
- process.exit(0);
577
- });
582
+ }
583
+ return worker;
578
584
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.681",
3
+ "version": "0.1.0-alpha.682",
4
4
  "main": "dist/heart/daemon/ouro-entry.js",
5
5
  "bin": {
6
6
  "cli": "dist/heart/daemon/ouro-bot-entry.js",