@maka/maka-cli 5.104.0 → 5.108.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.
Files changed (29) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/sideQuest/augmentations.d.ts +12 -0
  3. package/bundle/typescript/src/commands/game/sideQuest/augmentations.js +3 -0
  4. package/bundle/typescript/src/commands/game/sideQuest/augmentations.js.map +1 -1
  5. package/bundle/typescript/src/commands/game/sideQuest/commands/call.d.ts +19 -0
  6. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +74 -1
  7. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js.map +1 -1
  8. package/bundle/typescript/src/commands/game/sideQuest/commands/deck.js +4 -0
  9. package/bundle/typescript/src/commands/game/sideQuest/commands/deck.js.map +1 -1
  10. package/bundle/typescript/src/commands/game/sideQuest/commands/download.d.ts +46 -0
  11. package/bundle/typescript/src/commands/game/sideQuest/commands/download.js +128 -0
  12. package/bundle/typescript/src/commands/game/sideQuest/commands/download.js.map +1 -0
  13. package/bundle/typescript/src/commands/game/sideQuest/commands/players.js +1 -1
  14. package/bundle/typescript/src/commands/game/sideQuest/commands/players.js.map +1 -1
  15. package/bundle/typescript/src/commands/game/sideQuest/game.js +4 -2
  16. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  17. package/bundle/typescript/src/commands/game/sideQuest/models/device.d.ts +58 -0
  18. package/bundle/typescript/src/commands/game/sideQuest/models/device.js +66 -0
  19. package/bundle/typescript/src/commands/game/sideQuest/models/device.js.map +1 -1
  20. package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +37 -5
  21. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +56 -4
  22. package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
  23. package/bundle/typescript/src/commands/game/sideQuest/utilities/ar.js +26 -5
  24. package/bundle/typescript/src/commands/game/sideQuest/utilities/ar.js.map +1 -1
  25. package/bundle/typescript/src/commands/game/sideQuest/utilities/condition-report.js +5 -1
  26. package/bundle/typescript/src/commands/game/sideQuest/utilities/condition-report.js.map +1 -1
  27. package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.js +17 -0
  28. package/bundle/typescript/src/commands/game/sideQuest/utilities/grid-view.js.map +1 -1
  29. package/package.json +1 -1
@@ -17,7 +17,27 @@ export interface IDeviceConfig {
17
17
  opensExit?: string;
18
18
  openMessage?: string;
19
19
  refuseMessage?: string;
20
+ /** DEVICE RATING (p.234/p.356). Omitted takes the kind's default --
21
+ * see DEFAULT_DEVICE_RATING. Meaningless on a 'ward', which is not
22
+ * electronics at all. */
23
+ rating?: number;
24
+ /** Wireless mode. Defaults on for electronics, and is always off on a
25
+ * 'ward'. A device with its wireless off has no icon to find and
26
+ * nothing to reach from the grid. */
27
+ wireless?: boolean;
20
28
  }
29
+ /**
30
+ * WHAT A SHUT THING RATES WHEN NOBODY SAID (canon p.356 DEVICE RATINGS,
31
+ * which prices a door lock at 2, and p.234, where a device's Data
32
+ * Processing and Firewall are both simply its Device Rating).
33
+ *
34
+ * A 'ward' is deliberately absent: it is the Art, not electronics, and
35
+ * giving it a rating would be inventing a device where canon has none.
36
+ * broadcastsAro() answers false for it on the same grounds -- see
37
+ * kbWdrysBQSahg67cA, where the ask was "anything that can be HACKED must
38
+ * be a device", not "everything in the room is".
39
+ */
40
+ export declare const DEFAULT_DEVICE_RATING: Partial<Record<DeviceKind, number>>;
21
41
  /**
22
42
  * A DEVICE: a thing in a room that is shut and can be opened.
23
43
  *
@@ -65,8 +85,46 @@ export declare class Device {
65
85
  refuseMessage: string;
66
86
  /** The whole of this device's state. */
67
87
  open: boolean;
88
+ /**
89
+ * DEVICE RATING, and the wireless mode that decides whether anything
90
+ * can see it (kbWdrysBQSahg67cA, Deditri: "anything that can be hacked
91
+ * must be a device, with a device rating and any device that is
92
+ * wireless enabled (and on) will have an ARO").
93
+ *
94
+ * `open` is still the whole of the device's PUZZLE state -- these two
95
+ * are the Matrix presence of the object, which is a different
96
+ * question and does not change when it opens. A cracked keypad is
97
+ * still a keypad standing on the grid.
98
+ */
99
+ rating: number;
100
+ wireless: boolean;
68
101
  constructor(config: IDeviceConfig);
69
102
  isOpen(): boolean;
103
+ /**
104
+ * IS THERE AN ICON HERE TO FIND? Wireless mode on, and a rating that
105
+ * means it is electronics at all.
106
+ *
107
+ * Both surfaces ask this one predicate -- utilities/ar.ts for the
108
+ * street's overlay and utilities/grid-view.ts for a persona's icon
109
+ * list -- because the two views disagreeing about one object is the
110
+ * exact fault this codebase keeps having to close (see the gun in
111
+ * aroTags, AKfemBJJWJP99nx8K).
112
+ */
113
+ broadcastsAro(): boolean;
114
+ /** Data Processing and Firewall are both simply the Device Rating
115
+ * (p.234). Named rather than inlined so a future rating that is not
116
+ * flat has one place to change. */
117
+ get firewall(): number;
118
+ get dataProcessing(): number;
119
+ /**
120
+ * An UNATTENDED device stands in its Device Rating for the Mental
121
+ * attribute it does not have (p.237-238): a door lock nobody is
122
+ * watching defends a Control Device action with Rating + Firewall.
123
+ * Nothing consumes this yet -- hack.ts's panel route is still the
124
+ * bypass rail -- so it is declared where the rating lives rather than
125
+ * guessed at a call site later.
126
+ */
127
+ get unattendedDefencePool(): number;
70
128
  /** Every verb that works this device, for telling the player exactly
71
129
  * what they may type. */
72
130
  verbs(): string[];
@@ -1,6 +1,21 @@
1
1
  import { matchesCredential } from '../utilities/credentials.js';
2
2
  import { AFFORDANCE_FLAVOR, verbsFor } from '../utilities/affordances.js';
3
3
  import { hint } from '../utilities/hints.js';
4
+ /**
5
+ * WHAT A SHUT THING RATES WHEN NOBODY SAID (canon p.356 DEVICE RATINGS,
6
+ * which prices a door lock at 2, and p.234, where a device's Data
7
+ * Processing and Firewall are both simply its Device Rating).
8
+ *
9
+ * A 'ward' is deliberately absent: it is the Art, not electronics, and
10
+ * giving it a rating would be inventing a device where canon has none.
11
+ * broadcastsAro() answers false for it on the same grounds -- see
12
+ * kbWdrysBQSahg67cA, where the ask was "anything that can be HACKED must
13
+ * be a device", not "everything in the room is".
14
+ */
15
+ export const DEFAULT_DEVICE_RATING = {
16
+ lock: 2,
17
+ panel: 2,
18
+ };
4
19
  /**
5
20
  * A DEVICE: a thing in a room that is shut and can be opened.
6
21
  *
@@ -48,6 +63,19 @@ export class Device {
48
63
  refuseMessage;
49
64
  /** The whole of this device's state. */
50
65
  open = false;
66
+ /**
67
+ * DEVICE RATING, and the wireless mode that decides whether anything
68
+ * can see it (kbWdrysBQSahg67cA, Deditri: "anything that can be hacked
69
+ * must be a device, with a device rating and any device that is
70
+ * wireless enabled (and on) will have an ARO").
71
+ *
72
+ * `open` is still the whole of the device's PUZZLE state -- these two
73
+ * are the Matrix presence of the object, which is a different
74
+ * question and does not change when it opens. A cracked keypad is
75
+ * still a keypad standing on the grid.
76
+ */
77
+ rating;
78
+ wireless;
51
79
  constructor(config) {
52
80
  this.kind = config.kind;
53
81
  this.name = config.name;
@@ -61,10 +89,48 @@ export class Device {
61
89
  this.opensExit = config.opensExit;
62
90
  this.openMessage = config.openMessage || 'It opens.';
63
91
  this.refuseMessage = config.refuseMessage || `Nothing happens.`;
92
+ this.rating = config.rating ?? DEFAULT_DEVICE_RATING[config.kind] ?? 0;
93
+ // A ward has no wireless mode to be in. Everything else defaults ON,
94
+ // because a seeded keypad nobody thought about is a keypad on the
95
+ // grid -- which is the state the report says the game should model.
96
+ this.wireless = config.kind === 'ward' ? false : (config.wireless ?? true);
64
97
  }
65
98
  isOpen() {
66
99
  return this.open;
67
100
  }
101
+ /**
102
+ * IS THERE AN ICON HERE TO FIND? Wireless mode on, and a rating that
103
+ * means it is electronics at all.
104
+ *
105
+ * Both surfaces ask this one predicate -- utilities/ar.ts for the
106
+ * street's overlay and utilities/grid-view.ts for a persona's icon
107
+ * list -- because the two views disagreeing about one object is the
108
+ * exact fault this codebase keeps having to close (see the gun in
109
+ * aroTags, AKfemBJJWJP99nx8K).
110
+ */
111
+ broadcastsAro() {
112
+ return this.wireless && this.rating > 0;
113
+ }
114
+ /** Data Processing and Firewall are both simply the Device Rating
115
+ * (p.234). Named rather than inlined so a future rating that is not
116
+ * flat has one place to change. */
117
+ get firewall() {
118
+ return this.rating;
119
+ }
120
+ get dataProcessing() {
121
+ return this.rating;
122
+ }
123
+ /**
124
+ * An UNATTENDED device stands in its Device Rating for the Mental
125
+ * attribute it does not have (p.237-238): a door lock nobody is
126
+ * watching defends a Control Device action with Rating + Firewall.
127
+ * Nothing consumes this yet -- hack.ts's panel route is still the
128
+ * bypass rail -- so it is declared where the rating lives rather than
129
+ * guessed at a call site later.
130
+ */
131
+ get unattendedDefencePool() {
132
+ return this.rating + this.firewall;
133
+ }
68
134
  /** Every verb that works this device, for telling the player exactly
69
135
  * what they may type. */
70
136
  verbs() {
@@ -1 +1 @@
1
- {"version":3,"file":"device.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/models/device.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/models/device.ts"],"names":[],"mappings":"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"}
@@ -453,7 +453,9 @@ export declare class Player extends AbstractPlayer {
453
453
  /** Any deck at all, bricked included -- for status displays and repair. */
454
454
  getAnyCyberdeck(): Item | undefined;
455
455
  arOffline: boolean;
456
- arMuted: boolean;
456
+ private _arMuted;
457
+ get arMuted(): boolean;
458
+ set arMuted(v: boolean);
457
459
  panMarksBy: Map<string, number>;
458
460
  overwatchScore: number;
459
461
  overwatchLastTick: number;
@@ -553,6 +555,21 @@ export declare class Player extends AbstractPlayer {
553
555
  private static readonly ATTR_NAME;
554
556
  /** The undamaged array, before any IC reduction. */
555
557
  baseMatrixAttribute(kind: 'attack' | 'sleaze' | 'dataProcessing' | 'firewall'): number;
558
+ /**
559
+ * THE LIVE LINK -- what makes this runner reachable and lit (p.223,
560
+ * RAG-checked 2026-09-01: "a deck can perform all of the functions of
561
+ * a commlink"). The worn commlink, or failing that the working deck:
562
+ * a deck-only decker IS online, receives calls, and drives AR.
563
+ *
564
+ * The distinction this deliberately preserves: a POCKETED commlink is
565
+ * still not live (the 2026-08-24 ruling -- choosing not to wear the
566
+ * wearable is choosing silence), but a deck cannot be worn at all --
567
+ * it works from the kit BY the engine's own design, so its kit state
568
+ * IS its equipped state. ar.ts used to render the honest display of
569
+ * the old mechanics ("AR ON | Link offline"); this fixes the
570
+ * MECHANICS, so the display goes back to matching canon.
571
+ */
572
+ liveLink(): Item | undefined;
556
573
  getPanMaster(): Item | undefined;
557
574
  /**
558
575
  * Defense against a PAN intrusion, itemised: the book's attribute plus
@@ -851,7 +868,9 @@ export declare class Player extends AbstractPlayer {
851
868
  get name(): string;
852
869
  get currentLocation(): Room;
853
870
  set currentLocation(room: Room);
854
- atSpot?: string;
871
+ private _atSpot?;
872
+ get atSpot(): string | undefined;
873
+ set atSpot(v: string | undefined);
855
874
  /**
856
875
  * WHICH PAPER YOU CARRY (player request 2026-08-25, twice: "I should
857
876
  * be able to see which sin I have active, and be able set it"). The
@@ -883,12 +902,22 @@ export declare class Player extends AbstractPlayer {
883
902
  *
884
903
  * NOT persisted: like the grid itself, it is transient geometry -- a
885
904
  * reload puts you back on your spot's own seat.
905
+ *
906
+ * Accessor for the live dot map (2026-09-01) -- a cell step reports.
907
+ * Same-reference writes are the common no-op; a NEW object with equal
908
+ * coordinates still fires, which is harmless (one coalesced beat).
886
909
  */
887
- atCell?: {
910
+ private _atCell?;
911
+ get atCell(): {
888
912
  x: number;
889
913
  y: number;
890
914
  z: number;
891
- };
915
+ } | undefined;
916
+ set atCell(v: {
917
+ x: number;
918
+ y: number;
919
+ z: number;
920
+ } | undefined);
892
921
  /** The spot this actor was SEEDED at -- i.e. the fixture they work
893
922
  * (a bartender's bar, a shopkeeper's counter). Seating puts them on
894
923
  * the service side of it while everyone else stands in front (see
@@ -987,7 +1016,10 @@ export declare class Player extends AbstractPlayer {
987
1016
  * roll, so it is guarded where it is invoked.
988
1017
  */
989
1018
  onConditionChanged?: () => void;
990
- private noteConditionChanged;
1019
+ /** PUBLIC so state that lives on ITEMS (a deck's program list) can
1020
+ * report through the owning player -- deck.ts load/unload calls it.
1021
+ * Guarded here once: reporting never wounds. */
1022
+ noteConditionChanged(): void;
991
1023
  takeDamage(boxes: number): number;
992
1024
  /** A fresh injury opens a fresh set of wounds: first aid is available
993
1025
  * again, and whatever the mana did is now last wound's business. */
@@ -476,7 +476,17 @@ export class Player extends AbstractPlayer {
476
476
  // is untouched; you simply stop being shown the icon clutter.
477
477
  // Session-scoped like runningSilent: a fresh session boots AR up.
478
478
  // See commands/ar.ts and utilities/ar.ts.
479
- arMuted = false;
479
+ // Accessor (live-sheet, 2026-09-01): the AR toggle is sheet-visible --
480
+ // the report carries the derived arSightUp, and this is the switch the
481
+ // player actually flips, so flipping it reports.
482
+ _arMuted = false;
483
+ get arMuted() { return this._arMuted; }
484
+ set arMuted(v) {
485
+ if (this._arMuted === v)
486
+ return;
487
+ this._arMuted = v;
488
+ this.noteConditionChanged();
489
+ }
480
490
  // MARKS on THIS actor's PAN (canon p.235-236), keyed by PLACER name,
481
491
  // capped at 3 -- each one buys the placer +2 dice on PAN intrusions
482
492
  // against me (hack.ts). My "reboot" wipes them all; a placer's own
@@ -629,6 +639,23 @@ export class Player extends AbstractPlayer {
629
639
  const rig = this.activeDeck ?? this.getCyberdeck() ?? this.getPanMaster();
630
640
  return rig?.matrixAttribute(kind) ?? 0;
631
641
  }
642
+ /**
643
+ * THE LIVE LINK -- what makes this runner reachable and lit (p.223,
644
+ * RAG-checked 2026-09-01: "a deck can perform all of the functions of
645
+ * a commlink"). The worn commlink, or failing that the working deck:
646
+ * a deck-only decker IS online, receives calls, and drives AR.
647
+ *
648
+ * The distinction this deliberately preserves: a POCKETED commlink is
649
+ * still not live (the 2026-08-24 ruling -- choosing not to wear the
650
+ * wearable is choosing silence), but a deck cannot be worn at all --
651
+ * it works from the kit BY the engine's own design, so its kit state
652
+ * IS its equipped state. ar.ts used to render the honest display of
653
+ * the old mechanics ("AR ON | Link offline"); this fixes the
654
+ * MECHANICS, so the display goes back to matching canon.
655
+ */
656
+ liveLink() {
657
+ return this._equipment.head?.commlink ?? this.getCyberdeck();
658
+ }
632
659
  getPanMaster() {
633
660
  const deck = this.getCyberdeck();
634
661
  // Worn first, then CARRIED (playtest 2026-08-24: NPCs keep their
@@ -1405,7 +1432,17 @@ export class Player extends AbstractPlayer {
1405
1432
  // Where this actor stands WITHIN the room ("at" spots, see
1406
1433
  // utilities/spots.ts). undefined = circulating (reaches everything,
1407
1434
  // gets no cover) -- the compat default for everything un-migrated.
1408
- atSpot;
1435
+ // Accessor (live-sheet, 2026-09-01, user: "let's get that streaming
1436
+ // in too"): in-room movement walks the sheet's dot map, so the write
1437
+ // fires the report hook on CHANGE. Source-compatible; NPCs no-op.
1438
+ _atSpot;
1439
+ get atSpot() { return this._atSpot; }
1440
+ set atSpot(v) {
1441
+ if (this._atSpot === v)
1442
+ return;
1443
+ this._atSpot = v;
1444
+ this.noteConditionChanged();
1445
+ }
1409
1446
  /**
1410
1447
  * WHICH PAPER YOU CARRY (player request 2026-08-25, twice: "I should
1411
1448
  * be able to see which sin I have active, and be able set it"). The
@@ -1437,8 +1474,19 @@ export class Player extends AbstractPlayer {
1437
1474
  *
1438
1475
  * NOT persisted: like the grid itself, it is transient geometry -- a
1439
1476
  * reload puts you back on your spot's own seat.
1477
+ *
1478
+ * Accessor for the live dot map (2026-09-01) -- a cell step reports.
1479
+ * Same-reference writes are the common no-op; a NEW object with equal
1480
+ * coordinates still fires, which is harmless (one coalesced beat).
1440
1481
  */
1441
- atCell;
1482
+ _atCell;
1483
+ get atCell() { return this._atCell; }
1484
+ set atCell(v) {
1485
+ if (this._atCell === v)
1486
+ return;
1487
+ this._atCell = v;
1488
+ this.noteConditionChanged();
1489
+ }
1442
1490
  /** The spot this actor was SEEDED at -- i.e. the fixture they work
1443
1491
  * (a bartender's bar, a shopkeeper's counter). Seating puts them on
1444
1492
  * the service side of it while everyone else stands in front (see
@@ -1869,6 +1917,9 @@ export class Player extends AbstractPlayer {
1869
1917
  * roll, so it is guarded where it is invoked.
1870
1918
  */
1871
1919
  onConditionChanged;
1920
+ /** PUBLIC so state that lives on ITEMS (a deck's program list) can
1921
+ * report through the owning player -- deck.ts load/unload calls it.
1922
+ * Guarded here once: reporting never wounds. */
1872
1923
  noteConditionChanged() {
1873
1924
  try {
1874
1925
  this.onConditionChanged?.();
@@ -2332,7 +2383,8 @@ export class Player extends AbstractPlayer {
2332
2383
  // Intuition x 2 (p.159 chart, p.314 astral attributes).
2333
2384
  return Math.max(0, this.intuition * 2 + this.woundModifier);
2334
2385
  }
2335
- const link = this._equipment.head?.commlink;
2386
+ // The live link, not just the worn one: a deck drives AR too (p.223).
2387
+ const link = this.liveLink();
2336
2388
  // AR needs a link that's on you, broadcasting, and not hacked dark.
2337
2389
  // An ENGINE ADDITION, not canon: p.474 gives AR a bare Intuition +
2338
2390
  // Reaction. It predates this change and is left alone deliberately,