@maka/maka-cli 5.216.0 → 5.218.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.218.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.",
@@ -91,6 +91,35 @@ export class GiveCommand extends Command {
91
91
  this.logger.write(`${this.actor.name} tried to give item "${itemOrAmount}" but does not have it.`);
92
92
  return `You don’t have "${itemOrAmount}".`;
93
93
  }
94
+ // A DELIVERED OBJECTIVE DOES NOT COME BACK (qk7TtQqyaT4CaWNka, Maka:
95
+ // "when I returned from a job, after giving Ms. Halvorsen the Skim
96
+ // Ledger Archive -- I kept a copy, is that by design?").
97
+ //
98
+ // It was not a copy, and nothing duplicated anything. The transcript
99
+ // (session vi2bvgA7XhHZRjwYL) has Ted hand the chip over, the job
100
+ // complete -- "The ledger's yanked clean ... Karma earned: 4" -- a
101
+ // beat where "Ms. Halvorsen's hand shoots out and closes around the
102
+ // datachip", and then, one line later:
103
+ //
104
+ // Ms. Halvorsen give Skim Ledger Archive to Ted
105
+ //
106
+ // Her AI issued a `give` and handed the paydata straight back, so the
107
+ // runner walked out of a finished job still holding the thing he had
108
+ // just been paid for. The brief's own example of a matching command
109
+ // is `give <item> to <name>`, which is exactly the shape a model
110
+ // echoes when it has just been handed something.
111
+ //
112
+ // So the engine settles it rather than the prompt. Once the win
113
+ // condition is SATISFIED, the objective item is spent: it is the
114
+ // client's now, and no hand -- theirs, a bystander's, or the
115
+ // runner's -- passes it on. Scoped hard to the completed objective:
116
+ // an ordinary chip, an unfinished job, and the reward item all move
117
+ // exactly as they did.
118
+ const won = this.scene.getWinCondition?.();
119
+ if (this.scene.isCompleted?.() && won?.item.toLowerCase() === item.name.toLowerCase()) {
120
+ this.logger.write(`${this.actor.name} tried to pass on the delivered objective "${item.name}"; refused (job already settled).`);
121
+ return `The ${item.name} is already delivered and paid for -- it belongs to the client now, and nobody is handing it back.`;
122
+ }
94
123
  if (servedFromShelf) {
95
124
  room.inventory.removeItem(item.name);
96
125
  try {
@@ -1138,5 +1138,52 @@
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
+ // 1.77.0 (2026-09-16): A DELIVERED OBJECTIVE DOES NOT COME BACK
1167
+ // (qk7TtQqyaT4CaWNka, Maka: "when I returned from a job, after giving
1168
+ // Ms. Halvorsen the Skim Ledger Archive -- I kept a copy, is that by
1169
+ // design?"). It was not a copy and nothing duplicated anything -- the
1170
+ // vetting could not find it in the transcript because it was not
1171
+ // looking for a `give`. Session vi2bvgA7XhHZRjwYL, in order: Ted hands
1172
+ // the chip over, the job completes ("The ledger's yanked clean ...
1173
+ // Karma earned: 4"), a beat where "Ms. Halvorsen's hand shoots out and
1174
+ // closes around the datachip" -- and then, one line later:
1175
+ // Ms. Halvorsen give Skim Ledger Archive to Ted
1176
+ // Her AI issued a `give` and handed the paydata straight back, so the
1177
+ // runner walked out of a finished job still holding what he had just
1178
+ // been paid for. The brief's own example of a matching command is
1179
+ // `give <item> to <name>`, which is the shape a model echoes when it
1180
+ // has just been handed something -- so the ENGINE settles it rather
1181
+ // than the prompt. Once the win condition is satisfied the objective
1182
+ // item is spent: it belongs to the client, and no hand passes it on.
1183
+ // Scoped hard to the COMPLETED objective. An ordinary chip, the reward
1184
+ // item, and above all the delivery itself keep moving -- a gate that
1185
+ // read the win condition without reading completion would make the job
1186
+ // unwinnable, which is a worse bug than the one being fixed, and that
1187
+ // is the load-bearing test in the file.
1188
+ export const ENGINE_VERSION = '1.77.0';
1142
1189
  //# 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.218.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.",