pi-roundtable 0.27.0 → 0.27.1

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.md CHANGED
@@ -5,6 +5,13 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.27.1] - 2026-10-31
9
+
10
+ ### Fixed
11
+
12
+ - A reply card Discord refuses (a channel that denies Attach Files) no longer loses the reply: the Discord surface logs a warning and sends the text alone. A card that posts still goes first, as its own message.
13
+ - The shell-policy fuzz runner caps each line at 30 CPU seconds per process (`ulimit -t`), so a busy loop a line leaves behind ends even when the test runner is killed before it can kill the line's process group.
14
+
8
15
  ## [0.27.0] - 2026-10-31
9
16
 
10
17
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-roundtable",
3
- "version": "0.27.0",
3
+ "version": "0.27.1",
4
4
  "description": "A plugin-driven Pi agent server for one owner, reached through Discord or the web",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -297,8 +297,8 @@ export class DiscordSurface
297
297
 
298
298
  /**
299
299
  * Discord draws attachments below a message's text, so the card goes out as its own message
300
- * first and produced files last, each on its own. Replies may mention people but never everyone or a role.
301
- */
300
+ * first and produced files last, each on its own. Replies may mention people but never everyone or a role. A card
301
+ * Discord refuses (a channel without Attach Files) is logged, and the text still goes out. */
302
302
  async sendReply(channel: ChannelKey, reply: OutboundReply): Promise<void> {
303
303
  const target = await this.#sendable(channel);
304
304
  const allowedMentions = { parse: ["users" as const] };
@@ -306,12 +306,14 @@ export class DiscordSurface
306
306
  await target.send({ content: reply.thinking, allowedMentions });
307
307
  }
308
308
  if (reply.card) {
309
- await target.send({
310
- files: [
311
- new AttachmentBuilder(Buffer.from(reply.card), {
312
- name: "card.png",
313
- }),
314
- ],
309
+ const card = new AttachmentBuilder(Buffer.from(reply.card), {
310
+ name: "card.png",
311
+ });
312
+ await target.send({ files: [card] }).catch((err: unknown) => {
313
+ this.#options.logger.warn(
314
+ { channel, err },
315
+ "reply card not posted; sending the text alone",
316
+ );
315
317
  });
316
318
  }
317
319
  for (const chunk of reply.chunks) {