@maka/maka-cli 5.378.0 → 5.379.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 (27) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/sideQuest/commands/call.js +16 -3
  3. package/bundle/typescript/src/commands/game/sideQuest/commands/download.js +248 -132
  4. package/bundle/typescript/src/commands/game/sideQuest/commands/edit-file.js +26 -31
  5. package/bundle/typescript/src/commands/game/sideQuest/commands/give.js +24 -1
  6. package/bundle/typescript/src/commands/game/sideQuest/commands/inv.js +14 -0
  7. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +12 -0
  8. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js +21 -128
  9. package/bundle/typescript/src/commands/game/sideQuest/commands/transfer.js +92 -0
  10. package/bundle/typescript/src/commands/game/sideQuest/commands/upload.js +108 -0
  11. package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +14 -1
  12. package/bundle/typescript/src/commands/game/sideQuest/factories/job-order.js +28 -4
  13. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +125 -32
  14. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +10 -0
  15. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js +5 -0
  16. package/bundle/typescript/src/commands/game/sideQuest/game.js +24 -0
  17. package/bundle/typescript/src/commands/game/sideQuest/models/host.js +26 -0
  18. package/bundle/typescript/src/commands/game/sideQuest/models/item.js +16 -0
  19. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +37 -0
  20. package/bundle/typescript/src/commands/game/sideQuest/utilities/data-library.js +158 -0
  21. package/bundle/typescript/src/commands/game/sideQuest/utilities/data-work.js +4 -0
  22. package/bundle/typescript/src/commands/game/sideQuest/utilities/edit-file-test.js +31 -0
  23. package/bundle/typescript/src/commands/game/sideQuest/utilities/fixer-menu.js +10 -8
  24. package/bundle/typescript/src/commands/game/sideQuest/utilities/gear-tree.js +13 -1
  25. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +4 -0
  26. package/bundle/typescript/src/commands/game/sideQuest/utilities/verb-index.js +1 -1
  27. package/package.json +1 -1
@@ -28,6 +28,10 @@ const DATA_WORK = [
28
28
  /\bdumpster\s*(dive|diving|run)\b/i,
29
29
  /\bpaydata\b/i,
30
30
  /\bmatrix\s*(work|run|runs|job|jobs)\b/i,
31
+ // THE DATA COURIER (2026-10-04): a file carried TO a host.
32
+ /\b(data|file)\s*(courier|delivery|deliveries|drop|plant)\b/i,
33
+ /\bplant\w*\s+(a\s+|the\s+|some\s+)?(file|data|worm|backdoor)\b/i,
34
+ /\bupload\w*\b/i,
31
35
  ];
32
36
  /**
33
37
  * Is this caller asking the fixer for DATA work specifically?
@@ -0,0 +1,31 @@
1
+ import { gridActionModifier } from './grids.js';
2
+ import { rollPool, formatRoll } from './dice.js';
3
+ import { hostDefensePool } from './matrix-intrusion.js';
4
+ import { hostLabel } from './grid-names.js';
5
+ import { showsMechanics, mechanicsActorPrefix } from './mechanics-audience.js';
6
+ /**
7
+ * Refuses (returns a line) when Binder IC has burned Data Processing to
8
+ * zero -- a bracket of 0 permits no hits. Undefined when the roll may go.
9
+ */
10
+ export function editFileBlocked(actor) {
11
+ return actor.burnedAttributeRefusal('dataProcessing') || undefined;
12
+ }
13
+ /** Rolls Edit File against a host; `what` names the operation for the mechanics line ("delete", "copy", "create"). */
14
+ export function rollEditFile(scene, logger, actor, host, what) {
15
+ const computer = actor.skillRating('computer');
16
+ // Inside a host no grid penalty applies (p.246); silence still taxes
17
+ // every Matrix action (p.235-236, Player.matrixActionPenalty).
18
+ const grid = gridActionModifier(actor.currentGrid, !!actor.hostInside, actor.currentGrid);
19
+ const pool = Math.max(1, actor.logic + (computer > 0 ? computer : -1)
20
+ + actor.matrixActionPenalty + grid.total + actor.woundModifier - actor.sustainingPenalty);
21
+ const limit = actor.matrixAttribute('dataProcessing');
22
+ const defence = hostDefensePool(host);
23
+ const attempt = rollPool(pool, limit, { gremlins: actor.deckGremlins });
24
+ const resist = rollPool(defence.pool);
25
+ if (showsMechanics(scene, actor)) {
26
+ logger.meta(`${mechanicsActorPrefix(scene, actor)}Edit File (${what}) -- Computer + Logic [Data Processing]: ${formatRoll(attempt)}`);
27
+ logger.meta(` v. ${hostLabel(host.over)} (${defence.label}, rating standing in for Intuition): ${formatRoll(resist)}`);
28
+ }
29
+ return { success: attempt.hits > resist.hits, hits: attempt.hits, defence: resist.hits };
30
+ }
31
+ //# sourceMappingURL=edit-file-test.js.map
@@ -76,7 +76,7 @@ export function fixerPickupNote(game, actorName) {
76
76
  const heads = tableHeads(game);
77
77
  const sizes = JOB_SIZES.map(s => `${s} (${SIZE_BLURB[s]}; ${payWords(s, heads)})`).join('; ');
78
78
  const table = heads > 1 ? ` The money is priced for the ${heads} of them.` : '';
79
- return `[System note: ${actorName} just called you looking for work, and you have NOTHING specific yet -- you shop for a job once they tell you the SIZE of night they want. In your own voice, in a few sentences, ask what kind of night they are after and lay out the four sizes with what each runs to: ${sizes}.${table} Mention they can name a kind if they have a taste -- a snatch, a delivery, an extraction, wetwork, a demolition, or quiet data work on a host -- or leave it to you to roll the dice. Quote THESE bands and no others. Never invent a client, a venue or a rate.]`;
79
+ return `[System note: ${actorName} just called you looking for work, and you have NOTHING specific yet -- you shop for a job once they tell you the SIZE of night they want. In your own voice, in a few sentences, ask what kind of night they are after and lay out the four sizes with what each runs to: ${sizes}.${table} Mention they can name a kind if they have a taste -- a snatch, a delivery, an extraction, wetwork, a demolition, quiet data work on a host, or a data courier run that plants a file on one -- or leave it to you to roll the dice. Quote THESE bands and no others. Never invent a client, a venue or a rate.]`;
80
80
  }
81
81
  /**
82
82
  * THE COMMISSION. Drops the line, drafts the job in the background, and
@@ -100,13 +100,15 @@ export function commissionFromFixer(game, actor, order, fixerName = FIXER_NAME)
100
100
  : liveSeats.length === 1 ? ` Heard ${liveSeats[0].name} runs with you now -- I'll shop it as crew work.`
101
101
  : ` Heard you're rolling ${liveSeats.length + 1} deep these days -- I'll shop it as crew work.`;
102
102
  const sized = `${order.size[0].toUpperCase()}${order.size.slice(1)}`;
103
- const shape = order.runType === 'data'
104
- ? `Quiet work, then -- ${order.size}, something with a host and a file in it.`
105
- : order.kind === 'assassination'
106
- ? `${sized}, and wetwork. I'll find a name that needs finding. Your call to take it when you hear it.`
107
- : order.kind
108
- ? `${sized}, ${kindLabel(order.kind)}. I know a Johnson.`
109
- : `${sized}, then.`;
103
+ const shape = order.runType === 'data' && order.kind === 'delivery'
104
+ ? `Courier work, then -- ${order.size}, a file that needs to end up on somebody's host.`
105
+ : order.runType === 'data'
106
+ ? `Quiet work, then -- ${order.size}, something with a host and a file in it.`
107
+ : order.kind === 'assassination'
108
+ ? `${sized}, and wetwork. I'll find a name that needs finding. Your call to take it when you hear it.`
109
+ : order.kind
110
+ ? `${sized}, ${kindLabel(order.kind)}. I know a Johnson.`
111
+ : `${sized}, then.`;
110
112
  return `${CALL_ICON} "${shape}${table} Give me a minute; I'll ping you." Click.`;
111
113
  }
112
114
  /** The note Krow's AI hears when the runner says something on the line
@@ -4,6 +4,7 @@ import { catalogAugmentations } from './catalog.js';
4
4
  import { carryMode } from './carry.js';
5
5
  import { hint } from './hints.js';
6
6
  import { bodyTree } from './body-tree.js';
7
+ import { dataDevices, libraryDevice } from './data-library.js';
7
8
  /**
8
9
  * WHAT IS ON THE BODY, AS DATA (web drag-and-drop gear, 2026-10-02).
9
10
  *
@@ -143,7 +144,18 @@ export function gearReport(actor, homeRoom) {
143
144
  dumpster: containerView(findDumpster(homeRoom, actor.name)),
144
145
  };
145
146
  }
146
- return { worn: wornTree(actor) ?? null, augments: augmentTree(actor) ?? null, carried, home };
147
+ const persona = libraryDevice(actor);
148
+ const data = dataDevices(actor).map(d => ({
149
+ name: d.name,
150
+ category: String(d.category),
151
+ ...(d === persona ? { persona: true } : {}),
152
+ files: d.files.map(f => gearItem(f)),
153
+ }));
154
+ const inside = actor.plane === 'matrix' ? actor.hostInside : undefined;
155
+ const host = inside && !inside.over.offlineServer && (inside.cracked || inside.searchedBy.has(actor.name))
156
+ ? { name: inside.name, ...(inside.cracked ? { cracked: true } : {}), files: inside.files().map(f => gearItem(f)) }
157
+ : null;
158
+ return { worn: wornTree(actor) ?? null, augments: augmentTree(actor) ?? null, carried, home, data, host };
147
159
  }
148
160
  /** The AUGMENTS tree: the 'ware is equipment you cannot take off, hung
149
161
  * where it sits (catalog v30 `location`). Undefined with no 'ware. */
@@ -185,6 +185,8 @@ export function serializeItem(item) {
185
185
  out.storedPrograms = [...item.storedPrograms];
186
186
  if (item.papers.length > 0)
187
187
  out.papers = item.papers.map(serializeItem);
188
+ if (item.files.length > 0)
189
+ out.files = item.files.map(serializeItem);
188
190
  if (item.linkedSin)
189
191
  out.linkedSin = item.linkedSin;
190
192
  if (item.licenseType)
@@ -256,6 +258,8 @@ export function restoreItem(json) {
256
258
  item.storedPrograms = [...json.storedPrograms];
257
259
  if (json.papers)
258
260
  item.papers = json.papers.map(restoreItem);
261
+ if (json.files)
262
+ item.files = json.files.map(restoreItem);
259
263
  if (json.linkedSin)
260
264
  item.linkedSin = json.linkedSin;
261
265
  if (json.licenseType)
@@ -29,7 +29,7 @@ export const HELP_CATEGORIES = [
29
29
  // entered like any other -- "mark jackpoint" takes its invitation
30
30
  // (utilities/invitations.ts), "enter jackpoint" walks in. The bare word is still
31
31
  // caught before the typo matcher (game.ts) so it cannot read as `jack`.
32
- { title: 'matrix', entries: [['jack'], ['deck'], ['load'], ['unload'], ['hack'], ['force', 'brute', 'smash'], ['mark', 'marks'], ['unmark'], ['disable'], ['brick'], ['download'], ['enter'], ['exit-host'], ['hop'], ['tap', 'splice'], ['snoop'], ['overwatch', 'os'], ['hide'], ['edit'], ['erase', 'wipe'], ['pan'], ['wireless'], ['ar'], ['aros'], ['silent'], ['reboot'], ['agent'], ['drone'], ['jump', 'rig']] },
32
+ { title: 'matrix', entries: [['jack'], ['deck'], ['load'], ['unload'], ['hack'], ['force', 'brute', 'smash'], ['mark', 'marks'], ['unmark'], ['disable'], ['brick'], ['download'], ['upload'], ['transfer'], ['enter'], ['exit-host'], ['hop'], ['tap', 'splice'], ['snoop'], ['overwatch', 'os'], ['hide'], ['edit'], ['erase', 'wipe'], ['pan'], ['wireless'], ['ar'], ['aros'], ['silent'], ['reboot'], ['agent'], ['drone'], ['jump', 'rig']] },
33
33
  // The Emerged get their own shelf (player request: "there MUST be
34
34
  // resonance" -- matrix is the place, Resonance is the talent).
35
35
  // `sustain` shelves here and not under magic: the command is
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maka/maka-cli",
3
- "version": "5.378.0",
3
+ "version": "5.379.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.",