{"version":3,"sources":["../src/semantic/kaabalistic.ts","../src/semantic/index.ts"],"names":["canonicalTree"],"mappings":"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","sourcesContent":["import {\n  DEFAULT_ASPECT_SPECS,\n  PLANET_AND_NODE_NAMES,\n  SIGNS,\n  VirtualNodes,\n  computeAspects,\n  type BirthChart,\n  type HydratedNode,\n  type HydratedPlanet,\n  type ZodiacPosition,\n} from \"../astrology\"\nimport {\n  KaabalahTypes,\n  LetterTypes,\n  NumerologyTypes,\n  PLANETS,\n  SPHERES,\n  WESTERN_ASPECTS,\n  WESTERN_HOUSES,\n  WESTERN_ZODIAC_SIGNS,\n  WesternAstrologyTypes,\n  getCanonicalTree,\n  id,\n  parseId,\n  type Node,\n  type NodeId,\n} from \"../core\"\nimport { calculateGematria } from \"../gematria\"\nimport {\n  calculateKaabalisticLifePath,\n  calculateStraightAcrossReductionLifePath,\n} from \"../numerology\"\n\ntype CanonicalTree = ReturnType<typeof getCanonicalTree>\n\nexport type KaabalisticTargetId =\n  | NodeId<KaabalahTypes.SPHERE>\n  | NodeId<KaabalahTypes.PATH>\n\nexport type KaabalisticTargetType = \"sphere\" | \"path\"\n\nexport type KaabalisticMarkerKind = \"astrology\" | \"numerology\" | \"gematria\"\n\nexport type KaabalisticMarkerSourceType =\n  | \"planet\"\n  | \"angle\"\n  | \"node\"\n  | \"number\"\n  | \"letter\"\n\nexport type KaabalisticMarkerMapping =\n  | \"sign-sphere\"\n  | \"sign-path\"\n  | \"element-sphere\"\n  | \"element-path\"\n  | \"carrier-sphere\"\n  | \"planet-sign-path\"\n  | \"number-sphere\"\n  | \"number-path\"\n  | \"letter-path\"\n\nexport interface KaabalisticMarkerDescriptor {\n  kind: KaabalisticMarkerKind;\n  targetId: KaabalisticTargetId;\n  targetType: KaabalisticTargetType;\n  sourceType: KaabalisticMarkerSourceType;\n  sourceName: string;\n  mapping: KaabalisticMarkerMapping;\n  label: string;\n  sign?: string;\n  element?: string;\n  planet?: string;\n}\n\nexport interface KaabalisticCountsEntry {\n  astro: number;\n  numerology: number;\n  gematria: number;\n  total: number;\n}\n\nexport interface KaabalisticSummaryTarget {\n  id: KaabalisticTargetId;\n  type: KaabalisticTargetType;\n  name: string;\n  count: number;\n}\n\nexport interface KaabalisticItemConnection {\n  itemLabel: string;\n  targets: readonly KaabalisticSummaryTarget[];\n}\n\nexport interface KaabalisticMapData {\n  spheres: readonly Node<KaabalahTypes.SPHERE>[];\n  paths: readonly Node<KaabalahTypes.PATH>[];\n  markers: readonly KaabalisticMarkerDescriptor[];\n  sphereMarkers: Partial<Record<NodeId<KaabalahTypes.SPHERE>, readonly KaabalisticMarkerDescriptor[]>>;\n  pathMarkers: Partial<Record<NodeId<KaabalahTypes.PATH>, readonly KaabalisticMarkerDescriptor[]>>;\n  countsById: Partial<Record<KaabalisticTargetId, KaabalisticCountsEntry>>;\n  itemConnections: {\n    astrology: readonly KaabalisticItemConnection[];\n    numerology: readonly KaabalisticItemConnection[];\n    gematria: readonly KaabalisticItemConnection[];\n  };\n}\n\nexport interface KaabalisticSymbolMetadata {\n  kind: \"planet\" | \"sign\" | \"angle\" | \"node\";\n  key: string;\n  label: string;\n  shortLabel: string;\n  glyph: string;\n  id?:\n    | NodeId<WesternAstrologyTypes.PLANET>\n    | NodeId<WesternAstrologyTypes.WESTERN_ZODIAC_SIGN>\n    | NodeId<WesternAstrologyTypes.HOUSE>;\n}\n\nexport type KaabalisticSignLookup =\n  | (typeof SIGNS)[number]\n  | NodeId<WesternAstrologyTypes.WESTERN_ZODIAC_SIGN>\n  | string\n\nexport interface KaabalisticSignCorrespondenceLookup {\n  kind: \"sign\";\n  sign: KaabalisticSignLookup;\n}\n\nexport interface KaabalisticPlanetCorrespondenceLookup {\n  kind: \"planet\";\n  planet: string;\n  sign: KaabalisticSignLookup;\n}\n\nexport interface KaabalisticAngleCorrespondenceLookup {\n  kind: \"angle\";\n  angle: string;\n  sign: KaabalisticSignLookup;\n}\n\nexport interface KaabalisticNodeCorrespondenceLookup {\n  kind: \"node\";\n  node: string;\n  sign: KaabalisticSignLookup;\n}\n\nexport interface KaabalisticNumberCorrespondenceLookup {\n  kind: \"number\";\n  number: number;\n  sourceName?: string;\n}\n\nexport interface KaabalisticHebrewLetterCorrespondenceLookup {\n  kind: \"hebrewLetter\";\n  hebrewLetterId: NodeId<LetterTypes.HEBREW_LETTER>;\n  sourceName?: string;\n}\n\nexport type KaabalisticCorrespondenceLookup =\n  | KaabalisticSignCorrespondenceLookup\n  | KaabalisticPlanetCorrespondenceLookup\n  | KaabalisticAngleCorrespondenceLookup\n  | KaabalisticNodeCorrespondenceLookup\n  | KaabalisticNumberCorrespondenceLookup\n  | KaabalisticHebrewLetterCorrespondenceLookup\n\nexport interface KaabalisticCorrespondenceTarget {\n  targetId: KaabalisticTargetId;\n  targetType: KaabalisticTargetType;\n  targetName: string;\n  mapping: KaabalisticMarkerMapping;\n  distance: number;\n  sign?: string;\n  element?: string;\n  planet?: string;\n}\n\nexport interface KaabalisticCorrespondenceSource {\n  kind: KaabalisticCorrespondenceLookup[\"kind\"];\n  key: string;\n  label: string;\n  shortLabel: string;\n  glyph: string;\n  sign?: string;\n  element?: string;\n  planet?: string;\n  number?: number;\n  hebrewLetterId?: NodeId<LetterTypes.HEBREW_LETTER>;\n}\n\nexport interface KaabalisticCorrespondenceResult {\n  source: KaabalisticCorrespondenceSource;\n  targets: readonly KaabalisticCorrespondenceTarget[];\n}\n\nexport interface AstrologyTreeChartInput {\n  planets: readonly HydratedPlanet[] | Record<string, HydratedPlanet>;\n  houses: BirthChart[\"houses\"];\n  nodes?: readonly HydratedNode[] | Record<string, HydratedNode>;\n  aspects?: BirthChart[\"aspects\"];\n}\n\nexport interface NumerologyTreeInput {\n  birthDate: Date;\n  kaabalisticLifePath?: ReturnType<typeof calculateKaabalisticLifePath>;\n  straightAcrossReductionLifePath?: ReturnType<typeof calculateStraightAcrossReductionLifePath>;\n}\n\nexport interface GematriaTreeInput {\n  phrase?: string;\n  result?: ReturnType<typeof calculateGematria>;\n}\n\nexport interface BuildKaabalisticMapDataInput {\n  astrology?: BirthChart | AstrologyTreeChartInput | null;\n  numerology?: Date | NumerologyTreeInput | null;\n  gematria?: string | GematriaTreeInput | null;\n}\n\ntype SummaryBucket = \"astro\" | \"numerology\" | \"gematria\"\n\ntype AstrologyTreeMarkerSource = {\n  sourceType: Extract<KaabalisticMarkerSourceType, \"planet\" | \"angle\" | \"node\">;\n  sourceName: string;\n}\n\ntype SymbolSeed = KaabalisticSymbolMetadata & {\n  aliases?: readonly string[];\n}\n\nconst canonicalTree = getCanonicalTree({\n  system: \"kaabalah\",\n  parts: [\"westernAstrology\"],\n})\n\nconst orderedSphereIds = [\n  SPHERES.KETHER,\n  SPHERES.CHOKHMAH,\n  SPHERES.BINAH,\n  SPHERES.DAATH,\n  SPHERES.CHESED,\n  SPHERES.GEBURAH,\n  SPHERES.TIPHARETH,\n  SPHERES.NETZACH,\n  SPHERES.HOD,\n  SPHERES.YESOD,\n  SPHERES.MALKUTH,\n].map((sphere) => id(KaabalahTypes.SPHERE, sphere))\n\nconst orderedPathIds = Array.from({ length: 22 }, (_, index) =>\n  id(KaabalahTypes.PATH, index + 1)\n)\n\nconst orderedSpheres = Object.freeze(\n  orderedSphereIds\n    .map((sphereId) => canonicalTree.getNode(sphereId))\n    .filter((node): node is Node<KaabalahTypes.SPHERE> => Boolean(node))\n)\n\nconst orderedPaths = Object.freeze(\n  orderedPathIds\n    .map((pathId) => canonicalTree.getNode(pathId))\n    .filter((node): node is Node<KaabalahTypes.PATH> => Boolean(node))\n)\n\nconst SIGN_SYMBOLS = [\n  { kind: \"sign\", key: \"aries\", label: \"Aries\", shortLabel: \"Aries\", glyph: \"♈\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.ARIES) },\n  { kind: \"sign\", key: \"taurus\", label: \"Taurus\", shortLabel: \"Taurus\", glyph: \"♉\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.TAURUS) },\n  { kind: \"sign\", key: \"gemini\", label: \"Gemini\", shortLabel: \"Gemini\", glyph: \"♊\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.GEMINI) },\n  { kind: \"sign\", key: \"cancer\", label: \"Cancer\", shortLabel: \"Cancer\", glyph: \"♋\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.CANCER) },\n  { kind: \"sign\", key: \"leo\", label: \"Leo\", shortLabel: \"Leo\", glyph: \"♌\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.LEO) },\n  { kind: \"sign\", key: \"virgo\", label: \"Virgo\", shortLabel: \"Virgo\", glyph: \"♍\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.VIRGO) },\n  { kind: \"sign\", key: \"libra\", label: \"Libra\", shortLabel: \"Libra\", glyph: \"♎\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.LIBRA) },\n  { kind: \"sign\", key: \"scorpio\", label: \"Scorpio\", shortLabel: \"Scorpio\", glyph: \"♏\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.SCORPIO) },\n  { kind: \"sign\", key: \"sagittarius\", label: \"Sagittarius\", shortLabel: \"Sagittarius\", glyph: \"♐\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.SAGITTARIUS) },\n  { kind: \"sign\", key: \"capricorn\", label: \"Capricorn\", shortLabel: \"Capricorn\", glyph: \"♑\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.CAPRICORN) },\n  { kind: \"sign\", key: \"aquarius\", label: \"Aquarius\", shortLabel: \"Aquarius\", glyph: \"♒\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.AQUARIUS) },\n  { kind: \"sign\", key: \"pisces\", label: \"Pisces\", shortLabel: \"Pisces\", glyph: \"♓\", id: id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, WESTERN_ZODIAC_SIGNS.PISCES) },\n] as const satisfies readonly SymbolSeed[]\n\nconst PLANET_SYMBOLS = [\n  { kind: \"planet\", key: \"sun\", label: PLANETS.SUN, shortLabel: PLANETS.SUN, glyph: \"☉\", id: id(WesternAstrologyTypes.PLANET, PLANETS.SUN) },\n  { kind: \"planet\", key: \"moon\", label: PLANETS.MOON, shortLabel: PLANETS.MOON, glyph: \"☽\", id: id(WesternAstrologyTypes.PLANET, PLANETS.MOON) },\n  { kind: \"planet\", key: \"mercury\", label: PLANETS.MERCURY, shortLabel: PLANETS.MERCURY, glyph: \"☿\", id: id(WesternAstrologyTypes.PLANET, PLANETS.MERCURY) },\n  { kind: \"planet\", key: \"venus\", label: PLANETS.VENUS, shortLabel: PLANETS.VENUS, glyph: \"♀\", id: id(WesternAstrologyTypes.PLANET, PLANETS.VENUS) },\n  { kind: \"planet\", key: \"mars\", label: PLANETS.MARS, shortLabel: PLANETS.MARS, glyph: \"♂\", id: id(WesternAstrologyTypes.PLANET, PLANETS.MARS) },\n  { kind: \"planet\", key: \"jupiter\", label: PLANETS.JUPITER, shortLabel: PLANETS.JUPITER, glyph: \"♃\", id: id(WesternAstrologyTypes.PLANET, PLANETS.JUPITER) },\n  { kind: \"planet\", key: \"saturn\", label: PLANETS.SATURN, shortLabel: PLANETS.SATURN, glyph: \"♄\", id: id(WesternAstrologyTypes.PLANET, PLANETS.SATURN) },\n  { kind: \"planet\", key: \"uranus\", label: PLANETS.URANUS, shortLabel: PLANETS.URANUS, glyph: \"♅\", id: id(WesternAstrologyTypes.PLANET, PLANETS.URANUS) },\n  { kind: \"planet\", key: \"neptune\", label: PLANETS.NEPTUNE, shortLabel: PLANETS.NEPTUNE, glyph: \"♆\", id: id(WesternAstrologyTypes.PLANET, PLANETS.NEPTUNE) },\n  { kind: \"planet\", key: \"pluto\", label: PLANETS.PLUTO, shortLabel: PLANETS.PLUTO, glyph: \"♇\", id: id(WesternAstrologyTypes.PLANET, PLANETS.PLUTO) },\n  { kind: \"planet\", key: \"earth\", label: PLANETS.EARTH, shortLabel: PLANETS.EARTH, glyph: \"⊕\", id: id(WesternAstrologyTypes.PLANET, PLANETS.EARTH) },\n  { kind: \"planet\", key: \"chiron\", label: \"Chiron\", shortLabel: \"Chiron\", glyph: \"⚷\", aliases: [PLANET_AND_NODE_NAMES[15]] },\n] as const satisfies readonly SymbolSeed[]\n\nconst ANGLE_SYMBOLS = [\n  { kind: \"angle\", key: \"asc\", label: \"ASC\", shortLabel: \"ASC\", glyph: \"ASC\", id: id(WesternAstrologyTypes.HOUSE, WESTERN_HOUSES.ASCENDANT), aliases: [\"ascendant\"] },\n  { kind: \"angle\", key: \"mc\", label: \"MC\", shortLabel: \"MC\", glyph: \"MC\", id: id(WesternAstrologyTypes.HOUSE, WESTERN_HOUSES.MEDIUM_COELI), aliases: [\"medium coeli\"] },\n  { kind: \"angle\", key: \"dc\", label: \"DC\", shortLabel: \"DC\", glyph: \"DC\", id: id(WesternAstrologyTypes.HOUSE, WESTERN_HOUSES.DESCENDANT), aliases: [\"descendant\"] },\n  { kind: \"angle\", key: \"ic\", label: \"IC\", shortLabel: \"IC\", glyph: \"IC\", id: id(WesternAstrologyTypes.HOUSE, WESTERN_HOUSES.IMUM_COELI), aliases: [\"imum coeli\"] },\n  { kind: \"angle\", key: \"vertex\", label: \"Vertex\", shortLabel: \"Vertex\", glyph: \"Vtx\" },\n] as const satisfies readonly SymbolSeed[]\n\nconst NODE_SYMBOLS = [\n  { kind: \"node\", key: \"wheel of fortune\", label: \"Wheel of Fortune\", shortLabel: \"Wheel of Fortune\", glyph: \"𛲜\", aliases: [PLANET_AND_NODE_NAMES[VirtualNodes.PARS_FORTUNAE], \"pars fortunae\", \"parsfortunae\"] },\n  { kind: \"node\", key: \"mean node\", label: \"Mean Node\", shortLabel: \"Mean Node\", glyph: \"☊\", aliases: [PLANET_AND_NODE_NAMES[10]] },\n  { kind: \"node\", key: \"true node\", label: \"True Node\", shortLabel: \"True Node\", glyph: \"☊\", aliases: [PLANET_AND_NODE_NAMES[11]] },\n  { kind: \"node\", key: \"lilith mean\", label: \"Lilith Mean\", shortLabel: \"Lilith Mean\", glyph: \"⚸\", aliases: [PLANET_AND_NODE_NAMES[12]] },\n  { kind: \"node\", key: \"lilith true\", label: \"Lilith True\", shortLabel: \"Lilith True\", glyph: \"⚸\", aliases: [PLANET_AND_NODE_NAMES[13]] },\n] as const satisfies readonly SymbolSeed[]\n\nconst symbolRegistry = createSymbolRegistry([\n  ...SIGN_SYMBOLS,\n  ...PLANET_SYMBOLS,\n  ...ANGLE_SYMBOLS,\n  ...NODE_SYMBOLS,\n])\n\nconst classicalPlanetKeys = new Set([\n  normalizeLookupKey(PLANETS.SUN),\n  normalizeLookupKey(PLANETS.MOON),\n  normalizeLookupKey(PLANETS.MERCURY),\n  normalizeLookupKey(PLANETS.VENUS),\n  normalizeLookupKey(PLANETS.MARS),\n  normalizeLookupKey(PLANETS.JUPITER),\n  normalizeLookupKey(PLANETS.SATURN),\n])\n\nconst defaultExcludedAstrologyPoints = new Set([\n  normalizeLookupKey(\"True Node\"),\n  normalizeLookupKey(\"Lilith True\"),\n])\n\nconst planetCarrierSphereIdsByKey = createPlanetCarrierSphereIdsByKey(canonicalTree)\nconst classicalPlanetPathIdsByKey = createClassicalPlanetPathIdsByKey(canonicalTree)\nconst angleCarrierSphereIdsByKey = createAngleCarrierSphereIdsByKey()\n\nfunction normalizeLookupKey(value: string) {\n  return value.trim().toLowerCase()\n}\n\nfunction createSymbolRegistry(entries: readonly SymbolSeed[]) {\n  const byKey = new Map<string, KaabalisticSymbolMetadata>()\n\n  for (const entry of entries) {\n    const frozen = Object.freeze({\n      kind: entry.kind,\n      key: entry.key,\n      label: entry.label,\n      shortLabel: entry.shortLabel,\n      glyph: entry.glyph,\n      ...(entry.id ? { id: entry.id } : {}),\n    }) satisfies KaabalisticSymbolMetadata\n\n    byKey.set(normalizeLookupKey(entry.key), frozen)\n    byKey.set(normalizeLookupKey(entry.label), frozen)\n    byKey.set(normalizeLookupKey(entry.shortLabel), frozen)\n\n    for (const alias of entry.aliases ?? []) {\n      byKey.set(normalizeLookupKey(alias), frozen)\n    }\n\n    if (entry.id) {\n      byKey.set(normalizeLookupKey(entry.id), frozen)\n      byKey.set(normalizeLookupKey(parseId(entry.id)), frozen)\n    }\n  }\n\n  return Object.freeze({\n    byKey,\n    planets: Object.freeze(entries.filter((entry) => entry.kind === \"planet\").map((entry) => byKey.get(normalizeLookupKey(entry.key))!)),\n    signs: Object.freeze(entries.filter((entry) => entry.kind === \"sign\").map((entry) => byKey.get(normalizeLookupKey(entry.key))!)),\n    angles: Object.freeze(entries.filter((entry) => entry.kind === \"angle\").map((entry) => byKey.get(normalizeLookupKey(entry.key))!)),\n    nodes: Object.freeze(entries.filter((entry) => entry.kind === \"node\").map((entry) => byKey.get(normalizeLookupKey(entry.key))!)),\n  })\n}\n\nfunction createClassicalPlanetPathIdsByKey(tree: CanonicalTree) {\n  const registry = new Map<string, readonly NodeId<KaabalahTypes.PATH>[]>()\n  const mutable = new Map<string, NodeId<KaabalahTypes.PATH>[]>()\n\n  for (const pathId of orderedPathIds) {\n    const planet = tree.getCorrespondences(pathId, {\n      type: WesternAstrologyTypes.PLANET,\n      depth: 1,\n      limit: 1,\n    })[0]?.node\n\n    if (!planet) {\n      continue\n    }\n\n    const key = normalizeLookupKey(planet.name ?? parseId(planet.id))\n    if (!classicalPlanetKeys.has(key)) {\n      continue\n    }\n\n    const bucket = mutable.get(key) ?? []\n    bucket.push(pathId)\n    mutable.set(key, bucket)\n  }\n\n  for (const [key, value] of mutable.entries()) {\n    registry.set(key, Object.freeze([...value]))\n  }\n\n  return registry\n}\n\nfunction createPlanetCarrierSphereIdsByKey(tree: CanonicalTree) {\n  const registry = new Map<string, readonly NodeId<KaabalahTypes.SPHERE>[]>()\n\n  for (const symbol of PLANET_SYMBOLS) {\n    if (!(\"id\" in symbol) || !symbol.id) {\n      continue\n    }\n\n    const sphereIds = tree.getCorrespondences(symbol.id, {\n      type: KaabalahTypes.SPHERE,\n      depth: 1,\n    }).map((match) => match.node.id as NodeId<KaabalahTypes.SPHERE>)\n\n    if (!sphereIds.length) {\n      continue\n    }\n\n    registry.set(\n      normalizeLookupKey(symbol.label),\n      Object.freeze([...new Set(sphereIds)])\n    )\n  }\n\n  return registry\n}\n\nfunction createAngleCarrierSphereIdsByKey() {\n  return new Map<string, readonly NodeId<KaabalahTypes.SPHERE>[]>([\n    [\n      normalizeLookupKey(\"ASC\"),\n      Object.freeze([id(KaabalahTypes.SPHERE, SPHERES.MALKUTH)]),\n    ],\n  ])\n}\n\nfunction getTargetType(targetId: KaabalisticTargetId): KaabalisticTargetType {\n  return String(targetId).startsWith(`${KaabalahTypes.SPHERE}:`) ? \"sphere\" : \"path\"\n}\n\nfunction getTargetName(targetId: KaabalisticTargetId) {\n  return getTargetType(targetId) === \"sphere\"\n    ? parseId(targetId as NodeId<KaabalahTypes.SPHERE>)\n    : `Path ${parseId(targetId as NodeId<KaabalahTypes.PATH>)}`\n}\n\nfunction getTargetCountMap(\n  targets: readonly KaabalisticCorrespondenceTarget[]\n) {\n  const reduceMap: Partial<Record<KaabalisticTargetId, number>> = {}\n\n  for (const target of targets) {\n    reduceMap[target.targetId] = (reduceMap[target.targetId] ?? 0) + 1\n  }\n\n  return reduceMap\n}\n\nfunction toSummaryTargets(\n  reduceMap: Partial<Record<KaabalisticTargetId, number>>\n): KaabalisticSummaryTarget[] {\n  return Object.entries(reduceMap).map(([targetId, count]) => ({\n    id: targetId as KaabalisticTargetId,\n    type: getTargetType(targetId as KaabalisticTargetId),\n    name: getTargetName(targetId as KaabalisticTargetId),\n    count: count ?? 0,\n  }))\n}\n\nfunction groupByKey<T, K extends string>(items: readonly T[], getKey: (item: T) => K) {\n  const grouped = {} as Record<K, T[]>\n\n  for (const item of items) {\n    const key = getKey(item)\n    const bucket = grouped[key] ?? []\n    bucket.push(item)\n    grouped[key] = bucket\n  }\n\n  return grouped\n}\n\nfunction normalizeSignName(sign: KaabalisticSignLookup) {\n  const rawSign =\n    typeof sign === \"string\" && sign.startsWith(`${WesternAstrologyTypes.WESTERN_ZODIAC_SIGN}:`)\n      ? parseId(sign as NodeId<WesternAstrologyTypes.WESTERN_ZODIAC_SIGN>)\n      : typeof sign === \"string\"\n        ? sign\n        : parseId(sign)\n  const key = normalizeLookupKey(rawSign)\n  const metadata = symbolRegistry.byKey.get(key)\n\n  if (!metadata || metadata.kind !== \"sign\") {\n    return undefined\n  }\n\n  return metadata.label as (typeof SIGNS)[number]\n}\n\nfunction normalizePlanetName(planet: string) {\n  const rawPlanet = planet.startsWith(`${WesternAstrologyTypes.PLANET}:`)\n    ? parseId(planet as NodeId<WesternAstrologyTypes.PLANET>)\n    : planet\n  const key = normalizeLookupKey(rawPlanet)\n  const metadata = symbolRegistry.byKey.get(key)\n\n  if (metadata?.kind === \"planet\") {\n    return metadata.label\n  }\n\n  return PLANET_AND_NODE_NAMES[rawPlanet as unknown as keyof typeof PLANET_AND_NODE_NAMES] ?? rawPlanet\n}\n\nfunction lookupPlanetSymbolMetadata(planet: string) {\n  const rawPlanet = planet.startsWith(`${WesternAstrologyTypes.PLANET}:`)\n    ? parseId(planet as NodeId<WesternAstrologyTypes.PLANET>)\n    : planet\n  const metadata = symbolRegistry.byKey.get(normalizeLookupKey(rawPlanet))\n  return metadata?.kind === \"planet\" ? metadata : undefined\n}\n\nfunction lookupSignSymbolMetadata(sign: KaabalisticSignLookup) {\n  const rawSign =\n    typeof sign === \"string\" && sign.startsWith(`${WesternAstrologyTypes.WESTERN_ZODIAC_SIGN}:`)\n      ? parseId(sign as NodeId<WesternAstrologyTypes.WESTERN_ZODIAC_SIGN>)\n      : typeof sign === \"string\"\n        ? sign\n        : parseId(sign)\n  const metadata = symbolRegistry.byKey.get(normalizeLookupKey(rawSign))\n  return metadata?.kind === \"sign\" ? metadata : undefined\n}\n\nfunction normalizeAngleName(angle: string) {\n  const rawAngle = angle.startsWith(`${WesternAstrologyTypes.HOUSE}:`)\n    ? parseId(angle as NodeId<WesternAstrologyTypes.HOUSE>)\n    : angle\n  const metadata = symbolRegistry.byKey.get(normalizeLookupKey(rawAngle))\n\n  return metadata?.kind === \"angle\" ? metadata.label : rawAngle\n}\n\nexport function listPlanetSymbolMetadata() {\n  return symbolRegistry.planets\n}\n\nexport function listZodiacSignSymbolMetadata() {\n  return symbolRegistry.signs\n}\n\nexport function listAngleSymbolMetadata() {\n  return symbolRegistry.angles\n}\n\nexport function listNodeSymbolMetadata() {\n  return symbolRegistry.nodes\n}\n\nexport function getPlanetSymbolMetadata(lookup: string) {\n  return lookupPlanetSymbolMetadata(lookup)\n}\n\nexport function getZodiacSignSymbolMetadata(lookup: KaabalisticSignLookup) {\n  return lookupSignSymbolMetadata(lookup)\n}\n\nexport function getAngleSymbolMetadata(lookup: string) {\n  const rawLookup = lookup.startsWith(`${WesternAstrologyTypes.HOUSE}:`)\n    ? parseId(lookup as NodeId<WesternAstrologyTypes.HOUSE>)\n    : lookup\n  const metadata = symbolRegistry.byKey.get(normalizeLookupKey(rawLookup))\n  return metadata?.kind === \"angle\" ? metadata : undefined\n}\n\nexport function getNodeSymbolMetadata(lookup: string) {\n  const metadata = symbolRegistry.byKey.get(normalizeLookupKey(lookup))\n  return metadata?.kind === \"node\" ? metadata : undefined\n}\n\nfunction normalizeChartInput(input: BirthChart | AstrologyTreeChartInput) {\n  const planets = Array.isArray(input.planets)\n    ? [...input.planets]\n    : Object.values(input.planets)\n  const nodes = input.nodes\n    ? (Array.isArray(input.nodes) ? [...input.nodes] : Object.values(input.nodes))\n    : []\n\n  return {\n    planets,\n    nodes,\n    houses: input.houses,\n    aspects: input.aspects,\n  }\n}\n\nfunction getAstrologySourceType(name: string): Extract<KaabalisticMarkerSourceType, \"planet\" | \"node\"> {\n  return getNodeSymbolMetadata(name) ? \"node\" : \"planet\"\n}\n\nfunction getAstrologySourceGlyph(sourceType: Extract<KaabalisticMarkerSourceType, \"planet\" | \"angle\" | \"node\">, sourceName: string) {\n  if (sourceType === \"angle\") {\n    return getAngleSymbolMetadata(sourceName)?.glyph ?? sourceName\n  }\n\n  if (sourceType === \"node\") {\n    return getNodeSymbolMetadata(sourceName)?.glyph ?? sourceName.slice(0, 1).toUpperCase()\n  }\n\n  return lookupPlanetSymbolMetadata(sourceName)?.glyph ?? sourceName.slice(0, 1).toUpperCase()\n}\n\nfunction getHouseNodeByNumber(houseNumber: number) {\n  return canonicalTree.getCorrespondences(id(NumerologyTypes.NUMBER, houseNumber), {\n    type: WesternAstrologyTypes.HOUSE,\n    depth: 1,\n    limit: 1,\n  })[0]?.node\n}\n\nfunction buildSignTargets(sign: (typeof SIGNS)[number]) {\n  const signId = id(WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, sign)\n  const result: KaabalisticCorrespondenceTarget[] = []\n\n  for (const match of canonicalTree.getCorrespondences(signId, {\n    type: [KaabalahTypes.SPHERE, KaabalahTypes.PATH, WesternAstrologyTypes.WESTERN_ELEMENT],\n    depth: 1,\n  })) {\n    if (match.node.type === KaabalahTypes.SPHERE) {\n      result.push({\n        targetId: match.node.id as NodeId<KaabalahTypes.SPHERE>,\n        targetType: \"sphere\",\n        targetName: getTargetName(match.node.id as NodeId<KaabalahTypes.SPHERE>),\n        mapping: \"sign-sphere\",\n        distance: match.distance,\n        sign,\n      })\n      continue\n    }\n\n    if (match.node.type === KaabalahTypes.PATH) {\n      result.push({\n        targetId: match.node.id as NodeId<KaabalahTypes.PATH>,\n        targetType: \"path\",\n        targetName: getTargetName(match.node.id as NodeId<KaabalahTypes.PATH>),\n        mapping: \"sign-path\",\n        distance: match.distance,\n        sign,\n      })\n      continue\n    }\n\n    const element = parseId(match.node.id)\n\n    for (const elementPath of canonicalTree.getCorrespondences(match.node.id, {\n      type: KaabalahTypes.PATH,\n      depth: 1,\n    })) {\n      result.push({\n        targetId: elementPath.node.id as NodeId<KaabalahTypes.PATH>,\n        targetType: \"path\",\n        targetName: getTargetName(elementPath.node.id as NodeId<KaabalahTypes.PATH>),\n        mapping: \"element-path\",\n        distance: elementPath.distance + match.distance,\n        sign,\n        element,\n      })\n    }\n\n    for (const elementSphere of canonicalTree.getCorrespondences(match.node.id, {\n      type: KaabalahTypes.SPHERE,\n      depth: 1,\n    })) {\n      result.push({\n        targetId: elementSphere.node.id as NodeId<KaabalahTypes.SPHERE>,\n        targetType: \"sphere\",\n        targetName: getTargetName(elementSphere.node.id as NodeId<KaabalahTypes.SPHERE>),\n        mapping: \"element-sphere\",\n        distance: elementSphere.distance + match.distance,\n        sign,\n        element,\n      })\n    }\n  }\n\n  return dedupeTargets(result)\n}\n\nfunction buildCarrierSphereTargets(\n  lookup: KaabalisticPlanetCorrespondenceLookup | KaabalisticAngleCorrespondenceLookup,\n  sign: (typeof SIGNS)[number]\n) {\n  const isPlanetLookup = lookup.kind === \"planet\"\n  const sourceLabel = isPlanetLookup\n    ? normalizePlanetName(lookup.planet)\n    : normalizeAngleName(lookup.angle)\n  const sourceKey = normalizeLookupKey(sourceLabel)\n  const sphereIds = isPlanetLookup\n    ? planetCarrierSphereIdsByKey.get(sourceKey)\n    : angleCarrierSphereIdsByKey.get(sourceKey)\n\n  if (!sphereIds?.length) {\n    return []\n  }\n\n  return sphereIds.map<KaabalisticCorrespondenceTarget>((targetId) => ({\n    targetId,\n    targetType: \"sphere\",\n    targetName: getTargetName(targetId),\n    mapping: \"carrier-sphere\",\n    distance: 1,\n    sign,\n    ...(isPlanetLookup ? { planet: sourceLabel } : {}),\n  }))\n}\n\nfunction dedupeTargets(targets: readonly KaabalisticCorrespondenceTarget[]) {\n  const seen = new Set<string>()\n\n  return targets.filter((target) => {\n    const key = [\n      target.targetId,\n      target.mapping,\n      target.sign ?? \"\",\n      target.element ?? \"\",\n      target.planet ?? \"\",\n    ].join(\"|\")\n\n    if (seen.has(key)) {\n      return false\n    }\n\n    seen.add(key)\n    return true\n  })\n}\n\nfunction createCorrespondenceSource(\n  lookup: KaabalisticCorrespondenceLookup,\n  sign?: (typeof SIGNS)[number],\n  element?: string\n): KaabalisticCorrespondenceSource {\n  if (lookup.kind === \"sign\") {\n    const symbol = lookupSignSymbolMetadata(sign ?? lookup.sign)!\n    return {\n      kind: \"sign\",\n      key: symbol.key,\n      label: symbol.label,\n      shortLabel: symbol.shortLabel,\n      glyph: symbol.glyph,\n      ...(sign ? { sign } : {}),\n      ...(element ? { element } : {}),\n    }\n  }\n\n  if (lookup.kind === \"planet\") {\n    const symbol = lookupPlanetSymbolMetadata(lookup.planet)\n    const label = normalizePlanetName(lookup.planet)\n    return {\n      kind: \"planet\",\n      key: normalizeLookupKey(label),\n      label,\n      shortLabel: symbol?.shortLabel ?? label,\n      glyph: symbol?.glyph ?? label.slice(0, 1).toUpperCase(),\n      ...(sign ? { sign } : {}),\n      ...(element ? { element } : {}),\n      planet: label,\n    }\n  }\n\n  if (lookup.kind === \"angle\") {\n    const symbol = getAngleSymbolMetadata(lookup.angle)\n    const label = symbol?.label ?? lookup.angle\n    return {\n      kind: \"angle\",\n      key: normalizeLookupKey(label),\n      label,\n      shortLabel: symbol?.shortLabel ?? label,\n      glyph: symbol?.glyph ?? label,\n      ...(sign ? { sign } : {}),\n      ...(element ? { element } : {}),\n    }\n  }\n\n  if (lookup.kind === \"node\") {\n    const symbol = getNodeSymbolMetadata(lookup.node)\n    const label = symbol?.label ?? lookup.node\n    return {\n      kind: \"node\",\n      key: normalizeLookupKey(label),\n      label,\n      shortLabel: symbol?.shortLabel ?? label,\n      glyph: symbol?.glyph ?? label.slice(0, 1).toUpperCase(),\n      ...(sign ? { sign } : {}),\n      ...(element ? { element } : {}),\n    }\n  }\n\n  if (lookup.kind === \"number\") {\n    const label = String(lookup.number)\n    return {\n      kind: \"number\",\n      key: label,\n      label,\n      shortLabel: label,\n      glyph: label,\n      number: lookup.number,\n    }\n  }\n\n  const letterNode = canonicalTree.getNode(lookup.hebrewLetterId)\n  const letterLabel = letterNode?.name ?? parseId(lookup.hebrewLetterId)\n  const glyph = letterNode?.data?.character ?? letterLabel\n\n  return {\n    kind: \"hebrewLetter\",\n    key: normalizeLookupKey(lookup.hebrewLetterId),\n    label: letterLabel,\n    shortLabel: letterLabel,\n    glyph,\n    hebrewLetterId: lookup.hebrewLetterId,\n  }\n}\n\nexport function getKaabalisticCorrespondenceTargets(\n  lookup: KaabalisticCorrespondenceLookup\n): KaabalisticCorrespondenceResult | undefined {\n  if (lookup.kind === \"number\") {\n    const source = createCorrespondenceSource(lookup)\n    const numberId = id(NumerologyTypes.NUMBER, lookup.number)\n    const targets = [\n      ...canonicalTree.getCorrespondences(numberId, { type: KaabalahTypes.SPHERE, depth: 1 }).map((match) => ({\n        targetId: match.node.id as NodeId<KaabalahTypes.SPHERE>,\n        targetType: \"sphere\" as const,\n        targetName: getTargetName(match.node.id as NodeId<KaabalahTypes.SPHERE>),\n        mapping: \"number-sphere\" as const,\n        distance: match.distance,\n      })),\n      ...canonicalTree.getCorrespondences(numberId, { type: KaabalahTypes.PATH, depth: 1 }).map((match) => ({\n        targetId: match.node.id as NodeId<KaabalahTypes.PATH>,\n        targetType: \"path\" as const,\n        targetName: getTargetName(match.node.id as NodeId<KaabalahTypes.PATH>),\n        mapping: \"number-path\" as const,\n        distance: match.distance,\n      })),\n    ]\n\n    return {\n      source,\n      targets,\n    }\n  }\n\n  if (lookup.kind === \"hebrewLetter\") {\n    const source = createCorrespondenceSource(lookup)\n    const targets = canonicalTree.getCorrespondences(lookup.hebrewLetterId, {\n      type: KaabalahTypes.PATH,\n      depth: 1,\n    }).map((match) => ({\n      targetId: match.node.id as NodeId<KaabalahTypes.PATH>,\n      targetType: \"path\" as const,\n      targetName: getTargetName(match.node.id as NodeId<KaabalahTypes.PATH>),\n      mapping: \"letter-path\" as const,\n      distance: match.distance,\n    }))\n\n    return {\n      source,\n      targets,\n    }\n  }\n\n  const sign = normalizeSignName(lookup.sign)\n  if (!sign) {\n    return undefined\n  }\n\n  const signTargets = buildSignTargets(sign)\n  const element = signTargets.find((target) => target.element)?.element\n\n  if (lookup.kind === \"sign\") {\n    return {\n      source: createCorrespondenceSource(lookup, sign, element),\n      targets: signTargets,\n    }\n  }\n\n  if (lookup.kind === \"planet\") {\n    const planet = normalizePlanetName(lookup.planet)\n    const planetKey = normalizeLookupKey(planet)\n    const planetPathTargets = (classicalPlanetPathIdsByKey.get(planetKey) ?? []).map((pathId) => ({\n      targetId: pathId,\n      targetType: \"path\" as const,\n      targetName: getTargetName(pathId),\n      mapping: \"planet-sign-path\" as const,\n      distance: 1,\n      sign,\n      planet,\n    }))\n    const carrierSphereTargets = buildCarrierSphereTargets(lookup, sign)\n\n    return {\n      source: createCorrespondenceSource(lookup, sign, element),\n      targets: dedupeTargets([...signTargets, ...planetPathTargets, ...carrierSphereTargets]),\n    }\n  }\n\n  if (lookup.kind === \"angle\") {\n    const carrierSphereTargets = buildCarrierSphereTargets(lookup, sign)\n\n    return {\n      source: createCorrespondenceSource(lookup, sign, element),\n      targets: dedupeTargets([...signTargets, ...carrierSphereTargets]),\n    }\n  }\n\n  return {\n    source: createCorrespondenceSource(lookup, sign, element),\n    targets: signTargets,\n  }\n}\n\nfunction toAstrologyMarkers(\n  result: KaabalisticCorrespondenceResult,\n  source: AstrologyTreeMarkerSource\n) {\n  const sourceGlyph = getAstrologySourceGlyph(source.sourceType, source.sourceName)\n  const signGlyph = result.source.sign\n    ? lookupSignSymbolMetadata(result.source.sign)?.glyph ?? sourceGlyph\n    : sourceGlyph\n\n  return result.targets.map<KaabalisticMarkerDescriptor>((target) => ({\n    kind: \"astrology\",\n    targetId: target.targetId,\n    targetType: target.targetType,\n    sourceType: source.sourceType,\n    sourceName: source.sourceName,\n    mapping: target.mapping,\n    label:\n      target.mapping === \"planet-sign-path\" || target.mapping === \"carrier-sphere\"\n        ? signGlyph\n        : sourceGlyph,\n    ...(target.sign ? { sign: target.sign } : {}),\n    ...(target.element ? { element: target.element } : {}),\n    ...(target.planet ? { planet: target.planet } : {}),\n  }))\n}\n\nfunction dedupeMarkers(markers: readonly KaabalisticMarkerDescriptor[]) {\n  const seen = new Set<string>()\n\n  return markers.filter((marker) => {\n    const key = [\n      marker.kind,\n      marker.targetId,\n      marker.sourceType,\n      marker.sourceName,\n      marker.mapping,\n      marker.label,\n      marker.sign ?? \"\",\n      marker.element ?? \"\",\n      marker.planet ?? \"\",\n    ].join(\"|\")\n\n    if (seen.has(key)) {\n      return false\n    }\n\n    seen.add(key)\n    return true\n  })\n}\n\nexport function getAstrologyTreeMarkers(input: BirthChart | AstrologyTreeChartInput) {\n  const chart = normalizeChartInput(input)\n  const markers: KaabalisticMarkerDescriptor[] = []\n\n  for (const planet of chart.planets) {\n    const normalizedName = normalizeLookupKey(planet.name)\n    if (defaultExcludedAstrologyPoints.has(normalizedName)) {\n      continue\n    }\n\n    const sourceType = getAstrologySourceType(planet.name)\n    const correspondences = getKaabalisticCorrespondenceTargets({\n      kind: sourceType,\n      [sourceType]: planet.name,\n      sign: planet.zodiacPosition.sign,\n    } as KaabalisticPlanetCorrespondenceLookup | KaabalisticNodeCorrespondenceLookup)\n\n    if (!correspondences) {\n      continue\n    }\n\n    markers.push(\n      ...toAstrologyMarkers(correspondences, {\n        sourceType,\n        sourceName: correspondences.source.label,\n      })\n    )\n  }\n\n  for (const node of chart.nodes) {\n    const correspondences = getKaabalisticCorrespondenceTargets({\n      kind: \"node\",\n      node: node.name,\n      sign: node.sign,\n    })\n\n    if (!correspondences) {\n      continue\n    }\n\n    markers.push(\n      ...toAstrologyMarkers(correspondences, {\n        sourceType: \"node\",\n        sourceName: correspondences.source.label,\n      })\n    )\n  }\n\n  const angleTargets: Array<{ angle: string; position?: ZodiacPosition }> = [\n    { angle: \"ASC\", position: chart.houses.ascendant },\n    { angle: \"MC\", position: chart.houses.mc },\n    { angle: \"Vertex\", position: chart.houses.ascmc?.vertex },\n  ]\n\n  for (const angle of angleTargets) {\n    if (!angle.position?.sign) {\n      continue\n    }\n\n    const correspondences = getKaabalisticCorrespondenceTargets({\n      kind: \"angle\",\n      angle: angle.angle,\n      sign: angle.position.sign,\n    })\n\n    if (!correspondences) {\n      continue\n    }\n\n    markers.push(\n      ...toAstrologyMarkers(correspondences, {\n        sourceType: \"angle\",\n        sourceName: correspondences.source.label,\n      })\n    )\n  }\n\n  return dedupeMarkers(markers)\n}\n\nfunction resolveNumerologyInput(input: Date | NumerologyTreeInput) {\n  const birthDate = input instanceof Date ? input : input.birthDate\n  const kaabalisticLifePath =\n    input instanceof Date\n      ? calculateKaabalisticLifePath(birthDate)\n      : input.kaabalisticLifePath ?? calculateKaabalisticLifePath(birthDate)\n  const straightAcrossReductionLifePath =\n    input instanceof Date\n      ? calculateStraightAcrossReductionLifePath(birthDate)\n      : input.straightAcrossReductionLifePath ??\n        calculateStraightAcrossReductionLifePath(birthDate)\n\n  return {\n    birthDate,\n    kaabalisticLifePath,\n    straightAcrossReductionLifePath,\n  }\n}\n\nfunction buildNumberMarkers(sourceName: string, numbers: readonly number[], kind: KaabalisticMarkerKind) {\n  const markers: KaabalisticMarkerDescriptor[] = []\n\n  for (const number of numbers) {\n    const correspondences = getKaabalisticCorrespondenceTargets({\n      kind: \"number\",\n      number,\n      sourceName,\n    })\n\n    if (!correspondences) {\n      continue\n    }\n\n    for (const target of correspondences.targets) {\n      markers.push({\n        kind,\n        targetId: target.targetId,\n        targetType: target.targetType,\n        sourceType: \"number\",\n        sourceName,\n        mapping: target.mapping,\n        label: String(number),\n      })\n    }\n  }\n\n  return markers\n}\n\nexport function getNumerologyTreeMarkers(input: Date | NumerologyTreeInput) {\n  const { kaabalisticLifePath, straightAcrossReductionLifePath } = resolveNumerologyInput(input)\n  const markers: KaabalisticMarkerDescriptor[] = []\n\n  const sources: Array<{ sourceName: string; numbers: readonly number[] }> = [\n    {\n      sourceName: \"Day Energy\",\n      numbers: straightAcrossReductionLifePath.dayEnergy.reductionSteps,\n    },\n    {\n      sourceName: \"Month Energy\",\n      numbers: straightAcrossReductionLifePath.monthEnergy.reductionSteps,\n    },\n    {\n      sourceName: \"Year Energy\",\n      numbers: straightAcrossReductionLifePath.yearEnergy.reductionSteps,\n    },\n    {\n      sourceName: `Life Path (Kaabalistic) ${kaabalisticLifePath.lifePath.reducedValue}`,\n      numbers: kaabalisticLifePath.lifePath.reductionSteps,\n    },\n    {\n      sourceName: `Life Path (Straight) ${straightAcrossReductionLifePath.lifePath.reducedValue}`,\n      numbers: straightAcrossReductionLifePath.lifePath.reductionSteps,\n    },\n  ]\n\n  for (const source of sources) {\n    markers.push(...buildNumberMarkers(source.sourceName, source.numbers, \"numerology\"))\n  }\n\n  return markers\n}\n\nfunction resolveGematriaInput(input: string | GematriaTreeInput) {\n  if (typeof input === \"string\") {\n    return calculateGematria(input)\n  }\n\n  if (input.result) {\n    return input.result\n  }\n\n  if (input.phrase) {\n    return calculateGematria(input.phrase)\n  }\n\n  return undefined\n}\n\nexport function getGematriaTreeMarkers(input: string | GematriaTreeInput) {\n  const result = resolveGematriaInput(input)\n  if (!result) {\n    return []\n  }\n\n  const markers: KaabalisticMarkerDescriptor[] = []\n\n  const numericSources: Array<{ sourceName: string; numbers: readonly number[] }> = [\n    { sourceName: \"Vowels\", numbers: result.vowels.reductionSteps },\n    { sourceName: \"Consonants\", numbers: result.consonants.reductionSteps },\n    { sourceName: \"Synthesis\", numbers: result.synthesis.reductionSteps },\n  ]\n\n  for (const source of numericSources) {\n    markers.push(...buildNumberMarkers(source.sourceName, source.numbers, \"gematria\"))\n  }\n\n  for (const letter of result.includedLetters) {\n    const correspondences = getKaabalisticCorrespondenceTargets({\n      kind: \"hebrewLetter\",\n      hebrewLetterId: letter.hebrewLetterId,\n      sourceName: \"Included Letters\",\n    })\n\n    if (!correspondences) {\n      continue\n    }\n\n    for (const target of correspondences.targets) {\n      markers.push({\n        kind: \"gematria\",\n        targetId: target.targetId,\n        targetType: target.targetType,\n        sourceType: \"letter\",\n        sourceName: \"Included Letters\",\n        mapping: target.mapping,\n        label: letter.hebrewCharacter,\n      })\n    }\n  }\n\n  return markers\n}\n\nfunction incrementCounts(\n  countsById: Partial<Record<KaabalisticTargetId, KaabalisticCountsEntry>>,\n  targetId: KaabalisticTargetId,\n  bucket: SummaryBucket\n) {\n  const current = countsById[targetId] ?? {\n    astro: 0,\n    numerology: 0,\n    gematria: 0,\n    total: 0,\n  }\n\n  current[bucket] += 1\n  current.total += 1\n  countsById[targetId] = current\n}\n\nfunction groupMarkersByTarget(\n  markers: readonly KaabalisticMarkerDescriptor[],\n  targetType: KaabalisticTargetType\n) {\n  const grouped = {} as Partial<Record<KaabalisticTargetId, KaabalisticMarkerDescriptor[]>>\n\n  for (const marker of markers) {\n    if (marker.targetType !== targetType) {\n      continue\n    }\n\n    const bucket = grouped[marker.targetId] ?? []\n    bucket.push(marker)\n    grouped[marker.targetId] = bucket\n  }\n\n  return grouped\n}\n\nfunction buildAstrologySummary(\n  input: BirthChart | AstrologyTreeChartInput,\n  markers: readonly KaabalisticMarkerDescriptor[],\n  countsById: Partial<Record<KaabalisticTargetId, KaabalisticCountsEntry>>\n) {\n  const chart = normalizeChartInput(input)\n  const itemConnections: KaabalisticItemConnection[] = []\n\n  for (const marker of markers) {\n    incrementCounts(countsById, marker.targetId, \"astro\")\n  }\n\n  const groupedBySource = groupByKey(\n    markers,\n    (marker) => `${marker.sourceType}|${marker.sourceName}|${marker.sign ?? \"\"}`\n  )\n\n  for (const sourceMarkers of Object.values(groupedBySource)) {\n    if (!sourceMarkers.length) {\n      continue\n    }\n\n    const firstMarker = sourceMarkers[0]\n    const itemLabel = firstMarker.sign\n      ? `${firstMarker.sourceName} in ${firstMarker.sign}`\n      : firstMarker.sourceName\n    itemConnections.push({\n      itemLabel,\n      targets: toSummaryTargets(getTargetCountMap(sourceMarkers.map((marker) => ({\n        targetId: marker.targetId,\n        targetType: marker.targetType,\n        targetName: getTargetName(marker.targetId),\n        mapping: marker.mapping,\n        distance: 1,\n      })))),\n    })\n  }\n\n  const planetsByName = Object.fromEntries(\n    chart.planets\n      .filter((planet) => !defaultExcludedAstrologyPoints.has(normalizeLookupKey(planet.name)))\n      .map((planet) => [normalizeLookupKey(planet.name), { longitude: planet.longitude }])\n  )\n\n  const aspects = chart.aspects ?? computeAspects(planetsByName, DEFAULT_ASPECT_SPECS)\n  const aspectsByType: Record<string, Partial<Record<KaabalisticTargetId, number>>> = {}\n\n  for (const aspect of aspects) {\n    const aspectId = id(\n      WesternAstrologyTypes.ASPECT,\n      WESTERN_ASPECTS[aspect.aspect.toUpperCase() as keyof typeof WESTERN_ASPECTS] ?? aspect.aspect\n    )\n    const sphere = canonicalTree.getCorrespondences(aspectId, {\n      type: KaabalahTypes.SPHERE,\n      depth: 1,\n      limit: 1,\n    })[0]?.node\n\n    if (!sphere) {\n      continue\n    }\n\n    incrementCounts(countsById, sphere.id as NodeId<KaabalahTypes.SPHERE>, \"astro\")\n    const bucket = aspectsByType[aspect.aspect] ?? {}\n    bucket[sphere.id as NodeId<KaabalahTypes.SPHERE>] =\n      (bucket[sphere.id as NodeId<KaabalahTypes.SPHERE>] ?? 0) + 1\n    aspectsByType[aspect.aspect] = bucket\n  }\n\n  for (const [aspectName, reduceMap] of Object.entries(aspectsByType)) {\n    itemConnections.push({\n      itemLabel: `Aspects — ${capitalizeWords(aspectName)}`,\n      targets: toSummaryTargets(reduceMap),\n    })\n  }\n\n  for (const planet of chart.planets) {\n    if (defaultExcludedAstrologyPoints.has(normalizeLookupKey(planet.name))) {\n      continue\n    }\n\n    const house = getHouseNodeByNumber(planet.zodiacPosition.house)\n    if (!house) {\n      continue\n    }\n\n    const sign = canonicalTree.getCorrespondences(house.id, {\n      type: WesternAstrologyTypes.WESTERN_ZODIAC_SIGN,\n      depth: 1,\n      limit: 1,\n    })[0]?.node\n    if (!sign) {\n      continue\n    }\n\n    const spheres = canonicalTree.getCorrespondences(sign.id, {\n      type: KaabalahTypes.SPHERE,\n      depth: 1,\n    })\n    if (!spheres.length) {\n      continue\n    }\n\n    const reduceMap: Partial<Record<KaabalisticTargetId, number>> = {}\n    for (const sphere of spheres) {\n      const sphereId = sphere.node.id as NodeId<KaabalahTypes.SPHERE>\n      incrementCounts(countsById, sphereId, \"astro\")\n      reduceMap[sphereId] = (reduceMap[sphereId] ?? 0) + 1\n    }\n\n    itemConnections.push({\n      itemLabel: `${planet.name} • House ${planet.zodiacPosition.house}`,\n      targets: toSummaryTargets(reduceMap),\n    })\n  }\n\n  return itemConnections\n}\n\nfunction buildSourceSummary(\n  markers: readonly KaabalisticMarkerDescriptor[],\n  bucket: SummaryBucket,\n  countsById: Partial<Record<KaabalisticTargetId, KaabalisticCountsEntry>>\n) {\n  const groupedBySource = groupByKey(\n    markers,\n    (marker) => `${marker.sourceType}|${marker.sourceName}`\n  )\n\n  const connections: KaabalisticItemConnection[] = []\n\n  for (const sourceMarkers of Object.values(groupedBySource)) {\n    if (!sourceMarkers.length) {\n      continue\n    }\n\n    for (const marker of sourceMarkers) {\n      incrementCounts(countsById, marker.targetId, bucket)\n    }\n\n    connections.push({\n      itemLabel: sourceMarkers[0].sourceName,\n      targets: toSummaryTargets(getTargetCountMap(sourceMarkers.map((marker) => ({\n        targetId: marker.targetId,\n        targetType: marker.targetType,\n        targetName: getTargetName(marker.targetId),\n        mapping: marker.mapping,\n        distance: 1,\n      })))),\n    })\n  }\n\n  return connections\n}\n\nfunction capitalizeWords(value: string) {\n  return value\n    .split(/\\s+/)\n    .filter(Boolean)\n    .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n    .join(\" \")\n}\n\nexport function buildKaabalisticMapData(input: BuildKaabalisticMapDataInput): KaabalisticMapData {\n  const countsById: Partial<Record<KaabalisticTargetId, KaabalisticCountsEntry>> = {}\n  const allMarkers: KaabalisticMarkerDescriptor[] = []\n\n  const astrologyMarkers = input.astrology ? getAstrologyTreeMarkers(input.astrology) : []\n  const numerologyMarkers = input.numerology ? getNumerologyTreeMarkers(input.numerology) : []\n  const gematriaMarkers = input.gematria ? getGematriaTreeMarkers(input.gematria) : []\n\n  allMarkers.push(...astrologyMarkers, ...numerologyMarkers, ...gematriaMarkers)\n\n  const itemConnections = {\n    astrology: input.astrology\n      ? buildAstrologySummary(input.astrology, astrologyMarkers, countsById)\n      : [],\n    numerology: numerologyMarkers.length\n      ? buildSourceSummary(numerologyMarkers, \"numerology\", countsById)\n      : [],\n    gematria: gematriaMarkers.length\n      ? buildSourceSummary(gematriaMarkers, \"gematria\", countsById)\n      : [],\n  }\n\n  const sphereMarkers = groupMarkersByTarget(allMarkers, \"sphere\") as Partial<\n    Record<NodeId<KaabalahTypes.SPHERE>, readonly KaabalisticMarkerDescriptor[]>\n  >\n  const pathMarkers = groupMarkersByTarget(allMarkers, \"path\") as Partial<\n    Record<NodeId<KaabalahTypes.PATH>, readonly KaabalisticMarkerDescriptor[]>\n  >\n\n  return {\n    spheres: orderedSpheres,\n    paths: orderedPaths,\n    markers: allMarkers,\n    sphereMarkers,\n    pathMarkers,\n    countsById,\n    itemConnections,\n  }\n}\n","import {\n  getCanonicalTree,\n  id,\n  KaabalahTypes,\n  parseId,\n  TarotTypes,\n  type Node,\n  type NodeData,\n  type NodeId,\n  type NodeType,\n  WESTERN_HOUSES,\n  WesternAstrologyTypes,\n} from \"../core\"\nimport {\n  ARKANNUS,\n  getTarotArchetype,\n  type TarotCard,\n} from \"../tarot\"\n\nexport * from \"./kaabalistic\"\n\nexport const OCCULT_THEME_STOPWORDS = [\n  \"the\",\n  \"and\",\n  \"for\",\n  \"with\",\n  \"that\",\n  \"this\",\n  \"was\",\n  \"were\",\n  \"been\",\n  \"have\",\n  \"has\",\n  \"had\",\n  \"just\",\n  \"from\",\n  \"into\",\n  \"about\",\n  \"over\",\n  \"under\",\n  \"very\",\n  \"more\",\n  \"less\",\n  \"then\",\n  \"than\",\n  \"when\",\n  \"what\",\n  \"where\",\n  \"which\",\n  \"while\",\n  \"would\",\n  \"could\",\n  \"should\",\n  \"again\",\n  \"still\",\n  \"really\",\n  \"gotta\",\n  \"lota\",\n  \"lotta\",\n  \"para\",\n  \"com\",\n  \"sem\",\n  \"por\",\n  \"uma\",\n  \"um\",\n  \"uns\",\n  \"das\",\n  \"dos\",\n  \"del\",\n  \"que\",\n  \"não\",\n  \"nao\",\n  \"isso\",\n  \"essa\",\n  \"este\",\n  \"esta\",\n  \"como\",\n  \"mais\",\n  \"menos\",\n  \"muito\",\n  \"muita\",\n  \"their\",\n  \"your\",\n  \"mine\",\n  \"ours\",\n  \"onto\",\n  \"sobre\",\n  \"entre\",\n  \"depois\",\n  \"antes\",\n] as const\n\nexport interface TokenizeOccultThemeTextOptions {\n  minTokenLength?: number;\n  stopwords?: readonly string[];\n}\n\nexport interface OccultThemeCorrespondence<T extends NodeType> {\n  id: NodeId<T>;\n  label: string;\n  distance: number;\n}\n\nexport interface OccultThemeCorrespondences {\n  planets: readonly OccultThemeCorrespondence<WesternAstrologyTypes.PLANET>[];\n  signs: readonly OccultThemeCorrespondence<WesternAstrologyTypes.WESTERN_ZODIAC_SIGN>[];\n  elements: readonly OccultThemeCorrespondence<WesternAstrologyTypes.WESTERN_ELEMENT>[];\n  spheres: readonly OccultThemeCorrespondence<KaabalahTypes.SPHERE>[];\n  paths: readonly OccultThemeCorrespondence<KaabalahTypes.PATH>[];\n}\n\nexport type HouseThemeScope = \"personal\" | \"transition\" | \"transpersonal\"\n\nexport interface HouseThemeAxis {\n  key:\n    | \"self-other\"\n    | \"resources-initiation\"\n    | \"communication-journey\"\n    | \"private-public\"\n    | \"pleasure-friendship\"\n    | \"health-occult\";\n  label: string;\n  oppositeHouseNumber: HouseNumber;\n}\n\nexport type HouseNumber =\n  | 1\n  | 2\n  | 3\n  | 4\n  | 5\n  | 6\n  | 7\n  | 8\n  | 9\n  | 10\n  | 11\n  | 12\n\nexport type HouseThemeLookup =\n  | HouseNumber\n  | NodeId<WesternAstrologyTypes.HOUSE>;\n\nexport interface HouseThemeProfile {\n  kind: \"house\";\n  id: NodeId<WesternAstrologyTypes.HOUSE>;\n  houseNumber: HouseNumber;\n  houseLabel: string;\n  primaryLabel: string;\n  scope: HouseThemeScope;\n  axis: HouseThemeAxis;\n  aliases: readonly string[];\n  keywords: readonly string[];\n  tokens: readonly string[];\n  correspondences: OccultThemeCorrespondences;\n}\n\nexport interface TarotMajorArchetypeReference {\n  pathId: NodeId<KaabalahTypes.PATH>;\n  pathNumber: number;\n  pathSlug: string;\n  hebrewLetter: string;\n}\n\nexport interface TarotThemeCorrespondences extends OccultThemeCorrespondences {\n  suits: readonly OccultThemeCorrespondence<TarotTypes.TAROT_SUIT>[];\n}\n\nexport type TarotThemeLookup =\n  | number\n  | string\n  | { tarotCardNumber: number }\n  | { tarotCardFilename: string }\n  | { tarotCardName: string }\n  | { tarotArkAnnuId: NodeId<TarotTypes.TAROT_ARK_ANNU> }\n  | { pathId: NodeId<KaabalahTypes.PATH> }\n  | { pathSlug: string };\n\nexport interface TarotThemeProfile {\n  kind: \"tarot\";\n  id: NodeId<TarotTypes.TAROT_ARK_ANNU>;\n  cardNumber: number;\n  cardType: TarotCard[\"type\"];\n  tarotCardFilename: string;\n  primaryLabel: string;\n  aliases: readonly string[];\n  keywords: readonly string[];\n  tokens: readonly string[];\n  correspondences: TarotThemeCorrespondences;\n  majorArchetype?: TarotMajorArchetypeReference;\n}\n\ntype HouseThemeSeed = {\n  primaryLabel: string;\n  scope: HouseThemeScope;\n  aliases: readonly string[];\n  keywords: readonly string[];\n}\n\ntype TarotThemeProfileCache = {\n  profiles: readonly TarotThemeProfile[];\n  byId: Map<string, TarotThemeProfile>;\n  byCardNumber: Map<number, TarotThemeProfile>;\n  byFilename: Map<string, TarotThemeProfile>;\n  byName: Map<string, TarotThemeProfile>;\n  byPathId: Map<string, TarotThemeProfile>;\n  byPathSlug: Map<string, TarotThemeProfile>;\n}\n\nconst canonicalTree = getCanonicalTree({\n  system: \"kaabalah\",\n  parts: [\"westernAstrology\", \"tarot\"],\n})\n\nconst HOUSE_LABELS_BY_NUMBER = [\n  WESTERN_HOUSES.ASCENDANT,\n  WESTERN_HOUSES.SECOND_HOUSE,\n  WESTERN_HOUSES.THIRD_HOUSE,\n  WESTERN_HOUSES.IMUM_COELI,\n  WESTERN_HOUSES.FIFTH_HOUSE,\n  WESTERN_HOUSES.SIXTH_HOUSE,\n  WESTERN_HOUSES.DESCENDANT,\n  WESTERN_HOUSES.EIGHTH_HOUSE,\n  WESTERN_HOUSES.NINTH_HOUSE,\n  WESTERN_HOUSES.MEDIUM_COELI,\n  WESTERN_HOUSES.ELEVENTH_HOUSE,\n  WESTERN_HOUSES.TWELFTH_HOUSE,\n] as const\n\nconst HOUSE_THEME_SEEDS: Record<HouseNumber, HouseThemeSeed> = {\n  1: {\n    primaryLabel: \"Images\",\n    scope: \"personal\",\n    aliases: [\n      \"First House\",\n      \"House 1\",\n      \"Casa 1\",\n      \"Imagens\",\n      \"Como me vejo e como outros me veem\",\n      \"Self-image\",\n    ],\n    keywords: [\n      \"images\",\n      \"imagens\",\n      \"identity\",\n      \"self-image\",\n      \"appearance\",\n      \"body\",\n      \"personality\",\n      \"first impression\",\n      \"persona\",\n      \"character\",\n      \"personagem\",\n      \"how I see myself\",\n      \"how others see me\",\n    ],\n  },\n  2: {\n    primaryLabel: \"Money\",\n    scope: \"personal\",\n    aliases: [\"Second House\", \"House 2\", \"Casa 2\", \"Dinheiro\", \"Resources\"],\n    keywords: [\n      \"money\",\n      \"dinheiro\",\n      \"resources\",\n      \"income\",\n      \"finances\",\n      \"possessions\",\n      \"values\",\n      \"material values\",\n      \"self-worth\",\n    ],\n  },\n  3: {\n    primaryLabel: \"Communication\",\n    scope: \"personal\",\n    aliases: [\"Third House\", \"House 3\", \"Casa 3\", \"Comunicação\", \"Comunicações\"],\n    keywords: [\n      \"communication\",\n      \"comunicação\",\n      \"comunicações\",\n      \"siblings\",\n      \"writing\",\n      \"language\",\n      \"study\",\n      \"neighborhood\",\n      \"short trips\",\n      \"early education\",\n      \"mind\",\n    ],\n  },\n  4: {\n    primaryLabel: \"Family\",\n    scope: \"personal\",\n    aliases: [\n      \"Fourth House\",\n      \"House 4\",\n      \"Casa 4\",\n      \"IC\",\n      \"Home Angle\",\n      \"Família\",\n      \"Famílias\",\n      \"Family (not only blood)\",\n      \"Familia (não só de sangue)\",\n    ],\n    keywords: [\n      \"family\",\n      \"familia\",\n      \"families\",\n      \"famílias\",\n      \"home\",\n      \"roots\",\n      \"belonging\",\n      \"kinship\",\n      \"chosen family\",\n      \"vida íntima\",\n      \"inner foundation\",\n      \"private life\",\n    ],\n  },\n  5: {\n    primaryLabel: \"Hobbies\",\n    scope: \"personal\",\n    aliases: [\"Fifth House\", \"House 5\", \"Casa 5\", \"Hobbies\", \"Lazer\", \"Pleasures\"],\n    keywords: [\n      \"hobbies\",\n      \"hobby\",\n      \"lazer\",\n      \"pleasure\",\n      \"fun\",\n      \"games\",\n      \"creative leisure\",\n      \"creativity\",\n      \"children\",\n      \"romance\",\n      \"speculation\",\n    ],\n  },\n  6: {\n    primaryLabel: \"Health\",\n    scope: \"personal\",\n    aliases: [\"Sixth House\", \"House 6\", \"Casa 6\", \"Saúde\", \"Health\"],\n    keywords: [\n      \"health\",\n      \"saúde\",\n      \"routine\",\n      \"service\",\n      \"care\",\n      \"wellbeing\",\n      \"body maintenance\",\n      \"daily work\",\n      \"pets\",\n    ],\n  },\n  7: {\n    primaryLabel: \"Associations\",\n    scope: \"transition\",\n    aliases: [\n      \"Seventh House\",\n      \"House 7\",\n      \"Casa 7\",\n      \"Associações\",\n      \"Partnerships\",\n      \"Associations\",\n    ],\n    keywords: [\n      \"associations\",\n      \"associações\",\n      \"partnerships\",\n      \"partners\",\n      \"alliances\",\n      \"cooperation\",\n      \"the other\",\n      \"relationships\",\n      \"marriage\",\n      \"contracts\",\n      \"open enemies\",\n    ],\n  },\n  8: {\n    primaryLabel: \"Sex and Initiations\",\n    scope: \"transpersonal\",\n    aliases: [\n      \"Eighth House\",\n      \"House 8\",\n      \"Casa 8\",\n      \"Sexo\",\n      \"Iniciações\",\n      \"Sexo / Iniciações\",\n    ],\n    keywords: [\n      \"sex\",\n      \"sexo\",\n      \"initiations\",\n      \"iniciações\",\n      \"transformation\",\n      \"transmutations\",\n      \"taboo\",\n      \"death\",\n      \"shared resources\",\n      \"sexuality\",\n      \"occult\",\n      \"death rebirth\",\n    ],\n  },\n  9: {\n    primaryLabel: \"Travel and Knowledge\",\n    scope: \"transpersonal\",\n    aliases: [\n      \"Ninth House\",\n      \"House 9\",\n      \"Casa 9\",\n      \"Viagens\",\n      \"Travel\",\n      \"Travel, Religion, Philosophy, Knowledge\",\n    ],\n    keywords: [\n      \"travel\",\n      \"viagens\",\n      \"religion\",\n      \"religião\",\n      \"philosophy\",\n      \"filosofia\",\n      \"knowledge\",\n      \"conhecimento\",\n      \"higher studies\",\n      \"higher education\",\n      \"publishing\",\n      \"law\",\n    ],\n  },\n  10: {\n    primaryLabel: \"Career and Work\",\n    scope: \"transpersonal\",\n    aliases: [\n      \"Tenth House\",\n      \"House 10\",\n      \"Casa 10\",\n      \"Midheaven\",\n      \"MC\",\n      \"Carreira\",\n      \"Trabalho\",\n    ],\n    keywords: [\n      \"career\",\n      \"carreira\",\n      \"work\",\n      \"trabalho\",\n      \"profession\",\n      \"reputation\",\n      \"vocation\",\n      \"public life\",\n      \"public image\",\n      \"ambition\",\n      \"authority\",\n      \"legacy\",\n    ],\n  },\n  11: {\n    primaryLabel: \"Friends\",\n    scope: \"transpersonal\",\n    aliases: [\"Eleventh House\", \"House 11\", \"Casa 11\", \"Friends\", \"Amigos\", \"Relações\"],\n    keywords: [\n      \"friends\",\n      \"amigos\",\n      \"friendships\",\n      \"relations\",\n      \"network\",\n      \"community\",\n      \"groups\",\n      \"projects\",\n      \"ideals\",\n      \"hopes\",\n      \"humanitarian goals\",\n    ],\n  },\n  12: {\n    primaryLabel: \"Past Lives\",\n    scope: \"transpersonal\",\n    aliases: [\n      \"Twelfth House\",\n      \"House 12\",\n      \"Casa 12\",\n      \"Vida passada\",\n      \"Vidas passadas\",\n      \"Past life\",\n      \"Past lives\",\n      \"Oculto\",\n    ],\n    keywords: [\n      \"past life\",\n      \"past lives\",\n      \"vida passada\",\n      \"vidas passadas\",\n      \"karma\",\n      \"occult\",\n      \"hidden\",\n      \"unconscious\",\n      \"spiritual memory\",\n      \"isolation\",\n      \"spirituality\",\n      \"hidden enemies\",\n      \"self undoing\",\n    ],\n  },\n}\n\nconst TAROT_SUIT_ALIASES: Partial<Record<NonNullable<TarotCard[\"suit\"]>, readonly string[]>> = {\n  wands: [\"Rods\", \"Staves\", \"Paus\"],\n  cups: [\"Chalices\", \"Copas\"],\n  swords: [\"Blades\", \"Espadas\"],\n  pentacles: [\"Coins\", \"Disks\", \"Discs\", \"Ouros\"],\n}\n\nconst TAROT_SUIT_THEME_KEYWORDS: Partial<Record<NonNullable<TarotCard[\"suit\"]>, readonly string[]>> = {\n  wands: [\n    \"paus\",\n    \"fire\",\n    \"will\",\n    \"inspiration\",\n    \"creation\",\n    \"force\",\n    \"vigor\",\n    \"initiative\",\n    \"progress\",\n    \"thinking\",\n    \"associating ideas\",\n    \"seeking results\",\n    \"politicians\",\n    \"workers\",\n    \"producers\",\n    \"salamanders\",\n  ],\n  cups: [\n    \"copas\",\n    \"water\",\n    \"feelings\",\n    \"emotions\",\n    \"receptivity\",\n    \"sensitivity\",\n    \"ideals\",\n    \"love\",\n    \"artistic creation\",\n    \"feeling\",\n    \"affective\",\n    \"relational\",\n    \"emotional\",\n    \"clergy\",\n    \"spiritual class\",\n    \"ondines\",\n    \"mermaids\",\n  ],\n  swords: [\n    \"espadas\",\n    \"air\",\n    \"thought\",\n    \"intelligence\",\n    \"exchanges\",\n    \"cooperation of opposites\",\n    \"maturity\",\n    \"balance\",\n    \"intuition\",\n    \"sixth sense\",\n    \"imagination\",\n    \"future vision\",\n    \"military\",\n    \"warriors\",\n    \"police\",\n    \"sylphs\",\n    \"giants\",\n  ],\n  pentacles: [\n    \"ouros\",\n    \"earth\",\n    \"concretization\",\n    \"manifestation\",\n    \"practical intelligence\",\n    \"effort\",\n    \"study\",\n    \"gains\",\n    \"business\",\n    \"sensation\",\n    \"five senses\",\n    \"concrete perception\",\n    \"present\",\n    \"bourgeoisie\",\n    \"finances\",\n    \"commerce\",\n    \"gnomes\",\n  ],\n}\n\nconst TAROT_COURT_RANK_THEME_KEYWORDS: Partial<Record<string, readonly string[]>> = {\n  king: [\"dynamic\", \"active\", \"lordly\", \"cardinal\"],\n  queen: [\"stable\", \"receptive\", \"contained\", \"fixed\"],\n  knight: [\"volatile\", \"mutant\", \"active\", \"mutable\"],\n  page: [\"nascent\", \"fragile\", \"beginning\", \"starting\"],\n}\n\nconst TAROT_MINOR_PIP_STAGE_KEYWORDS: Partial<Record<string, readonly string[]>> = {\n  ace: [\"will\", \"pure potential\", \"something new emerging\", \"first spark\"],\n  two: [\"imagining\", \"visualizing\", \"formulating the idea\"],\n  three: [\"speaking\", \"understanding\", \"verbalizing\", \"giving form\"],\n  four: [\"expanding\", \"planning\", \"growth\", \"good feelings\"],\n  five: [\"restricting\", \"discipline\", \"justice\", \"pruning\", \"confronting limits\"],\n  six: [\"harmonizing\", \"beauty\", \"ethics\", \"balance\", \"heart\"],\n  seven: [\"winning silently\", \"emotional control\", \"quiet victory\", \"endurance\"],\n  eight: [\"connecting\", \"rational control\", \"linking concepts\", \"strategy\"],\n  nine: [\"foundations\", \"worthy\", \"solid base\"],\n  ten: [\"manifesting\", \"materialized\", \"completion\"],\n}\n\nlet houseThemeProfilesCache: readonly HouseThemeProfile[] | undefined\nlet tarotThemeProfilesCache: TarotThemeProfileCache | undefined\n\nfunction getHouseThemeAxis(houseNumber: HouseNumber): HouseThemeAxis {\n  const axisPairs: Record<HouseNumber, HouseThemeAxis> = {\n    1: { key: \"self-other\", label: \"Self and Other\", oppositeHouseNumber: 7 },\n    2: { key: \"resources-initiation\", label: \"Resources and Initiation\", oppositeHouseNumber: 8 },\n    3: { key: \"communication-journey\", label: \"Communication and Journey\", oppositeHouseNumber: 9 },\n    4: { key: \"private-public\", label: \"Private and Public Life\", oppositeHouseNumber: 10 },\n    5: { key: \"pleasure-friendship\", label: \"Pleasure and Friendship\", oppositeHouseNumber: 11 },\n    6: { key: \"health-occult\", label: \"Health and the Occult\", oppositeHouseNumber: 12 },\n    7: { key: \"self-other\", label: \"Self and Other\", oppositeHouseNumber: 1 },\n    8: { key: \"resources-initiation\", label: \"Resources and Initiation\", oppositeHouseNumber: 2 },\n    9: { key: \"communication-journey\", label: \"Communication and Journey\", oppositeHouseNumber: 3 },\n    10: { key: \"private-public\", label: \"Private and Public Life\", oppositeHouseNumber: 4 },\n    11: { key: \"pleasure-friendship\", label: \"Pleasure and Friendship\", oppositeHouseNumber: 5 },\n    12: { key: \"health-occult\", label: \"Health and the Occult\", oppositeHouseNumber: 6 },\n  }\n\n  return axisPairs[houseNumber]\n}\n\nfunction normalizeThemeText(value: string) {\n  return value\n    .normalize(\"NFD\")\n    .replace(/[\\u0300-\\u036f]/g, \"\")\n    .toLowerCase()\n}\n\nfunction uniqueStrings(values: Iterable<string | null | undefined>) {\n  const seen = new Set<string>()\n  const result: string[] = []\n\n  for (const value of values) {\n    const trimmed = value?.trim()\n\n    if (!trimmed || seen.has(trimmed)) {\n      continue\n    }\n\n    seen.add(trimmed)\n    result.push(trimmed)\n  }\n\n  return result\n}\n\nfunction titleCase(value: string) {\n  return value\n    .split(\" \")\n    .map((part) => part ? `${part[0].toUpperCase()}${part.slice(1)}` : part)\n    .join(\" \")\n}\n\nfunction humanizeTarotFilename(filename: string) {\n  return titleCase(\n    filename\n      .replace(/^\\d+_/, \"\")\n      .replace(/_/g, \" \")\n  )\n}\n\nfunction getNodeDisplayLabel<T extends NodeType>(node: Node<T>) {\n  const parsedId = parseId(node.id)\n\n  if (node.type === KaabalahTypes.PATH) {\n    return `Path ${parsedId}`\n  }\n\n  if (node.type === TarotTypes.TAROT_SUIT) {\n    return titleCase(parsedId)\n  }\n\n  return node.name ?? titleCase(parsedId)\n}\n\nfunction getNodeTextCandidates<T extends NodeType>(node: Node<T>) {\n  const data = node.data as Record<string, unknown> | undefined\n\n  return uniqueStrings([\n    getNodeDisplayLabel(node),\n    parseId(node.id),\n    typeof data?.englishName === \"string\" ? data.englishName : undefined,\n    typeof data?.meaning === \"string\" ? data.meaning : undefined,\n  ])\n}\n\nfunction getCorrespondenceRefs<T extends NodeType>(\n  nodeId: NodeId<NodeType>,\n  type: T,\n  depth: number\n): OccultThemeCorrespondence<T>[] {\n  return canonicalTree\n    .getCorrespondences(nodeId, { type, depth })\n    .map((match) => ({\n      id: match.node.id as NodeId<T>,\n      label: getNodeDisplayLabel(match.node as Node<T>),\n      distance: match.distance,\n    }))\n}\n\nfunction collectCorrespondenceTexts<T extends NodeType>(\n  correspondences: readonly OccultThemeCorrespondence<T>[]\n) {\n  const texts: string[] = []\n\n  for (const correspondence of correspondences) {\n    const node = canonicalTree.getNode(correspondence.id)\n\n    if (!node) {\n      continue\n    }\n\n    texts.push(...getNodeTextCandidates(node))\n  }\n\n  return texts\n}\n\nfunction freezeCorrespondences<T extends NodeType>(\n  correspondences: OccultThemeCorrespondence<T>[]\n) {\n  correspondences.forEach((correspondence) => Object.freeze(correspondence))\n  return Object.freeze(correspondences) as readonly OccultThemeCorrespondence<T>[]\n}\n\nfunction createTokenSurface(values: Iterable<string | null | undefined>) {\n  return tokenizeOccultThemeText([...values])\n}\n\nfunction getHouseLabelFromLookup(lookup: HouseThemeLookup) {\n  if (typeof lookup === \"number\") {\n    return HOUSE_LABELS_BY_NUMBER[lookup - 1]\n  }\n\n  if (String(lookup).startsWith(`${WesternAstrologyTypes.HOUSE}:`)) {\n    return parseId(lookup)\n  }\n\n  return undefined\n}\n\nfunction buildHouseThemeProfile(houseNumber: HouseNumber): HouseThemeProfile {\n  const houseLabel = HOUSE_LABELS_BY_NUMBER[houseNumber - 1]\n  const houseId = id(WesternAstrologyTypes.HOUSE, houseLabel)\n  const seed = HOUSE_THEME_SEEDS[houseNumber]\n  const primaryLabel = seed.primaryLabel\n  const axis = getHouseThemeAxis(houseNumber)\n  const aliases = uniqueStrings(seed.aliases)\n  const signs = getCorrespondenceRefs(houseId, WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, 1)\n  const planets = getCorrespondenceRefs(houseId, WesternAstrologyTypes.PLANET, 2)\n  const elements = getCorrespondenceRefs(houseId, WesternAstrologyTypes.WESTERN_ELEMENT, 2)\n  const spheres = getCorrespondenceRefs(houseId, KaabalahTypes.SPHERE, 2)\n  const paths = getCorrespondenceRefs(houseId, KaabalahTypes.PATH, 2)\n\n  const correspondenceTexts = [\n    ...collectCorrespondenceTexts(signs),\n    ...collectCorrespondenceTexts(planets),\n    ...collectCorrespondenceTexts(elements),\n    ...collectCorrespondenceTexts(spheres),\n    ...collectCorrespondenceTexts(paths),\n  ]\n\n  const keywords = uniqueStrings(seed.keywords)\n  const tokens = createTokenSurface([\n    primaryLabel,\n    ...aliases,\n    ...keywords,\n    ...correspondenceTexts,\n  ])\n\n  const profile: HouseThemeProfile = {\n    kind: \"house\",\n    id: houseId,\n    houseNumber,\n    houseLabel: titleCase(houseLabel),\n    primaryLabel,\n    scope: seed.scope,\n    axis: Object.freeze(axis),\n    aliases: Object.freeze(aliases),\n    keywords: Object.freeze(keywords),\n    tokens: Object.freeze(tokens),\n    correspondences: Object.freeze({\n      planets: freezeCorrespondences(planets),\n      signs: freezeCorrespondences(signs),\n      elements: freezeCorrespondences(elements),\n      spheres: freezeCorrespondences(spheres),\n      paths: freezeCorrespondences(paths),\n    }),\n  }\n\n  return Object.freeze(profile)\n}\n\nfunction getHouseThemeProfileCache() {\n  if (houseThemeProfilesCache) {\n    return houseThemeProfilesCache\n  }\n\n  houseThemeProfilesCache = Object.freeze(HOUSE_LABELS_BY_NUMBER.map((_, index) =>\n    buildHouseThemeProfile((index + 1) as HouseNumber)\n  ))\n\n  return houseThemeProfilesCache\n}\n\nfunction getTarotRank(card: TarotCard) {\n  if (!card.tarotCard.includes(\" of \")) {\n    return undefined\n  }\n\n  return card.tarotCard.split(\" of \")[0].toLowerCase()\n}\n\nfunction buildTarotAliases(\n  card: TarotCard,\n  majorArchetype?: TarotThemeProfile[\"majorArchetype\"],\n  descriptiveData?: NodeData<TarotTypes.TAROT_ARK_ANNU>[\"descriptiveData\"]\n) {\n  const normalizedPrimaryLabel = normalizeThemeText(card.tarotCard)\n  const cardNode = canonicalTree.getNode(id(TarotTypes.TAROT_ARK_ANNU, card.tarotCard))\n  const aliases: Array<string | undefined> = [\n    humanizeTarotFilename(card.tarotCardFilename),\n    card.egyptianCardName,\n    ...Object.values(descriptiveData ?? {}).map((description) => description?.name),\n    ...(cardNode?.data?.aliases ?? []),\n  ]\n\n  if (majorArchetype) {\n    aliases.push(titleCase(majorArchetype.pathSlug))\n  }\n\n  if (card.suit && card.tarotCard.includes(\" of \")) {\n    const rankLabel = card.tarotCard.split(\" of \")[0]\n\n    for (const suitAlias of TAROT_SUIT_ALIASES[card.suit] ?? []) {\n      aliases.push(`${rankLabel} of ${suitAlias}`)\n    }\n  }\n\n  return uniqueStrings(\n    aliases\n      .filter((alias): alias is string => Boolean(alias))\n      .filter((alias) => normalizeThemeText(alias) !== normalizedPrimaryLabel)\n  )\n}\n\nfunction buildTarotKeywordTexts(\n  card: TarotCard,\n  majorArchetype?: TarotThemeProfile[\"majorArchetype\"],\n  descriptiveData?: NodeData<TarotTypes.TAROT_ARK_ANNU>[\"descriptiveData\"]\n) {\n  const rank = getTarotRank(card)\n  const deckKeywordTexts = Object.values(descriptiveData ?? {}).flatMap((description) => [\n    description?.meaning,\n    description?.reversedMeaning,\n    ...(description?.keywords ?? []),\n  ])\n\n  return uniqueStrings([\n    card.meaning,\n    card.papusMeaning,\n    card.egyptianCardName,\n    ...(canonicalTree.getNode(id(TarotTypes.TAROT_ARK_ANNU, card.tarotCard))?.data?.keywords ?? []),\n    ...deckKeywordTexts,\n    ...(card.suit ? TAROT_SUIT_THEME_KEYWORDS[card.suit] ?? [] : []),\n    ...(card.type === \"minor\" && rank ? TAROT_MINOR_PIP_STAGE_KEYWORDS[rank] ?? [] : []),\n    ...(rank ? TAROT_COURT_RANK_THEME_KEYWORDS[rank] ?? [] : []),\n    majorArchetype?.hebrewLetter,\n  ])\n}\n\nfunction buildTarotThemeProfile(card: TarotCard): TarotThemeProfile {\n  const cardId = id(TarotTypes.TAROT_ARK_ANNU, card.tarotCard)\n  const cardNode = canonicalTree.getNode(cardId)\n\n  if (!cardNode) {\n    throw new Error(`Missing canonical tarot node for ${cardId}.`)\n  }\n\n  const majorArchetypeData = card.type === \"major\"\n    ? getTarotArchetype({ tarotCardNumber: card.number })\n    : undefined\n  const majorArchetype = majorArchetypeData\n    ? {\n        pathId: majorArchetypeData.pathId,\n        pathNumber: majorArchetypeData.pathNumber,\n        pathSlug: majorArchetypeData.pathSlug,\n        hebrewLetter: majorArchetypeData.hebrewLetter,\n      }\n    : undefined\n  const aliases = buildTarotAliases(\n    card,\n    majorArchetype,\n    cardNode.data?.descriptiveData\n  )\n  const suits = getCorrespondenceRefs(cardId, TarotTypes.TAROT_SUIT, 1)\n  const planets = getCorrespondenceRefs(cardId, WesternAstrologyTypes.PLANET, 3)\n  const signs = getCorrespondenceRefs(cardId, WesternAstrologyTypes.WESTERN_ZODIAC_SIGN, 3)\n  const elements = getCorrespondenceRefs(cardId, WesternAstrologyTypes.WESTERN_ELEMENT, 3)\n  const spheres = getCorrespondenceRefs(cardId, KaabalahTypes.SPHERE, 3)\n  const paths = getCorrespondenceRefs(cardId, KaabalahTypes.PATH, 2)\n  const keywordTexts = buildTarotKeywordTexts(\n    card,\n    majorArchetype,\n    cardNode.data?.descriptiveData\n  )\n  const keywords = createTokenSurface(keywordTexts)\n  const correspondenceTexts = [\n    ...collectCorrespondenceTexts(suits),\n    ...collectCorrespondenceTexts(planets),\n    ...collectCorrespondenceTexts(signs),\n    ...collectCorrespondenceTexts(elements),\n    ...collectCorrespondenceTexts(spheres),\n    ...collectCorrespondenceTexts(paths),\n  ]\n  const tokens = uniqueStrings([\n    ...keywords,\n    ...createTokenSurface([\n      card.tarotCard,\n      ...aliases,\n      ...correspondenceTexts,\n      card.suit,\n      majorArchetype?.pathSlug,\n    ]),\n  ])\n\n  const profile: TarotThemeProfile = {\n    kind: \"tarot\",\n    id: cardId,\n    cardNumber: card.number,\n    cardType: card.type,\n    tarotCardFilename: card.tarotCardFilename,\n    primaryLabel: card.tarotCard,\n    aliases: Object.freeze(aliases),\n    keywords: Object.freeze(keywords),\n    tokens: Object.freeze(tokens),\n    correspondences: Object.freeze({\n      planets: freezeCorrespondences(planets),\n      signs: freezeCorrespondences(signs),\n      elements: freezeCorrespondences(elements),\n      spheres: freezeCorrespondences(spheres),\n      paths: freezeCorrespondences(paths),\n      suits: freezeCorrespondences(suits),\n    }),\n    majorArchetype: majorArchetype ? Object.freeze(majorArchetype) : undefined,\n  }\n\n  return Object.freeze(profile)\n}\n\nfunction getTarotThemeProfileCache(): TarotThemeProfileCache {\n  if (tarotThemeProfilesCache) {\n    return tarotThemeProfilesCache\n  }\n\n  const profiles = Object.freeze(ARKANNUS.map((card) => buildTarotThemeProfile(card)))\n\n  tarotThemeProfilesCache = {\n    profiles,\n    byId: new Map(profiles.map((profile) => [profile.id, profile])),\n    byCardNumber: new Map(profiles.map((profile) => [profile.cardNumber, profile])),\n    byFilename: new Map(\n      profiles.map((profile) => [normalizeThemeText(profile.tarotCardFilename), profile])\n    ),\n    byName: new Map(\n      profiles.flatMap((profile) => [\n        [normalizeThemeText(profile.primaryLabel), profile] as const,\n        ...profile.aliases.map((alias) => [normalizeThemeText(alias), profile] as const),\n      ])\n    ),\n    byPathId: new Map(\n      profiles.flatMap((profile) =>\n        profile.majorArchetype\n          ? [[profile.majorArchetype.pathId, profile] as const]\n          : []\n      )\n    ),\n    byPathSlug: new Map(\n      profiles.flatMap((profile) =>\n        profile.majorArchetype\n          ? [[normalizeThemeText(profile.majorArchetype.pathSlug), profile] as const]\n          : []\n      )\n    ),\n  }\n\n  return tarotThemeProfilesCache\n}\n\nexport function tokenizeOccultThemeText(\n  input: string | null | undefined | readonly (string | null | undefined)[],\n  options: TokenizeOccultThemeTextOptions = {}\n) {\n  const values = Array.isArray(input) ? input : [input]\n  const minTokenLength = options.minTokenLength ?? 3\n  const stopwords = new Set((options.stopwords ?? OCCULT_THEME_STOPWORDS).map(normalizeThemeText))\n  const seen = new Set<string>()\n  const tokens: string[] = []\n\n  for (const value of values) {\n    if (!value) {\n      continue\n    }\n\n    const normalized = normalizeThemeText(value)\n\n    for (const token of normalized.split(/[^a-z0-9]+/)) {\n      if (token.length < minTokenLength || stopwords.has(token) || seen.has(token)) {\n        continue\n      }\n\n      seen.add(token)\n      tokens.push(token)\n    }\n  }\n\n  return tokens\n}\n\nexport function listHouseThemeProfiles() {\n  return getHouseThemeProfileCache()\n}\n\nexport function getHouseThemeProfile(lookup: HouseThemeLookup) {\n  const houseLabel = getHouseLabelFromLookup(lookup)\n\n  if (!houseLabel) {\n    return undefined\n  }\n\n  return getHouseThemeProfileCache().find((profile) => parseId(profile.id) === houseLabel)\n}\n\nexport function listTarotThemeProfiles() {\n  return getTarotThemeProfileCache().profiles\n}\n\nexport function getTarotThemeProfile(lookup: TarotThemeLookup) {\n  const cache = getTarotThemeProfileCache()\n\n  if (typeof lookup === \"number\") {\n    return cache.byCardNumber.get(lookup)\n  }\n\n  if (typeof lookup === \"string\") {\n    if (lookup.startsWith(`${TarotTypes.TAROT_ARK_ANNU}:`)) {\n      return cache.byId.get(lookup)\n    }\n\n    if (lookup.startsWith(`${KaabalahTypes.PATH}:`)) {\n      const archetype = getTarotArchetype({\n        pathId: lookup as NodeId<KaabalahTypes.PATH>,\n      })\n\n      return archetype ? cache.byCardNumber.get(archetype.tarotCardNumber) : undefined\n    }\n\n    return (\n      cache.byFilename.get(normalizeThemeText(lookup)) ??\n      cache.byName.get(normalizeThemeText(lookup)) ??\n      cache.byPathSlug.get(normalizeThemeText(lookup))\n    )\n  }\n\n  if (\"tarotCardNumber\" in lookup) {\n    return cache.byCardNumber.get(lookup.tarotCardNumber)\n  }\n\n  if (\"tarotCardFilename\" in lookup) {\n    return cache.byFilename.get(normalizeThemeText(lookup.tarotCardFilename))\n  }\n\n  if (\"tarotCardName\" in lookup) {\n    return cache.byName.get(normalizeThemeText(lookup.tarotCardName))\n  }\n\n  if (\"tarotArkAnnuId\" in lookup) {\n    return cache.byId.get(lookup.tarotArkAnnuId)\n  }\n\n  if (\"pathId\" in lookup) {\n    return cache.byPathId.get(lookup.pathId)\n  }\n\n  return cache.byPathSlug.get(normalizeThemeText(lookup.pathSlug))\n}\n"]}