@maka/maka-cli 5.64.0 → 5.65.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 (161) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.d.ts +29 -2
  3. package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.js +146 -1
  4. package/bundle/typescript/src/commands/game/sideQuest/commands/backlog.js.map +1 -1
  5. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.d.ts +40 -13
  6. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js +107 -25
  7. package/bundle/typescript/src/commands/game/sideQuest/commands/bluff.js.map +1 -1
  8. package/bundle/typescript/src/commands/game/sideQuest/commands/breach.d.ts +11 -15
  9. package/bundle/typescript/src/commands/game/sideQuest/commands/breach.js +13 -16
  10. package/bundle/typescript/src/commands/game/sideQuest/commands/breach.js.map +1 -1
  11. package/bundle/typescript/src/commands/game/sideQuest/commands/buy.d.ts +8 -0
  12. package/bundle/typescript/src/commands/game/sideQuest/commands/buy.js +30 -2
  13. package/bundle/typescript/src/commands/game/sideQuest/commands/buy.js.map +1 -1
  14. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.d.ts +40 -49
  15. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js +121 -160
  16. package/bundle/typescript/src/commands/game/sideQuest/commands/bypass-command.js.map +1 -1
  17. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.d.ts +7 -8
  18. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js +13 -13
  19. package/bundle/typescript/src/commands/game/sideQuest/commands/cast.js.map +1 -1
  20. package/bundle/typescript/src/commands/game/sideQuest/commands/cover.d.ts +30 -0
  21. package/bundle/typescript/src/commands/game/sideQuest/commands/cover.js +65 -0
  22. package/bundle/typescript/src/commands/game/sideQuest/commands/cover.js.map +1 -0
  23. package/bundle/typescript/src/commands/game/sideQuest/commands/dispel.d.ts +1 -1
  24. package/bundle/typescript/src/commands/game/sideQuest/commands/dispel.js +2 -2
  25. package/bundle/typescript/src/commands/game/sideQuest/commands/dispel.js.map +1 -1
  26. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js +25 -3
  27. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js.map +1 -1
  28. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.d.ts +2 -3
  29. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js +2 -2
  30. package/bundle/typescript/src/commands/game/sideQuest/commands/hack.js.map +1 -1
  31. package/bundle/typescript/src/commands/game/sideQuest/commands/jobs.js +2 -1
  32. package/bundle/typescript/src/commands/game/sideQuest/commands/jobs.js.map +1 -1
  33. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js +58 -2
  34. package/bundle/typescript/src/commands/game/sideQuest/commands/look.js.map +1 -1
  35. package/bundle/typescript/src/commands/game/sideQuest/commands/map.js +18 -4
  36. package/bundle/typescript/src/commands/game/sideQuest/commands/map.js.map +1 -1
  37. package/bundle/typescript/src/commands/game/sideQuest/commands/move.js +1 -1
  38. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.d.ts +2 -3
  39. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js +2 -2
  40. package/bundle/typescript/src/commands/game/sideQuest/commands/pick.js.map +1 -1
  41. package/bundle/typescript/src/commands/game/sideQuest/commands/posture.d.ts +45 -0
  42. package/bundle/typescript/src/commands/game/sideQuest/commands/posture.js +115 -0
  43. package/bundle/typescript/src/commands/game/sideQuest/commands/posture.js.map +1 -0
  44. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js +35 -24
  45. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js.map +1 -1
  46. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js +12 -0
  47. package/bundle/typescript/src/commands/game/sideQuest/commands/take.js.map +1 -1
  48. package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js +1 -1
  49. package/bundle/typescript/src/commands/game/sideQuest/commands/unlock.js.map +1 -1
  50. package/bundle/typescript/src/commands/game/sideQuest/commands/use.d.ts +17 -0
  51. package/bundle/typescript/src/commands/game/sideQuest/commands/use.js +136 -1
  52. package/bundle/typescript/src/commands/game/sideQuest/commands/use.js.map +1 -1
  53. package/bundle/typescript/src/commands/game/sideQuest/engine-version.d.ts +1 -1
  54. package/bundle/typescript/src/commands/game/sideQuest/engine-version.js +15 -1
  55. package/bundle/typescript/src/commands/game/sideQuest/engine-version.js.map +1 -1
  56. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.d.ts +82 -43
  57. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +419 -263
  58. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js.map +1 -1
  59. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +82 -84
  60. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js.map +1 -1
  61. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.d.ts +23 -4
  62. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js +95 -79
  63. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-seed-generator.js.map +1 -1
  64. package/bundle/typescript/src/commands/game/sideQuest/factories/seed-migration.d.ts +30 -0
  65. package/bundle/typescript/src/commands/game/sideQuest/factories/seed-migration.js +176 -0
  66. package/bundle/typescript/src/commands/game/sideQuest/factories/seed-migration.js.map +1 -0
  67. package/bundle/typescript/src/commands/game/sideQuest/game.js +11 -5
  68. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  69. package/bundle/typescript/src/commands/game/sideQuest/headless.js +24 -0
  70. package/bundle/typescript/src/commands/game/sideQuest/headless.js.map +1 -1
  71. package/bundle/typescript/src/commands/game/sideQuest/models/_index.d.ts +0 -1
  72. package/bundle/typescript/src/commands/game/sideQuest/models/_index.js +0 -1
  73. package/bundle/typescript/src/commands/game/sideQuest/models/_index.js.map +1 -1
  74. package/bundle/typescript/src/commands/game/sideQuest/models/device.d.ts +121 -0
  75. package/bundle/typescript/src/commands/game/sideQuest/models/device.js +145 -0
  76. package/bundle/typescript/src/commands/game/sideQuest/models/device.js.map +1 -0
  77. package/bundle/typescript/src/commands/game/sideQuest/models/door.d.ts +27 -8
  78. package/bundle/typescript/src/commands/game/sideQuest/models/door.js +15 -10
  79. package/bundle/typescript/src/commands/game/sideQuest/models/door.js.map +1 -1
  80. package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +81 -0
  81. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +132 -21
  82. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
  83. package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +68 -0
  84. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +102 -0
  85. package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
  86. package/bundle/typescript/src/commands/game/sideQuest/models/room.d.ts +32 -46
  87. package/bundle/typescript/src/commands/game/sideQuest/models/room.js +38 -63
  88. package/bundle/typescript/src/commands/game/sideQuest/models/room.js.map +1 -1
  89. package/bundle/typescript/src/commands/game/sideQuest/models/scene.d.ts +1 -4
  90. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +0 -22
  91. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js.map +1 -1
  92. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene1.json +78 -109
  93. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene2.json +4 -101
  94. package/bundle/typescript/src/commands/game/sideQuest/types/save-file.d.ts +24 -0
  95. package/bundle/typescript/src/commands/game/sideQuest/types/seed/device-seed.d.ts +52 -0
  96. package/bundle/typescript/src/commands/game/sideQuest/types/seed/device-seed.js +2 -0
  97. package/bundle/typescript/src/commands/game/sideQuest/types/seed/device-seed.js.map +1 -0
  98. package/bundle/typescript/src/commands/game/sideQuest/types/seed/legacy-puzzle-seed.d.ts +63 -0
  99. package/bundle/typescript/src/commands/game/sideQuest/types/seed/legacy-puzzle-seed.js +2 -0
  100. package/bundle/typescript/src/commands/game/sideQuest/types/seed/legacy-puzzle-seed.js.map +1 -0
  101. package/bundle/typescript/src/commands/game/sideQuest/types/seed/player-seed.d.ts +6 -0
  102. package/bundle/typescript/src/commands/game/sideQuest/types/seed/room-seed.d.ts +4 -0
  103. package/bundle/typescript/src/commands/game/sideQuest/types/seed/scene-seed.d.ts +3 -2
  104. package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.d.ts +2 -28
  105. package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.js +1 -14
  106. package/bundle/typescript/src/commands/game/sideQuest/types/shared/abstracts.js.map +1 -1
  107. package/bundle/typescript/src/commands/game/sideQuest/ui.js +24 -0
  108. package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
  109. package/bundle/typescript/src/commands/game/sideQuest/utilities/affordances.d.ts +55 -0
  110. package/bundle/typescript/src/commands/game/sideQuest/utilities/affordances.js +36 -0
  111. package/bundle/typescript/src/commands/game/sideQuest/utilities/affordances.js.map +1 -0
  112. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-review.d.ts +45 -0
  113. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-review.js +116 -0
  114. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog-review.js.map +1 -0
  115. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.d.ts +67 -1
  116. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.js +56 -1
  117. package/bundle/typescript/src/commands/game/sideQuest/utilities/backlog.js.map +1 -1
  118. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js +37 -4
  119. package/bundle/typescript/src/commands/game/sideQuest/utilities/combat-exchange.js.map +1 -1
  120. package/bundle/typescript/src/commands/game/sideQuest/utilities/credentials.d.ts +26 -0
  121. package/bundle/typescript/src/commands/game/sideQuest/utilities/credentials.js +48 -0
  122. package/bundle/typescript/src/commands/game/sideQuest/utilities/credentials.js.map +1 -0
  123. package/bundle/typescript/src/commands/game/sideQuest/utilities/devices.d.ts +23 -0
  124. package/bundle/typescript/src/commands/game/sideQuest/utilities/devices.js +55 -0
  125. package/bundle/typescript/src/commands/game/sideQuest/utilities/devices.js.map +1 -0
  126. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.d.ts +57 -2
  127. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.js +46 -3
  128. package/bundle/typescript/src/commands/game/sideQuest/utilities/fuzzy-match.js.map +1 -1
  129. package/bundle/typescript/src/commands/game/sideQuest/utilities/log-style.d.ts +16 -0
  130. package/bundle/typescript/src/commands/game/sideQuest/utilities/log-style.js +18 -0
  131. package/bundle/typescript/src/commands/game/sideQuest/utilities/log-style.js.map +1 -1
  132. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +68 -38
  133. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js.map +1 -1
  134. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.d.ts +3 -3
  135. package/bundle/typescript/src/commands/game/sideQuest/utilities/room-grid.js +3 -3
  136. package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.d.ts +36 -12
  137. package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.js +101 -27
  138. package/bundle/typescript/src/commands/game/sideQuest/utilities/spots.js.map +1 -1
  139. package/bundle/typescript/src/commands/game/sideQuest/utilities/use-target.d.ts +88 -0
  140. package/bundle/typescript/src/commands/game/sideQuest/utilities/use-target.js +113 -0
  141. package/bundle/typescript/src/commands/game/sideQuest/utilities/use-target.js.map +1 -0
  142. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +54 -5
  143. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
  144. package/bundle/typescript/src/maka.js +1 -1
  145. package/bundle/typescript/src/maka.js.map +1 -1
  146. package/bundle/typescript/src/tools/sdk-loader/relocate.d.ts +19 -2
  147. package/bundle/typescript/src/tools/sdk-loader/relocate.js +22 -2
  148. package/bundle/typescript/src/tools/sdk-loader/relocate.js.map +1 -1
  149. package/package.json +1 -1
  150. package/bundle/typescript/src/commands/game/sideQuest/commands/solve.d.ts +0 -6
  151. package/bundle/typescript/src/commands/game/sideQuest/commands/solve.js +0 -72
  152. package/bundle/typescript/src/commands/game/sideQuest/commands/solve.js.map +0 -1
  153. package/bundle/typescript/src/commands/game/sideQuest/factories/puzzle-factory.d.ts +0 -6
  154. package/bundle/typescript/src/commands/game/sideQuest/factories/puzzle-factory.js +0 -26
  155. package/bundle/typescript/src/commands/game/sideQuest/factories/puzzle-factory.js.map +0 -1
  156. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.d.ts +0 -152
  157. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js +0 -393
  158. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js.map +0 -1
  159. package/bundle/typescript/src/commands/game/sideQuest/types/seed/puzzle-seed.d.ts +0 -28
  160. package/bundle/typescript/src/commands/game/sideQuest/types/seed/puzzle-seed.js +0 -2
  161. package/bundle/typescript/src/commands/game/sideQuest/types/seed/puzzle-seed.js.map +0 -1
@@ -32,7 +32,15 @@ export interface ISkeletonExit {
32
32
  direction: string;
33
33
  targetRoom: string;
34
34
  keyRequired?: string;
35
- puzzle?: string;
35
+ /** A devices[].name that holds this door shut. That device lives in
36
+ * THIS room -- the one you must stand in to reach it. */
37
+ device?: string;
38
+ /** An npcs[].name who STANDS in this doorway and will not move.
39
+ * Mutually exclusive with `device`: an exit is gated by a person or
40
+ * by a mechanism, never both. The guard's position is DERIVED from
41
+ * the exit they hold (see assembleScene), so the two cannot disagree
42
+ * about where they are standing. */
43
+ guard?: string;
36
44
  }
37
45
  export interface ISkeletonRoom {
38
46
  name: string;
@@ -53,14 +61,21 @@ export interface ISkeletonNpc {
53
61
  plane?: 'meat' | 'matrix' | 'astral';
54
62
  startLocation: string;
55
63
  }
56
- export interface ISkeletonPuzzle {
64
+ export interface ISkeletonDevice {
57
65
  name: string;
58
- /** Room-anchored placement; omit for a door puzzle (referenced from exits[].puzzle). */
59
- room?: string;
66
+ /** REQUIRED. A device is always room-owned -- a keypad beside a grate
67
+ * physically stands in one room, the one you must be in to reach it.
68
+ * An exit it holds is declared FROM that same room. */
69
+ room: string;
60
70
  concept: string;
61
- bypassType?: 'lockpick' | 'hack' | 'spell' | 'con';
62
- requiresPuzzle?: string;
63
- rewardItem?: string;
71
+ /** lock (a mechanism -- picked, breached, or opened by its key),
72
+ * panel (an interface -- a code, or hacked), ward (a working -- cast
73
+ * at or dispelled). Anything unrecognised CLAMPS to 'panel' rather
74
+ * than throwing: a device whose kind we cannot read is still a
75
+ * device, and rejecting a whole draft over one word is a worse
76
+ * outcome than a keypad where the model meant something else. */
77
+ kind?: 'lock' | 'panel' | 'ward';
78
+ grantsItem?: string;
64
79
  }
65
80
  export type SkeletonItemRole = 'winCondition' | 'reward' | 'key' | 'clue' | 'loot' | 'starting';
66
81
  export interface ISkeletonItem {
@@ -70,8 +85,8 @@ export interface ISkeletonItem {
70
85
  room?: string;
71
86
  heldBy?: string;
72
87
  plane?: 'meat' | 'matrix';
73
- /** clue items only: which puzzle's requiredPhrase this clue reveals. */
74
- forPuzzle?: string;
88
+ /** clue items only: which device's code this clue reveals. */
89
+ forDevice?: string;
75
90
  }
76
91
  export interface ISceneSkeleton {
77
92
  name: string;
@@ -79,7 +94,7 @@ export interface ISceneSkeleton {
79
94
  completionMessage: string;
80
95
  rooms: ISkeletonRoom[];
81
96
  npcs: ISkeletonNpc[];
82
- puzzles: ISkeletonPuzzle[];
97
+ devices: ISkeletonDevice[];
83
98
  items: ISkeletonItem[];
84
99
  winCondition: {
85
100
  item: string;
@@ -123,13 +138,15 @@ export interface INpcDetail {
123
138
  dialogue: string[];
124
139
  combat?: Record<string, unknown>;
125
140
  }
126
- export interface IPuzzleDetail {
141
+ export interface IDeviceDetail {
127
142
  name: string;
128
- riddle: string;
129
- requiredPhrase: string;
130
- successMessage: string;
131
- failureMessage: string;
132
- lockedMessage?: string;
143
+ description: string;
144
+ /** ONLY meaningful on a 'panel'. You cannot talk at a mechanical
145
+ * lock, and a ward answers to the Art -- neither has anything to
146
+ * hear a phrase with. */
147
+ code?: string;
148
+ openMessage: string;
149
+ refuseMessage: string;
133
150
  guardsExit?: string;
134
151
  footprint?: 'small' | 'medium' | 'large';
135
152
  }
@@ -150,7 +167,7 @@ export interface IItemDetail {
150
167
  export interface ISceneDetails {
151
168
  rooms: IRoomDetail[];
152
169
  npcs: INpcDetail[];
153
- puzzles: IPuzzleDetail[];
170
+ devices: IDeviceDetail[];
154
171
  items: IItemDetail[];
155
172
  }
156
173
  /**
@@ -159,20 +176,21 @@ export interface ISceneDetails {
159
176
  * Returns '' when no player is available.
160
177
  */
161
178
  /**
162
- * SPELL OUT THE CLUE RULE, IN THIS RUNNER'S TERMS. The dossier already
163
- * hints at it in prose ("con"-bypass barriers for a talker), and the
164
- * model still missed it: the single most common generation failure on
165
- * record is a barrier this runner can't open with no clue written for
166
- * it. It's character-dependent, which is what made it look like random
167
- * flakiness -- a Face satisfies exactly ONE of the four bypass types, so
168
- * three quarters of the barriers the model naturally reaches for demand
169
- * a clue item, and it keeps forgetting.
179
+ * THE ONE BARRIER RULE THAT STILL DEPENDS ON WHO IS PLAYING.
180
+ *
181
+ * This used to name all three barrier types the runner could and could
182
+ * not force, and demand a clue for each one they could not -- the
183
+ * single most common generation failure on record, and one that looked
184
+ * like random flakiness precisely because it varied with the character.
170
185
  *
171
- * So state it mechanically instead of hinting: name the types they can
172
- * and can't do, and name the consequence. normalizeSkeleton repairs this
173
- * anyway -- this is the half that stops the fault being authored at all.
186
+ * It shrank to this because the clue/key rule became UNCONDITIONAL for
187
+ * panels and locks (see partyCanDispel): a code is findable and a key
188
+ * is placeable, so both are openable by ANY runner and there is nothing
189
+ * character-dependent left to state. A ward is the exception that
190
+ * cannot be written away -- no clue rescues it for a mundane team -- so
191
+ * it is the only thing this still says.
174
192
  */
175
- export declare function bypassBrief(player: Player): string;
193
+ export declare function wardBrief(player: Player): string;
176
194
  export declare function buildPlayerDossier(player?: Player): string;
177
195
  /** The crew summary generation scales opposition against (Phase A of
178
196
  * the party system): name, archetype, and the statline headline. */
@@ -196,20 +214,34 @@ export declare function partyHeadcount(crew?: ICrewDossierEntry[]): number;
196
214
  export declare function buildSkeletonPrompt(tier: number, player?: Player, previousError?: string, rumor?: string, crew?: ICrewDossierEntry[], canonBlock?: string): string;
197
215
  export declare function buildRoomsPrompt(skeleton: ISceneSkeleton, previousError?: string): string;
198
216
  export declare function buildNpcsPrompt(skeleton: ISceneSkeleton, previousError?: string): string;
199
- export declare function buildPuzzlesPrompt(skeleton: ISceneSkeleton, previousError?: string): string;
200
- export declare function buildItemsPrompt(skeleton: ISceneSkeleton, puzzles: IPuzzleDetail[], previousError?: string): string;
217
+ export declare function buildDevicesPrompt(skeleton: ISceneSkeleton, previousError?: string): string;
218
+ export declare function buildItemsPrompt(skeleton: ISceneSkeleton, devices: IDeviceDetail[], previousError?: string): string;
201
219
  /**
202
- * Whether THIS runner can reliably work a barrier of the given bypassType
203
- * with their own hands -- no written-down credential required. This is
204
- * what loosens the "every puzzle needs a discoverable clue" rule when the
205
- * scene is generated against a dossier: a lockpick maglock in a scene
206
- * built for a master locksmith doesn't need its code lying in a book --
207
- * the pick IS their route. Deliberately conservative: EXPLICIT skill
208
- * ratings only (the combatSkill fallback would let any bruiser "qualify"
209
- * as a hacker), threshold 3 (trained professional), and with no dossier
210
- * at all the strict clue rule stays.
220
+ * Can anyone at this table unweave a WARD?
221
+ *
222
+ * The last surviving branch of what used to be canBypassUnaided, which
223
+ * asked the same question of all three barrier kinds. The other two are
224
+ * gone because their answers stopped mattering (ruling 2026-08-27):
225
+ *
226
+ * A PANEL takes a code, and a code is FINDABLE. Write it down and any
227
+ * runner can type it; a decker who did not need it loses nothing.
228
+ * A LOCK takes a key, and a key is FINDABLE. Place it and any runner
229
+ * can carry it to the door; picking becomes the SHORTCUT for someone
230
+ * with locksmith, not the requirement.
231
+ *
232
+ * So for those two the clue/key rule is UNCONDITIONAL now, and the
233
+ * character-dependent waiver is gone with the condition it rested on.
234
+ *
235
+ * A WARD is irreducible. There is no findable answer to a ward; it takes
236
+ * Magic. A mundane team cannot dispel one however much is written down,
237
+ * so a ward generated for a party with nobody awakened is an unopenable
238
+ * barrier no clue can rescue. That is where the character dependence is
239
+ * REAL rather than incidental, and it is the only place this survives.
240
+ *
241
+ * Named for what it now is: a one-case function still called
242
+ * canBypassUnaided would attract the other two cases back.
211
243
  */
212
- export declare function canBypassUnaided(player: Player | undefined, bypassType?: string): boolean;
244
+ export declare function partyCanDispel(player: Player | undefined): boolean;
213
245
  /** Strips accidental markdown fences and parses; throws with a useful message. */
214
246
  export declare function parseJsonReply<T>(reply: string): T;
215
247
  /**
@@ -218,7 +250,14 @@ export declare function parseJsonReply<T>(reply: string): T;
218
250
  * matrix defense...) are still enforced by the assembled-scene validators.
219
251
  */
220
252
  export declare function validateSkeleton(skeleton: ISceneSkeleton, player?: Player, crew?: ICrewDossierEntry[]): void;
221
- export declare function normalizeSkeleton(skeleton: ISceneSkeleton, player?: Player): string[];
253
+ /**
254
+ * `player` is GONE from this signature, not underscored. Its only
255
+ * consumer was the character-dependent clue waiver, and with the
256
+ * clue/key rule unconditional there is nothing here that varies with
257
+ * who is playing. A parameter kept "just in case" is an invitation to
258
+ * make normalization character-dependent again.
259
+ */
260
+ export declare function normalizeSkeleton(skeleton: ISceneSkeleton): string[];
222
261
  /**
223
262
  * THE ANSWER HAS TO BE WRITTEN DOWN. The other half of the clue problem,
224
263
  * and the more expensive half.
@@ -290,7 +329,7 @@ export declare function resolveSpotName(declared: string, spotNames: string[]):
290
329
  */
291
330
  export declare function ensureCredentialKindAgrees(details: ISceneDetails): string[];
292
331
  export declare function assembleScene(skeleton: ISceneSkeleton, details: ISceneDetails, playerName: string): ISceneSeedJson;
293
- export type RepairTarget = 'rooms' | 'npcs' | 'puzzles' | 'items' | 'skeleton';
332
+ export type RepairTarget = 'rooms' | 'npcs' | 'devices' | 'items' | 'skeleton';
294
333
  /**
295
334
  * Maps a validation failure to the chunk that owns the broken content, so
296
335
  * a repair regenerates ONE pass instead of the whole scene. Anything