@mmmbuto/nexuscrew 0.9.61 → 0.9.62

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.
@@ -11,7 +11,7 @@
11
11
  <meta name="apple-mobile-web-app-title" content="NexusCrew" />
12
12
  <link rel="manifest" href="/manifest.json" />
13
13
  <title>NexusCrew</title>
14
- <script type="module" crossorigin src="/assets/index-VtTd56fc.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-Cq8wINIe.js"></script>
15
15
  <link rel="stylesheet" crossorigin href="/assets/index-fCIoVxeq.css">
16
16
  </head>
17
17
  <body>
@@ -1 +1 @@
1
- {"version":"0.9.61"}
1
+ {"version":"0.9.62"}
package/lib/server.js CHANGED
@@ -1455,9 +1455,15 @@ function createServer(opts = {}) {
1455
1455
  return res.status(409).json({ error: 'answer requires reconciliation', reason: 'delivery-unknown-block' });
1456
1456
  }
1457
1457
  if (!ask && previous) return res.json({ dismissed: true, scope: 'local', ownerSync: previous.syncState === 'blocked' ? 'blocked' : 'pending' });
1458
- if (!unavailable) return res.status(409).json({ error: 'owner channel is not known unavailable', reason: 'owner-availability-unknown' });
1458
+ // Removing a card from THIS node's view is a local intent: it needs the
1459
+ // ask to be visible and quiet, not a permission from the owner. It is
1460
+ // persisted durably here (removing is not answering). Only the offline
1461
+ // path (owner channel unavailable AND the local reply grant present)
1462
+ // queues a sync for when the owner returns; a reachable owner is never
1463
+ // queued, whatever this node's own grants say — the owner's denial is
1464
+ // what governs the remote closure.
1459
1465
  const out = asksStore.dismissImported({ ownerId: b.ownerId, ownerAskId: b.askId, ask, cellId, retryBinding: dismissalBinding(b.ownerId),
1460
- syncState: grants.grants.askReplyAccess === true ? 'pending' : 'blocked' });
1466
+ syncState: unavailable && grants.grants.askReplyAccess === true ? 'pending' : 'blocked' });
1461
1467
  if (!out.ok) return res.status(out.reason === 'dismissal-cap' ? 429 : 503).json({ error: 'local dismissal refused', reason: out.reason });
1462
1468
  notifier.deliverOnlyRaw({ type: 'ask-dismissed', id: alias ? alias.id : b.askId, ownerId: b.ownerId, ownerAskId: b.askId, scope: 'local',
1463
1469
  // UI-only context also distinguishes changed content before the first snapshot.
@@ -1503,7 +1509,7 @@ function createServer(opts = {}) {
1503
1509
  let readable = false;
1504
1510
  try { readable = asksStore.health().readable; } catch (_) {}
1505
1511
  res.json({ ...remote, canDismissRemote: mutable && remote.canReply === true,
1506
- canDismissLocal: mutable && readable && local.visible && !local.blocked && (local.unavailable || !!local.previous) });
1512
+ canDismissLocal: mutable && readable && local.visible && !local.blocked });
1507
1513
  }
1508
1514
  catch (_) { res.json({ ownerId, askId, canReply: false, status: 'unreachable' }); }
1509
1515
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmmbuto/nexuscrew",
3
- "version": "0.9.61",
3
+ "version": "0.9.62",
4
4
  "description": "Faithful browser tmux client — attach to live sessions over a real PTY, localhost-only, mobile-easy",
5
5
  "main": "lib/server.js",
6
6
  "bin": {