@ouro.bot/cli 0.1.0-alpha.233 → 0.1.0-alpha.234

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.234",
6
+ "changes": [
7
+ "fix(mcp): add retry logic for senseTurn daemon routing — retries on ECONNREFUSED, ENOENT, and empty response with exponential backoff (1s, 2s, 4s)"
8
+ ]
9
+ },
4
10
  {
5
11
  "version": "0.1.0-alpha.233",
6
12
  "changes": [
@@ -33,6 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports._senseTurnRetryDelays = exports.SENSE_TURN_RETRY_DELAYS_MS = exports.SENSE_TURN_MAX_RETRIES = void 0;
37
+ exports._setSenseTurnRetryDelays = _setSenseTurnRetryDelays;
36
38
  exports.createMcpServer = createMcpServer;
37
39
  exports.getToolSchemas = getToolSchemas;
38
40
  const socket_client_1 = require("../daemon/socket-client");
@@ -40,6 +42,47 @@ const agentService = __importStar(require("../daemon/agent-service"));
40
42
  const runtime_1 = require("../../nerves/runtime");
41
43
  const session_id_resolver_1 = require("../daemon/session-id-resolver");
42
44
  const pending_1 = require("../../mind/pending");
45
+ exports.SENSE_TURN_MAX_RETRIES = 3;
46
+ exports.SENSE_TURN_RETRY_DELAYS_MS = [1000, 2000, 4000];
47
+ // Allow test override
48
+ exports._senseTurnRetryDelays = exports.SENSE_TURN_RETRY_DELAYS_MS;
49
+ function _setSenseTurnRetryDelays(delays) { exports._senseTurnRetryDelays = delays; }
50
+ /**
51
+ * Send a senseTurn command to the daemon with retry logic.
52
+ * Retries on transient failures: empty response (daemon mid-restart),
53
+ * ECONNREFUSED (daemon not yet listening), ENOENT (socket not yet created).
54
+ */
55
+ async function sendSenseTurnWithRetry(socketPath, command) {
56
+ let lastError = null;
57
+ /* v8 ignore start -- retry loop: functionally tested via mcp-send-message retry tests @preserve */
58
+ for (let attempt = 0; attempt <= exports.SENSE_TURN_MAX_RETRIES; attempt++) {
59
+ try {
60
+ const response = await (0, socket_client_1.sendDaemonCommand)(socketPath, command);
61
+ return response;
62
+ }
63
+ catch (error) {
64
+ lastError = error instanceof Error ? error : new Error(String(error));
65
+ const msg = lastError.message;
66
+ const isTransient = msg.includes("ECONNREFUSED")
67
+ || msg.includes("ENOENT")
68
+ || msg.includes("empty response")
69
+ || msg.includes("Empty response");
70
+ if (!isTransient || attempt >= exports.SENSE_TURN_MAX_RETRIES) {
71
+ throw lastError;
72
+ }
73
+ const delay = exports._senseTurnRetryDelays[attempt] ?? 4000;
74
+ (0, runtime_1.emitNervesEvent)({
75
+ component: "daemon",
76
+ event: "daemon.mcp_sense_turn_retry",
77
+ message: `senseTurn attempt ${attempt + 1} failed, retrying in ${delay}ms`,
78
+ meta: { attempt: attempt + 1, error: msg, delay },
79
+ });
80
+ await new Promise((resolve) => setTimeout(resolve, delay));
81
+ }
82
+ }
83
+ throw lastError ?? new Error("senseTurn failed after retries");
84
+ /* v8 ignore stop */
85
+ }
43
86
  /**
44
87
  * Maps MCP tool names to daemon command kinds.
45
88
  */
@@ -248,7 +291,7 @@ function createMcpServer(options) {
248
291
  const message = toolArgs.message ?? "";
249
292
  /* v8 ignore stop */
250
293
  try {
251
- const response = await (0, socket_client_1.sendDaemonCommand)(socketPath, {
294
+ const response = await sendSenseTurnWithRetry(socketPath, {
252
295
  kind: "agent.senseTurn",
253
296
  agent,
254
297
  friendId,
@@ -322,7 +365,7 @@ function createMcpServer(options) {
322
365
  const context = toolArgs.context;
323
366
  const delegateMessage = context ? `[delegate] ${task}\n\ncontext: ${context}` : `[delegate] ${task}`;
324
367
  try {
325
- const response = await (0, socket_client_1.sendDaemonCommand)(socketPath, {
368
+ const response = await sendSenseTurnWithRetry(socketPath, {
326
369
  kind: "agent.senseTurn",
327
370
  agent,
328
371
  friendId,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.233",
3
+ "version": "0.1.0-alpha.234",
4
4
  "main": "dist/heart/daemon/ouro-entry.js",
5
5
  "bin": {
6
6
  "cli": "dist/heart/daemon/ouro-bot-entry.js",