@archivist-gg/dnd5e 0.3.17 → 0.3.19

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 (99) hide show
  1. package/dist/background/background.codec.js +5 -5
  2. package/dist/background/background.parser.js +4 -4
  3. package/dist/background/background.schema.js +3 -3
  4. package/dist/{chunk-7QN7XSAK.js → chunk-3SFGWFVQ.js} +1 -1
  5. package/dist/{chunk-2UDSN6VW.js → chunk-3SIUAFDQ.js} +1 -1
  6. package/dist/chunk-4J6DS3EJ.js +30 -0
  7. package/dist/{chunk-RLGQ5PZZ.js → chunk-5JXFJ5AU.js} +11 -1
  8. package/dist/{chunk-TULQ4FFX.js → chunk-64VNLMSG.js} +31 -9
  9. package/dist/{chunk-JSM6JFZR.js → chunk-7XJHI5H5.js} +2 -2
  10. package/dist/{chunk-YD2VAHA6.js → chunk-B2QHP6UF.js} +2 -2
  11. package/dist/{chunk-AZRGFUSR.js → chunk-BJGOSM76.js} +1 -1
  12. package/dist/{chunk-JCMUVZIK.js → chunk-BJWSOQUC.js} +1 -1
  13. package/dist/{chunk-ONTGZR5T.js → chunk-EJD47JHL.js} +64 -32
  14. package/dist/{chunk-FANQVQ3D.js → chunk-FJYBLXV7.js} +2 -2
  15. package/dist/{chunk-PQZ4LM4Z.js → chunk-FMUD3LDV.js} +1 -1
  16. package/dist/{chunk-PKX6TGRE.js → chunk-FMYWORTP.js} +2 -2
  17. package/dist/{chunk-G6PBI2BU.js → chunk-FVXLP7P3.js} +1 -1
  18. package/dist/{chunk-MBX25B6D.js → chunk-GVWEFECG.js} +1 -1
  19. package/dist/{chunk-Y5VVP73C.js → chunk-HY2SRSVM.js} +1 -1
  20. package/dist/{chunk-2JSQE3DD.js → chunk-JXWNXIIZ.js} +13 -0
  21. package/dist/{chunk-VRV3NNTA.js → chunk-LICYHPI3.js} +81 -5
  22. package/dist/{chunk-LF5AGJA4.js → chunk-LNT64X7C.js} +1 -1
  23. package/dist/{chunk-6EI737IO.js → chunk-NKZMQV2C.js} +1 -1
  24. package/dist/{chunk-T6QIF5XR.js → chunk-NTU2DXNG.js} +9 -2
  25. package/dist/{chunk-3VZZDKRA.js → chunk-NXUY5XQN.js} +63 -15
  26. package/dist/{chunk-QZSWN2KT.js → chunk-NZO7M5GV.js} +1 -1
  27. package/dist/{chunk-5MXFW4O3.js → chunk-OOL4KMG2.js} +1 -1
  28. package/dist/{chunk-H5PTKYXL.js → chunk-QA3YCOML.js} +1 -1
  29. package/dist/{chunk-3MGQFFNE.js → chunk-QFWQKS3M.js} +1 -1
  30. package/dist/{chunk-HTYMW5CH.js → chunk-RD2MID3M.js} +67 -3
  31. package/dist/{chunk-PXVNAY7T.js → chunk-TRBGC4ZG.js} +29 -1
  32. package/dist/{chunk-UUBJCNQU.js → chunk-UJCK5IW4.js} +2 -2
  33. package/dist/{chunk-OFCSP6MT.js → chunk-UNYR5GLI.js} +1 -1
  34. package/dist/{chunk-DOXSFYLH.js → chunk-VN5DLURA.js} +2 -2
  35. package/dist/{chunk-7ATNGKBS.js → chunk-VP5TIXDK.js} +1 -1
  36. package/dist/{chunk-QH36K2PU.js → chunk-WOHX7YTH.js} +7 -0
  37. package/dist/{chunk-YKL6SHRJ.js → chunk-XTEFPUSN.js} +1 -1
  38. package/dist/{chunk-RYLXAYIQ.js → chunk-ZOWKWMD2.js} +1 -1
  39. package/dist/class/class.codec.js +6 -6
  40. package/dist/class/class.parser.js +5 -5
  41. package/dist/class/class.schema.js +4 -4
  42. package/dist/dnd/amount-text.d.ts +4 -0
  43. package/dist/dnd/amount-text.js +3 -1
  44. package/dist/entities/registry-revision.d.ts +25 -0
  45. package/dist/entities/registry-revision.js +10 -0
  46. package/dist/feat/feat.codec.js +5 -5
  47. package/dist/feat/feat.parser.js +4 -4
  48. package/dist/feat/feat.schema.d.ts +9 -0
  49. package/dist/feat/feat.schema.js +3 -3
  50. package/dist/index.js +3720 -338
  51. package/dist/monster/monster.parser.js +5 -5
  52. package/dist/monster/monster.schema.js +4 -4
  53. package/dist/optional-feature/optional-feature.codec.js +5 -5
  54. package/dist/optional-feature/optional-feature.parser.js +4 -4
  55. package/dist/optional-feature/optional-feature.schema.d.ts +9 -0
  56. package/dist/optional-feature/optional-feature.schema.js +3 -3
  57. package/dist/pc/pc.additional-spells.d.ts +16 -2
  58. package/dist/pc/pc.additional-spells.js +4 -1
  59. package/dist/pc/pc.amount-bindings.d.ts +11 -2
  60. package/dist/pc/pc.amount-bindings.js +6 -1
  61. package/dist/pc/pc.decision-engine.d.ts +8 -0
  62. package/dist/pc/pc.decision-engine.js +13 -10
  63. package/dist/pc/pc.entry-overrides.js +3 -2
  64. package/dist/pc/pc.equipment.js +5 -4
  65. package/dist/pc/pc.feature-effects.d.ts +9 -2
  66. package/dist/pc/pc.feature-effects.js +15 -2
  67. package/dist/pc/pc.infusions.js +3 -2
  68. package/dist/pc/pc.member-choices.d.ts +33 -1
  69. package/dist/pc/pc.member-choices.js +12 -5
  70. package/dist/pc/pc.parser.js +1 -1
  71. package/dist/pc/pc.pools.js +3 -2
  72. package/dist/pc/pc.proficiencies.d.ts +14 -0
  73. package/dist/pc/pc.proficiencies.js +68 -19
  74. package/dist/pc/pc.proficiency-normalize.d.ts +14 -0
  75. package/dist/pc/pc.proficiency-normalize.js +9 -3
  76. package/dist/pc/pc.proficiency-query.js +1 -1
  77. package/dist/pc/pc.recalc.js +151 -55
  78. package/dist/pc/pc.resolver.d.ts +4 -1
  79. package/dist/pc/pc.resolver.js +10 -9
  80. package/dist/pc/pc.rest.js +3 -2
  81. package/dist/pc/pc.schema.d.ts +19 -0
  82. package/dist/pc/pc.schema.js +1 -1
  83. package/dist/pc/pc.spell-scope.d.ts +22 -0
  84. package/dist/pc/pc.tool-picks.js +2 -2
  85. package/dist/pc/pc.types.d.ts +65 -4
  86. package/dist/race/race.codec.js +6 -6
  87. package/dist/race/race.parser.js +5 -5
  88. package/dist/race/race.schema.js +4 -4
  89. package/dist/schemas/choice-schema.js +2 -2
  90. package/dist/schemas/feature-effect-schema.d.ts +9 -0
  91. package/dist/schemas/feature-effect-schema.js +1 -1
  92. package/dist/schemas/feature-schema.js +3 -3
  93. package/dist/subclass/subclass.codec.js +6 -6
  94. package/dist/subclass/subclass.parser.js +5 -5
  95. package/dist/subclass/subclass.schema.js +4 -4
  96. package/dist/types/choice.d.ts +2 -2
  97. package/dist/types/feature-effect.d.ts +18 -0
  98. package/dist/types/optional-feature.types.d.ts +1 -1
  99. package/package.json +1 -1
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  migrateLegacy,
3
3
  parseMonster
4
- } from "../chunk-JCMUVZIK.js";
5
- import "../chunk-7ATNGKBS.js";
6
- import "../chunk-YD2VAHA6.js";
4
+ } from "../chunk-BJWSOQUC.js";
5
+ import "../chunk-VP5TIXDK.js";
6
+ import "../chunk-B2QHP6UF.js";
7
7
  import "../chunk-WYGD2UGN.js";
8
8
  import "../chunk-ZJXSXVFP.js";
9
- import "../chunk-5MXFW4O3.js";
10
- import "../chunk-2JSQE3DD.js";
9
+ import "../chunk-OOL4KMG2.js";
10
+ import "../chunk-JXWNXIIZ.js";
11
11
  import "../chunk-UA5KS2PL.js";
12
12
  export {
13
13
  migrateLegacy,
@@ -11,12 +11,12 @@ import {
11
11
  monsterSpeedSchema,
12
12
  monsterSpellcastingSchema,
13
13
  monsterTypeSchema
14
- } from "../chunk-7ATNGKBS.js";
15
- import "../chunk-YD2VAHA6.js";
14
+ } from "../chunk-VP5TIXDK.js";
15
+ import "../chunk-B2QHP6UF.js";
16
16
  import "../chunk-WYGD2UGN.js";
17
17
  import "../chunk-ZJXSXVFP.js";
18
- import "../chunk-5MXFW4O3.js";
19
- import "../chunk-2JSQE3DD.js";
18
+ import "../chunk-OOL4KMG2.js";
19
+ import "../chunk-JXWNXIIZ.js";
20
20
  import "../chunk-UA5KS2PL.js";
21
21
  export {
22
22
  MONSTER_KNOWN_KEYS,
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  optionalFeatureCodec
3
- } from "../chunk-G6PBI2BU.js";
4
- import "../chunk-PQZ4LM4Z.js";
5
- import "../chunk-DOXSFYLH.js";
3
+ } from "../chunk-FVXLP7P3.js";
4
+ import "../chunk-FMUD3LDV.js";
5
+ import "../chunk-VN5DLURA.js";
6
6
  import "../chunk-WYGD2UGN.js";
7
7
  import "../chunk-ZJXSXVFP.js";
8
- import "../chunk-5MXFW4O3.js";
9
- import "../chunk-2JSQE3DD.js";
8
+ import "../chunk-OOL4KMG2.js";
9
+ import "../chunk-JXWNXIIZ.js";
10
10
  import "../chunk-UA5KS2PL.js";
11
11
  export {
12
12
  optionalFeatureCodec
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  parseOptionalFeature
3
- } from "../chunk-PQZ4LM4Z.js";
4
- import "../chunk-DOXSFYLH.js";
3
+ } from "../chunk-FMUD3LDV.js";
4
+ import "../chunk-VN5DLURA.js";
5
5
  import "../chunk-WYGD2UGN.js";
6
6
  import "../chunk-ZJXSXVFP.js";
7
- import "../chunk-5MXFW4O3.js";
8
- import "../chunk-2JSQE3DD.js";
7
+ import "../chunk-OOL4KMG2.js";
8
+ import "../chunk-JXWNXIIZ.js";
9
9
  import "../chunk-UA5KS2PL.js";
10
10
  export {
11
11
  parseOptionalFeature
@@ -301,6 +301,15 @@ export declare const optionalFeatureEntitySchema: z.ZodObject<{
301
301
  finesse: "finesse";
302
302
  thrown: "thrown";
303
303
  }>>]>>;
304
+ spell_scope: z.ZodOptional<z.ZodObject<{
305
+ list: z.ZodOptional<z.ZodString>;
306
+ level: z.ZodOptional<z.ZodNumber>;
307
+ school: z.ZodOptional<z.ZodString>;
308
+ damage_types: z.ZodOptional<z.ZodArray<z.ZodString>>;
309
+ damage_type_pick: z.ZodOptional<z.ZodString>;
310
+ spells: z.ZodOptional<z.ZodArray<z.ZodString>>;
311
+ once: z.ZodOptional<z.ZodBoolean>;
312
+ }, z.core.$strict>>;
304
313
  condition: z.ZodOptional<z.ZodString>;
305
314
  subject: z.ZodOptional<z.ZodString>;
306
315
  }, z.core.$strip>, z.ZodObject<{
@@ -2,11 +2,11 @@ import {
2
2
  infuseBlockSchema,
3
3
  optionRowSchema,
4
4
  optionalFeatureEntitySchema
5
- } from "../chunk-DOXSFYLH.js";
5
+ } from "../chunk-VN5DLURA.js";
6
6
  import "../chunk-WYGD2UGN.js";
7
7
  import "../chunk-ZJXSXVFP.js";
8
- import "../chunk-5MXFW4O3.js";
9
- import "../chunk-2JSQE3DD.js";
8
+ import "../chunk-OOL4KMG2.js";
9
+ import "../chunk-JXWNXIIZ.js";
10
10
  import "../chunk-UA5KS2PL.js";
11
11
  export {
12
12
  infuseBlockSchema,
@@ -3,7 +3,7 @@ import type { RaceEntity } from "@archivist-gg/dnd5e/race/race.types";
3
3
  import type { FeatEntity } from "@archivist-gg/dnd5e/feat/feat.types";
4
4
  import type { Spell } from "@archivist-gg/dnd5e/spell/spell.types";
5
5
  import type { Ability } from "@archivist-gg/dnd5e";
6
- import type { ResolvedClass, ResolvedSpell } from "./pc.types.js";
6
+ import type { ChoiceValue, ResolvedClass, ResolvedPool, ResolvedSpell } from "./pc.types.js";
7
7
  export declare const prefixOf: (slug: string) => string;
8
8
  /** §5.2.2 · a raw 5etools / bundle spell ref → the bare NAME slug. The path tail is taken ONLY for a wikilink; a bare
9
9
  * name may legally contain "/" ("blindness/deafness" → "blindnessdeafness", the converter's own slug tail · Gate 0 B1).
@@ -34,7 +34,16 @@ export declare function resolveSpellByName(opts: {
34
34
  /** §5.2.9 · fold a race's entries ONLY when no select-inline on race.choices[] / traits[].choices[] / nested option.choices[]
35
35
  * carries an id outside the structural set (nested: zero carriers, defensive). */
36
36
  export declare function raceIsUngated(race: RaceEntity): boolean;
37
- /** §5.2.1 · the reader. Every object it receives is the RAW registry entity; nothing is mutated. */
37
+ /** SRD-G T4: the slugs (value and label) of every option the character CHOSE on a race's content select-inlines
38
+ * (`race.choices[]` and `traits[].choices[]`, the structural set excluded), read through `read(<choice id>)`. */
39
+ export declare function chosenRaceOptionKeys(race: RaceEntity, read: (id: string) => ChoiceValue | undefined): Set<string>;
40
+ /** §5.2.1 · the reader. Every object it receives is the RAW registry entity; nothing is mutated.
41
+ *
42
+ * SRD-G T4 (audit §3a): the RACE root also reads (1) a race whose lineage select-inline GATES it: the entry NAMED like
43
+ * the option the character chose folds (the SRD 5.2 Tiefling's legacy, the Elf's and Gnome's lineage); an unnamed
44
+ * entry on a gated race still folds nothing (it may belong to any lineage); (2) an `ability: {choose}` entry, when
45
+ * `raceChoice("spellcasting-ability")` answers one of its abilities (unanswered, the entry waits for the pick);
46
+ * (3) the `innate` level spells (the level 3 / 5 once-per-Long-Rest spells), folded always prepared like `known`. */
38
47
  export declare function collectAdditionalSpells(args: {
39
48
  race: RaceEntity | null;
40
49
  feats: FeatEntity[];
@@ -44,4 +53,9 @@ export declare function collectAdditionalSpells(args: {
44
53
  alreadyCollected: ResolvedSpell[];
45
54
  entities: EntityRegistry;
46
55
  warnings: string[];
56
+ /** SRD-G T4: the character's answer to a race choice, by choice id (`origin_choices["race:<id>"]`). */
57
+ raceChoice?: (id: string) => ChoiceValue | undefined;
58
+ /** User report 2026-09-28: the RESOLVED pools. Every member the character has (a pick or a grant; an item-bound one's
59
+ * subject is its item) is a root, read at the owning class's level, its spells that class's. */
60
+ pools?: ReadonlyArray<ResolvedPool>;
47
61
  }): ResolvedSpell[];
@@ -1,13 +1,15 @@
1
1
  import {
2
2
  buildSpellNameIndex,
3
+ chosenRaceOptionKeys,
3
4
  collectAdditionalSpells,
4
5
  normalizeSpellRef,
5
6
  prefixOf,
6
7
  raceIsUngated,
7
8
  resolveSpellByName
8
- } from "../chunk-VRV3NNTA.js";
9
+ } from "../chunk-LICYHPI3.js";
9
10
  import "../chunk-PVCEA4HZ.js";
10
11
  import "../chunk-LVQLWRCU.js";
12
+ import "../chunk-4J6DS3EJ.js";
11
13
  import "../chunk-ZCTUYGNV.js";
12
14
  import "../chunk-7Q2VPKCD.js";
13
15
  import "../chunk-ZDAEGJH4.js";
@@ -15,6 +17,7 @@ import "../chunk-WELIKLZF.js";
15
17
  import "../chunk-UA5KS2PL.js";
16
18
  export {
17
19
  buildSpellNameIndex,
20
+ chosenRaceOptionKeys,
18
21
  collectAdditionalSpells,
19
22
  normalizeSpellRef,
20
23
  prefixOf,
@@ -4,8 +4,8 @@
4
4
  */
5
5
  import type { Ability } from "@archivist-gg/dnd5e/types/choice";
6
6
  import type { Spell } from "@archivist-gg/dnd5e/spell/spell.types";
7
- import type { AmountBindings } from "@archivist-gg/dnd5e/dnd/amount-text";
8
- import type { DerivedStats, FeatureSource, ResolvedCharacter, ResolvedSpell } from "./pc.types.js";
7
+ import { type AmountBindings } from "@archivist-gg/dnd5e/dnd/amount-text";
8
+ import type { DerivedStats, FeatureSource, ResolvedCharacter, ResolvedSpell, SpellDamageRider } from "./pc.types.js";
9
9
  /** The derived fields the bindings read (recalc builds them before its return; the sheet passes `ctx.derived`). */
10
10
  export type AmountDerived = Pick<DerivedStats, "proficiencyBonus" | "mods" | "spellcastingClasses"> & Partial<Pick<DerivedStats, "abilitySpellcasting">>;
11
11
  /** The class slug that owns `source`: a class by its slug, a subclass by the class that holds it, a feat through the
@@ -30,3 +30,12 @@ export declare function spellAmountBindings(spell: Pick<ResolvedSpell, "source"
30
30
  * null. Read from the note's own words at read time; the roll must be the one the phrase follows, so a spell whose
31
31
  * modifier rides a different roll (a heal beside a damage roll) adds nothing. */
32
32
  export declare function spellRollBonus(spell: Pick<Spell, "damage_roll" | "description">): string | null;
33
+ /** The spell's printed roll with every spell damage rider that reaches it added INSIDE the one roll (bonus damage prints
34
+ * in the damage cell, user ruling): Agonizing Blast's Charisma on its cantrip reads "1d10+3" (found live 2026-09-28),
35
+ * Potent Spellcasting's Wisdom on Sacred Flame "1d8+3". A conditional rider, or one of another canonical damage type
36
+ * than the spell's own, is not added here: it is a line of its own (`spellDamageRiderLines`). */
37
+ export declare function addSpellDamageRiders(roll: string, spell: Pick<ResolvedSpell, "slug" | "entity">, derived: Partial<Pick<DerivedStats, "spellDamageRiders">>): string;
38
+ /** The spell damage riders that reach `spell` but do not fold into its roll, each its own line in the damage cell, the
39
+ * way a conditional weapon rider is (Power Surge's "+ 5 force" once a surge is spent; Arcane Firearm's "+ 1d8" through
40
+ * the firearm): a `condition`, or another canonical damage type. `spells` and `once` are the engine's, not the line's. */
41
+ export declare function spellDamageRiderLines(spell: Pick<ResolvedSpell, "slug" | "entity">, derived: Partial<Pick<DerivedStats, "spellDamageRiders">>): Array<Pick<SpellDamageRider, "amount" | "damage_type" | "source" | "condition">>;
@@ -1,23 +1,28 @@
1
1
  import {
2
+ addSpellDamageRiders,
2
3
  amountBindingsFor,
3
4
  ownerClassSlug,
4
5
  spellAmountBindings,
6
+ spellDamageRiderLines,
5
7
  spellRollBonus,
6
8
  spellcastingFor
7
- } from "../chunk-PXVNAY7T.js";
9
+ } from "../chunk-TRBGC4ZG.js";
8
10
  import "../chunk-KR6JF3BF.js";
9
11
  import "../chunk-KSTV7J2U.js";
10
12
  import "../chunk-DPUJDOKV.js";
11
13
  import "../chunk-IUAAXXNO.js";
12
14
  import "../chunk-LVQLWRCU.js";
15
+ import "../chunk-WOHX7YTH.js";
13
16
  import "../chunk-EVMUJYUD.js";
14
17
  import "../chunk-VTTA2ALZ.js";
15
18
  import "../chunk-PDJSUH24.js";
16
19
  import "../chunk-WELIKLZF.js";
17
20
  export {
21
+ addSpellDamageRiders,
18
22
  amountBindingsFor,
19
23
  ownerClassSlug,
20
24
  spellAmountBindings,
25
+ spellDamageRiderLines,
21
26
  spellRollBonus,
22
27
  spellcastingFor
23
28
  };
@@ -203,6 +203,14 @@ export declare function computeEffectiveProficiencies(resolved: ResolvedCharacte
203
203
  languages: ProficiencyEntry[];
204
204
  tools: ProficiencyEntry[];
205
205
  };
206
+ /** D4 A: the complement of {@link computeEffectiveProficiencies}: every language and tool the character's grants, picks
207
+ * or adds would hold but `overrides.<domain>.remove` (or a `none` tools tri) suppresses, each entry keeping its
208
+ * `sources` and `origin`. The proficiency picker draws these struck through ("Dwarf · removed"). Both functions read
209
+ * ONE composer, so a row is kept or suppressed, never both and never neither. */
210
+ export declare function computeSuppressedProficiencies(resolved: ResolvedCharacter): {
211
+ languages: ProficiencyEntry[];
212
+ tools: ProficiencyEntry[];
213
+ };
206
214
  export interface OriginAbilityPoints {
207
215
  race: Partial<Record<Ability, number>>;
208
216
  background: Partial<Record<Ability, number>>;
@@ -4,31 +4,33 @@ import {
4
4
  buildDecisionLedger,
5
5
  collectChosenAbilityPoints,
6
6
  collectChosenProficiencies,
7
- computeEffectiveProficiencies
8
- } from "../chunk-ONTGZR5T.js";
7
+ computeEffectiveProficiencies,
8
+ computeSuppressedProficiencies
9
+ } from "../chunk-EJD47JHL.js";
9
10
  import "../chunk-2LULMQTF.js";
10
- import "../chunk-H5PTKYXL.js";
11
- import "../chunk-TULQ4FFX.js";
11
+ import "../chunk-QA3YCOML.js";
12
+ import "../chunk-64VNLMSG.js";
12
13
  import "../chunk-TOM66P2P.js";
13
14
  import "../chunk-KU3YLF6D.js";
14
- import "../chunk-HTYMW5CH.js";
15
+ import "../chunk-5JXFJ5AU.js";
16
+ import "../chunk-RD2MID3M.js";
17
+ import "../chunk-LICYHPI3.js";
18
+ import "../chunk-PVCEA4HZ.js";
15
19
  import "../chunk-KSTV7J2U.js";
16
20
  import "../chunk-DPUJDOKV.js";
17
21
  import "../chunk-LBEXLN6I.js";
18
- import "../chunk-RLGQ5PZZ.js";
19
- import "../chunk-3VZZDKRA.js";
22
+ import "../chunk-NXUY5XQN.js";
20
23
  import "../chunk-W6GC6OKK.js";
21
24
  import "../chunk-B3DP42OM.js";
22
25
  import "../chunk-IUAAXXNO.js";
23
26
  import "../chunk-YHYTW5QA.js";
24
- import "../chunk-VRV3NNTA.js";
25
- import "../chunk-PVCEA4HZ.js";
27
+ import "../chunk-ZUQW5VBZ.js";
26
28
  import "../chunk-IHE6KVC3.js";
27
29
  import "../chunk-LHZXYFBU.js";
28
30
  import "../chunk-YBLDE5CG.js";
29
- import "../chunk-ZUQW5VBZ.js";
30
31
  import "../chunk-LVQLWRCU.js";
31
32
  import "../chunk-CM5CWO4K.js";
33
+ import "../chunk-4J6DS3EJ.js";
32
34
  import "../chunk-EVMUJYUD.js";
33
35
  import "../chunk-VTTA2ALZ.js";
34
36
  import {
@@ -48,5 +50,6 @@ export {
48
50
  collectChosenAbilityPoints,
49
51
  collectChosenProficiencies,
50
52
  computeEffectiveProficiencies,
53
+ computeSuppressedProficiencies,
51
54
  wikilinkTailSlug
52
55
  };
@@ -11,15 +11,16 @@ import {
11
11
  isWeaponLikeEntry,
12
12
  itemChargesMax,
13
13
  scrollSpellCost
14
- } from "../chunk-3VZZDKRA.js";
14
+ } from "../chunk-NXUY5XQN.js";
15
15
  import "../chunk-W6GC6OKK.js";
16
16
  import "../chunk-B3DP42OM.js";
17
17
  import "../chunk-IUAAXXNO.js";
18
+ import "../chunk-ZUQW5VBZ.js";
18
19
  import "../chunk-IHE6KVC3.js";
19
20
  import "../chunk-LHZXYFBU.js";
20
- import "../chunk-ZUQW5VBZ.js";
21
21
  import "../chunk-LVQLWRCU.js";
22
22
  import "../chunk-CM5CWO4K.js";
23
+ import "../chunk-4J6DS3EJ.js";
23
24
  import "../chunk-ZCTUYGNV.js";
24
25
  import "../chunk-3TM34RSJ.js";
25
26
  import "../chunk-PDJSUH24.js";
@@ -4,22 +4,23 @@ import {
4
4
  computeSlotsAndAttacks,
5
5
  emptyAppliedBonuses,
6
6
  isWeaponSlugProficient
7
- } from "../chunk-JSM6JFZR.js";
7
+ } from "../chunk-7XJHI5H5.js";
8
8
  import "../chunk-3LWMFYKS.js";
9
9
  import "../chunk-YDGMBMYI.js";
10
10
  import "../chunk-EJP263OP.js";
11
- import "../chunk-RLGQ5PZZ.js";
12
- import "../chunk-3VZZDKRA.js";
11
+ import "../chunk-5JXFJ5AU.js";
12
+ import "../chunk-NXUY5XQN.js";
13
13
  import "../chunk-W6GC6OKK.js";
14
14
  import "../chunk-B3DP42OM.js";
15
15
  import "../chunk-IUAAXXNO.js";
16
+ import "../chunk-ZUQW5VBZ.js";
16
17
  import "../chunk-IHE6KVC3.js";
17
18
  import "../chunk-HHBD4SQ6.js";
18
19
  import "../chunk-A54HHCWW.js";
19
20
  import "../chunk-LHZXYFBU.js";
20
- import "../chunk-ZUQW5VBZ.js";
21
21
  import "../chunk-LVQLWRCU.js";
22
22
  import "../chunk-CM5CWO4K.js";
23
+ import "../chunk-4J6DS3EJ.js";
23
24
  import "../chunk-ZCTUYGNV.js";
24
25
  import "../chunk-3TM34RSJ.js";
25
26
  import "../chunk-PDJSUH24.js";
@@ -1,6 +1,6 @@
1
1
  import type { FeatureEffect, SenseType } from "@archivist-gg/dnd5e/types/feature-effect";
2
2
  import type { Ability } from "@archivist-gg/dnd5e";
3
- import type { DamageRider, DefenseGrant, FeatureSource, ResolvedCharacter, ResolvedFeature, RollModifierEntry, SaveOutcomeEntry } from "./pc.types.js";
3
+ import type { DamageRider, DefenseGrant, FeatureSource, ResolvedCharacter, ResolvedFeature, RollModifierEntry, SaveOutcomeEntry, SpellDamageRider } from "./pc.types.js";
4
4
  /**
5
5
  * A melee-attack ability override from a `weapon-ability` effect. `weaponSlugs`
6
6
  * (bare, namespace-stripped) scopes the override to matching weapon types only;
@@ -210,11 +210,18 @@ export interface FeatureEffectTotals {
210
210
  attackNotes: string[];
211
211
  /**
212
212
  * Additive on-hit damage riders from `damage-bonus` effects with
213
- * `applies_to` weapon/all (spell-only ignored — no spell surface). Each is
213
+ * `applies_to` weapon/all (spell and all riders also go to `spellDamageBonuses`). Each is
214
214
  * labeled with the owning feature's name. recalc merges these onto every
215
215
  * weapon AttackRow's `damageRiders`.
216
216
  */
217
217
  damageBonuses: DamageRider[];
218
+ /**
219
+ * The `damage-bonus` effects with `applies_to: spell` or `all`, labeled with the owning feature's name and carrying its
220
+ * `spellTargets` and `spell_scope` (found live 2026-09-28: they were dropped here, so Agonizing Blast never reached its
221
+ * cantrip). recalc reads each against the character's spells (`spellsReached`, `spellsInScope`) into
222
+ * `DerivedStats.spellDamageRiders`.
223
+ */
224
+ spellDamageBonuses: SpellDamageRider[];
218
225
  }
219
226
  export declare function emptyFeatureEffectTotals(): FeatureEffectTotals;
220
227
  /**
@@ -7,12 +7,25 @@ import {
7
7
  foldsNow,
8
8
  foldsOnSelf,
9
9
  selfEffectsOf
10
- } from "../chunk-TULQ4FFX.js";
10
+ } from "../chunk-64VNLMSG.js";
11
11
  import "../chunk-TOM66P2P.js";
12
12
  import "../chunk-KU3YLF6D.js";
13
- import "../chunk-RLGQ5PZZ.js";
13
+ import "../chunk-5JXFJ5AU.js";
14
+ import "../chunk-RD2MID3M.js";
15
+ import "../chunk-NXUY5XQN.js";
16
+ import "../chunk-W6GC6OKK.js";
17
+ import "../chunk-B3DP42OM.js";
18
+ import "../chunk-IUAAXXNO.js";
19
+ import "../chunk-ZUQW5VBZ.js";
20
+ import "../chunk-IHE6KVC3.js";
21
+ import "../chunk-LHZXYFBU.js";
22
+ import "../chunk-YBLDE5CG.js";
14
23
  import "../chunk-LVQLWRCU.js";
24
+ import "../chunk-CM5CWO4K.js";
25
+ import "../chunk-4J6DS3EJ.js";
15
26
  import "../chunk-ZCTUYGNV.js";
27
+ import "../chunk-3TM34RSJ.js";
28
+ import "../chunk-PDJSUH24.js";
16
29
  import "../chunk-WELIKLZF.js";
17
30
  export {
18
31
  assembleEffectFeatures,
@@ -23,15 +23,16 @@ import {
23
23
  scaledInfuseItem,
24
24
  splitOne,
25
25
  withEntryCharges
26
- } from "../chunk-3VZZDKRA.js";
26
+ } from "../chunk-NXUY5XQN.js";
27
27
  import "../chunk-W6GC6OKK.js";
28
28
  import "../chunk-B3DP42OM.js";
29
29
  import "../chunk-IUAAXXNO.js";
30
+ import "../chunk-ZUQW5VBZ.js";
30
31
  import "../chunk-IHE6KVC3.js";
31
32
  import "../chunk-LHZXYFBU.js";
32
- import "../chunk-ZUQW5VBZ.js";
33
33
  import "../chunk-LVQLWRCU.js";
34
34
  import "../chunk-CM5CWO4K.js";
35
+ import "../chunk-4J6DS3EJ.js";
35
36
  import "../chunk-ZCTUYGNV.js";
36
37
  import "../chunk-3TM34RSJ.js";
37
38
  import "../chunk-PDJSUH24.js";
@@ -11,7 +11,7 @@
11
11
  * from the raw keys the notes already carry (`feat_progression`, `optionalfeature_progression`, `additional_spells`
12
12
  * with `choose`, a `spell-choose` prerequisite), so existing notes work with no re-import. Authored `choices` win.
13
13
  */
14
- import type { Character, ChoiceValue, FeatVia, ResolvedCharacter, ResolvedClass } from "./pc.types.js";
14
+ import type { Character, ChoiceValue, FeatVia, ResolvedCharacter, ResolvedClass, ResolvedSpell, SpellTargets } from "./pc.types.js";
15
15
  import type { Choice } from "@archivist-gg/dnd5e/types/choice";
16
16
  import type { OptionalFeatureEntity } from "@archivist-gg/dnd5e/types/optional-feature.types";
17
17
  import type { FeatEntity } from "@archivist-gg/dnd5e/feat/feat.types";
@@ -23,6 +23,22 @@ export declare function isTargetChoice(ch: Choice): boolean;
23
23
  * derived rows carry the member's edition so a pick never offers the other edition's twin.
24
24
  */
25
25
  export declare function memberChoices(entity: OptionalFeatureEntity | null | undefined): Choice[];
26
+ /**
27
+ * The spells a member's spell-scoped damage rider reaches, as its DATA names them (found live 2026-09-28: Agonizing
28
+ * Blast's Charisma never reached its cantrip): each answer of a spell target pick (`isTargetChoice`, the blasts' cantrip,
29
+ * read through `read`, the member's nested key) and each `spell-known` prerequisite (the 2014 Agonizing Blast's Eldritch
30
+ * Blast). A target pick left unanswered keeps its filter in `open` (see {@link spellsReached}). Null when the member names
31
+ * no spell, so its spell riders reach none.
32
+ */
33
+ export declare function memberSpellTargets(member: OptionalFeatureEntity, read: (choiceId: string) => ChoiceValue | undefined): SpellTargets | null;
34
+ /**
35
+ * The slugs of the character's `spells` a rider with `targets` reaches, unique, in `spells` order: every spell a ref
36
+ * names (its full slug, else its bare name, so a path link `[[SRD 5e/eldritch-blast]]` finds `srd-5e_spell_eldritch-blast`),
37
+ * and, for each open target pick, its ONE legal answer: the character's own spells that match the pick's filter and roll
38
+ * damage, when exactly one does ("one of your known Warlock cantrips that deals damage" with only Eldritch Blast known).
39
+ * Two or more legal answers are a choice the player has not made, and reach none.
40
+ */
41
+ export declare function spellsReached(targets: SpellTargets | undefined, spells: ReadonlyArray<Pick<ResolvedSpell, "slug" | "entity">>): string[];
26
42
  /** One stored pool pick whose member carries choices, with the block its nested picks live in. */
27
43
  export interface PoolMemberSite {
28
44
  classIndex: number;
@@ -80,6 +96,22 @@ export interface FeatPickSite {
80
96
  export declare function featPickSites(classEntries: ReadonlyArray<{
81
97
  choices?: Character["class"][number]["choices"] | ResolvedClass["choices"];
82
98
  }> | undefined, memberSites: PoolMemberSite[], classSlugOf: (classIndex: number) => string | null): FeatPickSite[];
99
+ /** SRD-G T4 (audit §3b): a feat the character picked through a SPECIES (the SRD 5.2 Human's Versatile: "You gain an
100
+ * Origin feat of your choice"): a `select-entity` of `entity_type: feat` on `race.choices[]` or a trait's `choices[]`,
101
+ * answered under `origin_choices["race:<id>"]`. The feat's OWN children are read under `race:feat:<childId>`, the key
102
+ * the builder's ledger writes them to (a race item's feat children carry the `feat:` prefix, namespace `race`). */
103
+ export interface RaceFeatSite {
104
+ slug: string;
105
+ via: FeatVia;
106
+ read: (childId: string) => ChoiceValue | undefined;
107
+ }
108
+ export declare function raceFeatSites(race: {
109
+ slug: string;
110
+ choices?: unknown;
111
+ traits?: ReadonlyArray<{
112
+ choices?: unknown;
113
+ }>;
114
+ } | null | undefined, originChoices: Readonly<Record<string, ChoiceValue>> | undefined): RaceFeatSite[];
83
115
  /** Look a feat pick up in the resolved feats (by slug, then bare slug). */
84
116
  export declare function featOfSite(site: FeatPickSite, feats: ReadonlyArray<FeatEntity>): FeatEntity | undefined;
85
117
  /**
@@ -3,20 +3,24 @@ import {
3
3
  featPickSites,
4
4
  isTargetChoice,
5
5
  memberChoices,
6
+ memberSpellTargets,
6
7
  nestedPickKeysToPrune,
7
8
  poolMemberSites,
8
- poolMemberSitesOf
9
- } from "../chunk-HTYMW5CH.js";
10
- import "../chunk-3VZZDKRA.js";
9
+ poolMemberSitesOf,
10
+ raceFeatSites,
11
+ spellsReached
12
+ } from "../chunk-RD2MID3M.js";
13
+ import "../chunk-NXUY5XQN.js";
11
14
  import "../chunk-W6GC6OKK.js";
12
15
  import "../chunk-B3DP42OM.js";
13
16
  import "../chunk-IUAAXXNO.js";
17
+ import "../chunk-ZUQW5VBZ.js";
14
18
  import "../chunk-IHE6KVC3.js";
15
19
  import "../chunk-LHZXYFBU.js";
16
20
  import "../chunk-YBLDE5CG.js";
17
- import "../chunk-ZUQW5VBZ.js";
18
21
  import "../chunk-LVQLWRCU.js";
19
22
  import "../chunk-CM5CWO4K.js";
23
+ import "../chunk-4J6DS3EJ.js";
20
24
  import "../chunk-ZCTUYGNV.js";
21
25
  import "../chunk-3TM34RSJ.js";
22
26
  import "../chunk-PDJSUH24.js";
@@ -26,7 +30,10 @@ export {
26
30
  featPickSites,
27
31
  isTargetChoice,
28
32
  memberChoices,
33
+ memberSpellTargets,
29
34
  nestedPickKeysToPrune,
30
35
  poolMemberSites,
31
- poolMemberSitesOf
36
+ poolMemberSitesOf,
37
+ raceFeatSites,
38
+ spellsReached
32
39
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  characterSchema
3
- } from "../chunk-T6QIF5XR.js";
3
+ } from "../chunk-NTU2DXNG.js";
4
4
  import "../chunk-S7REMWW4.js";
5
5
  import {
6
6
  keptSlugForLink
@@ -4,15 +4,16 @@ import {
4
4
  resolveAllPools,
5
5
  resolvePool,
6
6
  strandedPicks
7
- } from "../chunk-3VZZDKRA.js";
7
+ } from "../chunk-NXUY5XQN.js";
8
8
  import "../chunk-W6GC6OKK.js";
9
9
  import "../chunk-B3DP42OM.js";
10
10
  import "../chunk-IUAAXXNO.js";
11
+ import "../chunk-ZUQW5VBZ.js";
11
12
  import "../chunk-IHE6KVC3.js";
12
13
  import "../chunk-LHZXYFBU.js";
13
- import "../chunk-ZUQW5VBZ.js";
14
14
  import "../chunk-LVQLWRCU.js";
15
15
  import "../chunk-CM5CWO4K.js";
16
+ import "../chunk-4J6DS3EJ.js";
16
17
  import "../chunk-ZCTUYGNV.js";
17
18
  import "../chunk-3TM34RSJ.js";
18
19
  import "../chunk-PDJSUH24.js";
@@ -1,4 +1,6 @@
1
1
  import type { ResolvedCharacter } from "./pc.types.js";
2
+ import type { WeaponEntity } from "@archivist-gg/dnd5e/weapon/weapon.types";
3
+ import { type ProficiencyKind } from "./pc.proficiency-normalize.js";
2
4
  import { type ProficiencyEntry, type ProficiencyGrant } from "./pc.proficiency-grants.js";
3
5
  /** Re-exported for the plugin: both types are DECLARED in the leaf so that
4
6
  * pc.decision-engine can reference them without importing this module, which
@@ -62,3 +64,15 @@ export interface ProficiencySources {
62
64
  }
63
65
  export declare function collectProficiencySources(resolved: ResolvedCharacter): ProficiencySources;
64
66
  export declare function aggregateProficiencies(resolved: ResolvedCharacter): ProficiencyAggregate;
67
+ /** D4 A: one kind's proficiencies as the picker needs them: `effective` is exactly the sheet's line (the aggregate's
68
+ * bucket), `removed` every grant or pick the user's overrides suppress, keeping its `sources`. Both halves come out of
69
+ * the composers the sheet reads, so the picker and the sheet line cannot disagree. */
70
+ export declare function proficiencyOverview(resolved: ResolvedCharacter, kind: ProficiencyKind): {
71
+ effective: ProficiencyEntry[];
72
+ removed: ProficiencyEntry[];
73
+ };
74
+ /** D4 A: the effective weapon entry that covers `weapon` without naming it, a category (`simple`, `martial`, or the
75
+ * entity's own `martial-melee` form) or a property-qualified grant ("Martial weapons that have the Light property").
76
+ * The same three arms as the live gate, `isWeaponSlugProficient` (pc.equipment.ts), so the picker's dimmed "via" row
77
+ * and the attack row's proficiency agree. Undefined when nothing but the weapon's own entry could cover it. */
78
+ export declare function weaponCoveredBy(effective: readonly ProficiencyEntry[], weapon: Pick<WeaponEntity, "category" | "properties" | "range" | "slug">): ProficiencyEntry | undefined;