relay-companion 0.1.46 → 0.1.48

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relay-companion",
3
- "version": "0.1.46",
3
+ "version": "0.1.48",
4
4
  "description": "Relay companion: connects local coding agents to Relay tasks, approvals, and connector tools.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -633,7 +633,10 @@ export function stagePlainRelayItem(
633
633
  bodyMarkdown: packet?.bodyMarkdown || item.preview || "",
634
634
  createdAt: item.createdAt || packet?.createdAt || now,
635
635
  updatedAt: item.updatedAt || now,
636
- deliveryReferenceAt: item.updatedAt || item.createdAt || now,
636
+ // A restoration is a fresh inbox delivery even when the underlying relay was
637
+ // read before deletion. Use that timestamp so an older account read-all
638
+ // cutoff cannot immediately collapse the restored row back to read.
639
+ deliveryReferenceAt: item.restoredAt || item.updatedAt || item.createdAt || now,
637
640
  stagedAt: now,
638
641
  actionUrl: "/app/relays",
639
642
  action: { type: "open", url: "/app/relays" },
@@ -72,7 +72,12 @@ function freshPlainRelays(ledger, items) {
72
72
  ledger.plainRelays ||= {};
73
73
  return items.filter((item) => {
74
74
  const seen = ledger.plainRelays[item.relayId];
75
- return !seen || seen.updatedAt !== item.updatedAt || seen.state !== item.state;
75
+ return (
76
+ !seen ||
77
+ seen.updatedAt !== item.updatedAt ||
78
+ seen.state !== item.state ||
79
+ (seen.restoredAt || "") !== (item.restoredAt || "")
80
+ );
76
81
  });
77
82
  }
78
83
 
@@ -83,6 +88,7 @@ function markPlainRelaysProcessed(ledger, items) {
83
88
  ledger.plainRelays[item.relayId] = {
84
89
  state: item.state,
85
90
  updatedAt: item.updatedAt || item.createdAt || "",
91
+ restoredAt: item.restoredAt || "",
86
92
  processedAt,
87
93
  };
88
94
  }
@@ -147,8 +153,12 @@ async function pollPlainInbox({ client, ledger, stagePlainRelay, log }) {
147
153
  const staged = [];
148
154
  for (const item of fresh) {
149
155
  try {
156
+ const seen = ledger.plainRelays[item.relayId];
150
157
  const relay = await client.fetchRelay(item.relayId);
151
- stagePlainRelay({ item, packet: relay.packet, attachmentUrls: relay.attachmentUrls || {} });
158
+ stagePlainRelay(
159
+ { item, packet: relay.packet, attachmentUrls: relay.attachmentUrls || {} },
160
+ { forceUnread: Boolean(item.restoredAt && seen?.restoredAt !== item.restoredAt) },
161
+ );
152
162
  staged.push(item);
153
163
  log(`staged ordinary Relay from ${item.sender?.name || "someone"}: ${item.title || item.relayId}`);
154
164
  } catch (err) {