@maka/maka-cli 5.216.0 → 5.217.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": "@maka/maka-cli",
3
- "version": "5.216.0",
3
+ "version": "5.217.0",
4
4
  "type": "module",
5
5
  "summary": "A command line tool for scaffolding Meteor 3.x applications using either React.",
6
6
  "description": "A command line tool for scaffolding Meteor 3.x applications using React.",
@@ -1138,5 +1138,30 @@
1138
1138
  // because that is what narrowing means. One candidate is not a
1139
1139
  // cycle -- a key that rewrites the box to what it already holds
1140
1140
  // looks broken.
1141
- export const ENGINE_VERSION = '1.75.0';
1141
+ // 1.76.0 (2026-09-16): THE WAN IS DRAWN AS A TREE (RXBaewsjGDZqqW8ba,
1142
+ // Maka: "the heiarchy is confusing when using 'look' in the matrix.
1143
+ // What 'host' does camera cluster attach to? it says 'live, feeding
1144
+ // the site's host'. If we're allowed to know which host it's attached
1145
+ // to, then let's make this a 'tree' view"). The list was flat: a host
1146
+ // in one section, the devices hanging off it in another, nothing
1147
+ // joining them, and the only clue a phrase that named no host. The
1148
+ // structure was in the model all along and only the rendering hid it.
1149
+ // - HOSTS OVERHEAD now indents a host's slaves beneath it with box
1150
+ // drawing, and ICONS IN REACH holds only what answers to nobody.
1151
+ // - The camera line NAMES its master, from the same cameraMasterHost
1152
+ // tap.ts uses to decide what is on the other end of the cable.
1153
+ // - WHAT COUNTS AS A SLAVE is p.233's rule, not "everything nearby":
1154
+ // "the slaves must be devices and the master must be a host". So the
1155
+ // room's devices and its camera cluster branch off the host; a
1156
+ // person's commlink is THEIR PAN and a persona is nobody's slave,
1157
+ // and both stay at top level.
1158
+ // - "IF WE'RE ALLOWED TO KNOW" IS THE REPORTER'S OWN CONDITIONAL, and
1159
+ // it was RAG-checked rather than assumed. Matrix Perception does NOT
1160
+ // list a device's master among what a hit buys you (p.235), so this
1161
+ // must not become a way to learn one -- and it is not. The engine
1162
+ // already disclosed that these icons answered to "the site's host",
1163
+ // and a room with a node has exactly one; the tree says the same
1164
+ // thing in a shape that can be read. A watched room with NO node
1165
+ // still names no master, pinned as a test.
1166
+ export const ENGINE_VERSION = '1.76.0';
1142
1167
  //# sourceMappingURL=engine-version.js.map
@@ -4,7 +4,7 @@ import { hostsInReach, hostLine, roomsInReach, gridVicinity } from './grid-reach
4
4
  import { NPC } from '../models/npc.js';
5
5
  import { hostLabel, hostPurposeFor } from './grid-names.js';
6
6
  import { isLinked } from './comm-style.js';
7
- import { isWatched, camerasLive, canSnoopFeeds } from './surveillance.js';
7
+ import { isWatched, camerasLive, canSnoopFeeds, cameraMasterHost } from './surveillance.js';
8
8
  /**
9
9
  * The grid's icon inventory for one room -- everything a persona can
10
10
  * ACT on, each with its verb (player rulings 2026-08-23/24: "it's hard
@@ -277,7 +277,16 @@ export function gridIcons(scene, actor, room) {
277
277
  // catch is that a persona cannot hold a cable -- so this reads as
278
278
  // something your BODY could do, which is the price the rule
279
279
  // charges. See commands/tap.ts.
280
- icons.push(`◎ Camera cluster -- live, feeding the site's host. Loud acts here travel. (own the host to loop them -- or walk in and "tap" a lens in the flesh: slaved to the host means a key to the host)`);
280
+ // NAME THE MASTER (RXBaewsjGDZqqW8ba, Maka: "What 'host' does
281
+ // camera cluster attach to? it says 'live, feeding the site's
282
+ // host'"). Nothing new is disclosed -- the line already said these
283
+ // lenses answer to a host, and cameraMasterHost is the same
284
+ // function tap.ts uses to decide what is on the other end of the
285
+ // cable. It simply refused to say WHICH, in a district that has
286
+ // exactly one, so the reader was left to guess at a fact the
287
+ // engine had already handed them.
288
+ const owner = cameraMasterHost(scene.getRooms(), room);
289
+ icons.push(`◎ Camera cluster -- live, feeding ${owner ? hostLabel(owner) : `the site's host`}. Loud acts here travel. (own the host to loop them -- or walk in and "tap" a lens in the flesh: slaved to the host means a key to the host)`);
281
290
  }
282
291
  }
283
292
  // THE DIVIDER (eJANPpm7qCaCAJBJw). Only when there is a host to be
@@ -562,9 +571,6 @@ export function gridIconBlock(scene, actor, room, rooms) {
562
571
  }
563
572
  const out = [];
564
573
  const hosts = hostsInReach(rooms, actor);
565
- out.push(hosts.length > 0
566
- ? `{light-blue-fg}HOSTS OVERHEAD:{/light-blue-fg}\n${hosts.map(h => ` {light-blue-fg}${hostLine(h, actor)}{/light-blue-fg}`).join('\n')}`
567
- : `{light-blue-fg}Nothing overhead -- no host stands over this district.{/light-blue-fg}`);
568
574
  // THE DIVIDER DIVIDES NOTHING HERE. gridIcons puts the host's own icon
569
575
  // first and splices a "-- and NEAR it ... --" heading after it; this
570
576
  // block then pulls the host line OUT (it has its own HOSTS OVERHEAD
@@ -577,9 +583,51 @@ export function gridIconBlock(scene, actor, room, rooms) {
577
583
  const near = gridIcons(scene, actor, gridVicinity(actor))
578
584
  .filter(i => !isHostLine(i))
579
585
  .filter((i, idx) => !(idx === 0 && isNearDivider(i)));
580
- out.push(near.length > 0
581
- ? `{light-blue-fg}ICONS IN REACH:{/light-blue-fg}\n${near.map(i => ` {light-blue-fg}${i}{/light-blue-fg}`).join('\n')}`
582
- : `{light-blue-fg}Nothing near -- background noise around your signal.{/light-blue-fg}`);
586
+ // THE WAN IS DRAWN AS A TREE (RXBaewsjGDZqqW8ba, Maka: "the heiarchy
587
+ // is confusing when using 'look' in the matrix. What 'host' does
588
+ // camera cluster attach to? ... let's make this a 'tree' view").
589
+ //
590
+ // The list was flat, so a host and the devices hanging off it sat in
591
+ // two separate sections with nothing joining them, and the only clue
592
+ // was the phrase "the site's host" -- which names no host. The
593
+ // structure was in the model the whole time and only the rendering
594
+ // hid it.
595
+ //
596
+ // WHAT IS ACTUALLY SLAVED, and the line is not "everything nearby":
597
+ // a WAN's slaves are DEVICES (p.233 -- "the slaves must be devices and
598
+ // the master must be a host"), which here means the room's own
599
+ // devices and its camera cluster. A person's commlink is their PAN,
600
+ // not the host's, and a persona is nobody's slave; those stay at top
601
+ // level where they belong.
602
+ //
603
+ // AND NOTHING NEW IS DISCLOSED. Checked against the books rather than
604
+ // assumed: Matrix Perception does NOT list a device's master among
605
+ // what a hit buys you (p.235), so this must not become a way to learn
606
+ // one. It doesn't -- the engine already told you these icons answered
607
+ // to "the site's host", and a room with a node has exactly one. The
608
+ // tree says the same thing in a shape that can be read; it does not
609
+ // reach for a relationship the player did not already have.
610
+ const hereRoom = gridVicinity(actor);
611
+ const master = hosts.find(h => h === hereRoom);
612
+ const isSlave = (i) => i.startsWith('▤') || i.startsWith('◎');
613
+ const slaved = master ? near.filter(isSlave) : [];
614
+ const loose = master ? near.filter(i => !isSlave(i)) : near;
615
+ out.push(hosts.length > 0
616
+ ? `{light-blue-fg}HOSTS OVERHEAD:{/light-blue-fg}\n${hosts.map(h => {
617
+ const line = ` {light-blue-fg}${hostLine(h, actor)}{/light-blue-fg}`;
618
+ if (h !== master || slaved.length === 0)
619
+ return line;
620
+ // Box-drawing, so the last child closes the branch and the eye can
621
+ // see where the WAN ends.
622
+ const kids = slaved.map((i, idx) => ` {light-blue-fg}${idx === slaved.length - 1 ? '└─' : '├─'} ${i}{/light-blue-fg}`);
623
+ return [line, ...kids].join('\n');
624
+ }).join('\n')}`
625
+ : `{light-blue-fg}Nothing overhead -- no host stands over this district.{/light-blue-fg}`);
626
+ out.push(loose.length > 0
627
+ ? `{light-blue-fg}ICONS IN REACH${slaved.length > 0 ? ' -- answering to nobody up there' : ''}:{/light-blue-fg}\n${loose.map(i => ` {light-blue-fg}${i}{/light-blue-fg}`).join('\n')}`
628
+ : slaved.length > 0
629
+ ? `{light-blue-fg}Nothing else near -- everything around you hangs off the host.{/light-blue-fg}`
630
+ : `{light-blue-fg}Nothing near -- background noise around your signal.{/light-blue-fg}`);
583
631
  // FARTHER OUT, WITHOUT AN ADDRESS (SR5 p.235, p.243): Matrix Perception
584
632
  // never tells you where a device physically sits -- that is Trace Icon,
585
633
  // two marks and an opposed test. So far icons are listed by the noise
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.216.0",
3
+ "version": "5.217.0",
4
4
  "type": "module",
5
5
  "summary": "A command line tool for scaffolding Meteor 3.x applications using either React.",
6
6
  "description": "A command line tool for scaffolding Meteor 3.x applications using React.",