{"version":3,"sources":["../src/browser.ts","../src/viterbi/ViterbiNode.ts","../src/viterbi/ViterbiLattice.ts","../src/viterbi/ViterbiBuilder.ts","../src/viterbi/ViterbiSearcher.ts","../src/tokenizer/Tokenizer.ts","../src/types/dictionary.ts","../src/trie/DoubleArrayBuilder.ts","../src/trie/DoubleArray.ts","../src/dict/ConnectionCosts.ts","../src/util/ByteBuffer.ts","../src/dict/TokenInfoDictionary.ts","../src/dict/CharacterDefinition.ts","../src/dict/UnknownDictionary.ts","../src/dict/DictionaryContainer.ts","../src/tokenizer/TokenizerBuilder.ts","../src/dict/format/IpadicFormat.ts","../src/dict/format/UnidicFormat.ts","../src/dict/format/NeologdFormat.ts","../src/util/SurrogateAwareString.ts","../src/loader/BrowserLoader.ts","../src/createTokenizer.ts"],"sourcesContent":["export * from \"./index.shared.js\";\nexport { BrowserLoader } from \"./loader/BrowserLoader.js\";\n\nimport type { IpadicToken, UnidicToken, BaseToken } from \"./types/token.js\";\nimport type { TokenizerOptions } from \"./types/options.js\";\nimport type { Tokenizer } from \"./tokenizer/Tokenizer.js\";\nimport { BrowserLoader } from \"./loader/BrowserLoader.js\";\nimport { createTokenizerWithLoader } from \"./createTokenizer.js\";\n\n/**\n * Create a tokenizer with the browser dictionary loader.\n *\n * @example\n * ```typescript\n * const tokenizer = await createTokenizer({\n *   format: \"ipadic\",\n *   dicPath: \"/dict\",\n * });\n * const tokens = tokenizer.tokenize(\"東京都に住んでいる\");\n * ```\n */\nexport async function createTokenizer(\n  options: TokenizerOptions & { format: \"ipadic\" }\n): Promise<Tokenizer<IpadicToken>>;\nexport async function createTokenizer(\n  options: TokenizerOptions & { format: \"unidic\" }\n): Promise<Tokenizer<UnidicToken>>;\nexport async function createTokenizer(\n  options: TokenizerOptions & { format: \"neologd\" }\n): Promise<Tokenizer<IpadicToken>>;\nexport async function createTokenizer(\n  options: TokenizerOptions\n): Promise<Tokenizer<BaseToken>>;\nexport async function createTokenizer(\n  options: TokenizerOptions\n): Promise<Tokenizer<BaseToken>> {\n  return createTokenizerWithLoader(\n    options,\n    new BrowserLoader(options.dicPath)\n  );\n}\n","/**\n * Node in the Viterbi lattice.\n */\n\nimport type { TokenType } from \"../types/token.js\";\n\nexport class ViterbiNode {\n  /** Word ID in the dictionary */\n  wordId: number;\n  /** Word cost from the dictionary */\n  wordCost: number;\n  /** Start position in the input string */\n  startPos: number;\n  /** Length of the surface form */\n  length: number;\n  /** Left context ID for connection cost lookup */\n  leftId: number;\n  /** Right context ID for connection cost lookup */\n  rightId: number;\n  /** Token type */\n  type: TokenType;\n  /** Surface form */\n  surface: string;\n\n  /** Shortest path cost from BOS to this node */\n  shortestCost: number;\n  /** Previous node in the shortest path */\n  prev: ViterbiNode | null;\n\n  constructor(\n    wordId: number,\n    wordCost: number,\n    startPos: number,\n    length: number,\n    leftId: number,\n    rightId: number,\n    type: TokenType,\n    surface: string\n  ) {\n    this.wordId = wordId;\n    this.wordCost = wordCost;\n    this.startPos = startPos;\n    this.length = length;\n    this.leftId = leftId;\n    this.rightId = rightId;\n    this.type = type;\n    this.surface = surface;\n    this.shortestCost = Number.MAX_SAFE_INTEGER;\n    this.prev = null;\n  }\n\n  static createBOS(): ViterbiNode {\n    return new ViterbiNode(\n      -1, // wordId\n      0, // wordCost\n      0, // startPos\n      0, // length\n      0, // leftId (BOS/EOS left ID)\n      0, // rightId (BOS/EOS right ID)\n      \"BOS\",\n      \"\"\n    );\n  }\n\n  static createEOS(inputLength: number): ViterbiNode {\n    return new ViterbiNode(\n      -1, // wordId\n      0, // wordCost\n      inputLength, // startPos\n      0, // length\n      0, // leftId\n      0, // rightId\n      \"EOS\",\n      \"\"\n    );\n  }\n}\n","/**\n * Viterbi lattice structure.\n * Organizes nodes by their starting position in the input string.\n */\n\nimport { ViterbiNode } from \"./ViterbiNode.js\";\n\nexport class ViterbiLattice {\n  /** Nodes indexed by end position (position after the last character) */\n  private nodesEndAt: ViterbiNode[][];\n  /** Length of the input string */\n  private readonly inputLength: number;\n\n  /** BOS node */\n  readonly bos: ViterbiNode;\n  /** EOS node */\n  readonly eos: ViterbiNode;\n\n  constructor(inputLength: number) {\n    this.inputLength = inputLength;\n    // nodesEndAt[i] = nodes whose surface ends at position i\n    // Index 0 is for BOS, index inputLength+1 is for EOS\n    this.nodesEndAt = new Array(inputLength + 2);\n    for (let i = 0; i < this.nodesEndAt.length; i++) {\n      this.nodesEndAt[i] = [];\n    }\n\n    this.bos = ViterbiNode.createBOS();\n    this.bos.shortestCost = 0;\n    this.nodesEndAt[0].push(this.bos);\n\n    this.eos = ViterbiNode.createEOS(inputLength);\n  }\n\n  /**\n   * Add a node to the lattice.\n   * Node is indexed by its end position (startPos + length).\n   */\n  addNode(node: ViterbiNode): void {\n    const endPos = node.startPos + node.length;\n    if (endPos >= 0 && endPos < this.nodesEndAt.length) {\n      this.nodesEndAt[endPos].push(node);\n    }\n  }\n\n  /**\n   * Get all nodes that end at the given position.\n   */\n  getNodesEndAt(pos: number): ViterbiNode[] {\n    return this.nodesEndAt[pos] ?? [];\n  }\n\n  getInputLength(): number {\n    return this.inputLength;\n  }\n}\n","/**\n * Builds a Viterbi lattice from input text using the trie and dictionaries.\n */\n\nimport type { DoubleArray } from \"../trie/DoubleArray.js\";\nimport type { TokenInfoDictionary } from \"../dict/TokenInfoDictionary.js\";\nimport type { UnknownDictionary } from \"../dict/UnknownDictionary.js\";\nimport { ViterbiNode } from \"./ViterbiNode.js\";\nimport { ViterbiLattice } from \"./ViterbiLattice.js\";\n\nexport class ViterbiBuilder {\n  private readonly trie: DoubleArray;\n  private readonly tokenInfoDictionary: TokenInfoDictionary;\n  private readonly unknownDictionary: UnknownDictionary;\n\n  constructor(\n    trie: DoubleArray,\n    tokenInfoDictionary: TokenInfoDictionary,\n    unknownDictionary: UnknownDictionary\n  ) {\n    this.trie = trie;\n    this.tokenInfoDictionary = tokenInfoDictionary;\n    this.unknownDictionary = unknownDictionary;\n  }\n\n  /**\n   * Build a Viterbi lattice for the given input text.\n   */\n  build(text: string): ViterbiLattice {\n    const lattice = new ViterbiLattice(text.length);\n    const charDef = this.unknownDictionary.getCharacterDefinition();\n\n    for (let i = 0; i < text.length; i = nextCodePointPosition(text, i)) {\n      const suffix = text.substring(i);\n\n      // Search known words using trie\n      const matches = this.trie.commonPrefixSearch(suffix);\n      let hasKnownWord = false;\n\n      for (const match of matches) {\n        if (match.length === 0) continue;\n        hasKnownWord = true;\n        const surface = text.substring(i, i + match.length);\n\n        for (const wordId of this.tokenInfoDictionary.getWordIds(match.value)) {\n          const node = new ViterbiNode(\n            wordId,\n            this.tokenInfoDictionary.getWordCost(wordId),\n            i,\n            match.length,\n            this.tokenInfoDictionary.getLeftId(wordId),\n            this.tokenInfoDictionary.getRightId(wordId),\n            \"KNOWN\",\n            surface\n          );\n          lattice.addNode(node);\n        }\n      }\n\n      // Process unknown words\n      const charCode = codePointAt(text, i);\n      const isInvoke = charDef.isInvoke(charCode);\n\n      // Add unknown word nodes if:\n      // 1. No known word was found, OR\n      // 2. The character class has invoke=true\n      if (!hasKnownWord || isInvoke) {\n        this.addUnknownNodes(lattice, text, i, charDef);\n      }\n    }\n\n    return lattice;\n  }\n\n  private addUnknownNodes(\n    lattice: ViterbiLattice,\n    text: string,\n    pos: number,\n    charDef: import(\"../dict/CharacterDefinition.js\").CharacterDefinition\n  ): void {\n    const charCode = codePointAt(text, pos);\n    const classId = charDef.getCharacterClass(charCode);\n    const isGroup = charDef.isGroup(charCode);\n    const maxLength = charDef.getMaxLength(charCode);\n\n    // Get unknown word entries for this character class\n    const wordIds = this.unknownDictionary.lookup(charCode);\n\n    if (wordIds.length === 0) return;\n\n    // If group flag is set, try to group consecutive same-class characters\n    if (isGroup) {\n      let endPos = nextCodePointPosition(text, pos);\n      while (endPos < text.length) {\n        const nextClass = charDef.getCharacterClass(codePointAt(text, endPos));\n        if (nextClass !== classId) break;\n        endPos = nextCodePointPosition(text, endPos);\n      }\n\n      const surface = text.substring(pos, endPos);\n      for (const wordId of wordIds) {\n        const node = new ViterbiNode(\n          wordId,\n          this.unknownDictionary.getWordCost(wordId),\n          pos,\n          surface.length,\n          this.unknownDictionary.getLeftId(wordId),\n          this.unknownDictionary.getRightId(wordId),\n          \"UNKNOWN\",\n          surface\n        );\n        lattice.addNode(node);\n      }\n    }\n\n    // Also try individual character lengths up to maxLength\n    const limit = maxLength > 0 ? maxLength : 1;\n    let endPos = pos;\n    for (let len = 1; len <= limit && endPos < text.length; len++) {\n      if (len > 1) {\n        const nextClass = charDef.getCharacterClass(\n          codePointAt(text, endPos)\n        );\n        if (nextClass !== classId) break;\n      }\n      endPos = nextCodePointPosition(text, endPos);\n\n      const surface = text.substring(pos, endPos);\n      for (const wordId of wordIds) {\n        // Avoid duplicating the grouped entry\n        if (isGroup && len === 1) continue;\n\n        const node = new ViterbiNode(\n          wordId,\n          this.unknownDictionary.getWordCost(wordId),\n          pos,\n          surface.length,\n          this.unknownDictionary.getLeftId(wordId),\n          this.unknownDictionary.getRightId(wordId),\n          \"UNKNOWN\",\n          surface\n        );\n        lattice.addNode(node);\n      }\n    }\n\n    // If no nodes were added (non-group, maxLength=0), add single character\n    if (!isGroup && maxLength === 0) {\n      const surface = text.substring(pos, nextCodePointPosition(text, pos));\n      for (const wordId of wordIds) {\n        const node = new ViterbiNode(\n          wordId,\n          this.unknownDictionary.getWordCost(wordId),\n          pos,\n          surface.length,\n          this.unknownDictionary.getLeftId(wordId),\n          this.unknownDictionary.getRightId(wordId),\n          \"UNKNOWN\",\n          surface\n        );\n        lattice.addNode(node);\n      }\n    }\n  }\n}\n\nfunction codePointAt(text: string, pos: number): number {\n  return text.codePointAt(pos) ?? text.charCodeAt(pos);\n}\n\nfunction nextCodePointPosition(text: string, pos: number): number {\n  const code = text.codePointAt(pos);\n  return pos + (code !== undefined && code > 0xffff ? 2 : 1);\n}\n","/**\n * Viterbi algorithm searcher.\n * Finds the optimal path through the lattice using dynamic programming.\n */\n\nimport type { ConnectionCosts } from \"../dict/ConnectionCosts.js\";\nimport type { ViterbiLattice } from \"./ViterbiLattice.js\";\nimport { ViterbiNode } from \"./ViterbiNode.js\";\n\nexport class ViterbiSearcher {\n  private readonly connectionCosts: ConnectionCosts;\n\n  constructor(connectionCosts: ConnectionCosts) {\n    this.connectionCosts = connectionCosts;\n  }\n\n  /**\n   * Find the optimal (lowest cost) path through the lattice.\n   * Returns the path as an array of ViterbiNodes from first token to last (excluding BOS/EOS).\n   */\n  search(lattice: ViterbiLattice): ViterbiNode[] {\n    // Forward pass: compute shortest cost to each node\n    this.forward(lattice);\n\n    // Backward pass: trace back from EOS to BOS\n    return this.backward(lattice);\n  }\n\n  /**\n   * Forward pass: for each position, find the shortest path cost to each node.\n   */\n  private forward(lattice: ViterbiLattice): void {\n    const inputLength = lattice.getInputLength();\n\n    for (let endPos = 1; endPos <= inputLength; endPos++) {\n      const nodes = lattice.getNodesEndAt(endPos);\n\n      for (const node of nodes) {\n        // Find the best previous node\n        const prevNodes = lattice.getNodesEndAt(node.startPos);\n\n        for (const prevNode of prevNodes) {\n          if (prevNode.shortestCost === Number.MAX_SAFE_INTEGER) continue;\n\n          const connectionCost = this.connectionCosts.get(\n            prevNode.rightId,\n            node.leftId\n          );\n          const totalCost =\n            prevNode.shortestCost + connectionCost + node.wordCost;\n\n          if (totalCost < node.shortestCost) {\n            node.shortestCost = totalCost;\n            node.prev = prevNode;\n          }\n        }\n      }\n    }\n\n    // Connect EOS\n    const eos = lattice.eos;\n    const lastNodes = lattice.getNodesEndAt(inputLength);\n    for (const node of lastNodes) {\n      if (node.shortestCost === Number.MAX_SAFE_INTEGER) continue;\n\n      const connectionCost = this.connectionCosts.get(node.rightId, eos.leftId);\n      const totalCost = node.shortestCost + connectionCost + eos.wordCost;\n\n      if (totalCost < eos.shortestCost) {\n        eos.shortestCost = totalCost;\n        eos.prev = node;\n      }\n    }\n  }\n\n  /**\n   * Backward pass: trace back from EOS to BOS to get the optimal path.\n   */\n  private backward(lattice: ViterbiLattice): ViterbiNode[] {\n    const path: ViterbiNode[] = [];\n    let node: ViterbiNode | null = lattice.eos.prev;\n\n    while (node !== null && node.type !== \"BOS\") {\n      path.unshift(node);\n      node = node.prev;\n    }\n\n    return path;\n  }\n}\n","/**\n * Main tokenizer class.\n * Performs Japanese morphological analysis using Viterbi algorithm.\n */\n\nimport type { BaseToken } from \"../types/token.js\";\nimport type { DictionaryContainer } from \"../dict/DictionaryContainer.js\";\nimport type { DictionaryFormat } from \"../dict/format/DictionaryFormat.js\";\nimport { ViterbiBuilder } from \"../viterbi/ViterbiBuilder.js\";\nimport { ViterbiSearcher } from \"../viterbi/ViterbiSearcher.js\";\n\nexport class Tokenizer<T extends BaseToken = BaseToken> {\n  private readonly viterbiBuilder: ViterbiBuilder;\n  private readonly viterbiSearcher: ViterbiSearcher;\n  private readonly dictionary: DictionaryContainer;\n  private readonly format: DictionaryFormat<T>;\n\n  constructor(dictionary: DictionaryContainer, format: DictionaryFormat<T>) {\n    this.dictionary = dictionary;\n    this.format = format;\n\n    this.viterbiBuilder = new ViterbiBuilder(\n      dictionary.trie,\n      dictionary.tokenInfoDictionary,\n      dictionary.unknownDictionary\n    );\n\n    this.viterbiSearcher = new ViterbiSearcher(dictionary.connectionCosts);\n  }\n\n  /**\n   * Tokenize input text into morphemes.\n   */\n  tokenize(text: string): T[] {\n    if (text.length === 0) {\n      return [];\n    }\n\n    // Build lattice\n    const lattice = this.viterbiBuilder.build(text);\n\n    // Find optimal path\n    const path = this.viterbiSearcher.search(lattice);\n\n    // Convert path nodes to typed tokens\n    return path.map((node) => {\n      const dict =\n        node.type === \"UNKNOWN\"\n          ? this.dictionary.unknownDictionary\n          : this.dictionary.tokenInfoDictionary;\n      const features = dict.getFeatures(node.wordId);\n\n      return this.format.parseToken(\n        {\n          wordId: node.wordId,\n          type: node.type,\n          surface: node.surface,\n          offset: node.startPos,\n          length: node.length,\n          cost: node.shortestCost,\n        },\n        features\n      );\n    });\n  }\n\n  /**\n   * Get the dictionary format handler.\n   */\n  getFormat(): DictionaryFormat<T> {\n    return this.format;\n  }\n}\n","/**\n * Dictionary-related type definitions.\n */\n\n/** Character class definition entry */\nexport interface CharacterClass {\n  /** Class name (e.g., DEFAULT, SPACE, KANJI) */\n  name: string;\n  /** Whether to invoke unknown word processing */\n  invoke: boolean;\n  /** Whether to group consecutive same-class chars */\n  group: boolean;\n  /** Maximum unknown word length (0 = unlimited) */\n  length: number;\n}\n\n/** Character-to-class mapping */\nexport interface CharacterMapping {\n  /** Character class index */\n  classId: number;\n  /** Compatible classes */\n  compatibleClasses: number[];\n}\n\n/** Unknown word dictionary entry */\nexport interface UnknownEntry {\n  /** Character class name */\n  className: string;\n  /** Left context ID */\n  leftId: number;\n  /** Right context ID */\n  rightId: number;\n  /** Word cost */\n  cost: number;\n  /** Token info features */\n  features: string[];\n}\n\n/** Dictionary file names */\nexport const DICT_FILES = {\n  trie: \"base.dat.gz\",\n  tid: \"tid.dat.gz\",\n  tidPos: \"tid_pos.dat.gz\",\n  tidMap: \"tid_map.dat.gz\",\n  cc: \"cc.dat.gz\",\n  unk: \"unk.dat.gz\",\n  unkPos: \"unk_pos.dat.gz\",\n  unkMap: \"unk_map.dat.gz\",\n  unkChar: \"unk_char.dat.gz\",\n  unkCompat: \"unk_compat.dat.gz\",\n  unkInvoke: \"unk_invoke.dat.gz\",\n} as const;\n","/**\n * Builds a double array trie from a set of sorted keys.\n *\n * The double array structure uses two parallel arrays (base and check)\n * to represent a trie compactly. This is the standard Aoe algorithm.\n */\n\nexport interface DoubleArrayBuildResult {\n  base: Int32Array;\n  check: Int32Array;\n}\n\ninterface TrieNode {\n  code: number;\n  children: TrieNode[];\n  isTerminal: boolean;\n  value: number;\n}\n\nconst ROOT_CODE = 0;\nconst LEAF_CODE = -1;\nconst BASE_INITIAL = 1;\nconst CHECK_EMPTY = 0;\n\nexport class DoubleArrayBuilder {\n  /**\n   * Build a double array from sorted key-value pairs.\n   * Keys must be sorted in lexicographic order.\n   * Each key is an array of character codes (unsigned integers > 0).\n   */\n  static build(keys: { key: number[]; value: number }[]): DoubleArrayBuildResult {\n    const builder = new DoubleArrayBuilder();\n    return builder.buildFromKeys(keys);\n  }\n\n  private base: Int32Array;\n  private check: Int32Array;\n  private nextCheckPos: number;\n\n  constructor() {\n    this.base = new Int32Array(0);\n    this.check = new Int32Array(0);\n    this.nextCheckPos = 0;\n  }\n\n  private buildFromKeys(\n    keys: { key: number[]; value: number }[]\n  ): DoubleArrayBuildResult {\n    if (keys.length === 0) {\n      return { base: new Int32Array(1), check: new Int32Array(1) };\n    }\n\n    // Build intermediate trie\n    const root = this.buildTrie(keys);\n\n    // Initial allocation\n    const initialSize = Math.max(keys.length * 4, 1024);\n    this.base = new Int32Array(initialSize);\n    this.check = new Int32Array(initialSize);\n    this.nextCheckPos = 0;\n\n    // Root node at position 0\n    this.base[0] = BASE_INITIAL;\n\n    // Recursively insert children\n    const children = root.children;\n    if (children.length > 0) {\n      this.insert(children, 0);\n    }\n\n    // Trim to used size\n    let usedSize = 0;\n    for (let i = this.base.length - 1; i >= 0; i--) {\n      if (this.base[i] !== 0 || this.check[i] !== 0) {\n        usedSize = i + 1;\n        break;\n      }\n    }\n    usedSize = Math.max(usedSize, 1);\n\n    return {\n      base: this.base.slice(0, usedSize),\n      check: this.check.slice(0, usedSize),\n    };\n  }\n\n  private buildTrie(keys: { key: number[]; value: number }[]): TrieNode {\n    const root: TrieNode = {\n      code: ROOT_CODE,\n      children: [],\n      isTerminal: false,\n      value: -1,\n    };\n\n    for (const { key, value } of keys) {\n      let node = root;\n      for (const code of key) {\n        let child = node.children.find((c) => c.code === code);\n        if (!child) {\n          child = {\n            code,\n            children: [],\n            isTerminal: false,\n            value: -1,\n          };\n          node.children.push(child);\n        }\n        node = child;\n      }\n      // Add terminal marker\n      const terminal: TrieNode = {\n        code: LEAF_CODE,\n        children: [],\n        isTerminal: true,\n        value,\n      };\n      // Insert terminal at beginning of children\n      node.children.unshift(terminal);\n    }\n\n    return root;\n  }\n\n  private ensureSize(size: number): void {\n    if (size <= this.base.length) return;\n    let newSize = this.base.length;\n    while (newSize < size) {\n      newSize = Math.max(newSize * 2, 1024);\n    }\n    const newBase = new Int32Array(newSize);\n    const newCheck = new Int32Array(newSize);\n    newBase.set(this.base);\n    newCheck.set(this.check);\n    this.base = newBase;\n    this.check = newCheck;\n  }\n\n  private insert(siblings: TrieNode[], parentIdx: number): void {\n    // Find codes for siblings. Terminal nodes use code 0.\n    const codes = siblings.map((s) => (s.code === LEAF_CODE ? 0 : s.code));\n\n    // Find a base value where all children fit\n    let begin = Math.max(codes[0] + 1, this.nextCheckPos) - codes[0];\n    let nonZeroCount = 0;\n    let isFirst = true;\n\n    outer: while (true) {\n      begin++;\n      this.ensureSize(begin + codes[codes.length - 1] + 1);\n\n      if (this.check[begin + codes[0]] !== CHECK_EMPTY) {\n        nonZeroCount++;\n        continue;\n      }\n      if (isFirst) {\n        this.nextCheckPos = begin + codes[0];\n        isFirst = false;\n      }\n\n      for (let i = 1; i < codes.length; i++) {\n        if (this.check[begin + codes[i]] !== CHECK_EMPTY) {\n          continue outer;\n        }\n      }\n      break;\n    }\n\n    // Advance nextCheckPos heuristic\n    if (nonZeroCount / (begin - this.nextCheckPos + 1) >= 0.95) {\n      this.nextCheckPos = begin + codes[0];\n    }\n\n    this.base[parentIdx] = begin;\n\n    // First pass: set check values for all siblings\n    for (let i = 0; i < siblings.length; i++) {\n      const pos = begin + codes[i];\n      this.ensureSize(pos + 1);\n      this.check[pos] = parentIdx + 1; // check stores parent+1 (0 means empty)\n    }\n\n    // Second pass: set base values and recurse\n    for (let i = 0; i < siblings.length; i++) {\n      const pos = begin + codes[i];\n\n      if (siblings[i].isTerminal) {\n        // Terminal: store negative value - 1 in base\n        this.base[pos] = -siblings[i].value - 1;\n      } else if (siblings[i].children.length > 0) {\n        this.insert(siblings[i].children, pos);\n      }\n    }\n  }\n}\n","/**\n * Double Array Trie for efficient prefix matching.\n * Supports exact lookup and common prefix search.\n */\n\nimport { DoubleArrayBuilder } from \"./DoubleArrayBuilder.js\";\n\nexport interface KeyValue {\n  /** The value associated with the key */\n  value: number;\n  /** Length of the matched key (in code units) */\n  length: number;\n}\n\nexport class DoubleArray {\n  private base: Int32Array;\n  private check: Int32Array;\n\n  constructor(base?: Int32Array, check?: Int32Array) {\n    this.base = base ?? new Int32Array(0);\n    this.check = check ?? new Int32Array(0);\n  }\n\n  /**\n   * Build a DoubleArray from sorted string keys.\n   * Keys must be sorted lexicographically.\n   */\n  static build(keys: { key: string; value: number }[]): DoubleArray {\n    const encoded = keys.map(({ key, value }) => ({\n      key: Array.from(key).map((ch) => ch.codePointAt(0) ?? 0),\n      value,\n    }));\n    const { base, check } = DoubleArrayBuilder.build(encoded);\n    return new DoubleArray(base, check);\n  }\n\n  /**\n   * Exact lookup of a key string.\n   * Returns the associated value, or -1 if not found.\n   */\n  lookup(key: string): number {\n    let pos = 0;\n    let baseVal = this.base[0];\n\n    for (let i = 0; i < key.length; ) {\n      const code = key.codePointAt(i);\n      if (code === undefined) return -1;\n      const next = baseVal + code;\n\n      if (next >= this.check.length || this.check[next] !== pos + 1) {\n        return -1;\n      }\n      pos = next;\n      baseVal = this.base[pos];\n      i += code > 0xffff ? 2 : 1;\n    }\n\n    // Check for terminal (code 0)\n    const termPos = baseVal; // base + 0\n    if (\n      termPos >= 0 &&\n      termPos < this.check.length &&\n      this.check[termPos] === pos + 1\n    ) {\n      const v = this.base[termPos];\n      if (v < 0) {\n        return -v - 1;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * Find all keys that are prefixes of the given string.\n   * Returns values and their matched lengths.\n   */\n  commonPrefixSearch(key: string): KeyValue[] {\n    const results: KeyValue[] = [];\n    let pos = 0;\n    let baseVal = this.base[0];\n\n    for (let i = 0; i < key.length; ) {\n      // Check for terminal at current position\n      const termPos = baseVal; // base + 0\n      if (\n        termPos >= 0 &&\n        termPos < this.check.length &&\n        this.check[termPos] === pos + 1\n      ) {\n        const v = this.base[termPos];\n        if (v < 0) {\n          results.push({ value: -v - 1, length: i });\n        }\n      }\n\n      const code = key.codePointAt(i);\n      if (code === undefined) return results;\n      const next = baseVal + code;\n\n      if (next < 0 || next >= this.check.length || this.check[next] !== pos + 1) {\n        return results;\n      }\n      pos = next;\n      baseVal = this.base[pos];\n      i += code > 0xffff ? 2 : 1;\n    }\n\n    // Check for terminal at the end\n    const termPos = baseVal;\n    if (\n      termPos >= 0 &&\n      termPos < this.check.length &&\n      this.check[termPos] === pos + 1\n    ) {\n      const v = this.base[termPos];\n      if (v < 0) {\n        results.push({ value: -v - 1, length: key.length });\n      }\n    }\n\n    return results;\n  }\n\n  /**\n   * Check if any key exists that starts with the given prefix.\n   */\n  contain(key: string): boolean {\n    return this.lookup(key) !== -1;\n  }\n\n  /**\n   * Get the raw base array (for serialization).\n   */\n  getBase(): Int32Array {\n    return this.base;\n  }\n\n  /**\n   * Get the raw check array (for serialization).\n   */\n  getCheck(): Int32Array {\n    return this.check;\n  }\n\n  /**\n   * Create a DoubleArray from raw base and check arrays (for deserialization).\n   */\n  static fromArrays(base: Int32Array, check: Int32Array): DoubleArray {\n    return new DoubleArray(base, check);\n  }\n}\n","/**\n * Connection cost matrix.\n * Stores the cost of transitioning from one morpheme to the next.\n * Matrix is indexed by [right_id][left_id].\n */\nexport class ConnectionCosts {\n  private readonly forwardSize: number;\n  private readonly backwardSize: number;\n  private readonly costs: Int16Array;\n\n  constructor(forwardSize: number, backwardSize: number) {\n    this.forwardSize = forwardSize;\n    this.backwardSize = backwardSize;\n    this.costs = new Int16Array(forwardSize * backwardSize);\n  }\n\n  put(forwardId: number, backwardId: number, cost: number): void {\n    this.costs[forwardId * this.backwardSize + backwardId] = cost;\n  }\n\n  get(forwardId: number, backwardId: number): number {\n    return this.costs[forwardId * this.backwardSize + backwardId];\n  }\n\n  getForwardSize(): number {\n    return this.forwardSize;\n  }\n\n  getBackwardSize(): number {\n    return this.backwardSize;\n  }\n\n  /**\n   * Load from a raw Int16Array buffer.\n   * Format: [forwardSize (as int16), backwardSize (as int16), ...costs]\n   */\n  static fromBuffer(buffer: Int16Array): ConnectionCosts {\n    const forwardSize = buffer[0];\n    const backwardSize = buffer[1];\n    const cc = new ConnectionCosts(forwardSize, backwardSize);\n    cc.costs.set(buffer.subarray(2, 2 + forwardSize * backwardSize));\n    return cc;\n  }\n\n  /**\n   * Serialize to Int16Array buffer.\n   */\n  toBuffer(): Int16Array {\n    const buffer = new Int16Array(2 + this.forwardSize * this.backwardSize);\n    buffer[0] = this.forwardSize;\n    buffer[1] = this.backwardSize;\n    buffer.set(this.costs, 2);\n    return buffer;\n  }\n}\n","/**\n * Growable byte buffer for binary data manipulation.\n * Used for reading/writing dictionary binary data.\n */\nexport class ByteBuffer {\n  private buffer: ArrayBuffer;\n  private view: DataView;\n  private position: number;\n\n  constructor(arg?: number | Uint8Array) {\n    if (arg instanceof Uint8Array) {\n      const isShared =\n        typeof SharedArrayBuffer !== \"undefined\" && arg.buffer instanceof SharedArrayBuffer;\n      const src = isShared\n        ? new ArrayBuffer(arg.byteLength)\n        : (arg.buffer as ArrayBuffer).slice(arg.byteOffset, arg.byteOffset + arg.byteLength);\n      if (isShared) {\n        new Uint8Array(src).set(arg);\n      }\n      this.buffer = src;\n      this.view = new DataView(this.buffer);\n      this.position = 0;\n    } else {\n      const size = arg ?? 1024;\n      this.buffer = new ArrayBuffer(size);\n      this.view = new DataView(this.buffer);\n      this.position = 0;\n    }\n  }\n\n  private ensureCapacity(additional: number): void {\n    const required = this.position + additional;\n    if (required <= this.buffer.byteLength) return;\n\n    let newSize = this.buffer.byteLength;\n    while (newSize < required) {\n      newSize *= 2;\n    }\n    const newBuffer = new ArrayBuffer(newSize);\n    new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));\n    this.buffer = newBuffer;\n    this.view = new DataView(this.buffer);\n  }\n\n  size(): number {\n    return this.position;\n  }\n\n  getPosition(): number {\n    return this.position;\n  }\n\n  setPosition(pos: number): void {\n    this.position = pos;\n  }\n\n  getInt8(pos: number): number {\n    return this.view.getInt8(pos);\n  }\n\n  getInt16(pos: number): number {\n    return this.view.getInt16(pos, true);\n  }\n\n  getInt32(pos: number): number {\n    return this.view.getInt32(pos, true);\n  }\n\n  getUint8(pos: number): number {\n    return this.view.getUint8(pos);\n  }\n\n  getUint16(pos: number): number {\n    return this.view.getUint16(pos, true);\n  }\n\n  getUint32(pos: number): number {\n    return this.view.getUint32(pos, true);\n  }\n\n  putInt8(value: number): void {\n    this.ensureCapacity(1);\n    this.view.setInt8(this.position, value);\n    this.position += 1;\n  }\n\n  putInt16(value: number): void {\n    this.ensureCapacity(2);\n    this.view.setInt16(this.position, value, true);\n    this.position += 2;\n  }\n\n  putInt32(value: number): void {\n    this.ensureCapacity(4);\n    this.view.setInt32(this.position, value, true);\n    this.position += 4;\n  }\n\n  putUint8(value: number): void {\n    this.ensureCapacity(1);\n    this.view.setUint8(this.position, value);\n    this.position += 1;\n  }\n\n  putUint16(value: number): void {\n    this.ensureCapacity(2);\n    this.view.setUint16(this.position, value, true);\n    this.position += 2;\n  }\n\n  putUint32(value: number): void {\n    this.ensureCapacity(4);\n    this.view.setUint32(this.position, value, true);\n    this.position += 4;\n  }\n\n  readInt8(): number {\n    const value = this.view.getInt8(this.position);\n    this.position += 1;\n    return value;\n  }\n\n  readInt16(): number {\n    const value = this.view.getInt16(this.position, true);\n    this.position += 2;\n    return value;\n  }\n\n  readInt32(): number {\n    const value = this.view.getInt32(this.position, true);\n    this.position += 4;\n    return value;\n  }\n\n  readUint8(): number {\n    const value = this.view.getUint8(this.position);\n    this.position += 1;\n    return value;\n  }\n\n  readUint16(): number {\n    const value = this.view.getUint16(this.position, true);\n    this.position += 2;\n    return value;\n  }\n\n  readUint32(): number {\n    const value = this.view.getUint32(this.position, true);\n    this.position += 4;\n    return value;\n  }\n\n  readString(length: number): string {\n    const bytes = new Uint8Array(this.buffer, this.position, length * 2);\n    this.position += length * 2;\n    const chars: string[] = [];\n    for (let i = 0; i < length; i++) {\n      chars.push(\n        String.fromCharCode(bytes[i * 2] | (bytes[i * 2 + 1] << 8))\n      );\n    }\n    return chars.join(\"\");\n  }\n\n  putString(str: string): void {\n    this.ensureCapacity(str.length * 2);\n    for (let i = 0; i < str.length; i++) {\n      const code = str.charCodeAt(i);\n      this.view.setUint8(this.position++, code & 0xff);\n      this.view.setUint8(this.position++, (code >> 8) & 0xff);\n    }\n  }\n\n  shrink(): Uint8Array {\n    return new Uint8Array(this.buffer, 0, this.position);\n  }\n\n  toUint8Array(): Uint8Array {\n    return new Uint8Array(this.buffer, 0, this.position);\n  }\n\n  getArrayBuffer(): ArrayBuffer {\n    return this.buffer;\n  }\n\n  getDataView(): DataView {\n    return this.view;\n  }\n}\n","/**\n * Token information dictionary.\n * Stores morpheme features (POS, reading, pronunciation, etc.)\n * indexed by word ID.\n */\nimport { ByteBuffer } from \"../util/ByteBuffer.js\";\n\nexport class TokenInfoDictionary {\n  /** Feature data for each word, stored as concatenated strings */\n  private dictionary: ByteBuffer;\n\n  /** Mapping from word ID to position in features buffer */\n  private targetMap: Record<number, number>;\n  /** Mapping from the first word ID for a trie hit to the number of candidate entries */\n  private wordIdGroupCounts: Record<number, number>;\n\n  constructor() {\n    this.dictionary = new ByteBuffer(1024 * 1024);\n    this.targetMap = {};\n    this.wordIdGroupCounts = {};\n  }\n\n  buildDictionary(entries: { wordId: number; leftId: number; rightId: number; cost: number }[]): {\n    wordId: number;\n    leftId: number;\n    rightId: number;\n    cost: number;\n  }[] {\n    return entries;\n  }\n\n  /**\n   * Add a token entry to the dictionary.\n   */\n  put(wordId: number, leftId: number, rightId: number, cost: number, features: string): void {\n    const pos = this.dictionary.getPosition();\n    this.targetMap[wordId] = pos;\n\n    // Store: leftId(2) + rightId(2) + cost(2) + features_length(2) + features\n    this.dictionary.putInt16(leftId);\n    this.dictionary.putInt16(rightId);\n    this.dictionary.putInt16(cost);\n    this.dictionary.putInt16(features.length);\n    this.dictionary.putString(features);\n  }\n\n  /**\n   * Add a mapping from word ID to buffer position.\n   */\n  addMapping(wordId: number, position: number): void {\n    this.targetMap[wordId] = position;\n  }\n\n  /**\n   * Get left context ID for a word.\n   */\n  getLeftId(wordId: number): number {\n    const pos = this.targetMap[wordId];\n    if (pos === undefined) return -1;\n    return this.dictionary.getInt16(pos);\n  }\n\n  /**\n   * Get right context ID for a word.\n   */\n  getRightId(wordId: number): number {\n    const pos = this.targetMap[wordId];\n    if (pos === undefined) return -1;\n    return this.dictionary.getInt16(pos + 2);\n  }\n\n  /**\n   * Get word cost for a word.\n   */\n  getWordCost(wordId: number): number {\n    const pos = this.targetMap[wordId];\n    if (pos === undefined) return -1;\n    return this.dictionary.getInt16(pos + 4);\n  }\n\n  /**\n   * Get feature string for a word.\n   */\n  getFeatures(wordId: number): string {\n    const pos = this.targetMap[wordId];\n    if (pos === undefined) return \"\";\n    const len = this.dictionary.getInt16(pos + 6);\n    const saved = this.dictionary.getPosition();\n    this.dictionary.setPosition(pos + 8);\n    const str = this.dictionary.readString(len);\n    this.dictionary.setPosition(saved);\n    return str;\n  }\n\n  /**\n   * Load the dictionary data buffer.\n   */\n  loadDictionary(data: Uint8Array): this {\n    this.dictionary = new ByteBuffer(data);\n    return this;\n  }\n\n  /**\n   * Load the position data buffer.\n   */\n  loadPosVector(_data: Uint8Array): this {\n    if (_data.byteLength === 0) {\n      this.wordIdGroupCounts = {};\n      return this;\n    }\n\n    const view = new DataView(\n      _data.buffer,\n      _data.byteOffset,\n      _data.byteLength\n    );\n    const count = view.getInt32(0, true);\n    const groupCounts: Record<number, number> = {};\n    for (let i = 0; i < count; i++) {\n      const offset = 4 + i * 8;\n      const firstWordId = view.getInt32(offset, true);\n      const entryCount = view.getInt32(offset + 4, true);\n      if (entryCount > 0) {\n        groupCounts[firstWordId] = entryCount;\n      }\n    }\n    this.wordIdGroupCounts = groupCounts;\n    return this;\n  }\n\n  /**\n   * Get all candidate word IDs associated with a trie hit.\n   */\n  getWordIds(firstWordId: number): number[] {\n    const count = this.wordIdGroupCounts[firstWordId] ?? 1;\n    const wordIds: number[] = [];\n    for (let i = 0; i < count; i++) {\n      const wordId = firstWordId + i;\n      if (this.targetMap[wordId] !== undefined) {\n        wordIds.push(wordId);\n      }\n    }\n    return wordIds;\n  }\n\n  /**\n   * Load the target map buffer.\n   * Format: sequence of int32 pairs [wordId, position]\n   */\n  loadTargetMap(data: Uint8Array): this {\n    const view = new DataView(\n      data.buffer,\n      data.byteOffset,\n      data.byteLength\n    );\n    this.targetMap = {};\n    const count = view.getInt32(0, true);\n    for (let i = 0; i < count; i++) {\n      const offset = 4 + i * 4;\n      const pos = view.getInt32(offset, true);\n      this.targetMap[i] = pos;\n    }\n    return this;\n  }\n\n  getDictionary(): ByteBuffer {\n    return this.dictionary;\n  }\n\n  getTargetMap(): Record<number, number> {\n    return this.targetMap;\n  }\n\n  getTargetMapData(): Uint8Array {\n    const ids = Object.keys(this.targetMap)\n      .map(Number)\n      .sort((a, b) => a - b);\n    const maxId = ids.length > 0 ? ids[ids.length - 1] : -1;\n    const buf = new ByteBuffer(4 + (maxId + 1) * 4);\n    buf.putInt32(maxId + 1);\n    for (let i = 0; i <= maxId; i++) {\n      buf.putInt32(this.targetMap[i] ?? -1);\n    }\n    return buf.shrink();\n  }\n}\n","/**\n * Character type definition for unknown word processing.\n * Maps Unicode characters to character classes used in MeCab's char.def.\n */\n\nimport type { CharacterClass } from \"../types/dictionary.js\";\n\nconst DEFAULT_CATEGORY = 0;\n\nexport const CHARACTER_CATEGORY_NAMES = [\n  \"DEFAULT\",\n  \"SPACE\",\n  \"KANJI\",\n  \"SYMBOL\",\n  \"NUMERIC\",\n  \"ALPHA\",\n  \"HIRAGANA\",\n  \"KATAKANA\",\n  \"KANJINUMERIC\",\n  \"GREEK\",\n  \"CYRILLIC\",\n] as const;\n\nexport type CharacterCategoryName =\n  (typeof CHARACTER_CATEGORY_NAMES)[number];\n\nexport class CharacterDefinition {\n  /** Character class definitions */\n  private characterClasses: CharacterClass[];\n\n  /** Mapping from character code to class index */\n  private characterCategoryMap: Uint8Array;\n\n  /** Mapping from character code to compatible class bitmask */\n  private compatibleCategoryMap: Uint32Array;\n\n  constructor() {\n    this.characterClasses = [];\n    // Support BMP only (0x0000 - 0xFFFF)\n    this.characterCategoryMap = new Uint8Array(65536);\n    this.compatibleCategoryMap = new Uint32Array(65536);\n  }\n\n  addCharacterClass(charClass: CharacterClass): number {\n    const id = this.characterClasses.length;\n    this.characterClasses.push(charClass);\n    return id;\n  }\n\n  setCharacterCategory(\n    start: number,\n    end: number,\n    classId: number,\n    compatibleClasses: number[]\n  ): void {\n    for (let i = start; i <= end; i++) {\n      this.characterCategoryMap[i] = classId;\n      let compat = 0;\n      for (const c of compatibleClasses) {\n        compat |= 1 << c;\n      }\n      this.compatibleCategoryMap[i] = compat;\n    }\n  }\n\n  /**\n   * Lookup the character class for a given character code.\n   */\n  lookup(charCode: number): CharacterClass {\n    const classId =\n      charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n    return this.characterClasses[classId] ?? this.characterClasses[0];\n  }\n\n  /**\n   * Get the character class index for a character code.\n   */\n  getCharacterClass(charCode: number): number {\n    return charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n  }\n\n  /**\n   * Check if two character codes are in compatible classes.\n   */\n  isCompatible(charCode1: number, charCode2: number): boolean {\n    const class2 = this.getCharacterClass(charCode2);\n    const compat = this.compatibleCategoryMap[charCode1] ?? 0;\n    return (compat & (1 << class2)) !== 0;\n  }\n\n  /**\n   * Get the invoke flag for a character class.\n   */\n  isInvoke(charCode: number): boolean {\n    const classId = this.getCharacterClass(charCode);\n    const cls = this.characterClasses[classId];\n    return cls ? cls.invoke : false;\n  }\n\n  /**\n   * Get the group flag for a character class.\n   */\n  isGroup(charCode: number): boolean {\n    const classId = this.getCharacterClass(charCode);\n    const cls = this.characterClasses[classId];\n    return cls ? cls.group : false;\n  }\n\n  /**\n   * Get the max length for a character class.\n   */\n  getMaxLength(charCode: number): number {\n    const classId = this.getCharacterClass(charCode);\n    const cls = this.characterClasses[classId];\n    return cls ? cls.length : 0;\n  }\n\n  getCharacterClasses(): CharacterClass[] {\n    return this.characterClasses;\n  }\n\n  getCategoryMap(): Uint8Array {\n    return this.characterCategoryMap;\n  }\n\n  getCompatibleCategoryMap(): Uint32Array {\n    return this.compatibleCategoryMap;\n  }\n\n  /**\n   * Load from binary buffers.\n   */\n  static fromBuffers(\n    categoryMap: Uint8Array,\n    compatMap: Uint32Array,\n    invokeDefBuf: Uint8Array\n  ): CharacterDefinition {\n    const def = new CharacterDefinition();\n    def.characterCategoryMap = categoryMap;\n    def.compatibleCategoryMap = compatMap;\n\n    // invokeDefBuf: [count(4bytes), then for each class: invoke(1), group(1), length(4)]\n    const view = new DataView(\n      invokeDefBuf.buffer,\n      invokeDefBuf.byteOffset,\n      invokeDefBuf.byteLength\n    );\n    const count = view.getInt32(0, true);\n    for (let i = 0; i < count; i++) {\n      const offset = 4 + i * 6;\n      const invoke = view.getUint8(offset) === 1;\n      const group = view.getUint8(offset + 1) === 1;\n      const length = view.getInt32(offset + 2, true);\n      def.characterClasses.push({\n        name: CHARACTER_CATEGORY_NAMES[i] ?? `CLASS_${i}`,\n        invoke,\n        group,\n        length,\n      });\n    }\n\n    return def;\n  }\n\n  /**\n   * Serialize invoke definitions to buffer.\n   */\n  toInvokeBuffer(): Uint8Array {\n    const count = this.characterClasses.length;\n    const buf = new Uint8Array(4 + count * 6);\n    const view = new DataView(buf.buffer);\n    view.setInt32(0, count, true);\n    for (let i = 0; i < count; i++) {\n      const cls = this.characterClasses[i];\n      const offset = 4 + i * 6;\n      view.setUint8(offset, cls.invoke ? 1 : 0);\n      view.setUint8(offset + 1, cls.group ? 1 : 0);\n      view.setInt32(offset + 2, cls.length, true);\n    }\n    return buf;\n  }\n}\n","/**\n * Unknown word dictionary.\n * Handles words not found in the main dictionary by using character type information.\n */\n\nimport { CharacterDefinition } from \"./CharacterDefinition.js\";\nimport { TokenInfoDictionary } from \"./TokenInfoDictionary.js\";\n\nexport class UnknownDictionary extends TokenInfoDictionary {\n  private characterDefinition: CharacterDefinition;\n  private classIdToWordIds: Record<number, number[]> | null;\n\n  constructor() {\n    super();\n    this.characterDefinition = new CharacterDefinition();\n    this.classIdToWordIds = null;\n  }\n\n  setCharacterDefinition(charDef: CharacterDefinition): void {\n    this.characterDefinition = charDef;\n  }\n\n  getCharacterDefinition(): CharacterDefinition {\n    return this.characterDefinition;\n  }\n\n  /**\n   * Lookup unknown word entries for a given character class.\n   * Returns word IDs for the given character class index.\n   */\n  lookup(charCode: number): number[] {\n    return this.lookupByCharClass(\n      this.characterDefinition.getCharacterClass(charCode)\n    );\n  }\n\n  /**\n   * Lookup word IDs by character class index.\n   */\n  lookupByCharClass(classId: number): number[] {\n    if (this.classIdToWordIds) {\n      return this.classIdToWordIds[classId] ?? [];\n    }\n\n    const map = this.getTargetMap();\n    const ids: number[] = [];\n    for (const key of Object.keys(map)) {\n      const wordId = Number(key);\n      const features = this.getFeatures(wordId);\n      if (features !== \"\") {\n        ids.push(wordId);\n      }\n    }\n    return ids;\n  }\n\n  override loadPosVector(data: Uint8Array): this {\n    if (data.byteLength === 0) {\n      this.classIdToWordIds = null;\n      return this;\n    }\n\n    const view = new DataView(\n      data.buffer,\n      data.byteOffset,\n      data.byteLength\n    );\n    const classCount = view.getInt32(0, true);\n    const map: Record<number, number[]> = {};\n    let offset = 4;\n    for (let classId = 0; classId < classCount; classId++) {\n      const wordIdCount = view.getInt32(offset, true);\n      offset += 4;\n      const wordIds: number[] = [];\n      for (let i = 0; i < wordIdCount; i++) {\n        wordIds.push(view.getInt32(offset, true));\n        offset += 4;\n      }\n      map[classId] = wordIds;\n    }\n    this.classIdToWordIds = map;\n    return this;\n  }\n\n  /**\n   * Load from category map and dictionary data.\n   */\n  loadCharacterDefinition(charDef: CharacterDefinition): this {\n    this.characterDefinition = charDef;\n    return this;\n  }\n}\n","/**\n * Container that holds all dictionary components needed for tokenization.\n */\n\nimport { DoubleArray } from \"../trie/DoubleArray.js\";\nimport { ConnectionCosts } from \"./ConnectionCosts.js\";\nimport { TokenInfoDictionary } from \"./TokenInfoDictionary.js\";\nimport { UnknownDictionary } from \"./UnknownDictionary.js\";\n\nexport class DictionaryContainer {\n  readonly trie: DoubleArray;\n  readonly tokenInfoDictionary: TokenInfoDictionary;\n  readonly connectionCosts: ConnectionCosts;\n  readonly unknownDictionary: UnknownDictionary;\n\n  constructor(\n    trie: DoubleArray,\n    tokenInfoDictionary: TokenInfoDictionary,\n    connectionCosts: ConnectionCosts,\n    unknownDictionary: UnknownDictionary\n  ) {\n    this.trie = trie;\n    this.tokenInfoDictionary = tokenInfoDictionary;\n    this.connectionCosts = connectionCosts;\n    this.unknownDictionary = unknownDictionary;\n  }\n}\n","/**\n * Asynchronous tokenizer builder.\n * Loads dictionary files and constructs a ready-to-use Tokenizer.\n */\n\nimport type { BaseToken } from \"../types/token.js\";\nimport type { TokenizerOptions } from \"../types/options.js\";\nimport type { DictionaryLoader } from \"../loader/DictionaryLoader.js\";\nimport type { DictionaryFormat } from \"../dict/format/DictionaryFormat.js\";\nimport { DICT_FILES } from \"../types/dictionary.js\";\nimport { DoubleArray } from \"../trie/DoubleArray.js\";\nimport { ConnectionCosts } from \"../dict/ConnectionCosts.js\";\nimport { TokenInfoDictionary } from \"../dict/TokenInfoDictionary.js\";\nimport { UnknownDictionary } from \"../dict/UnknownDictionary.js\";\nimport { CharacterDefinition } from \"../dict/CharacterDefinition.js\";\nimport { DictionaryContainer } from \"../dict/DictionaryContainer.js\";\nimport { Tokenizer } from \"./Tokenizer.js\";\n\nexport class TokenizerBuilder {\n  /**\n   * Build a tokenizer with the given options.\n   */\n  static async build<T extends BaseToken>(\n    _options: TokenizerOptions,\n    loader: DictionaryLoader,\n    format: DictionaryFormat<T>\n  ): Promise<Tokenizer<T>> {\n    // Load all dictionary files in parallel\n    const [\n      trieData,\n      tidData,\n      tidPosData,\n      tidMapData,\n      ccData,\n      unkData,\n      unkPosData,\n      unkMapData,\n      unkCharData,\n      unkCompatData,\n      unkInvokeData,\n    ] = await Promise.all([\n      loader.loadArrayBuffer(DICT_FILES.trie),\n      loader.loadArrayBuffer(DICT_FILES.tid),\n      loader.loadArrayBuffer(DICT_FILES.tidPos),\n      loader.loadArrayBuffer(DICT_FILES.tidMap),\n      loader.loadArrayBuffer(DICT_FILES.cc),\n      loader.loadArrayBuffer(DICT_FILES.unk),\n      loader.loadArrayBuffer(DICT_FILES.unkPos),\n      loader.loadArrayBuffer(DICT_FILES.unkMap),\n      loader.loadArrayBuffer(DICT_FILES.unkChar),\n      loader.loadArrayBuffer(DICT_FILES.unkCompat),\n      loader.loadArrayBuffer(DICT_FILES.unkInvoke),\n    ]);\n\n    // Build trie\n    const baseArray = new Int32Array(trieData);\n    // The trie data contains base and check arrays concatenated\n    // First half is base, second half is check\n    const halfLen = baseArray.length / 2;\n    const base = baseArray.slice(0, halfLen);\n    const check = baseArray.slice(halfLen);\n    const trie = DoubleArray.fromArrays(base, check);\n\n    // Build connection costs\n    const ccArray = new Int16Array(ccData);\n    const connectionCosts = ConnectionCosts.fromBuffer(ccArray);\n\n    // Build token info dictionary\n    const tokenInfoDictionary = new TokenInfoDictionary();\n    tokenInfoDictionary.loadDictionary(new Uint8Array(tidData));\n    tokenInfoDictionary.loadPosVector(new Uint8Array(tidPosData));\n    tokenInfoDictionary.loadTargetMap(new Uint8Array(tidMapData));\n\n    // Build character definition\n    const charDef = CharacterDefinition.fromBuffers(\n      new Uint8Array(unkCharData),\n      new Uint32Array(unkCompatData),\n      new Uint8Array(unkInvokeData)\n    );\n\n    // Build unknown dictionary\n    const unknownDictionary = new UnknownDictionary();\n    unknownDictionary.loadDictionary(new Uint8Array(unkData));\n    unknownDictionary.loadPosVector(new Uint8Array(unkPosData));\n    unknownDictionary.loadTargetMap(new Uint8Array(unkMapData));\n    unknownDictionary.loadCharacterDefinition(charDef);\n\n    // Create container\n    const container = new DictionaryContainer(\n      trie,\n      tokenInfoDictionary,\n      connectionCosts,\n      unknownDictionary\n    );\n\n    return new Tokenizer<T>(container, format);\n  }\n}\n","/**\n * IPAdic dictionary format parser.\n * Parses features in the IPAdic format (MeCab-IPADIC).\n */\n\nimport type { BaseToken, IpadicToken } from \"../../types/token.js\";\nimport type { DictionaryFormat } from \"./DictionaryFormat.js\";\n\nexport class IpadicFormatHandler implements DictionaryFormat<IpadicToken> {\n  readonly name: string = \"ipadic\";\n\n  parseToken(\n    base: Omit<BaseToken, \"cost\"> & { cost: number },\n    features: string\n  ): IpadicToken {\n    const parts = features.split(\",\");\n    return {\n      ...base,\n      pos: parts[0] ?? \"*\",\n      posDetail1: parts[1] ?? \"*\",\n      posDetail2: parts[2] ?? \"*\",\n      posDetail3: parts[3] ?? \"*\",\n      conjugationType: parts[4] ?? \"*\",\n      conjugationForm: parts[5] ?? \"*\",\n      baseForm: parts[6] ?? \"*\",\n      reading: parts[7] ?? \"*\",\n      pronunciation: parts[8] ?? \"*\",\n    };\n  }\n\n  getFeatureCount(): number {\n    return 9;\n  }\n}\n","/**\n * UniDic dictionary format parser.\n */\n\nimport type { BaseToken, UnidicToken } from \"../../types/token.js\";\nimport type { DictionaryFormat } from \"./DictionaryFormat.js\";\n\nexport class UnidicFormatHandler implements DictionaryFormat<UnidicToken> {\n  readonly name = \"unidic\";\n\n  parseToken(\n    base: Omit<BaseToken, \"cost\"> & { cost: number },\n    features: string\n  ): UnidicToken {\n    const parts = features.split(\",\");\n    return {\n      ...base,\n      pos1: parts[0] ?? \"*\",\n      pos2: parts[1] ?? \"*\",\n      pos3: parts[2] ?? \"*\",\n      pos4: parts[3] ?? \"*\",\n      cType: parts[4] ?? \"*\",\n      cForm: parts[5] ?? \"*\",\n      lForm: parts[6] ?? \"*\",\n      lemma: parts[7] ?? \"*\",\n      orth: parts[8] ?? \"*\",\n      orthBase: parts[9] ?? \"*\",\n      pron: parts[10] ?? \"*\",\n      pronBase: parts[11] ?? \"*\",\n      goshu: parts[12] ?? \"*\",\n      iType: parts[13] ?? \"*\",\n      iForm: parts[14] ?? \"*\",\n      fType: parts[15] ?? \"*\",\n      fForm: parts[16] ?? \"*\",\n    };\n  }\n\n  getFeatureCount(): number {\n    return 17;\n  }\n}\n","/**\n * NEologd dictionary format parser.\n * NEologd is based on IPAdic format with the same feature structure.\n */\n\nimport type { IpadicToken } from \"../../types/token.js\";\nimport { IpadicFormatHandler } from \"./IpadicFormat.js\";\n\nexport class NeologdFormatHandler extends IpadicFormatHandler {\n  override readonly name: string = \"neologd\";\n}\n\nexport type NeologdToken = IpadicToken;\n","/**\n * Unicode-aware string that correctly handles surrogate pairs.\n * Provides character-level indexing that treats surrogate pairs as single characters.\n */\nexport class SurrogateAwareString {\n  private readonly codePoints: number[];\n  readonly length: number;\n\n  constructor(str: string) {\n    this.codePoints = [];\n    for (let i = 0; i < str.length; i++) {\n      const code = str.charCodeAt(i);\n      if (code >= 0xd800 && code <= 0xdbff && i + 1 < str.length) {\n        const low = str.charCodeAt(i + 1);\n        if (low >= 0xdc00 && low <= 0xdfff) {\n          this.codePoints.push(\n            (code - 0xd800) * 0x400 + (low - 0xdc00) + 0x10000\n          );\n          i++;\n          continue;\n        }\n      }\n      this.codePoints.push(code);\n    }\n    this.length = this.codePoints.length;\n  }\n\n  charAt(index: number): string {\n    if (index < 0 || index >= this.length) return \"\";\n    return String.fromCodePoint(this.codePoints[index]);\n  }\n\n  charCodeAt(index: number): number {\n    if (index < 0 || index >= this.length) return NaN;\n    return this.codePoints[index];\n  }\n\n  substring(start: number, end?: number): string {\n    const e = end ?? this.length;\n    return this.codePoints\n      .slice(start, e)\n      .map((cp) => String.fromCodePoint(cp))\n      .join(\"\");\n  }\n\n  slice(start: number, end?: number): string {\n    return this.substring(start, end);\n  }\n\n  toString(): string {\n    return this.codePoints.map((cp) => String.fromCodePoint(cp)).join(\"\");\n  }\n}\n","/**\n * Dictionary loader for browser using fetch and DecompressionStream.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport class BrowserLoader implements DictionaryLoader {\n  private readonly baseUrl: string;\n\n  constructor(baseUrl: string) {\n    // Ensure trailing slash\n    this.baseUrl = baseUrl.endsWith(\"/\") ? baseUrl : baseUrl + \"/\";\n  }\n\n  async loadArrayBuffer(fileName: string): Promise<ArrayBuffer> {\n    const url = this.baseUrl + fileName;\n    const response = await fetch(url);\n    if (!response.ok) {\n      throw new Error(`Failed to fetch dictionary file: ${url} (${response.status})`);\n    }\n\n    // If the server set Content-Encoding: gzip, the browser already decompressed\n    // the response transparently — no need to decompress again.\n    const contentEncoding = response.headers.get(\"Content-Encoding\");\n    if (contentEncoding === \"gzip\") {\n      return response.arrayBuffer();\n    }\n\n    if (!response.body) {\n      throw new Error(`Response body is null for: ${url}`);\n    }\n\n    // Use native DecompressionStream for gzip decompression\n    const ds = new DecompressionStream(\"gzip\");\n    const decompressedStream = response.body.pipeThrough(ds);\n    const reader = decompressedStream.getReader();\n\n    const chunks: Uint8Array[] = [];\n    let totalLength = 0;\n\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) break;\n      chunks.push(value);\n      totalLength += value.byteLength;\n    }\n\n    // Concatenate chunks\n    const result = new Uint8Array(totalLength);\n    let offset = 0;\n    for (const chunk of chunks) {\n      result.set(chunk, offset);\n      offset += chunk.byteLength;\n    }\n\n    return result.buffer;\n  }\n}\n","import type { DictionaryLoader } from \"./loader/DictionaryLoader.js\";\nimport type { TokenizerOptions } from \"./types/options.js\";\nimport type { BaseToken } from \"./types/token.js\";\nimport type { Tokenizer } from \"./tokenizer/Tokenizer.js\";\nimport { TokenizerBuilder } from \"./tokenizer/TokenizerBuilder.js\";\nimport { IpadicFormatHandler } from \"./dict/format/IpadicFormat.js\";\nimport { UnidicFormatHandler } from \"./dict/format/UnidicFormat.js\";\nimport { NeologdFormatHandler } from \"./dict/format/NeologdFormat.js\";\n\nexport function createTokenizerWithLoader(\n  options: TokenizerOptions,\n  loader: DictionaryLoader\n): Promise<Tokenizer<BaseToken>> {\n  const format = options.format ?? \"ipadic\";\n  switch (format) {\n    case \"ipadic\":\n      return TokenizerBuilder.build(options, loader, new IpadicFormatHandler());\n    case \"unidic\":\n      return TokenizerBuilder.build(options, loader, new UnidicFormatHandler());\n    case \"neologd\":\n      return TokenizerBuilder.build(options, loader, new NeologdFormatHandler());\n    default:\n      throw new Error(`Unknown dictionary format: ${format}`);\n  }\n}\n"],"mappings":"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","names":["endPos","termPos"]}