@essentialai/cogent-plugin 3.15.0 → 3.16.0

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogent",
3
- "version": "3.15.0",
3
+ "version": "3.16.0",
4
4
  "description": "Inter-session communication bridge for Claude Code with Slack integration. Enables CC agents and Slack team members to communicate in real time.",
5
5
  "author": {
6
6
  "name": "Essential AI Solutions",
@@ -26389,8 +26389,8 @@ var init_stdio2 = __esm({
26389
26389
  // src/constants.ts
26390
26390
  import { createRequire } from "node:module";
26391
26391
  function resolveVersion() {
26392
- if ("3.15.0") {
26393
- return "3.15.0";
26392
+ if ("3.16.0") {
26393
+ return "3.16.0";
26394
26394
  }
26395
26395
  try {
26396
26396
  const require2 = createRequire(import.meta.url);
@@ -33080,6 +33080,7 @@ var init_auto_relay = __esm({
33080
33080
  logger.info(`Auto-relay: processing message from ${fromLabel} (${msg.fromPeerId})`);
33081
33081
  const traceId = msg.traceId ?? randomUUID2();
33082
33082
  const startMs = Date.now();
33083
+ let replied = false;
33083
33084
  try {
33084
33085
  const res = await this.refreshSessionId();
33085
33086
  this._trace(traceId, "resolved", {
@@ -33126,6 +33127,7 @@ var init_auto_relay = __esm({
33126
33127
  const durationMs = Date.now() - startMs;
33127
33128
  if (result.exitCode === 0 && result.stdout) {
33128
33129
  await this._relayCapturedReply(msg, result, traceId, durationMs, false);
33130
+ replied = true;
33129
33131
  } else {
33130
33132
  this._trace(traceId, "failed", { exitCode: result.exitCode, sandboxBlocked: result.sandboxBlocked, durationMs });
33131
33133
  logger.warn(
@@ -33142,6 +33144,7 @@ var init_auto_relay = __esm({
33142
33144
  const bypassRetry = await execRemote(cfg.COGENT_PLATFORM, this.localSessionId, formatted, this.localCwd);
33143
33145
  if (bypassRetry.exitCode === 0 && bypassRetry.stdout) {
33144
33146
  await this._relayCapturedReply(msg, bypassRetry, traceId, Date.now() - startMs, true);
33147
+ replied = true;
33145
33148
  return;
33146
33149
  }
33147
33150
  logger.warn(`Auto-relay: sandbox-bypass retry also failed (exit=${bypassRetry.exitCode})`);
@@ -33171,15 +33174,49 @@ var init_auto_relay = __esm({
33171
33174
  const retry = await execRemote(getConfig().COGENT_PLATFORM, this.localSessionId, formatted, this.localCwd);
33172
33175
  if (retry.exitCode === 0 && retry.stdout) {
33173
33176
  await this._relayCapturedReply(msg, retry, traceId, Date.now() - startMs, true);
33177
+ replied = true;
33174
33178
  } else {
33175
33179
  logger.warn(`Auto-relay: retry also failed (exit=${retry.exitCode})`);
33176
33180
  }
33177
33181
  }
33178
33182
  }
33183
+ if (!replied) {
33184
+ await this._recordNoReplyFailure(msg, traceId, Date.now() - startMs);
33185
+ }
33179
33186
  } catch (err) {
33180
33187
  const durationMs = Date.now() - startMs;
33181
33188
  this._trace(traceId, "failed", { threw: true, durationMs });
33182
33189
  logger.error(`Auto-relay: execRemote threw after ${durationMs}ms: ${err}`);
33190
+ if (!replied) {
33191
+ await this._recordNoReplyFailure(msg, traceId, durationMs);
33192
+ }
33193
+ }
33194
+ }
33195
+ /**
33196
+ * Fail-loud (2026-08-11): a wake that captured NO reply — empty stdout, a
33197
+ * non-zero exit with no rotated-session retry, a failed retry, or a thrown
33198
+ * execRemote — used to record NOTHING, so the sender saw response:null with no
33199
+ * error (the invisible failure that hid the demo busy-miss). Record ONE visible
33200
+ * success:false notice to the sender so a human/agent knows to reply manually.
33201
+ * On Codex this pairs with Wake-C (check-on-stop), which auto-recovers the reply
33202
+ * at the next turn boundary. Refusal (AMBIGUOUS_SESSION) and sandbox-blocked
33203
+ * paths record their own failure and return before this, so no double-record.
33204
+ */
33205
+ async _recordNoReplyFailure(msg, traceId, durationMs) {
33206
+ try {
33207
+ await getBackend().recordMessage({
33208
+ fromPeerId: this.localPeerId,
33209
+ toPeerId: msg.fromPeerId,
33210
+ message: `\u26A0\uFE0F Cogent could not capture a reply from "${this.localPeerId}" (it may have been busy, or the resume produced no output). Manual response required \u2014 the target agent must reply in its own session. (trace ${traceId})`,
33211
+ response: null,
33212
+ durationMs,
33213
+ success: false,
33214
+ error: "NO_REPLY_CAPTURED",
33215
+ isRelayEcho: true,
33216
+ traceId
33217
+ });
33218
+ } catch (recordErr) {
33219
+ logger.error(`Auto-relay: failed to record no-reply failure: ${recordErr}`);
33183
33220
  }
33184
33221
  }
33185
33222
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@essentialai/cogent-plugin",
3
- "version": "3.15.0",
3
+ "version": "3.16.0",
4
4
  "description": "Cogent — Claude Code plugin (skills + slash-commands + MCP server) for the cross-agent comms fabric.",
5
5
  "author": { "name": "Essential AI Solutions Ltd.", "url": "https://essentialai.uk" },
6
6
  "homepage": "https://cogent.tools",