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.
- package/README.md +171 -0
- package/dist/affix/AffixRegistry.d.ts +68 -0
- package/dist/affix/AffixRegistry.d.ts.map +1 -0
- package/dist/affix/AffixRegistry.js +245 -0
- package/dist/affix/AffixRegistry.js.map +1 -0
- package/dist/affix/PluginLoader.d.ts +66 -0
- package/dist/affix/PluginLoader.d.ts.map +1 -0
- package/dist/affix/PluginLoader.js +321 -0
- package/dist/affix/PluginLoader.js.map +1 -0
- package/dist/affix/builtin.d.ts +6 -0
- package/dist/affix/builtin.d.ts.map +1 -0
- package/dist/affix/builtin.js +311 -0
- package/dist/affix/builtin.js.map +1 -0
- package/dist/affix/index.d.ts +8 -0
- package/dist/affix/index.d.ts.map +1 -0
- package/dist/affix/index.js +11 -0
- package/dist/affix/index.js.map +1 -0
- package/dist/affix/types.d.ts +152 -0
- package/dist/affix/types.d.ts.map +1 -0
- package/dist/affix/types.js +8 -0
- package/dist/affix/types.js.map +1 -0
- package/dist/ai/PlayKitClient.d.ts +208 -0
- package/dist/ai/PlayKitClient.d.ts.map +1 -0
- package/dist/ai/PlayKitClient.js +721 -0
- package/dist/ai/PlayKitClient.js.map +1 -0
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +8 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/app/App.d.ts +85 -0
- package/dist/app/App.d.ts.map +1 -0
- package/dist/app/App.js +296 -0
- package/dist/app/App.js.map +1 -0
- package/dist/app/EventBus.d.ts +222 -0
- package/dist/app/EventBus.d.ts.map +1 -0
- package/dist/app/EventBus.js +88 -0
- package/dist/app/EventBus.js.map +1 -0
- package/dist/app/Keybind.d.ts +83 -0
- package/dist/app/Keybind.d.ts.map +1 -0
- package/dist/app/Keybind.js +184 -0
- package/dist/app/Keybind.js.map +1 -0
- package/dist/app/Router.d.ts +123 -0
- package/dist/app/Router.d.ts.map +1 -0
- package/dist/app/Router.js +142 -0
- package/dist/app/Router.js.map +1 -0
- package/dist/app/ScreenManager.d.ts +97 -0
- package/dist/app/ScreenManager.d.ts.map +1 -0
- package/dist/app/ScreenManager.js +216 -0
- package/dist/app/ScreenManager.js.map +1 -0
- package/dist/app/index.d.ts +14 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +19 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/screens/BaseScreen.d.ts +101 -0
- package/dist/app/screens/BaseScreen.d.ts.map +1 -0
- package/dist/app/screens/BaseScreen.js +132 -0
- package/dist/app/screens/BaseScreen.js.map +1 -0
- package/dist/app/screens/CharacterCreationScreen.d.ts +42 -0
- package/dist/app/screens/CharacterCreationScreen.d.ts.map +1 -0
- package/dist/app/screens/CharacterCreationScreen.js +467 -0
- package/dist/app/screens/CharacterCreationScreen.js.map +1 -0
- package/dist/app/screens/CombatScreen.d.ts +30 -0
- package/dist/app/screens/CombatScreen.d.ts.map +1 -0
- package/dist/app/screens/CombatScreen.js +309 -0
- package/dist/app/screens/CombatScreen.js.map +1 -0
- package/dist/app/screens/DialogScreen.d.ts +29 -0
- package/dist/app/screens/DialogScreen.d.ts.map +1 -0
- package/dist/app/screens/DialogScreen.js +295 -0
- package/dist/app/screens/DialogScreen.js.map +1 -0
- package/dist/app/screens/ExploreScreen.d.ts +50 -0
- package/dist/app/screens/ExploreScreen.d.ts.map +1 -0
- package/dist/app/screens/ExploreScreen.js +308 -0
- package/dist/app/screens/ExploreScreen.js.map +1 -0
- package/dist/app/screens/HelpScreen.d.ts +12 -0
- package/dist/app/screens/HelpScreen.d.ts.map +1 -0
- package/dist/app/screens/HelpScreen.js +155 -0
- package/dist/app/screens/HelpScreen.js.map +1 -0
- package/dist/app/screens/InventoryScreen.d.ts +27 -0
- package/dist/app/screens/InventoryScreen.d.ts.map +1 -0
- package/dist/app/screens/InventoryScreen.js +326 -0
- package/dist/app/screens/InventoryScreen.js.map +1 -0
- package/dist/app/screens/PrologueScreen.d.ts +24 -0
- package/dist/app/screens/PrologueScreen.d.ts.map +1 -0
- package/dist/app/screens/PrologueScreen.js +176 -0
- package/dist/app/screens/PrologueScreen.js.map +1 -0
- package/dist/app/screens/TitleScreen.d.ts +42 -0
- package/dist/app/screens/TitleScreen.d.ts.map +1 -0
- package/dist/app/screens/TitleScreen.js +380 -0
- package/dist/app/screens/TitleScreen.js.map +1 -0
- package/dist/app/screens/TravelScreen.d.ts +22 -0
- package/dist/app/screens/TravelScreen.d.ts.map +1 -0
- package/dist/app/screens/TravelScreen.js +122 -0
- package/dist/app/screens/TravelScreen.js.map +1 -0
- package/dist/app/screens/index.d.ts +14 -0
- package/dist/app/screens/index.d.ts.map +1 -0
- package/dist/app/screens/index.js +17 -0
- package/dist/app/screens/index.js.map +1 -0
- package/dist/commands/CommandRegistry.d.ts +91 -0
- package/dist/commands/CommandRegistry.d.ts.map +1 -0
- package/dist/commands/CommandRegistry.js +159 -0
- package/dist/commands/CommandRegistry.js.map +1 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +10 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/core/Actor.d.ts +103 -0
- package/dist/core/Actor.d.ts.map +1 -0
- package/dist/core/Actor.js +409 -0
- package/dist/core/Actor.js.map +1 -0
- package/dist/core/Combat.d.ts +37 -0
- package/dist/core/Combat.d.ts.map +1 -0
- package/dist/core/Combat.js +294 -0
- package/dist/core/Combat.js.map +1 -0
- package/dist/core/DungeonRunner.d.ts +169 -0
- package/dist/core/DungeonRunner.d.ts.map +1 -0
- package/dist/core/DungeonRunner.js +627 -0
- package/dist/core/DungeonRunner.js.map +1 -0
- package/dist/core/Game.d.ts +133 -0
- package/dist/core/Game.d.ts.map +1 -0
- package/dist/core/Game.js +644 -0
- package/dist/core/Game.js.map +1 -0
- package/dist/core/IdleCombat.d.ts +61 -0
- package/dist/core/IdleCombat.d.ts.map +1 -0
- package/dist/core/IdleCombat.js +461 -0
- package/dist/core/IdleCombat.js.map +1 -0
- package/dist/core/IdleGameManager.d.ts +198 -0
- package/dist/core/IdleGameManager.d.ts.map +1 -0
- package/dist/core/IdleGameManager.js +688 -0
- package/dist/core/IdleGameManager.js.map +1 -0
- package/dist/core/IdleSaveManager.d.ts +109 -0
- package/dist/core/IdleSaveManager.d.ts.map +1 -0
- package/dist/core/IdleSaveManager.js +296 -0
- package/dist/core/IdleSaveManager.js.map +1 -0
- package/dist/core/NewGameFlowManager.d.ts +64 -0
- package/dist/core/NewGameFlowManager.d.ts.map +1 -0
- package/dist/core/NewGameFlowManager.js +153 -0
- package/dist/core/NewGameFlowManager.js.map +1 -0
- package/dist/core/Player.d.ts +65 -0
- package/dist/core/Player.d.ts.map +1 -0
- package/dist/core/Player.js +261 -0
- package/dist/core/Player.js.map +1 -0
- package/dist/core/RoomHandlers.d.ts +75 -0
- package/dist/core/RoomHandlers.d.ts.map +1 -0
- package/dist/core/RoomHandlers.js +383 -0
- package/dist/core/RoomHandlers.js.map +1 -0
- package/dist/core/SaveManager.d.ts +84 -0
- package/dist/core/SaveManager.d.ts.map +1 -0
- package/dist/core/SaveManager.js +281 -0
- package/dist/core/SaveManager.js.map +1 -0
- package/dist/core/SaveMigration.d.ts +69 -0
- package/dist/core/SaveMigration.d.ts.map +1 -0
- package/dist/core/SaveMigration.js +408 -0
- package/dist/core/SaveMigration.js.map +1 -0
- package/dist/core/StateAdapter.d.ts +79 -0
- package/dist/core/StateAdapter.d.ts.map +1 -0
- package/dist/core/StateAdapter.js +397 -0
- package/dist/core/StateAdapter.js.map +1 -0
- package/dist/core/Team.d.ts +145 -0
- package/dist/core/Team.d.ts.map +1 -0
- package/dist/core/Team.js +371 -0
- package/dist/core/Team.js.map +1 -0
- package/dist/core/TeamCombat.d.ts +88 -0
- package/dist/core/TeamCombat.d.ts.map +1 -0
- package/dist/core/TeamCombat.js +405 -0
- package/dist/core/TeamCombat.js.map +1 -0
- package/dist/core/TeamDungeonRunner.d.ts +186 -0
- package/dist/core/TeamDungeonRunner.d.ts.map +1 -0
- package/dist/core/TeamDungeonRunner.js +758 -0
- package/dist/core/TeamDungeonRunner.js.map +1 -0
- package/dist/core/TimeManager.d.ts +114 -0
- package/dist/core/TimeManager.d.ts.map +1 -0
- package/dist/core/TimeManager.js +318 -0
- package/dist/core/TimeManager.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/timeConstants.d.ts +135 -0
- package/dist/core/timeConstants.d.ts.map +1 -0
- package/dist/core/timeConstants.js +157 -0
- package/dist/core/timeConstants.js.map +1 -0
- package/dist/core/types.d.ts +780 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +16 -0
- package/dist/core/types.js.map +1 -0
- package/dist/data/continents/index.d.ts +163 -0
- package/dist/data/continents/index.d.ts.map +1 -0
- package/dist/data/continents/index.js +31 -0
- package/dist/data/continents/index.js.map +1 -0
- package/dist/data/continents/verdantia.d.ts +294 -0
- package/dist/data/continents/verdantia.d.ts.map +1 -0
- package/dist/data/continents/verdantia.js +327 -0
- package/dist/data/continents/verdantia.js.map +1 -0
- package/dist/handlers/DialogHandler.d.ts +95 -0
- package/dist/handlers/DialogHandler.d.ts.map +1 -0
- package/dist/handlers/DialogHandler.js +450 -0
- package/dist/handlers/DialogHandler.js.map +1 -0
- package/dist/handlers/SaveLoadHandler.d.ts +60 -0
- package/dist/handlers/SaveLoadHandler.d.ts.map +1 -0
- package/dist/handlers/SaveLoadHandler.js +187 -0
- package/dist/handlers/SaveLoadHandler.js.map +1 -0
- package/dist/handlers/TitleScreenHandler.d.ts +43 -0
- package/dist/handlers/TitleScreenHandler.d.ts.map +1 -0
- package/dist/handlers/TitleScreenHandler.js +508 -0
- package/dist/handlers/TitleScreenHandler.js.map +1 -0
- package/dist/handlers/WorkshopHandler.d.ts +75 -0
- package/dist/handlers/WorkshopHandler.d.ts.map +1 -0
- package/dist/handlers/WorkshopHandler.js +401 -0
- package/dist/handlers/WorkshopHandler.js.map +1 -0
- package/dist/handlers/index.d.ts +12 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +14 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/types.d.ts +34 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/types.js +8 -0
- package/dist/handlers/types.js.map +1 -0
- package/dist/i18n/en.d.ts +3 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +130 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +40 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +105 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/types.d.ts +133 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/i18n/zh.d.ts +3 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +130 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/instrument.d.ts +8 -0
- package/dist/instrument.d.ts.map +1 -0
- package/dist/instrument.js +33 -0
- package/dist/instrument.js.map +1 -0
- package/dist/main-new.d.ts +12 -0
- package/dist/main-new.d.ts.map +1 -0
- package/dist/main-new.js +32 -0
- package/dist/main-new.js.map +1 -0
- package/dist/main.d.ts +7 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +2816 -0
- package/dist/main.js.map +1 -0
- package/dist/map/ContinentManager.d.ts +88 -0
- package/dist/map/ContinentManager.d.ts.map +1 -0
- package/dist/map/ContinentManager.js +241 -0
- package/dist/map/ContinentManager.js.map +1 -0
- package/dist/map/DungeonGenerator.d.ts +32 -0
- package/dist/map/DungeonGenerator.d.ts.map +1 -0
- package/dist/map/DungeonGenerator.js +615 -0
- package/dist/map/DungeonGenerator.js.map +1 -0
- package/dist/map/MapGenerator.d.ts +27 -0
- package/dist/map/MapGenerator.d.ts.map +1 -0
- package/dist/map/MapGenerator.js +485 -0
- package/dist/map/MapGenerator.js.map +1 -0
- package/dist/map/index.d.ts +5 -0
- package/dist/map/index.d.ts.map +1 -0
- package/dist/map/index.js +8 -0
- package/dist/map/index.js.map +1 -0
- package/dist/npc/NPCGenerator.d.ts +68 -0
- package/dist/npc/NPCGenerator.d.ts.map +1 -0
- package/dist/npc/NPCGenerator.js +468 -0
- package/dist/npc/NPCGenerator.js.map +1 -0
- package/dist/npc/NPCManager.d.ts +86 -0
- package/dist/npc/NPCManager.d.ts.map +1 -0
- package/dist/npc/NPCManager.js +217 -0
- package/dist/npc/NPCManager.js.map +1 -0
- package/dist/npc/fixedNPCs.d.ts +7 -0
- package/dist/npc/fixedNPCs.d.ts.map +1 -0
- package/dist/npc/fixedNPCs.js +196 -0
- package/dist/npc/fixedNPCs.js.map +1 -0
- package/dist/npc/index.d.ts +9 -0
- package/dist/npc/index.d.ts.map +1 -0
- package/dist/npc/index.js +12 -0
- package/dist/npc/index.js.map +1 -0
- package/dist/npc/traits.d.ts +33 -0
- package/dist/npc/traits.d.ts.map +1 -0
- package/dist/npc/traits.js +795 -0
- package/dist/npc/traits.js.map +1 -0
- package/dist/npc/types.d.ts +193 -0
- package/dist/npc/types.d.ts.map +1 -0
- package/dist/npc/types.js +9 -0
- package/dist/npc/types.js.map +1 -0
- package/dist/quest/QuestManager.d.ts +79 -0
- package/dist/quest/QuestManager.d.ts.map +1 -0
- package/dist/quest/QuestManager.js +273 -0
- package/dist/quest/QuestManager.js.map +1 -0
- package/dist/quest/index.d.ts +6 -0
- package/dist/quest/index.d.ts.map +1 -0
- package/dist/quest/index.js +9 -0
- package/dist/quest/index.js.map +1 -0
- package/dist/quest/types.d.ts +81 -0
- package/dist/quest/types.d.ts.map +1 -0
- package/dist/quest/types.js +8 -0
- package/dist/quest/types.js.map +1 -0
- package/dist/strategy/StrategyExecutor.d.ts +159 -0
- package/dist/strategy/StrategyExecutor.d.ts.map +1 -0
- package/dist/strategy/StrategyExecutor.js +479 -0
- package/dist/strategy/StrategyExecutor.js.map +1 -0
- package/dist/strategy/StrategyParser.d.ts +48 -0
- package/dist/strategy/StrategyParser.d.ts.map +1 -0
- package/dist/strategy/StrategyParser.js +321 -0
- package/dist/strategy/StrategyParser.js.map +1 -0
- package/dist/strategy/defaultStrategy.d.ts +40 -0
- package/dist/strategy/defaultStrategy.d.ts.map +1 -0
- package/dist/strategy/defaultStrategy.js +254 -0
- package/dist/strategy/defaultStrategy.js.map +1 -0
- package/dist/strategy/index.d.ts +8 -0
- package/dist/strategy/index.d.ts.map +1 -0
- package/dist/strategy/index.js +14 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/tui/ExploreMenu.d.ts +106 -0
- package/dist/tui/ExploreMenu.d.ts.map +1 -0
- package/dist/tui/ExploreMenu.js +282 -0
- package/dist/tui/ExploreMenu.js.map +1 -0
- package/dist/tui/GameUI.d.ts +313 -0
- package/dist/tui/GameUI.d.ts.map +1 -0
- package/dist/tui/GameUI.js +2116 -0
- package/dist/tui/GameUI.js.map +1 -0
- package/dist/tui/GameUIAdapter.d.ts +207 -0
- package/dist/tui/GameUIAdapter.d.ts.map +1 -0
- package/dist/tui/GameUIAdapter.js +1342 -0
- package/dist/tui/GameUIAdapter.js.map +1 -0
- package/dist/tui/Input.d.ts +139 -0
- package/dist/tui/Input.d.ts.map +1 -0
- package/dist/tui/Input.js +278 -0
- package/dist/tui/Input.js.map +1 -0
- package/dist/tui/Menu.d.ts +110 -0
- package/dist/tui/Menu.d.ts.map +1 -0
- package/dist/tui/Menu.js +365 -0
- package/dist/tui/Menu.js.map +1 -0
- package/dist/tui/Screen.d.ts +228 -0
- package/dist/tui/Screen.d.ts.map +1 -0
- package/dist/tui/Screen.js +502 -0
- package/dist/tui/Screen.js.map +1 -0
- package/dist/tui/components/Box.d.ts +36 -0
- package/dist/tui/components/Box.d.ts.map +1 -0
- package/dist/tui/components/Box.js +43 -0
- package/dist/tui/components/Box.js.map +1 -0
- package/dist/tui/components/List.d.ts +69 -0
- package/dist/tui/components/List.d.ts.map +1 -0
- package/dist/tui/components/List.js +136 -0
- package/dist/tui/components/List.js.map +1 -0
- package/dist/tui/components/ProgressBar.d.ts +42 -0
- package/dist/tui/components/ProgressBar.d.ts.map +1 -0
- package/dist/tui/components/ProgressBar.js +75 -0
- package/dist/tui/components/ProgressBar.js.map +1 -0
- package/dist/tui/components/index.d.ts +8 -0
- package/dist/tui/components/index.d.ts.map +1 -0
- package/dist/tui/components/index.js +11 -0
- package/dist/tui/components/index.js.map +1 -0
- package/dist/tui/core/BaseSection.d.ts +98 -0
- package/dist/tui/core/BaseSection.d.ts.map +1 -0
- package/dist/tui/core/BaseSection.js +174 -0
- package/dist/tui/core/BaseSection.js.map +1 -0
- package/dist/tui/core/Component.d.ts +61 -0
- package/dist/tui/core/Component.d.ts.map +1 -0
- package/dist/tui/core/Component.js +32 -0
- package/dist/tui/core/Component.js.map +1 -0
- package/dist/tui/core/Section.d.ts +101 -0
- package/dist/tui/core/Section.d.ts.map +1 -0
- package/dist/tui/core/Section.js +24 -0
- package/dist/tui/core/Section.js.map +1 -0
- package/dist/tui/core/SectionManager.d.ts +108 -0
- package/dist/tui/core/SectionManager.d.ts.map +1 -0
- package/dist/tui/core/SectionManager.js +258 -0
- package/dist/tui/core/SectionManager.js.map +1 -0
- package/dist/tui/core/index.d.ts +9 -0
- package/dist/tui/core/index.d.ts.map +1 -0
- package/dist/tui/core/index.js +12 -0
- package/dist/tui/core/index.js.map +1 -0
- package/dist/tui/index.d.ts +15 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +23 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/screens/BaseScreen.d.ts +62 -0
- package/dist/tui/screens/BaseScreen.d.ts.map +1 -0
- package/dist/tui/screens/BaseScreen.js +55 -0
- package/dist/tui/screens/BaseScreen.js.map +1 -0
- package/dist/tui/screens/CombatScreen.d.ts +43 -0
- package/dist/tui/screens/CombatScreen.d.ts.map +1 -0
- package/dist/tui/screens/CombatScreen.js +125 -0
- package/dist/tui/screens/CombatScreen.js.map +1 -0
- package/dist/tui/screens/DialogScreen.d.ts +53 -0
- package/dist/tui/screens/DialogScreen.d.ts.map +1 -0
- package/dist/tui/screens/DialogScreen.js +90 -0
- package/dist/tui/screens/DialogScreen.js.map +1 -0
- package/dist/tui/screens/DungeonScreen.d.ts +80 -0
- package/dist/tui/screens/DungeonScreen.d.ts.map +1 -0
- package/dist/tui/screens/DungeonScreen.js +317 -0
- package/dist/tui/screens/DungeonScreen.js.map +1 -0
- package/dist/tui/screens/ExploreScreen.d.ts +69 -0
- package/dist/tui/screens/ExploreScreen.d.ts.map +1 -0
- package/dist/tui/screens/ExploreScreen.js +224 -0
- package/dist/tui/screens/ExploreScreen.js.map +1 -0
- package/dist/tui/screens/SectionScreen.d.ts +84 -0
- package/dist/tui/screens/SectionScreen.d.ts.map +1 -0
- package/dist/tui/screens/SectionScreen.js +156 -0
- package/dist/tui/screens/SectionScreen.js.map +1 -0
- package/dist/tui/screens/TitleScreen.d.ts +40 -0
- package/dist/tui/screens/TitleScreen.d.ts.map +1 -0
- package/dist/tui/screens/TitleScreen.js +253 -0
- package/dist/tui/screens/TitleScreen.js.map +1 -0
- package/dist/tui/screens/TownScreen.d.ts +98 -0
- package/dist/tui/screens/TownScreen.d.ts.map +1 -0
- package/dist/tui/screens/TownScreen.js +370 -0
- package/dist/tui/screens/TownScreen.js.map +1 -0
- package/dist/tui/screens/TravelScreen.d.ts +67 -0
- package/dist/tui/screens/TravelScreen.d.ts.map +1 -0
- package/dist/tui/screens/TravelScreen.js +286 -0
- package/dist/tui/screens/TravelScreen.js.map +1 -0
- package/dist/tui/screens/index.d.ts +8 -0
- package/dist/tui/screens/index.d.ts.map +1 -0
- package/dist/tui/screens/index.js +17 -0
- package/dist/tui/screens/index.js.map +1 -0
- package/dist/tui/sections/ActionsSection.d.ts +71 -0
- package/dist/tui/sections/ActionsSection.d.ts.map +1 -0
- package/dist/tui/sections/ActionsSection.js +184 -0
- package/dist/tui/sections/ActionsSection.js.map +1 -0
- package/dist/tui/sections/DungeonSection.d.ts +65 -0
- package/dist/tui/sections/DungeonSection.d.ts.map +1 -0
- package/dist/tui/sections/DungeonSection.js +144 -0
- package/dist/tui/sections/DungeonSection.js.map +1 -0
- package/dist/tui/sections/EventsSection.d.ts +50 -0
- package/dist/tui/sections/EventsSection.d.ts.map +1 -0
- package/dist/tui/sections/EventsSection.js +134 -0
- package/dist/tui/sections/EventsSection.js.map +1 -0
- package/dist/tui/sections/MapSection.d.ts +66 -0
- package/dist/tui/sections/MapSection.d.ts.map +1 -0
- package/dist/tui/sections/MapSection.js +669 -0
- package/dist/tui/sections/MapSection.js.map +1 -0
- package/dist/tui/sections/StatusSection.d.ts +47 -0
- package/dist/tui/sections/StatusSection.d.ts.map +1 -0
- package/dist/tui/sections/StatusSection.js +133 -0
- package/dist/tui/sections/StatusSection.js.map +1 -0
- package/dist/tui/sections/TeamSection.d.ts +71 -0
- package/dist/tui/sections/TeamSection.d.ts.map +1 -0
- package/dist/tui/sections/TeamSection.js +224 -0
- package/dist/tui/sections/TeamSection.js.map +1 -0
- package/dist/tui/sections/TravelingSection.d.ts +51 -0
- package/dist/tui/sections/TravelingSection.d.ts.map +1 -0
- package/dist/tui/sections/TravelingSection.js +106 -0
- package/dist/tui/sections/TravelingSection.js.map +1 -0
- package/dist/tui/sections/index.d.ts +9 -0
- package/dist/tui/sections/index.d.ts.map +1 -0
- package/dist/tui/sections/index.js +12 -0
- package/dist/tui/sections/index.js.map +1 -0
- package/dist/ui/Terminal.d.ts +68 -0
- package/dist/ui/Terminal.d.ts.map +1 -0
- package/dist/ui/Terminal.js +297 -0
- package/dist/ui/Terminal.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +8 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/utils/configMigration.d.ts +14 -0
- package/dist/utils/configMigration.d.ts.map +1 -0
- package/dist/utils/configMigration.js +92 -0
- package/dist/utils/configMigration.js.map +1 -0
- package/dist/utils/errorHandler.d.ts +86 -0
- package/dist/utils/errorHandler.d.ts.map +1 -0
- package/dist/utils/errorHandler.js +224 -0
- package/dist/utils/errorHandler.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/weapon/WeaponFactory.d.ts +32 -0
- package/dist/weapon/WeaponFactory.d.ts.map +1 -0
- package/dist/weapon/WeaponFactory.js +216 -0
- package/dist/weapon/WeaponFactory.js.map +1 -0
- package/dist/weapon/index.d.ts +5 -0
- package/dist/weapon/index.d.ts.map +1 -0
- package/dist/weapon/index.js +8 -0
- package/dist/weapon/index.js.map +1 -0
- 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
|