@maka/maka-cli 5.214.0 → 5.215.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.214.0",
3
+ "version": "5.215.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.",
@@ -1086,5 +1086,22 @@
1086
1086
  // stay guarded...", "Suspicious system-note injection detected" --
1087
1087
  // are all dated 2026-08-24 and predate isOutOfCharacter, which
1088
1088
  // already catches them. Checked, not assumed.)
1089
- export const ENGINE_VERSION = '1.74.0';
1089
+ // 1.74.1 (2026-09-16): A PERSON MAY SAY WHAT THEY KNOW. 1.74.0's
1090
+ // INTERIOR rule leaked onto the SPEECH channel and gagged ordinary
1091
+ // dialogue -- an NPC saying "I know exactly what you mean" out loud
1092
+ // was refused as mind-reading. Caught before anyone played it, by
1093
+ // reading judgeNarration's other caller rather than by a report.
1094
+ // THE TRAP IS WORTH RECORDING. Dialogue has run through this judge
1095
+ // since KwiMKNMN2e8KBqTY7, and it was safe from the agency rules for
1096
+ // an INVISIBLE reason: that caller passes an empty cast, so there is
1097
+ // no subject to resolve and CONTACT/COMPELLED_MOVEMENT can never fire.
1098
+ // A real guarantee, nowhere stated. INTERIOR needs no subject, so it
1099
+ // walked straight through. judgeNarration now takes an explicit
1100
+ // `channel` ('beat' by default, 'speech' from the dialogue call) and
1101
+ // the beat-only rules are gated on it, so the next rule added here has
1102
+ // to decide which channel it belongs to instead of inheriting an
1103
+ // accident. The distinction is the rule itself: a character may SAY
1104
+ // what they know; they may not have it NARRATED at a player who cannot
1105
+ // hear it.
1106
+ export const ENGINE_VERSION = '1.74.1';
1090
1107
  //# sourceMappingURL=engine-version.js.map
@@ -2515,6 +2515,13 @@ Your objective is to drive the story line.`}
2515
2515
  const placeVerdict = judgeNarration(said, this.name, [], {
2516
2516
  here: this.currentLocation?.name,
2517
2517
  worldRooms: Object.values(this._scene?.getRooms?.() ?? {}).map(r => r.name),
2518
+ // SAYS WHICH CHANNEL THIS IS, rather than relying on the empty
2519
+ // `others` above to keep the beat-only rules from firing. That
2520
+ // guarantee held for the agency rules, which need a subject to
2521
+ // resolve -- and broke the moment a rule arrived that does not
2522
+ // (INTERIOR), refusing an ordinary spoken "I know exactly what
2523
+ // you mean" as mind-reading. A person may SAY what they know.
2524
+ channel: 'speech',
2518
2525
  });
2519
2526
  if (placeVerdict.refused) {
2520
2527
  this.logger.write(`${this.name} speech refused (claimed to be elsewhere): ${said.slice(0, 160)}`);
@@ -309,6 +309,21 @@ function aimedAtAPerson(text, matches, subject) {
309
309
  * @param opts.holding who this NPC already has a grapple on, if anyone --
310
310
  * narration about a hold the dice already settled is a
311
311
  * description, not a claim.
312
+ * @param opts.channel which half of the reply this is. 'beat' (the
313
+ * default) is exposition and gets every rule. 'speech'
314
+ * is a line of DIALOGUE and gets the place rule only.
315
+ *
316
+ * WHY THE CHANNEL IS A PARAMETER AND NOT AN ACCIDENT. Dialogue has been
317
+ * passing through here since KwiMKNMN2e8KBqTY7 ("Whisper ... says he
318
+ * is"), and it survived the agency rules only because its caller passes
319
+ * an EMPTY `others` -- with nobody to resolve as the subject, CONTACT
320
+ * and COMPELLED_MOVEMENT can never fire. That is a real guarantee but an
321
+ * invisible one, and the INTERIOR rule broke it the moment it was
322
+ * written: interiority needs no subject, so a perfectly ordinary spoken
323
+ * "I know exactly what you mean" was refused as mind-reading. A person
324
+ * is allowed to say what they know. They are not allowed to have it
325
+ * NARRATED at a player who cannot hear it -- which is the whole
326
+ * distinction, and it now has a name in the signature.
312
327
  */
313
328
  export function judgeNarration(line, speaker, others, opts = {}) {
314
329
  const t = line.replace(/^[\s│|>*-]+/, '').trim();
@@ -327,8 +342,9 @@ export function judgeNarration(line, speaker, others, opts = {}) {
327
342
  }
328
343
  }
329
344
  // ALSO BEFORE the agency rules, and for the same reason: this is about
330
- // the SPEAKER's own head, so there is no subject to resolve.
331
- if (INTERIOR.test(t)) {
345
+ // the SPEAKER's own head, so there is no subject to resolve -- which
346
+ // is exactly why it must be told to stay off the speech channel.
347
+ if (opts.channel !== 'speech' && INTERIOR.test(t)) {
332
348
  return {
333
349
  refused: true,
334
350
  subject: speaker,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.214.0",
3
+ "version": "5.215.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.",