idlerpg.sh 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. package/README.md +171 -0
  2. package/dist/affix/AffixRegistry.d.ts +68 -0
  3. package/dist/affix/AffixRegistry.d.ts.map +1 -0
  4. package/dist/affix/AffixRegistry.js +245 -0
  5. package/dist/affix/AffixRegistry.js.map +1 -0
  6. package/dist/affix/PluginLoader.d.ts +66 -0
  7. package/dist/affix/PluginLoader.d.ts.map +1 -0
  8. package/dist/affix/PluginLoader.js +321 -0
  9. package/dist/affix/PluginLoader.js.map +1 -0
  10. package/dist/affix/builtin.d.ts +6 -0
  11. package/dist/affix/builtin.d.ts.map +1 -0
  12. package/dist/affix/builtin.js +311 -0
  13. package/dist/affix/builtin.js.map +1 -0
  14. package/dist/affix/index.d.ts +8 -0
  15. package/dist/affix/index.d.ts.map +1 -0
  16. package/dist/affix/index.js +11 -0
  17. package/dist/affix/index.js.map +1 -0
  18. package/dist/affix/types.d.ts +152 -0
  19. package/dist/affix/types.d.ts.map +1 -0
  20. package/dist/affix/types.js +8 -0
  21. package/dist/affix/types.js.map +1 -0
  22. package/dist/ai/PlayKitClient.d.ts +208 -0
  23. package/dist/ai/PlayKitClient.d.ts.map +1 -0
  24. package/dist/ai/PlayKitClient.js +721 -0
  25. package/dist/ai/PlayKitClient.js.map +1 -0
  26. package/dist/ai/index.d.ts +5 -0
  27. package/dist/ai/index.d.ts.map +1 -0
  28. package/dist/ai/index.js +8 -0
  29. package/dist/ai/index.js.map +1 -0
  30. package/dist/app/App.d.ts +85 -0
  31. package/dist/app/App.d.ts.map +1 -0
  32. package/dist/app/App.js +296 -0
  33. package/dist/app/App.js.map +1 -0
  34. package/dist/app/EventBus.d.ts +222 -0
  35. package/dist/app/EventBus.d.ts.map +1 -0
  36. package/dist/app/EventBus.js +88 -0
  37. package/dist/app/EventBus.js.map +1 -0
  38. package/dist/app/Keybind.d.ts +83 -0
  39. package/dist/app/Keybind.d.ts.map +1 -0
  40. package/dist/app/Keybind.js +184 -0
  41. package/dist/app/Keybind.js.map +1 -0
  42. package/dist/app/Router.d.ts +123 -0
  43. package/dist/app/Router.d.ts.map +1 -0
  44. package/dist/app/Router.js +142 -0
  45. package/dist/app/Router.js.map +1 -0
  46. package/dist/app/ScreenManager.d.ts +97 -0
  47. package/dist/app/ScreenManager.d.ts.map +1 -0
  48. package/dist/app/ScreenManager.js +216 -0
  49. package/dist/app/ScreenManager.js.map +1 -0
  50. package/dist/app/index.d.ts +14 -0
  51. package/dist/app/index.d.ts.map +1 -0
  52. package/dist/app/index.js +19 -0
  53. package/dist/app/index.js.map +1 -0
  54. package/dist/app/screens/BaseScreen.d.ts +101 -0
  55. package/dist/app/screens/BaseScreen.d.ts.map +1 -0
  56. package/dist/app/screens/BaseScreen.js +132 -0
  57. package/dist/app/screens/BaseScreen.js.map +1 -0
  58. package/dist/app/screens/CharacterCreationScreen.d.ts +42 -0
  59. package/dist/app/screens/CharacterCreationScreen.d.ts.map +1 -0
  60. package/dist/app/screens/CharacterCreationScreen.js +467 -0
  61. package/dist/app/screens/CharacterCreationScreen.js.map +1 -0
  62. package/dist/app/screens/CombatScreen.d.ts +30 -0
  63. package/dist/app/screens/CombatScreen.d.ts.map +1 -0
  64. package/dist/app/screens/CombatScreen.js +309 -0
  65. package/dist/app/screens/CombatScreen.js.map +1 -0
  66. package/dist/app/screens/DialogScreen.d.ts +29 -0
  67. package/dist/app/screens/DialogScreen.d.ts.map +1 -0
  68. package/dist/app/screens/DialogScreen.js +295 -0
  69. package/dist/app/screens/DialogScreen.js.map +1 -0
  70. package/dist/app/screens/ExploreScreen.d.ts +50 -0
  71. package/dist/app/screens/ExploreScreen.d.ts.map +1 -0
  72. package/dist/app/screens/ExploreScreen.js +308 -0
  73. package/dist/app/screens/ExploreScreen.js.map +1 -0
  74. package/dist/app/screens/HelpScreen.d.ts +12 -0
  75. package/dist/app/screens/HelpScreen.d.ts.map +1 -0
  76. package/dist/app/screens/HelpScreen.js +155 -0
  77. package/dist/app/screens/HelpScreen.js.map +1 -0
  78. package/dist/app/screens/InventoryScreen.d.ts +27 -0
  79. package/dist/app/screens/InventoryScreen.d.ts.map +1 -0
  80. package/dist/app/screens/InventoryScreen.js +326 -0
  81. package/dist/app/screens/InventoryScreen.js.map +1 -0
  82. package/dist/app/screens/PrologueScreen.d.ts +24 -0
  83. package/dist/app/screens/PrologueScreen.d.ts.map +1 -0
  84. package/dist/app/screens/PrologueScreen.js +176 -0
  85. package/dist/app/screens/PrologueScreen.js.map +1 -0
  86. package/dist/app/screens/TitleScreen.d.ts +42 -0
  87. package/dist/app/screens/TitleScreen.d.ts.map +1 -0
  88. package/dist/app/screens/TitleScreen.js +380 -0
  89. package/dist/app/screens/TitleScreen.js.map +1 -0
  90. package/dist/app/screens/TravelScreen.d.ts +22 -0
  91. package/dist/app/screens/TravelScreen.d.ts.map +1 -0
  92. package/dist/app/screens/TravelScreen.js +122 -0
  93. package/dist/app/screens/TravelScreen.js.map +1 -0
  94. package/dist/app/screens/index.d.ts +14 -0
  95. package/dist/app/screens/index.d.ts.map +1 -0
  96. package/dist/app/screens/index.js +17 -0
  97. package/dist/app/screens/index.js.map +1 -0
  98. package/dist/commands/CommandRegistry.d.ts +91 -0
  99. package/dist/commands/CommandRegistry.d.ts.map +1 -0
  100. package/dist/commands/CommandRegistry.js +159 -0
  101. package/dist/commands/CommandRegistry.js.map +1 -0
  102. package/dist/commands/index.d.ts +7 -0
  103. package/dist/commands/index.d.ts.map +1 -0
  104. package/dist/commands/index.js +10 -0
  105. package/dist/commands/index.js.map +1 -0
  106. package/dist/core/Actor.d.ts +103 -0
  107. package/dist/core/Actor.d.ts.map +1 -0
  108. package/dist/core/Actor.js +409 -0
  109. package/dist/core/Actor.js.map +1 -0
  110. package/dist/core/Combat.d.ts +37 -0
  111. package/dist/core/Combat.d.ts.map +1 -0
  112. package/dist/core/Combat.js +294 -0
  113. package/dist/core/Combat.js.map +1 -0
  114. package/dist/core/DungeonRunner.d.ts +169 -0
  115. package/dist/core/DungeonRunner.d.ts.map +1 -0
  116. package/dist/core/DungeonRunner.js +627 -0
  117. package/dist/core/DungeonRunner.js.map +1 -0
  118. package/dist/core/Game.d.ts +133 -0
  119. package/dist/core/Game.d.ts.map +1 -0
  120. package/dist/core/Game.js +644 -0
  121. package/dist/core/Game.js.map +1 -0
  122. package/dist/core/IdleCombat.d.ts +61 -0
  123. package/dist/core/IdleCombat.d.ts.map +1 -0
  124. package/dist/core/IdleCombat.js +461 -0
  125. package/dist/core/IdleCombat.js.map +1 -0
  126. package/dist/core/IdleGameManager.d.ts +198 -0
  127. package/dist/core/IdleGameManager.d.ts.map +1 -0
  128. package/dist/core/IdleGameManager.js +688 -0
  129. package/dist/core/IdleGameManager.js.map +1 -0
  130. package/dist/core/IdleSaveManager.d.ts +109 -0
  131. package/dist/core/IdleSaveManager.d.ts.map +1 -0
  132. package/dist/core/IdleSaveManager.js +296 -0
  133. package/dist/core/IdleSaveManager.js.map +1 -0
  134. package/dist/core/NewGameFlowManager.d.ts +64 -0
  135. package/dist/core/NewGameFlowManager.d.ts.map +1 -0
  136. package/dist/core/NewGameFlowManager.js +153 -0
  137. package/dist/core/NewGameFlowManager.js.map +1 -0
  138. package/dist/core/Player.d.ts +65 -0
  139. package/dist/core/Player.d.ts.map +1 -0
  140. package/dist/core/Player.js +261 -0
  141. package/dist/core/Player.js.map +1 -0
  142. package/dist/core/RoomHandlers.d.ts +75 -0
  143. package/dist/core/RoomHandlers.d.ts.map +1 -0
  144. package/dist/core/RoomHandlers.js +383 -0
  145. package/dist/core/RoomHandlers.js.map +1 -0
  146. package/dist/core/SaveManager.d.ts +84 -0
  147. package/dist/core/SaveManager.d.ts.map +1 -0
  148. package/dist/core/SaveManager.js +281 -0
  149. package/dist/core/SaveManager.js.map +1 -0
  150. package/dist/core/SaveMigration.d.ts +69 -0
  151. package/dist/core/SaveMigration.d.ts.map +1 -0
  152. package/dist/core/SaveMigration.js +408 -0
  153. package/dist/core/SaveMigration.js.map +1 -0
  154. package/dist/core/StateAdapter.d.ts +79 -0
  155. package/dist/core/StateAdapter.d.ts.map +1 -0
  156. package/dist/core/StateAdapter.js +397 -0
  157. package/dist/core/StateAdapter.js.map +1 -0
  158. package/dist/core/Team.d.ts +145 -0
  159. package/dist/core/Team.d.ts.map +1 -0
  160. package/dist/core/Team.js +371 -0
  161. package/dist/core/Team.js.map +1 -0
  162. package/dist/core/TeamCombat.d.ts +88 -0
  163. package/dist/core/TeamCombat.d.ts.map +1 -0
  164. package/dist/core/TeamCombat.js +405 -0
  165. package/dist/core/TeamCombat.js.map +1 -0
  166. package/dist/core/TeamDungeonRunner.d.ts +186 -0
  167. package/dist/core/TeamDungeonRunner.d.ts.map +1 -0
  168. package/dist/core/TeamDungeonRunner.js +758 -0
  169. package/dist/core/TeamDungeonRunner.js.map +1 -0
  170. package/dist/core/TimeManager.d.ts +114 -0
  171. package/dist/core/TimeManager.d.ts.map +1 -0
  172. package/dist/core/TimeManager.js +318 -0
  173. package/dist/core/TimeManager.js.map +1 -0
  174. package/dist/core/index.d.ts +9 -0
  175. package/dist/core/index.d.ts.map +1 -0
  176. package/dist/core/index.js +12 -0
  177. package/dist/core/index.js.map +1 -0
  178. package/dist/core/timeConstants.d.ts +135 -0
  179. package/dist/core/timeConstants.d.ts.map +1 -0
  180. package/dist/core/timeConstants.js +157 -0
  181. package/dist/core/timeConstants.js.map +1 -0
  182. package/dist/core/types.d.ts +780 -0
  183. package/dist/core/types.d.ts.map +1 -0
  184. package/dist/core/types.js +16 -0
  185. package/dist/core/types.js.map +1 -0
  186. package/dist/data/continents/index.d.ts +163 -0
  187. package/dist/data/continents/index.d.ts.map +1 -0
  188. package/dist/data/continents/index.js +31 -0
  189. package/dist/data/continents/index.js.map +1 -0
  190. package/dist/data/continents/verdantia.d.ts +294 -0
  191. package/dist/data/continents/verdantia.d.ts.map +1 -0
  192. package/dist/data/continents/verdantia.js +327 -0
  193. package/dist/data/continents/verdantia.js.map +1 -0
  194. package/dist/handlers/DialogHandler.d.ts +95 -0
  195. package/dist/handlers/DialogHandler.d.ts.map +1 -0
  196. package/dist/handlers/DialogHandler.js +450 -0
  197. package/dist/handlers/DialogHandler.js.map +1 -0
  198. package/dist/handlers/SaveLoadHandler.d.ts +60 -0
  199. package/dist/handlers/SaveLoadHandler.d.ts.map +1 -0
  200. package/dist/handlers/SaveLoadHandler.js +187 -0
  201. package/dist/handlers/SaveLoadHandler.js.map +1 -0
  202. package/dist/handlers/TitleScreenHandler.d.ts +43 -0
  203. package/dist/handlers/TitleScreenHandler.d.ts.map +1 -0
  204. package/dist/handlers/TitleScreenHandler.js +508 -0
  205. package/dist/handlers/TitleScreenHandler.js.map +1 -0
  206. package/dist/handlers/WorkshopHandler.d.ts +75 -0
  207. package/dist/handlers/WorkshopHandler.d.ts.map +1 -0
  208. package/dist/handlers/WorkshopHandler.js +401 -0
  209. package/dist/handlers/WorkshopHandler.js.map +1 -0
  210. package/dist/handlers/index.d.ts +12 -0
  211. package/dist/handlers/index.d.ts.map +1 -0
  212. package/dist/handlers/index.js +14 -0
  213. package/dist/handlers/index.js.map +1 -0
  214. package/dist/handlers/types.d.ts +34 -0
  215. package/dist/handlers/types.d.ts.map +1 -0
  216. package/dist/handlers/types.js +8 -0
  217. package/dist/handlers/types.js.map +1 -0
  218. package/dist/i18n/en.d.ts +3 -0
  219. package/dist/i18n/en.d.ts.map +1 -0
  220. package/dist/i18n/en.js +130 -0
  221. package/dist/i18n/en.js.map +1 -0
  222. package/dist/i18n/index.d.ts +40 -0
  223. package/dist/i18n/index.d.ts.map +1 -0
  224. package/dist/i18n/index.js +105 -0
  225. package/dist/i18n/index.js.map +1 -0
  226. package/dist/i18n/types.d.ts +133 -0
  227. package/dist/i18n/types.d.ts.map +1 -0
  228. package/dist/i18n/types.js +8 -0
  229. package/dist/i18n/types.js.map +1 -0
  230. package/dist/i18n/zh.d.ts +3 -0
  231. package/dist/i18n/zh.d.ts.map +1 -0
  232. package/dist/i18n/zh.js +130 -0
  233. package/dist/i18n/zh.js.map +1 -0
  234. package/dist/instrument.d.ts +8 -0
  235. package/dist/instrument.d.ts.map +1 -0
  236. package/dist/instrument.js +33 -0
  237. package/dist/instrument.js.map +1 -0
  238. package/dist/main-new.d.ts +12 -0
  239. package/dist/main-new.d.ts.map +1 -0
  240. package/dist/main-new.js +32 -0
  241. package/dist/main-new.js.map +1 -0
  242. package/dist/main.d.ts +7 -0
  243. package/dist/main.d.ts.map +1 -0
  244. package/dist/main.js +2816 -0
  245. package/dist/main.js.map +1 -0
  246. package/dist/map/ContinentManager.d.ts +88 -0
  247. package/dist/map/ContinentManager.d.ts.map +1 -0
  248. package/dist/map/ContinentManager.js +241 -0
  249. package/dist/map/ContinentManager.js.map +1 -0
  250. package/dist/map/DungeonGenerator.d.ts +32 -0
  251. package/dist/map/DungeonGenerator.d.ts.map +1 -0
  252. package/dist/map/DungeonGenerator.js +615 -0
  253. package/dist/map/DungeonGenerator.js.map +1 -0
  254. package/dist/map/MapGenerator.d.ts +27 -0
  255. package/dist/map/MapGenerator.d.ts.map +1 -0
  256. package/dist/map/MapGenerator.js +485 -0
  257. package/dist/map/MapGenerator.js.map +1 -0
  258. package/dist/map/index.d.ts +5 -0
  259. package/dist/map/index.d.ts.map +1 -0
  260. package/dist/map/index.js +8 -0
  261. package/dist/map/index.js.map +1 -0
  262. package/dist/npc/NPCGenerator.d.ts +68 -0
  263. package/dist/npc/NPCGenerator.d.ts.map +1 -0
  264. package/dist/npc/NPCGenerator.js +468 -0
  265. package/dist/npc/NPCGenerator.js.map +1 -0
  266. package/dist/npc/NPCManager.d.ts +86 -0
  267. package/dist/npc/NPCManager.d.ts.map +1 -0
  268. package/dist/npc/NPCManager.js +217 -0
  269. package/dist/npc/NPCManager.js.map +1 -0
  270. package/dist/npc/fixedNPCs.d.ts +7 -0
  271. package/dist/npc/fixedNPCs.d.ts.map +1 -0
  272. package/dist/npc/fixedNPCs.js +196 -0
  273. package/dist/npc/fixedNPCs.js.map +1 -0
  274. package/dist/npc/index.d.ts +9 -0
  275. package/dist/npc/index.d.ts.map +1 -0
  276. package/dist/npc/index.js +12 -0
  277. package/dist/npc/index.js.map +1 -0
  278. package/dist/npc/traits.d.ts +33 -0
  279. package/dist/npc/traits.d.ts.map +1 -0
  280. package/dist/npc/traits.js +795 -0
  281. package/dist/npc/traits.js.map +1 -0
  282. package/dist/npc/types.d.ts +193 -0
  283. package/dist/npc/types.d.ts.map +1 -0
  284. package/dist/npc/types.js +9 -0
  285. package/dist/npc/types.js.map +1 -0
  286. package/dist/quest/QuestManager.d.ts +79 -0
  287. package/dist/quest/QuestManager.d.ts.map +1 -0
  288. package/dist/quest/QuestManager.js +273 -0
  289. package/dist/quest/QuestManager.js.map +1 -0
  290. package/dist/quest/index.d.ts +6 -0
  291. package/dist/quest/index.d.ts.map +1 -0
  292. package/dist/quest/index.js +9 -0
  293. package/dist/quest/index.js.map +1 -0
  294. package/dist/quest/types.d.ts +81 -0
  295. package/dist/quest/types.d.ts.map +1 -0
  296. package/dist/quest/types.js +8 -0
  297. package/dist/quest/types.js.map +1 -0
  298. package/dist/strategy/StrategyExecutor.d.ts +159 -0
  299. package/dist/strategy/StrategyExecutor.d.ts.map +1 -0
  300. package/dist/strategy/StrategyExecutor.js +479 -0
  301. package/dist/strategy/StrategyExecutor.js.map +1 -0
  302. package/dist/strategy/StrategyParser.d.ts +48 -0
  303. package/dist/strategy/StrategyParser.d.ts.map +1 -0
  304. package/dist/strategy/StrategyParser.js +321 -0
  305. package/dist/strategy/StrategyParser.js.map +1 -0
  306. package/dist/strategy/defaultStrategy.d.ts +40 -0
  307. package/dist/strategy/defaultStrategy.d.ts.map +1 -0
  308. package/dist/strategy/defaultStrategy.js +254 -0
  309. package/dist/strategy/defaultStrategy.js.map +1 -0
  310. package/dist/strategy/index.d.ts +8 -0
  311. package/dist/strategy/index.d.ts.map +1 -0
  312. package/dist/strategy/index.js +14 -0
  313. package/dist/strategy/index.js.map +1 -0
  314. package/dist/tui/ExploreMenu.d.ts +106 -0
  315. package/dist/tui/ExploreMenu.d.ts.map +1 -0
  316. package/dist/tui/ExploreMenu.js +282 -0
  317. package/dist/tui/ExploreMenu.js.map +1 -0
  318. package/dist/tui/GameUI.d.ts +313 -0
  319. package/dist/tui/GameUI.d.ts.map +1 -0
  320. package/dist/tui/GameUI.js +2116 -0
  321. package/dist/tui/GameUI.js.map +1 -0
  322. package/dist/tui/GameUIAdapter.d.ts +207 -0
  323. package/dist/tui/GameUIAdapter.d.ts.map +1 -0
  324. package/dist/tui/GameUIAdapter.js +1342 -0
  325. package/dist/tui/GameUIAdapter.js.map +1 -0
  326. package/dist/tui/Input.d.ts +139 -0
  327. package/dist/tui/Input.d.ts.map +1 -0
  328. package/dist/tui/Input.js +278 -0
  329. package/dist/tui/Input.js.map +1 -0
  330. package/dist/tui/Menu.d.ts +110 -0
  331. package/dist/tui/Menu.d.ts.map +1 -0
  332. package/dist/tui/Menu.js +365 -0
  333. package/dist/tui/Menu.js.map +1 -0
  334. package/dist/tui/Screen.d.ts +228 -0
  335. package/dist/tui/Screen.d.ts.map +1 -0
  336. package/dist/tui/Screen.js +502 -0
  337. package/dist/tui/Screen.js.map +1 -0
  338. package/dist/tui/components/Box.d.ts +36 -0
  339. package/dist/tui/components/Box.d.ts.map +1 -0
  340. package/dist/tui/components/Box.js +43 -0
  341. package/dist/tui/components/Box.js.map +1 -0
  342. package/dist/tui/components/List.d.ts +69 -0
  343. package/dist/tui/components/List.d.ts.map +1 -0
  344. package/dist/tui/components/List.js +136 -0
  345. package/dist/tui/components/List.js.map +1 -0
  346. package/dist/tui/components/ProgressBar.d.ts +42 -0
  347. package/dist/tui/components/ProgressBar.d.ts.map +1 -0
  348. package/dist/tui/components/ProgressBar.js +75 -0
  349. package/dist/tui/components/ProgressBar.js.map +1 -0
  350. package/dist/tui/components/index.d.ts +8 -0
  351. package/dist/tui/components/index.d.ts.map +1 -0
  352. package/dist/tui/components/index.js +11 -0
  353. package/dist/tui/components/index.js.map +1 -0
  354. package/dist/tui/core/BaseSection.d.ts +98 -0
  355. package/dist/tui/core/BaseSection.d.ts.map +1 -0
  356. package/dist/tui/core/BaseSection.js +174 -0
  357. package/dist/tui/core/BaseSection.js.map +1 -0
  358. package/dist/tui/core/Component.d.ts +61 -0
  359. package/dist/tui/core/Component.d.ts.map +1 -0
  360. package/dist/tui/core/Component.js +32 -0
  361. package/dist/tui/core/Component.js.map +1 -0
  362. package/dist/tui/core/Section.d.ts +101 -0
  363. package/dist/tui/core/Section.d.ts.map +1 -0
  364. package/dist/tui/core/Section.js +24 -0
  365. package/dist/tui/core/Section.js.map +1 -0
  366. package/dist/tui/core/SectionManager.d.ts +108 -0
  367. package/dist/tui/core/SectionManager.d.ts.map +1 -0
  368. package/dist/tui/core/SectionManager.js +258 -0
  369. package/dist/tui/core/SectionManager.js.map +1 -0
  370. package/dist/tui/core/index.d.ts +9 -0
  371. package/dist/tui/core/index.d.ts.map +1 -0
  372. package/dist/tui/core/index.js +12 -0
  373. package/dist/tui/core/index.js.map +1 -0
  374. package/dist/tui/index.d.ts +15 -0
  375. package/dist/tui/index.d.ts.map +1 -0
  376. package/dist/tui/index.js +23 -0
  377. package/dist/tui/index.js.map +1 -0
  378. package/dist/tui/screens/BaseScreen.d.ts +62 -0
  379. package/dist/tui/screens/BaseScreen.d.ts.map +1 -0
  380. package/dist/tui/screens/BaseScreen.js +55 -0
  381. package/dist/tui/screens/BaseScreen.js.map +1 -0
  382. package/dist/tui/screens/CombatScreen.d.ts +43 -0
  383. package/dist/tui/screens/CombatScreen.d.ts.map +1 -0
  384. package/dist/tui/screens/CombatScreen.js +125 -0
  385. package/dist/tui/screens/CombatScreen.js.map +1 -0
  386. package/dist/tui/screens/DialogScreen.d.ts +53 -0
  387. package/dist/tui/screens/DialogScreen.d.ts.map +1 -0
  388. package/dist/tui/screens/DialogScreen.js +90 -0
  389. package/dist/tui/screens/DialogScreen.js.map +1 -0
  390. package/dist/tui/screens/DungeonScreen.d.ts +80 -0
  391. package/dist/tui/screens/DungeonScreen.d.ts.map +1 -0
  392. package/dist/tui/screens/DungeonScreen.js +317 -0
  393. package/dist/tui/screens/DungeonScreen.js.map +1 -0
  394. package/dist/tui/screens/ExploreScreen.d.ts +69 -0
  395. package/dist/tui/screens/ExploreScreen.d.ts.map +1 -0
  396. package/dist/tui/screens/ExploreScreen.js +224 -0
  397. package/dist/tui/screens/ExploreScreen.js.map +1 -0
  398. package/dist/tui/screens/SectionScreen.d.ts +84 -0
  399. package/dist/tui/screens/SectionScreen.d.ts.map +1 -0
  400. package/dist/tui/screens/SectionScreen.js +156 -0
  401. package/dist/tui/screens/SectionScreen.js.map +1 -0
  402. package/dist/tui/screens/TitleScreen.d.ts +40 -0
  403. package/dist/tui/screens/TitleScreen.d.ts.map +1 -0
  404. package/dist/tui/screens/TitleScreen.js +253 -0
  405. package/dist/tui/screens/TitleScreen.js.map +1 -0
  406. package/dist/tui/screens/TownScreen.d.ts +98 -0
  407. package/dist/tui/screens/TownScreen.d.ts.map +1 -0
  408. package/dist/tui/screens/TownScreen.js +370 -0
  409. package/dist/tui/screens/TownScreen.js.map +1 -0
  410. package/dist/tui/screens/TravelScreen.d.ts +67 -0
  411. package/dist/tui/screens/TravelScreen.d.ts.map +1 -0
  412. package/dist/tui/screens/TravelScreen.js +286 -0
  413. package/dist/tui/screens/TravelScreen.js.map +1 -0
  414. package/dist/tui/screens/index.d.ts +8 -0
  415. package/dist/tui/screens/index.d.ts.map +1 -0
  416. package/dist/tui/screens/index.js +17 -0
  417. package/dist/tui/screens/index.js.map +1 -0
  418. package/dist/tui/sections/ActionsSection.d.ts +71 -0
  419. package/dist/tui/sections/ActionsSection.d.ts.map +1 -0
  420. package/dist/tui/sections/ActionsSection.js +184 -0
  421. package/dist/tui/sections/ActionsSection.js.map +1 -0
  422. package/dist/tui/sections/DungeonSection.d.ts +65 -0
  423. package/dist/tui/sections/DungeonSection.d.ts.map +1 -0
  424. package/dist/tui/sections/DungeonSection.js +144 -0
  425. package/dist/tui/sections/DungeonSection.js.map +1 -0
  426. package/dist/tui/sections/EventsSection.d.ts +50 -0
  427. package/dist/tui/sections/EventsSection.d.ts.map +1 -0
  428. package/dist/tui/sections/EventsSection.js +134 -0
  429. package/dist/tui/sections/EventsSection.js.map +1 -0
  430. package/dist/tui/sections/MapSection.d.ts +66 -0
  431. package/dist/tui/sections/MapSection.d.ts.map +1 -0
  432. package/dist/tui/sections/MapSection.js +669 -0
  433. package/dist/tui/sections/MapSection.js.map +1 -0
  434. package/dist/tui/sections/StatusSection.d.ts +47 -0
  435. package/dist/tui/sections/StatusSection.d.ts.map +1 -0
  436. package/dist/tui/sections/StatusSection.js +133 -0
  437. package/dist/tui/sections/StatusSection.js.map +1 -0
  438. package/dist/tui/sections/TeamSection.d.ts +71 -0
  439. package/dist/tui/sections/TeamSection.d.ts.map +1 -0
  440. package/dist/tui/sections/TeamSection.js +224 -0
  441. package/dist/tui/sections/TeamSection.js.map +1 -0
  442. package/dist/tui/sections/TravelingSection.d.ts +51 -0
  443. package/dist/tui/sections/TravelingSection.d.ts.map +1 -0
  444. package/dist/tui/sections/TravelingSection.js +106 -0
  445. package/dist/tui/sections/TravelingSection.js.map +1 -0
  446. package/dist/tui/sections/index.d.ts +9 -0
  447. package/dist/tui/sections/index.d.ts.map +1 -0
  448. package/dist/tui/sections/index.js +12 -0
  449. package/dist/tui/sections/index.js.map +1 -0
  450. package/dist/ui/Terminal.d.ts +68 -0
  451. package/dist/ui/Terminal.d.ts.map +1 -0
  452. package/dist/ui/Terminal.js +297 -0
  453. package/dist/ui/Terminal.js.map +1 -0
  454. package/dist/ui/index.d.ts +5 -0
  455. package/dist/ui/index.d.ts.map +1 -0
  456. package/dist/ui/index.js +8 -0
  457. package/dist/ui/index.js.map +1 -0
  458. package/dist/utils/configMigration.d.ts +14 -0
  459. package/dist/utils/configMigration.d.ts.map +1 -0
  460. package/dist/utils/configMigration.js +92 -0
  461. package/dist/utils/configMigration.js.map +1 -0
  462. package/dist/utils/errorHandler.d.ts +86 -0
  463. package/dist/utils/errorHandler.d.ts.map +1 -0
  464. package/dist/utils/errorHandler.js +224 -0
  465. package/dist/utils/errorHandler.js.map +1 -0
  466. package/dist/utils/logger.d.ts +14 -0
  467. package/dist/utils/logger.d.ts.map +1 -0
  468. package/dist/utils/logger.js +43 -0
  469. package/dist/utils/logger.js.map +1 -0
  470. package/dist/weapon/WeaponFactory.d.ts +32 -0
  471. package/dist/weapon/WeaponFactory.d.ts.map +1 -0
  472. package/dist/weapon/WeaponFactory.js +216 -0
  473. package/dist/weapon/WeaponFactory.js.map +1 -0
  474. package/dist/weapon/index.d.ts +5 -0
  475. package/dist/weapon/index.d.ts.map +1 -0
  476. package/dist/weapon/index.js +8 -0
  477. package/dist/weapon/index.js.map +1 -0
  478. package/package.json +46 -0
@@ -0,0 +1,721 @@
1
+ /**
2
+ * PlayKit SDK integration for AI-powered content generation
3
+ * Uses Headless Device Auth for terminal authentication
4
+ * Supports token persistence for seamless re-authentication
5
+ */
6
+
7
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="214c7645-bb1a-54ec-8340-8a4840924497")}catch(e){}}();
8
+ import { PlayKitSDK } from 'playkit-sdk';
9
+ import { getLanguage, getPrompt, getPrompts } from '../i18n/index.js';
10
+ import qrcode from 'qrcode-terminal';
11
+ import { readFile, writeFile, mkdir, unlink } from 'fs/promises';
12
+ import { join } from 'path';
13
+ import { homedir } from 'os';
14
+ import { logger } from '../utils/logger.js';
15
+ import { Sentry } from '../instrument.js';
16
+ // ============================================================================
17
+ // Game Configuration
18
+ // ============================================================================
19
+ const GAME_ID = 'a976f7ae-8114-4595-a0d3-a005be2997cc';
20
+ /**
21
+ * Get the token storage file path
22
+ */
23
+ function getTokenPath() {
24
+ return join(homedir(), '.idlerpg-terminal', 'auth.json');
25
+ }
26
+ /**
27
+ * Save tokens to disk
28
+ */
29
+ async function saveTokens(tokens) {
30
+ try {
31
+ const dir = join(homedir(), '.idlerpg-terminal');
32
+ await mkdir(dir, { recursive: true });
33
+ await writeFile(getTokenPath(), JSON.stringify(tokens, null, 2), 'utf-8');
34
+ }
35
+ catch (error) {
36
+ console.error('[Auth] Failed to save tokens:', error);
37
+ }
38
+ }
39
+ /**
40
+ * Load tokens from disk
41
+ */
42
+ async function loadTokens() {
43
+ try {
44
+ const data = await readFile(getTokenPath(), 'utf-8');
45
+ return JSON.parse(data);
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ /**
52
+ * Clear saved tokens
53
+ */
54
+ async function clearTokens() {
55
+ try {
56
+ await unlink(getTokenPath());
57
+ }
58
+ catch {
59
+ // Ignore if file doesn't exist
60
+ }
61
+ }
62
+ // Available models (configured on playkit.ai)
63
+ export const MODELS = {
64
+ text: {
65
+ fast: 'gemini-2.5-flash',
66
+ balanced: 'deepseek-chat',
67
+ smart: 'gpt-4o',
68
+ premium: 'claude-sonnet-4.5',
69
+ },
70
+ image: {
71
+ fast: 'flux-1-schnell',
72
+ quality: 'Kolors',
73
+ },
74
+ };
75
+ /**
76
+ * Generate QR code as string array for terminal display
77
+ */
78
+ export function generateQRCode(url) {
79
+ return new Promise((resolve) => {
80
+ // Use qrcode-terminal to generate QR code
81
+ qrcode.generate(url, { small: true }, (qr) => {
82
+ resolve(qr);
83
+ });
84
+ });
85
+ }
86
+ // ============================================================================
87
+ // Retry Configuration
88
+ // ============================================================================
89
+ const MAX_RETRIES = 3;
90
+ const RETRY_DELAY_MS = 1000;
91
+ /**
92
+ * Retry an async operation with exponential backoff
93
+ */
94
+ async function withRetry(operation, maxRetries = MAX_RETRIES, onRetry) {
95
+ let lastError;
96
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
97
+ try {
98
+ return await operation();
99
+ }
100
+ catch (error) {
101
+ lastError = error;
102
+ if (attempt < maxRetries) {
103
+ onRetry?.(attempt, error);
104
+ // Exponential backoff: 1s, 2s, 4s...
105
+ await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS * Math.pow(2, attempt - 1)));
106
+ }
107
+ }
108
+ }
109
+ throw lastError;
110
+ }
111
+ export class AIClient {
112
+ sdk;
113
+ chatClients = new Map();
114
+ npcClients = new Map();
115
+ initialized = false;
116
+ currentLoginInfo = null;
117
+ storedPlayerName = null;
118
+ constructor() {
119
+ // Create SDK - always use device auth flow (no developer token)
120
+ this.sdk = new PlayKitSDK({
121
+ gameId: GAME_ID,
122
+ mode: 'server', // Terminal app, no browser UI
123
+ });
124
+ }
125
+ /**
126
+ * Try to restore authentication from saved tokens
127
+ * Returns player name if successful, null if login is needed
128
+ */
129
+ async tryRestoreAuth() {
130
+ try {
131
+ const tokens = await loadTokens();
132
+ logger.debug('tryRestoreAuth: loaded tokens', { hasTokens: !!tokens, expiresAt: tokens?.expiresAt });
133
+ if (!tokens) {
134
+ logger.info('tryRestoreAuth: no saved tokens');
135
+ return { success: false };
136
+ }
137
+ const now = Date.now();
138
+ const isExpired = tokens.expiresAt <= now;
139
+ const expiresInMs = tokens.expiresAt - now;
140
+ logger.debug('tryRestoreAuth: token status', { isExpired, expiresInMs, expiresInMinutes: Math.floor(expiresInMs / 60000) });
141
+ // If token is still valid (with 5 min buffer)
142
+ if (!isExpired && expiresInMs > 5 * 60 * 1000) {
143
+ // Re-create SDK with the saved token
144
+ this.sdk = new PlayKitSDK({
145
+ gameId: GAME_ID,
146
+ mode: 'server',
147
+ playerToken: tokens.accessToken,
148
+ });
149
+ // Initialize SDK before using any API methods
150
+ await this.sdk.initialize();
151
+ // Verify the token by actually calling getPlayerInfo
152
+ // This is more reliable than verifyToken which may not exist
153
+ try {
154
+ logger.debug('tryRestoreAuth: verifying token with getPlayerInfo');
155
+ const playerInfo = await this.sdk.getPlayerInfo();
156
+ logger.info('tryRestoreAuth: token verified', { userId: playerInfo.userId, nickname: playerInfo.nickname });
157
+ this.initialized = true;
158
+ this.storedPlayerName = playerInfo.nickname || tokens.playerName || null;
159
+ return { success: true, playerName: playerInfo.nickname || tokens.playerName };
160
+ }
161
+ catch (verifyError) {
162
+ const err = verifyError;
163
+ logger.warn('tryRestoreAuth: token verification failed', { code: err.code });
164
+ // Token is invalid, clear it and require re-login
165
+ await clearTokens();
166
+ this.sdk = new PlayKitSDK({
167
+ gameId: GAME_ID,
168
+ mode: 'server',
169
+ });
170
+ return { success: false };
171
+ }
172
+ }
173
+ // Token expired or expiring soon - try to refresh
174
+ if (tokens.refreshToken) {
175
+ try {
176
+ // Create SDK with the access token first
177
+ this.sdk = new PlayKitSDK({
178
+ gameId: GAME_ID,
179
+ mode: 'server',
180
+ playerToken: tokens.accessToken,
181
+ });
182
+ // Initialize SDK before using any API methods
183
+ await this.sdk.initialize();
184
+ const extSdk = this.sdk;
185
+ // Check if we can refresh
186
+ if (extSdk.canRefreshToken()) {
187
+ const refreshResult = await extSdk.refreshToken();
188
+ // Save the new tokens
189
+ const newTokens = {
190
+ accessToken: refreshResult.accessToken,
191
+ refreshToken: refreshResult.refreshToken || tokens.refreshToken,
192
+ expiresAt: Date.now() + (refreshResult.expiresIn * 1000),
193
+ playerName: tokens.playerName,
194
+ };
195
+ await saveTokens(newTokens);
196
+ this.initialized = true;
197
+ this.storedPlayerName = tokens.playerName || null;
198
+ return { success: true, playerName: tokens.playerName, needsRefresh: true };
199
+ }
200
+ }
201
+ catch (error) {
202
+ console.error('[Auth] Token refresh failed:', error);
203
+ // Report token refresh failure
204
+ Sentry.captureException(error, {
205
+ tags: { operation: 'token_refresh', fallback: true },
206
+ });
207
+ // Clear invalid tokens
208
+ await clearTokens();
209
+ }
210
+ }
211
+ // Could not restore - need fresh login
212
+ // Reset SDK to clean state
213
+ this.sdk = new PlayKitSDK({
214
+ gameId: GAME_ID,
215
+ mode: 'server',
216
+ });
217
+ return { success: false };
218
+ }
219
+ catch (error) {
220
+ console.error('[Auth] Error restoring auth:', error);
221
+ return { success: false };
222
+ }
223
+ }
224
+ /**
225
+ * Get stored player name (if restored from saved auth)
226
+ */
227
+ getStoredPlayerName() {
228
+ return this.storedPlayerName;
229
+ }
230
+ /**
231
+ * Step 1: Initiate login - get auth URL and QR code
232
+ * Returns login info for display
233
+ */
234
+ async initiateLogin() {
235
+ const { authUrl, sessionId, codeVerifier, expiresIn } = await this.sdk.initiateLogin();
236
+ this.currentLoginInfo = { authUrl, sessionId, codeVerifier, expiresIn };
237
+ return this.currentLoginInfo;
238
+ }
239
+ /**
240
+ * Step 2: Complete login - poll for user to authenticate
241
+ */
242
+ async completeLogin(onStatus) {
243
+ if (!this.currentLoginInfo) {
244
+ throw new Error('Must call initiateLogin first');
245
+ }
246
+ const { sessionId, codeVerifier, expiresIn } = this.currentLoginInfo;
247
+ try {
248
+ const result = await this.sdk.completeLogin(sessionId, codeVerifier, {
249
+ onStatus: (status) => {
250
+ onStatus?.(status);
251
+ },
252
+ timeoutMs: expiresIn * 1000,
253
+ });
254
+ // Success!
255
+ this.initialized = true;
256
+ this.currentLoginInfo = null;
257
+ // Get player name from result if available
258
+ const playerName = result.player_name || 'Adventurer';
259
+ this.storedPlayerName = playerName;
260
+ const extSdk = this.sdk;
261
+ // Try multiple methods to get the token
262
+ let authState = null;
263
+ try {
264
+ authState = extSdk.getAuthState();
265
+ }
266
+ catch {
267
+ // getAuthState not available
268
+ }
269
+ let sdkToken = null;
270
+ try {
271
+ sdkToken = extSdk.getToken();
272
+ }
273
+ catch {
274
+ // getToken not available
275
+ }
276
+ // Also try to get tokens directly from result (some SDK versions return them directly)
277
+ const tokenResult = result;
278
+ // Prefer auth state, fallback to getToken, then result
279
+ const accessToken = authState?.token || sdkToken || tokenResult.access_token;
280
+ const refreshToken = authState?.refreshToken || tokenResult.refresh_token;
281
+ const expiresAt = authState?.expiresAt || (tokenResult.expires_in
282
+ ? Date.now() + (tokenResult.expires_in * 1000)
283
+ : Date.now() + (24 * 60 * 60 * 1000)); // Default 24h
284
+ if (accessToken) {
285
+ const tokens = {
286
+ accessToken,
287
+ refreshToken,
288
+ expiresAt,
289
+ playerName,
290
+ };
291
+ await saveTokens(tokens);
292
+ }
293
+ return { playerName };
294
+ }
295
+ catch (error) {
296
+ const err = error;
297
+ if (err.code === 'ACCESS_DENIED') {
298
+ throw new Error('Authorization denied. Please try again.');
299
+ }
300
+ else if (err.code === 'EXPIRED') {
301
+ throw new Error('Login session expired. Please try again.');
302
+ }
303
+ else if (err.code === 'CANCELLED') {
304
+ throw new Error('Login cancelled.');
305
+ }
306
+ else {
307
+ throw new Error(err.message || 'Authentication failed');
308
+ }
309
+ }
310
+ }
311
+ /**
312
+ * Legacy method - Initialize SDK with callbacks (for compatibility)
313
+ */
314
+ async initializeWithAuth(callbacks) {
315
+ if (this.initialized)
316
+ return;
317
+ try {
318
+ const loginInfo = await this.initiateLogin();
319
+ callbacks.onAuthUrl(loginInfo.authUrl);
320
+ callbacks.onWaiting();
321
+ const { playerName } = await this.completeLogin((status) => {
322
+ callbacks.onStatus(status);
323
+ });
324
+ callbacks.onSuccess(playerName);
325
+ }
326
+ catch (error) {
327
+ const err = error;
328
+ if (err.message.includes('expired')) {
329
+ callbacks.onExpired();
330
+ }
331
+ else {
332
+ callbacks.onError(err.message);
333
+ }
334
+ throw error;
335
+ }
336
+ }
337
+ /**
338
+ * Initialize without auth (for testing only - will fail API calls)
339
+ */
340
+ async initialize() {
341
+ // This is now a no-op - auth is required
342
+ throw new Error('Authentication required. Use initiateLogin() and completeLogin().');
343
+ }
344
+ /**
345
+ * Cancel ongoing login
346
+ */
347
+ cancelLogin() {
348
+ this.sdk.cancelLogin();
349
+ }
350
+ /**
351
+ * Check if authenticated
352
+ */
353
+ isAuthenticated() {
354
+ return this.sdk.isAuthenticated();
355
+ }
356
+ /**
357
+ * Logout
358
+ */
359
+ async logout() {
360
+ await this.sdk.logout();
361
+ await clearTokens();
362
+ this.initialized = false;
363
+ this.storedPlayerName = null;
364
+ }
365
+ /**
366
+ * Set player nickname using PlayKit SDK
367
+ * Returns the new nickname if successful
368
+ */
369
+ async setNickname(nickname) {
370
+ logger.info('Setting nickname', { nickname });
371
+ try {
372
+ const result = await this.sdk.setNickname(nickname);
373
+ logger.debug('setNickname result', result);
374
+ if (result.success) {
375
+ this.storedPlayerName = result.nickname;
376
+ // Update stored tokens with new nickname
377
+ const tokens = await loadTokens();
378
+ if (tokens) {
379
+ tokens.playerName = result.nickname;
380
+ await saveTokens(tokens);
381
+ }
382
+ logger.info('Nickname set successfully', { nickname: result.nickname });
383
+ return { success: true, nickname: result.nickname };
384
+ }
385
+ logger.warn('setNickname returned success=false');
386
+ return { success: false, error: 'Failed to set nickname' };
387
+ }
388
+ catch (error) {
389
+ const err = error;
390
+ logger.error('setNickname failed', { code: err.code, message: err.message });
391
+ // Handle specific error codes from PlayKit
392
+ const errorMessages = {
393
+ 'INVALID_NICKNAME': 'Nickname format is invalid (1-16 chars, no special symbols)',
394
+ 'INVALID_TOKEN_TYPE': 'Cannot set nickname with developer token',
395
+ 'GLOBAL_TOKEN_NOT_ALLOWED': 'Requires game-specific player token',
396
+ 'MODERATION_FLAGGED': 'Nickname contains inappropriate content',
397
+ 'NOT_AUTHENTICATED': 'Not authenticated',
398
+ };
399
+ const errorMessage = err.code ? (errorMessages[err.code] || err.message) : (err.message || 'Unknown error');
400
+ return { success: false, error: errorMessage };
401
+ }
402
+ }
403
+ /**
404
+ * Get current nickname from PlayKit SDK
405
+ * Returns null if no nickname is set (user should be prompted to set one)
406
+ */
407
+ async getNickname() {
408
+ logger.debug('Getting nickname from PlayKit');
409
+ try {
410
+ const playerInfo = await this.sdk.getPlayerInfo();
411
+ logger.debug('getPlayerInfo result', { nickname: playerInfo.nickname, userId: playerInfo.userId });
412
+ // Only return the nickname if it's actually set on PlayKit
413
+ // Don't fall back to storedPlayerName as that might be a default value
414
+ return playerInfo.nickname || null;
415
+ }
416
+ catch (error) {
417
+ logger.error('Failed to get player info', error);
418
+ // Return null to trigger nickname prompt, don't use stored fallback
419
+ return null;
420
+ }
421
+ }
422
+ /**
423
+ * Get or create a chat client for a model
424
+ */
425
+ getChatClient(model) {
426
+ if (!this.chatClients.has(model)) {
427
+ const sdkClient = this.sdk.createChatClient(model);
428
+ // Wrap to match our interface
429
+ const client = {
430
+ async chat(message) {
431
+ const response = await sdkClient.chat(message);
432
+ // Handle both string and object response types
433
+ if (typeof response === 'string')
434
+ return response;
435
+ const respObj = response;
436
+ return respObj.content || String(response);
437
+ },
438
+ async chatStream(message, onChunk, onComplete) {
439
+ await sdkClient.chatStream(message, onChunk, onComplete);
440
+ },
441
+ };
442
+ this.chatClients.set(model, client);
443
+ }
444
+ return this.chatClients.get(model);
445
+ }
446
+ /**
447
+ * Generate weapon name based on affixes (with retry)
448
+ */
449
+ async generateWeaponName(affixes) {
450
+ const prompt = getPrompt('weapon', 'generateName', {
451
+ affixes: affixes.join(', '),
452
+ });
453
+ try {
454
+ const result = await withRetry(async () => {
455
+ const client = this.getChatClient(MODELS.text.fast);
456
+ const name = await client.chat(prompt);
457
+ return name.trim().replace(/['"]/g, '');
458
+ }, MAX_RETRIES, (attempt, error) => {
459
+ console.warn(`[AIClient] Weapon name generation retry ${attempt}/${MAX_RETRIES}:`, error);
460
+ });
461
+ return result;
462
+ }
463
+ catch (error) {
464
+ console.error('[AIClient] Failed to generate weapon name after retries:', error);
465
+ // Report exhausted retries for weapon name generation
466
+ Sentry.captureException(error, {
467
+ tags: { operation: 'weapon_name_generation', fallback: true },
468
+ extra: { affixes },
469
+ });
470
+ return this.fallbackWeaponName(affixes);
471
+ }
472
+ }
473
+ /**
474
+ * Generate weapon description (with retry)
475
+ */
476
+ async generateWeaponDescription(name, affixes) {
477
+ const prompt = getPrompt('weapon', 'generateDescription', {
478
+ name,
479
+ affixes: affixes.join(', '),
480
+ });
481
+ try {
482
+ return await withRetry(async () => {
483
+ const client = this.getChatClient(MODELS.text.fast);
484
+ return await client.chat(prompt);
485
+ }, MAX_RETRIES, (attempt, error) => {
486
+ console.warn(`[AIClient] Weapon description retry ${attempt}/${MAX_RETRIES}:`, error);
487
+ });
488
+ }
489
+ catch (error) {
490
+ console.error('[AIClient] Failed to generate weapon description after retries:', error);
491
+ // Report exhausted retries for weapon description generation
492
+ Sentry.captureException(error, {
493
+ tags: { operation: 'weapon_description_generation', fallback: true },
494
+ extra: { name, affixes },
495
+ });
496
+ return `A weapon imbued with ${affixes.join(' and ')}.`;
497
+ }
498
+ }
499
+ /**
500
+ * Generate weapon lore (with retry)
501
+ */
502
+ async generateWeaponLore(name) {
503
+ const prompt = getPrompt('weapon', 'generateLore', { name });
504
+ try {
505
+ return await withRetry(async () => {
506
+ const client = this.getChatClient(MODELS.text.balanced);
507
+ return await client.chat(prompt);
508
+ }, MAX_RETRIES, (attempt, error) => {
509
+ console.warn(`[AIClient] Weapon lore retry ${attempt}/${MAX_RETRIES}:`, error);
510
+ });
511
+ }
512
+ catch (error) {
513
+ console.error('[AIClient] Failed to generate weapon lore after retries:', error);
514
+ // Report exhausted retries for weapon lore generation
515
+ Sentry.captureException(error, {
516
+ tags: { operation: 'weapon_lore_generation', fallback: true },
517
+ extra: { name },
518
+ });
519
+ return '';
520
+ }
521
+ }
522
+ /**
523
+ * Create an NPC client with appropriate system prompt
524
+ */
525
+ createNPCClient(npcType, customPrompt) {
526
+ const key = `${npcType}_${getLanguage()}`;
527
+ if (!this.npcClients.has(key) || customPrompt) {
528
+ const systemPrompt = customPrompt || this.getNPCSystemPrompt(npcType);
529
+ const sdkClient = this.sdk.createNPCClient({
530
+ systemPrompt,
531
+ });
532
+ const client = {
533
+ async talk(message) {
534
+ const response = await sdkClient.talk(message);
535
+ // Handle both string and object response types
536
+ if (typeof response === 'string')
537
+ return response;
538
+ const respObj = response;
539
+ return respObj.content || String(response);
540
+ },
541
+ };
542
+ this.npcClients.set(key, client);
543
+ }
544
+ return this.npcClients.get(key);
545
+ }
546
+ /**
547
+ * Get system prompt for NPC type
548
+ */
549
+ getNPCSystemPrompt(npcType) {
550
+ const prompts = getPrompts();
551
+ const promptMap = {
552
+ merchant: 'mysteriousMerchant',
553
+ sage: 'wiseSage',
554
+ guard: 'dungeonGuard',
555
+ traveler: 'wanderingTraveler',
556
+ blacksmith: 'blacksmith',
557
+ quest_giver: 'wiseSage',
558
+ };
559
+ return prompts.npc[promptMap[npcType]] || prompts.npc.wanderingTraveler;
560
+ }
561
+ /**
562
+ * Talk to an NPC (with retry)
563
+ * Returns result indicating success/failure and whether retries were exhausted
564
+ */
565
+ async talkToNPC(npcType, message, onChunk) {
566
+ const client = this.createNPCClient(npcType);
567
+ try {
568
+ const response = await withRetry(async () => {
569
+ return await client.talk(message);
570
+ }, MAX_RETRIES, (attempt, error) => {
571
+ console.warn(`[AIClient] NPC conversation retry ${attempt}/${MAX_RETRIES}:`, error);
572
+ });
573
+ if (onChunk) {
574
+ for (const char of response) {
575
+ onChunk(char);
576
+ }
577
+ }
578
+ return { success: true, data: response };
579
+ }
580
+ catch (error) {
581
+ console.error('[AIClient] NPC conversation failed after retries:', error);
582
+ // Report exhausted retries for NPC conversation
583
+ Sentry.captureException(error, {
584
+ tags: { operation: 'npc_conversation', fallback: true },
585
+ extra: { npcType },
586
+ });
587
+ return {
588
+ success: false,
589
+ error: error.message || 'NPC conversation failed',
590
+ retriesExhausted: true
591
+ };
592
+ }
593
+ }
594
+ /**
595
+ * Generate content with streaming
596
+ */
597
+ async generateStream(prompt, onChunk, model = MODELS.text.fast) {
598
+ const client = this.getChatClient(model);
599
+ return new Promise((resolve, reject) => {
600
+ client.chatStream(prompt, onChunk, resolve).catch(reject);
601
+ });
602
+ }
603
+ /**
604
+ * Generate combat narration (with retry)
605
+ */
606
+ async generateCombatNarration(playerName, enemyName, weaponName) {
607
+ const prompt = getPrompt('events', 'combatNarration', {
608
+ player: playerName,
609
+ enemy: enemyName,
610
+ weapon: weaponName,
611
+ });
612
+ try {
613
+ return await withRetry(async () => {
614
+ const client = this.getChatClient(MODELS.text.fast);
615
+ return await client.chat(prompt);
616
+ }, MAX_RETRIES, (attempt, error) => {
617
+ console.warn(`[AIClient] Combat narration retry ${attempt}/${MAX_RETRIES}:`, error);
618
+ });
619
+ }
620
+ catch (error) {
621
+ console.error('[AIClient] Combat narration failed after retries:', error);
622
+ // Report exhausted retries for combat narration
623
+ Sentry.captureException(error, {
624
+ tags: { operation: 'combat_narration', fallback: true },
625
+ extra: { playerName, enemyName, weaponName },
626
+ });
627
+ return `${playerName} strikes at ${enemyName}!`;
628
+ }
629
+ }
630
+ /**
631
+ * Fallback weapon name generator
632
+ */
633
+ fallbackWeaponName(affixes) {
634
+ const prefixes = ['Ancient', 'Dark', 'Blazing', 'Frost', 'Shadow'];
635
+ const weapons = ['Blade', 'Sword', 'Edge', 'Saber', 'Fang'];
636
+ const prefix = prefixes[Math.floor(Math.random() * prefixes.length)];
637
+ const weapon = weapons[Math.floor(Math.random() * weapons.length)];
638
+ return `${prefix} ${weapon}`;
639
+ }
640
+ /**
641
+ * Check if AI client is ready
642
+ */
643
+ isReady() {
644
+ return this.initialized && this.isAuthenticated();
645
+ }
646
+ /**
647
+ * Get SDK for direct access if needed
648
+ */
649
+ getSDK() {
650
+ return this.sdk;
651
+ }
652
+ }
653
+ // ============================================================================
654
+ // Singleton & Exports
655
+ // ============================================================================
656
+ let aiClientInstance = null;
657
+ export function getAIClient() {
658
+ if (!aiClientInstance) {
659
+ aiClientInstance = new AIClient();
660
+ }
661
+ return aiClientInstance;
662
+ }
663
+ /**
664
+ * Step 1: Get login URL and info
665
+ */
666
+ export async function initiateLogin() {
667
+ const client = getAIClient();
668
+ return client.initiateLogin();
669
+ }
670
+ /**
671
+ * Step 2: Complete login (poll for auth)
672
+ */
673
+ export async function completeLogin(onStatus) {
674
+ const client = getAIClient();
675
+ return client.completeLogin(onStatus);
676
+ }
677
+ /**
678
+ * Legacy: Initialize AI with player authentication
679
+ */
680
+ export async function initializeAIWithAuth(callbacks) {
681
+ const client = getAIClient();
682
+ await client.initializeWithAuth(callbacks);
683
+ return client;
684
+ }
685
+ /**
686
+ * Try to restore authentication from saved tokens
687
+ * Returns result indicating if auth was restored
688
+ */
689
+ export async function tryRestoreAuth() {
690
+ const client = getAIClient();
691
+ return client.tryRestoreAuth();
692
+ }
693
+ /**
694
+ * Set player nickname
695
+ */
696
+ export async function setNickname(nickname) {
697
+ const client = getAIClient();
698
+ return client.setNickname(nickname);
699
+ }
700
+ /**
701
+ * Get player nickname
702
+ */
703
+ export async function getNickname() {
704
+ const client = getAIClient();
705
+ return client.getNickname();
706
+ }
707
+ /**
708
+ * Logout and clear saved tokens
709
+ */
710
+ export async function logout() {
711
+ const client = getAIClient();
712
+ return client.logout();
713
+ }
714
+ /**
715
+ * Deprecated: No longer supported without auth
716
+ */
717
+ export async function initializeAI() {
718
+ throw new Error('Developer token auth removed. Use initiateLogin() and completeLogin().');
719
+ }
720
+ //# sourceMappingURL=PlayKitClient.js.map
721
+ //# debugId=214c7645-bb1a-54ec-8340-8a4840924497