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 @@
|
|
|
1
|
+
{"version":3,"file":"PlayKitClient.js","sources":["ai/PlayKitClient.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * PlayKit SDK integration for AI-powered content generation\r\n * Uses Headless Device Auth for terminal authentication\r\n * Supports token persistence for seamless re-authentication\r\n */\r\n\r\nimport { PlayKitSDK } from 'playkit-sdk';\r\nimport { getLanguage, getPrompt, getPrompts } from '../i18n/index.js';\r\nimport type { NPCType } from '../core/types.js';\r\nimport qrcode from 'qrcode-terminal';\r\nimport { readFile, writeFile, mkdir, unlink } from 'fs/promises';\r\nimport { join } from 'path';\r\nimport { homedir } from 'os';\r\nimport { logger } from '../utils/logger.js';\r\nimport { Sentry } from '../instrument.js';\r\n\r\n// ============================================================================\r\n// Game Configuration\r\n// ============================================================================\r\n\r\nconst GAME_ID = 'a976f7ae-8114-4595-a0d3-a005be2997cc';\r\n\r\n// ============================================================================\r\n// Token Persistence\r\n// ============================================================================\r\n\r\n/**\r\n * Stored token data structure\r\n */\r\ninterface StoredTokens {\r\n accessToken: string;\r\n refreshToken?: string;\r\n expiresAt: number; // Unix timestamp in ms\r\n playerName?: string;\r\n}\r\n\r\n/**\r\n * Get the token storage file path\r\n */\r\nfunction getTokenPath(): string {\r\n return join(homedir(), '.idlerpg-terminal', 'auth.json');\r\n}\r\n\r\n/**\r\n * Save tokens to disk\r\n */\r\nasync function saveTokens(tokens: StoredTokens): Promise<void> {\r\n try {\r\n const dir = join(homedir(), '.idlerpg-terminal');\r\n await mkdir(dir, { recursive: true });\r\n await writeFile(getTokenPath(), JSON.stringify(tokens, null, 2), 'utf-8');\r\n } catch (error) {\r\n console.error('[Auth] Failed to save tokens:', error);\r\n }\r\n}\r\n\r\n/**\r\n * Load tokens from disk\r\n */\r\nasync function loadTokens(): Promise<StoredTokens | null> {\r\n try {\r\n const data = await readFile(getTokenPath(), 'utf-8');\r\n return JSON.parse(data) as StoredTokens;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Clear saved tokens\r\n */\r\nasync function clearTokens(): Promise<void> {\r\n try {\r\n await unlink(getTokenPath());\r\n } catch {\r\n // Ignore if file doesn't exist\r\n }\r\n}\r\n\r\n// Available models (configured on playkit.ai)\r\nexport const MODELS = {\r\n text: {\r\n fast: 'gemini-2.5-flash',\r\n balanced: 'deepseek-chat',\r\n smart: 'gpt-4o',\r\n premium: 'claude-sonnet-4.5',\r\n },\r\n image: {\r\n fast: 'flux-1-schnell',\r\n quality: 'Kolors',\r\n },\r\n} as const;\r\n\r\n/**\r\n * Generate QR code as string array for terminal display\r\n */\r\nexport function generateQRCode(url: string): Promise<string> {\r\n return new Promise((resolve) => {\r\n // Use qrcode-terminal to generate QR code\r\n qrcode.generate(url, { small: true }, (qr: string) => {\r\n resolve(qr);\r\n });\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Retry Configuration\r\n// ============================================================================\r\n\r\nconst MAX_RETRIES = 3;\r\nconst RETRY_DELAY_MS = 1000;\r\n\r\n/**\r\n * Retry an async operation with exponential backoff\r\n */\r\nasync function withRetry<T>(\r\n operation: () => Promise<T>,\r\n maxRetries: number = MAX_RETRIES,\r\n onRetry?: (attempt: number, error: unknown) => void\r\n): Promise<T> {\r\n let lastError: unknown;\r\n \r\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n lastError = error;\r\n \r\n if (attempt < maxRetries) {\r\n onRetry?.(attempt, error);\r\n // Exponential backoff: 1s, 2s, 4s...\r\n await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS * Math.pow(2, attempt - 1)));\r\n }\r\n }\r\n }\r\n \r\n throw lastError;\r\n}\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface AIOperationResult<T> {\r\n success: boolean;\r\n data?: T;\r\n error?: string;\r\n retriesExhausted?: boolean;\r\n}\r\n\r\nexport interface AuthCallbacks {\r\n onAuthUrl: (url: string) => void;\r\n onWaiting: () => void;\r\n onStatus: (status: string) => void;\r\n onSuccess: (playerName?: string) => void;\r\n onError: (error: string) => void;\r\n onExpired: () => void;\r\n}\r\n\r\ninterface ChatClient {\r\n chat(message: string): Promise<string>;\r\n chatStream(\r\n message: string,\r\n onChunk: (chunk: string) => void,\r\n onComplete: (fullText: string) => void\r\n ): Promise<void>;\r\n}\r\n\r\ninterface NPCClient {\r\n talk(message: string): Promise<string>;\r\n}\r\n\r\n// ============================================================================\r\n// AI Client\r\n// ============================================================================\r\n\r\nexport interface LoginInfo {\r\n authUrl: string;\r\n sessionId: string;\r\n codeVerifier: string;\r\n expiresIn: number;\r\n}\r\n\r\nexport class AIClient {\r\n private sdk: PlayKitSDK;\r\n private chatClients: Map<string, ChatClient> = new Map();\r\n private npcClients: Map<string, NPCClient> = new Map();\r\n private initialized = false;\r\n private currentLoginInfo: LoginInfo | null = null;\r\n private storedPlayerName: string | null = null;\r\n\r\n constructor() {\r\n // Create SDK - always use device auth flow (no developer token)\r\n this.sdk = new PlayKitSDK({\r\n gameId: GAME_ID,\r\n mode: 'server', // Terminal app, no browser UI\r\n });\r\n }\r\n\r\n /**\r\n * Try to restore authentication from saved tokens\r\n * Returns player name if successful, null if login is needed\r\n */\r\n async tryRestoreAuth(): Promise<{ success: boolean; playerName?: string; needsRefresh?: boolean }> {\r\n // Extended SDK interface for methods that exist but aren't in types\r\n interface ExtendedSDK {\r\n verifyToken(): Promise<{ valid: boolean; userId?: string }>;\r\n canRefreshToken(): boolean;\r\n refreshToken(): Promise<{ accessToken: string; refreshToken?: string; expiresIn: number }>;\r\n }\r\n\r\n try {\r\n const tokens = await loadTokens();\r\n logger.debug('tryRestoreAuth: loaded tokens', { hasTokens: !!tokens, expiresAt: tokens?.expiresAt });\r\n \r\n if (!tokens) {\r\n logger.info('tryRestoreAuth: no saved tokens');\r\n return { success: false };\r\n }\r\n\r\n const now = Date.now();\r\n const isExpired = tokens.expiresAt <= now;\r\n const expiresInMs = tokens.expiresAt - now;\r\n \r\n logger.debug('tryRestoreAuth: token status', { isExpired, expiresInMs, expiresInMinutes: Math.floor(expiresInMs / 60000) });\r\n\r\n // If token is still valid (with 5 min buffer)\r\n if (!isExpired && expiresInMs > 5 * 60 * 1000) {\r\n // Re-create SDK with the saved token\r\n this.sdk = new PlayKitSDK({\r\n gameId: GAME_ID,\r\n mode: 'server',\r\n playerToken: tokens.accessToken,\r\n });\r\n\r\n // Initialize SDK before using any API methods\r\n await this.sdk.initialize();\r\n\r\n // Verify the token by actually calling getPlayerInfo\r\n // This is more reliable than verifyToken which may not exist\r\n try {\r\n logger.debug('tryRestoreAuth: verifying token with getPlayerInfo');\r\n const playerInfo = await this.sdk.getPlayerInfo();\r\n logger.info('tryRestoreAuth: token verified', { userId: playerInfo.userId, nickname: playerInfo.nickname });\r\n \r\n this.initialized = true;\r\n this.storedPlayerName = playerInfo.nickname || tokens.playerName || null;\r\n return { success: true, playerName: playerInfo.nickname || tokens.playerName };\r\n } catch (verifyError) {\r\n const err = verifyError as { code?: string };\r\n logger.warn('tryRestoreAuth: token verification failed', { code: err.code });\r\n \r\n // Token is invalid, clear it and require re-login\r\n await clearTokens();\r\n this.sdk = new PlayKitSDK({\r\n gameId: GAME_ID,\r\n mode: 'server',\r\n });\r\n return { success: false };\r\n }\r\n }\r\n\r\n // Token expired or expiring soon - try to refresh\r\n if (tokens.refreshToken) {\r\n try {\r\n // Create SDK with the access token first\r\n this.sdk = new PlayKitSDK({\r\n gameId: GAME_ID,\r\n mode: 'server',\r\n playerToken: tokens.accessToken,\r\n });\r\n\r\n // Initialize SDK before using any API methods\r\n await this.sdk.initialize();\r\n\r\n const extSdk = this.sdk as unknown as ExtendedSDK;\r\n \r\n // Check if we can refresh\r\n if (extSdk.canRefreshToken()) {\r\n const refreshResult = await extSdk.refreshToken();\r\n \r\n // Save the new tokens\r\n const newTokens: StoredTokens = {\r\n accessToken: refreshResult.accessToken,\r\n refreshToken: refreshResult.refreshToken || tokens.refreshToken,\r\n expiresAt: Date.now() + (refreshResult.expiresIn * 1000),\r\n playerName: tokens.playerName,\r\n };\r\n await saveTokens(newTokens);\r\n \r\n this.initialized = true;\r\n this.storedPlayerName = tokens.playerName || null;\r\n return { success: true, playerName: tokens.playerName, needsRefresh: true };\r\n }\r\n } catch (error) {\r\n console.error('[Auth] Token refresh failed:', error);\r\n // Report token refresh failure\r\n Sentry.captureException(error, {\r\n tags: { operation: 'token_refresh', fallback: true },\r\n });\r\n // Clear invalid tokens\r\n await clearTokens();\r\n }\r\n }\r\n\r\n // Could not restore - need fresh login\r\n // Reset SDK to clean state\r\n this.sdk = new PlayKitSDK({\r\n gameId: GAME_ID,\r\n mode: 'server',\r\n });\r\n return { success: false };\r\n\r\n } catch (error) {\r\n console.error('[Auth] Error restoring auth:', error);\r\n return { success: false };\r\n }\r\n }\r\n\r\n /**\r\n * Get stored player name (if restored from saved auth)\r\n */\r\n getStoredPlayerName(): string | null {\r\n return this.storedPlayerName;\r\n }\r\n\r\n /**\r\n * Step 1: Initiate login - get auth URL and QR code\r\n * Returns login info for display\r\n */\r\n async initiateLogin(): Promise<LoginInfo> {\r\n const { authUrl, sessionId, codeVerifier, expiresIn } = await this.sdk.initiateLogin();\r\n \r\n this.currentLoginInfo = { authUrl, sessionId, codeVerifier, expiresIn };\r\n return this.currentLoginInfo;\r\n }\r\n\r\n /**\r\n * Step 2: Complete login - poll for user to authenticate\r\n */\r\n async completeLogin(\r\n onStatus?: (status: string) => void\r\n ): Promise<{ playerName: string }> {\r\n if (!this.currentLoginInfo) {\r\n throw new Error('Must call initiateLogin first');\r\n }\r\n\r\n const { sessionId, codeVerifier, expiresIn } = this.currentLoginInfo;\r\n\r\n try {\r\n const result = await this.sdk.completeLogin(sessionId, codeVerifier, {\r\n onStatus: (status: string) => {\r\n onStatus?.(status);\r\n },\r\n timeoutMs: expiresIn * 1000,\r\n });\r\n\r\n // Success!\r\n this.initialized = true;\r\n this.currentLoginInfo = null;\r\n \r\n // Get player name from result if available\r\n const playerName = (result as { player_name?: string }).player_name || 'Adventurer';\r\n this.storedPlayerName = playerName;\r\n\r\n // Get tokens from SDK auth state (SDK stores them internally after completeLogin)\r\n // Extended SDK interface for methods that exist but aren't in types\r\n interface ExtendedSDK {\r\n getAuthState(): { \r\n isAuthenticated: boolean; \r\n token: string; \r\n tokenType: string; \r\n expiresAt: number;\r\n refreshToken?: string;\r\n };\r\n getToken(): string | null;\r\n }\r\n \r\n const extSdk = this.sdk as unknown as ExtendedSDK;\r\n \r\n // Try multiple methods to get the token\r\n let authState: { token?: string; expiresAt?: number; refreshToken?: string } | null = null;\r\n try {\r\n authState = extSdk.getAuthState();\r\n } catch {\r\n // getAuthState not available\r\n }\r\n \r\n let sdkToken: string | null = null;\r\n try {\r\n sdkToken = extSdk.getToken();\r\n } catch {\r\n // getToken not available\r\n }\r\n \r\n // Also try to get tokens directly from result (some SDK versions return them directly)\r\n const tokenResult = result as { \r\n access_token?: string; \r\n refresh_token?: string; \r\n expires_in?: number;\r\n };\r\n \r\n // Prefer auth state, fallback to getToken, then result\r\n const accessToken = authState?.token || sdkToken || tokenResult.access_token;\r\n const refreshToken = authState?.refreshToken || tokenResult.refresh_token;\r\n const expiresAt = authState?.expiresAt || (tokenResult.expires_in \r\n ? Date.now() + (tokenResult.expires_in * 1000) \r\n : Date.now() + (24 * 60 * 60 * 1000)); // Default 24h\r\n \r\n if (accessToken) {\r\n const tokens: StoredTokens = {\r\n accessToken,\r\n refreshToken,\r\n expiresAt,\r\n playerName,\r\n };\r\n await saveTokens(tokens);\r\n }\r\n\r\n return { playerName };\r\n\r\n } catch (error: unknown) {\r\n const err = error as { code?: string; message?: string };\r\n \r\n if (err.code === 'ACCESS_DENIED') {\r\n throw new Error('Authorization denied. Please try again.');\r\n } else if (err.code === 'EXPIRED') {\r\n throw new Error('Login session expired. Please try again.');\r\n } else if (err.code === 'CANCELLED') {\r\n throw new Error('Login cancelled.');\r\n } else {\r\n throw new Error(err.message || 'Authentication failed');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Legacy method - Initialize SDK with callbacks (for compatibility)\r\n */\r\n async initializeWithAuth(callbacks: AuthCallbacks): Promise<void> {\r\n if (this.initialized) return;\r\n\r\n try {\r\n const loginInfo = await this.initiateLogin();\r\n \r\n callbacks.onAuthUrl(loginInfo.authUrl);\r\n callbacks.onWaiting();\r\n\r\n const { playerName } = await this.completeLogin((status) => {\r\n callbacks.onStatus(status);\r\n });\r\n\r\n callbacks.onSuccess(playerName);\r\n\r\n } catch (error: unknown) {\r\n const err = error as Error;\r\n if (err.message.includes('expired')) {\r\n callbacks.onExpired();\r\n } else {\r\n callbacks.onError(err.message);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Initialize without auth (for testing only - will fail API calls)\r\n */\r\n async initialize(): Promise<void> {\r\n // This is now a no-op - auth is required\r\n throw new Error('Authentication required. Use initiateLogin() and completeLogin().');\r\n }\r\n\r\n /**\r\n * Cancel ongoing login\r\n */\r\n cancelLogin(): void {\r\n this.sdk.cancelLogin();\r\n }\r\n\r\n /**\r\n * Check if authenticated\r\n */\r\n isAuthenticated(): boolean {\r\n return this.sdk.isAuthenticated();\r\n }\r\n\r\n /**\r\n * Logout\r\n */\r\n async logout(): Promise<void> {\r\n await this.sdk.logout();\r\n await clearTokens();\r\n this.initialized = false;\r\n this.storedPlayerName = null;\r\n }\r\n\r\n /**\r\n * Set player nickname using PlayKit SDK\r\n * Returns the new nickname if successful\r\n */\r\n async setNickname(nickname: string): Promise<{ success: boolean; nickname?: string; error?: string }> {\r\n logger.info('Setting nickname', { nickname });\r\n try {\r\n const result = await this.sdk.setNickname(nickname);\r\n logger.debug('setNickname result', result);\r\n \r\n if (result.success) {\r\n this.storedPlayerName = result.nickname;\r\n \r\n // Update stored tokens with new nickname\r\n const tokens = await loadTokens();\r\n if (tokens) {\r\n tokens.playerName = result.nickname;\r\n await saveTokens(tokens);\r\n }\r\n \r\n logger.info('Nickname set successfully', { nickname: result.nickname });\r\n return { success: true, nickname: result.nickname };\r\n }\r\n logger.warn('setNickname returned success=false');\r\n return { success: false, error: 'Failed to set nickname' };\r\n } catch (error: unknown) {\r\n const err = error as { code?: string; message?: string };\r\n logger.error('setNickname failed', { code: err.code, message: err.message });\r\n \r\n // Handle specific error codes from PlayKit\r\n const errorMessages: Record<string, string> = {\r\n 'INVALID_NICKNAME': 'Nickname format is invalid (1-16 chars, no special symbols)',\r\n 'INVALID_TOKEN_TYPE': 'Cannot set nickname with developer token',\r\n 'GLOBAL_TOKEN_NOT_ALLOWED': 'Requires game-specific player token',\r\n 'MODERATION_FLAGGED': 'Nickname contains inappropriate content',\r\n 'NOT_AUTHENTICATED': 'Not authenticated',\r\n };\r\n \r\n const errorMessage = err.code ? (errorMessages[err.code] || err.message) : (err.message || 'Unknown error');\r\n return { success: false, error: errorMessage };\r\n }\r\n }\r\n\r\n /**\r\n * Get current nickname from PlayKit SDK\r\n * Returns null if no nickname is set (user should be prompted to set one)\r\n */\r\n async getNickname(): Promise<string | null> {\r\n logger.debug('Getting nickname from PlayKit');\r\n try {\r\n const playerInfo = await this.sdk.getPlayerInfo();\r\n logger.debug('getPlayerInfo result', { nickname: playerInfo.nickname, userId: playerInfo.userId });\r\n // Only return the nickname if it's actually set on PlayKit\r\n // Don't fall back to storedPlayerName as that might be a default value\r\n return playerInfo.nickname || null;\r\n } catch (error) {\r\n logger.error('Failed to get player info', error);\r\n // Return null to trigger nickname prompt, don't use stored fallback\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get or create a chat client for a model\r\n */\r\n private getChatClient(model: string): ChatClient {\r\n if (!this.chatClients.has(model)) {\r\n const sdkClient = this.sdk.createChatClient(model);\r\n \r\n // Wrap to match our interface\r\n const client: ChatClient = {\r\n async chat(message: string): Promise<string> {\r\n const response = await sdkClient.chat(message);\r\n // Handle both string and object response types\r\n if (typeof response === 'string') return response;\r\n const respObj = response as { content?: string };\r\n return respObj.content || String(response);\r\n },\r\n async chatStream(\r\n message: string,\r\n onChunk: (chunk: string) => void,\r\n onComplete: (fullText: string) => void\r\n ): Promise<void> {\r\n await sdkClient.chatStream(message, onChunk, onComplete);\r\n },\r\n };\r\n \r\n this.chatClients.set(model, client);\r\n }\r\n return this.chatClients.get(model)!;\r\n }\r\n\r\n /**\r\n * Generate weapon name based on affixes (with retry)\r\n */\r\n async generateWeaponName(affixes: string[]): Promise<string> {\r\n const prompt = getPrompt('weapon', 'generateName', {\r\n affixes: affixes.join(', '),\r\n });\r\n\r\n try {\r\n const result = await withRetry(\r\n async () => {\r\n const client = this.getChatClient(MODELS.text.fast);\r\n const name = await client.chat(prompt);\r\n return name.trim().replace(/['\"]/g, '');\r\n },\r\n MAX_RETRIES,\r\n (attempt, error) => {\r\n console.warn(`[AIClient] Weapon name generation retry ${attempt}/${MAX_RETRIES}:`, error);\r\n }\r\n );\r\n return result;\r\n } catch (error) {\r\n console.error('[AIClient] Failed to generate weapon name after retries:', error);\r\n // Report exhausted retries for weapon name generation\r\n Sentry.captureException(error, {\r\n tags: { operation: 'weapon_name_generation', fallback: true },\r\n extra: { affixes },\r\n });\r\n return this.fallbackWeaponName(affixes);\r\n }\r\n }\r\n\r\n /**\r\n * Generate weapon description (with retry)\r\n */\r\n async generateWeaponDescription(name: string, affixes: string[]): Promise<string> {\r\n const prompt = getPrompt('weapon', 'generateDescription', {\r\n name,\r\n affixes: affixes.join(', '),\r\n });\r\n\r\n try {\r\n return await withRetry(\r\n async () => {\r\n const client = this.getChatClient(MODELS.text.fast);\r\n return await client.chat(prompt);\r\n },\r\n MAX_RETRIES,\r\n (attempt, error) => {\r\n console.warn(`[AIClient] Weapon description retry ${attempt}/${MAX_RETRIES}:`, error);\r\n }\r\n );\r\n } catch (error) {\r\n console.error('[AIClient] Failed to generate weapon description after retries:', error);\r\n // Report exhausted retries for weapon description generation\r\n Sentry.captureException(error, {\r\n tags: { operation: 'weapon_description_generation', fallback: true },\r\n extra: { name, affixes },\r\n });\r\n return `A weapon imbued with ${affixes.join(' and ')}.`;\r\n }\r\n }\r\n\r\n /**\r\n * Generate weapon lore (with retry)\r\n */\r\n async generateWeaponLore(name: string): Promise<string> {\r\n const prompt = getPrompt('weapon', 'generateLore', { name });\r\n\r\n try {\r\n return await withRetry(\r\n async () => {\r\n const client = this.getChatClient(MODELS.text.balanced);\r\n return await client.chat(prompt);\r\n },\r\n MAX_RETRIES,\r\n (attempt, error) => {\r\n console.warn(`[AIClient] Weapon lore retry ${attempt}/${MAX_RETRIES}:`, error);\r\n }\r\n );\r\n } catch (error) {\r\n console.error('[AIClient] Failed to generate weapon lore after retries:', error);\r\n // Report exhausted retries for weapon lore generation\r\n Sentry.captureException(error, {\r\n tags: { operation: 'weapon_lore_generation', fallback: true },\r\n extra: { name },\r\n });\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Create an NPC client with appropriate system prompt\r\n */\r\n createNPCClient(npcType: NPCType, customPrompt?: string): NPCClient {\r\n const key = `${npcType}_${getLanguage()}`;\r\n\r\n if (!this.npcClients.has(key) || customPrompt) {\r\n const systemPrompt = customPrompt || this.getNPCSystemPrompt(npcType);\r\n\r\n const sdkClient = this.sdk.createNPCClient({\r\n systemPrompt,\r\n });\r\n\r\n const client: NPCClient = {\r\n async talk(message: string): Promise<string> {\r\n const response = await sdkClient.talk(message);\r\n // Handle both string and object response types\r\n if (typeof response === 'string') return response;\r\n const respObj = response as { content?: string };\r\n return respObj.content || String(response);\r\n },\r\n };\r\n\r\n this.npcClients.set(key, client);\r\n }\r\n\r\n return this.npcClients.get(key)!;\r\n }\r\n\r\n /**\r\n * Get system prompt for NPC type\r\n */\r\n private getNPCSystemPrompt(npcType: NPCType): string {\r\n const prompts = getPrompts();\r\n\r\n const promptMap: Record<NPCType, keyof typeof prompts.npc> = {\r\n merchant: 'mysteriousMerchant',\r\n sage: 'wiseSage',\r\n guard: 'dungeonGuard',\r\n traveler: 'wanderingTraveler',\r\n blacksmith: 'blacksmith',\r\n quest_giver: 'wiseSage',\r\n };\r\n\r\n return prompts.npc[promptMap[npcType]] || prompts.npc.wanderingTraveler;\r\n }\r\n\r\n /**\r\n * Talk to an NPC (with retry)\r\n * Returns result indicating success/failure and whether retries were exhausted\r\n */\r\n async talkToNPC(\r\n npcType: NPCType,\r\n message: string,\r\n onChunk?: (chunk: string) => void\r\n ): Promise<AIOperationResult<string>> {\r\n const client = this.createNPCClient(npcType);\r\n\r\n try {\r\n const response = await withRetry(\r\n async () => {\r\n return await client.talk(message);\r\n },\r\n MAX_RETRIES,\r\n (attempt, error) => {\r\n console.warn(`[AIClient] NPC conversation retry ${attempt}/${MAX_RETRIES}:`, error);\r\n }\r\n );\r\n \r\n if (onChunk) {\r\n for (const char of response) {\r\n onChunk(char);\r\n }\r\n }\r\n \r\n return { success: true, data: response };\r\n } catch (error) {\r\n console.error('[AIClient] NPC conversation failed after retries:', error);\r\n // Report exhausted retries for NPC conversation\r\n Sentry.captureException(error, {\r\n tags: { operation: 'npc_conversation', fallback: true },\r\n extra: { npcType },\r\n });\r\n return {\r\n success: false,\r\n error: (error as Error).message || 'NPC conversation failed',\r\n retriesExhausted: true\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Generate content with streaming\r\n */\r\n async generateStream(\r\n prompt: string,\r\n onChunk: (chunk: string) => void,\r\n model: string = MODELS.text.fast\r\n ): Promise<string> {\r\n const client = this.getChatClient(model);\r\n \r\n return new Promise((resolve, reject) => {\r\n client.chatStream(prompt, onChunk, resolve).catch(reject);\r\n });\r\n }\r\n\r\n /**\r\n * Generate combat narration (with retry)\r\n */\r\n async generateCombatNarration(\r\n playerName: string,\r\n enemyName: string,\r\n weaponName: string\r\n ): Promise<string> {\r\n const prompt = getPrompt('events', 'combatNarration', {\r\n player: playerName,\r\n enemy: enemyName,\r\n weapon: weaponName,\r\n });\r\n\r\n try {\r\n return await withRetry(\r\n async () => {\r\n const client = this.getChatClient(MODELS.text.fast);\r\n return await client.chat(prompt);\r\n },\r\n MAX_RETRIES,\r\n (attempt, error) => {\r\n console.warn(`[AIClient] Combat narration retry ${attempt}/${MAX_RETRIES}:`, error);\r\n }\r\n );\r\n } catch (error) {\r\n console.error('[AIClient] Combat narration failed after retries:', error);\r\n // Report exhausted retries for combat narration\r\n Sentry.captureException(error, {\r\n tags: { operation: 'combat_narration', fallback: true },\r\n extra: { playerName, enemyName, weaponName },\r\n });\r\n return `${playerName} strikes at ${enemyName}!`;\r\n }\r\n }\r\n\r\n /**\r\n * Fallback weapon name generator\r\n */\r\n private fallbackWeaponName(affixes: string[]): string {\r\n const prefixes = ['Ancient', 'Dark', 'Blazing', 'Frost', 'Shadow'];\r\n const weapons = ['Blade', 'Sword', 'Edge', 'Saber', 'Fang'];\r\n\r\n const prefix = prefixes[Math.floor(Math.random() * prefixes.length)];\r\n const weapon = weapons[Math.floor(Math.random() * weapons.length)];\r\n\r\n return `${prefix} ${weapon}`;\r\n }\r\n\r\n /**\r\n * Check if AI client is ready\r\n */\r\n isReady(): boolean {\r\n return this.initialized && this.isAuthenticated();\r\n }\r\n\r\n /**\r\n * Get SDK for direct access if needed\r\n */\r\n getSDK(): PlayKitSDK {\r\n return this.sdk;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Singleton & Exports\r\n// ============================================================================\r\n\r\nlet aiClientInstance: AIClient | null = null;\r\n\r\nexport function getAIClient(): AIClient {\r\n if (!aiClientInstance) {\r\n aiClientInstance = new AIClient();\r\n }\r\n return aiClientInstance;\r\n}\r\n\r\n/**\r\n * Step 1: Get login URL and info\r\n */\r\nexport async function initiateLogin(): Promise<LoginInfo> {\r\n const client = getAIClient();\r\n return client.initiateLogin();\r\n}\r\n\r\n/**\r\n * Step 2: Complete login (poll for auth)\r\n */\r\nexport async function completeLogin(\r\n onStatus?: (status: string) => void\r\n): Promise<{ playerName: string }> {\r\n const client = getAIClient();\r\n return client.completeLogin(onStatus);\r\n}\r\n\r\n/**\r\n * Legacy: Initialize AI with player authentication\r\n */\r\nexport async function initializeAIWithAuth(callbacks: AuthCallbacks): Promise<AIClient> {\r\n const client = getAIClient();\r\n await client.initializeWithAuth(callbacks);\r\n return client;\r\n}\r\n\r\n/**\r\n * Try to restore authentication from saved tokens\r\n * Returns result indicating if auth was restored\r\n */\r\nexport async function tryRestoreAuth(): Promise<{ success: boolean; playerName?: string; needsRefresh?: boolean }> {\r\n const client = getAIClient();\r\n return client.tryRestoreAuth();\r\n}\r\n\r\n/**\r\n * Set player nickname\r\n */\r\nexport async function setNickname(nickname: string): Promise<{ success: boolean; nickname?: string; error?: string }> {\r\n const client = getAIClient();\r\n return client.setNickname(nickname);\r\n}\r\n\r\n/**\r\n * Get player nickname\r\n */\r\nexport async function getNickname(): Promise<string | null> {\r\n const client = getAIClient();\r\n return client.getNickname();\r\n}\r\n\r\n/**\r\n * Logout and clear saved tokens\r\n */\r\nexport async function logout(): Promise<void> {\r\n const client = getAIClient();\r\n return client.logout();\r\n}\r\n\r\n/**\r\n * Deprecated: No longer supported without auth\r\n */\r\nexport async function initializeAI(): Promise<AIClient> {\r\n throw new Error('Developer token auth removed. Use initiateLogin() and completeLogin().');\r\n}\r\n"],"names":[],"mappings":"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","debug_id":"214c7645-bb1a-54ec-8340-8a4840924497"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["ai/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/ai/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI module exports
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
!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]="7e75db42-bd48-5ef7-beb5-52d9750d9e7a")}catch(e){}}();
|
|
6
|
+
export { AIClient, getAIClient, initializeAI, MODELS } from './PlayKitClient.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
8
|
+
//# debugId=7e75db42-bd48-5ef7-beb5-52d9750d9e7a
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["ai/index.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * AI module exports\r\n */\r\n\r\nexport { AIClient, getAIClient, initializeAI, MODELS } from './PlayKitClient.js';\r\n"],"names":[],"mappings":"AAAA;;GAEG;;;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC","debug_id":"7e75db42-bd48-5ef7-beb5-52d9750d9e7a"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App - Main application orchestrator
|
|
3
|
+
* Connects all systems together
|
|
4
|
+
*/
|
|
5
|
+
import { Game } from '../core/Game.js';
|
|
6
|
+
/**
|
|
7
|
+
* Application state
|
|
8
|
+
*/
|
|
9
|
+
interface AppState {
|
|
10
|
+
isRunning: boolean;
|
|
11
|
+
game: Game | null;
|
|
12
|
+
playerName: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Main App class
|
|
16
|
+
*/
|
|
17
|
+
export declare class App {
|
|
18
|
+
private state;
|
|
19
|
+
private router;
|
|
20
|
+
private bus;
|
|
21
|
+
private screenManager;
|
|
22
|
+
private screen;
|
|
23
|
+
private input;
|
|
24
|
+
private npcManager;
|
|
25
|
+
private questManager;
|
|
26
|
+
/**
|
|
27
|
+
* Start the application
|
|
28
|
+
*/
|
|
29
|
+
start(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Ensure terminal meets minimum size
|
|
32
|
+
*/
|
|
33
|
+
private ensureMinimumSize;
|
|
34
|
+
/**
|
|
35
|
+
* Setup event handlers
|
|
36
|
+
*/
|
|
37
|
+
private setupEventHandlers;
|
|
38
|
+
/**
|
|
39
|
+
* Handle route changes
|
|
40
|
+
*/
|
|
41
|
+
private handleRouteChange;
|
|
42
|
+
/**
|
|
43
|
+
* Update explore screen with current game state
|
|
44
|
+
*/
|
|
45
|
+
private updateExploreScreen;
|
|
46
|
+
/**
|
|
47
|
+
* Setup dialog screen with NPC
|
|
48
|
+
*/
|
|
49
|
+
private setupDialogScreen;
|
|
50
|
+
/**
|
|
51
|
+
* Handle travel to room
|
|
52
|
+
*/
|
|
53
|
+
private handleTravel;
|
|
54
|
+
/**
|
|
55
|
+
* Register global keybinds
|
|
56
|
+
*/
|
|
57
|
+
private registerKeybinds;
|
|
58
|
+
/**
|
|
59
|
+
* Initialize AI and get player name
|
|
60
|
+
*/
|
|
61
|
+
private initializeAndGetPlayerName;
|
|
62
|
+
/**
|
|
63
|
+
* Start the game
|
|
64
|
+
*/
|
|
65
|
+
private startGame;
|
|
66
|
+
/**
|
|
67
|
+
* Stop the application
|
|
68
|
+
*/
|
|
69
|
+
stop(): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Handle fatal errors
|
|
72
|
+
*/
|
|
73
|
+
private handleFatalError;
|
|
74
|
+
/**
|
|
75
|
+
* Get game instance
|
|
76
|
+
*/
|
|
77
|
+
getGame(): Game | null;
|
|
78
|
+
/**
|
|
79
|
+
* Get app state
|
|
80
|
+
*/
|
|
81
|
+
getState(): Readonly<AppState>;
|
|
82
|
+
}
|
|
83
|
+
export declare function getApp(): App;
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=App.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"/","sources":["app/App.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAQvC;;GAEG;AACH,UAAU,QAAQ;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,GAAG;IACd,OAAO,CAAC,KAAK,CAIX;IAEF,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,YAAY,CAAqB;IAEzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC5B;;OAEG;YACW,iBAAiB;IAqB/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsD1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoCxB;;OAEG;YACW,0BAA0B;IAUxC;;OAEG;YACW,SAAS;IAkBvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,OAAO,IAAI,IAAI,GAAG,IAAI;IAItB;;OAEG;IACH,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;CAG/B;AAKD,wBAAgB,MAAM,IAAI,GAAG,CAK5B"}
|
package/dist/app/App.js
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App - Main application orchestrator
|
|
3
|
+
* Connects all systems together
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
!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]="9193af86-567a-5e90-a3aa-d9eaa26e0e24")}catch(e){}}();
|
|
7
|
+
import * as Sentry from '@sentry/node';
|
|
8
|
+
import { getRouter } from './Router.js';
|
|
9
|
+
import { getEventBus } from './EventBus.js';
|
|
10
|
+
import { getScreenManager } from './ScreenManager.js';
|
|
11
|
+
import { getKeybindManager } from './Keybind.js';
|
|
12
|
+
import { getScreen } from '../tui/Screen.js';
|
|
13
|
+
import { getInput } from '../tui/Input.js';
|
|
14
|
+
import { Game } from '../core/Game.js';
|
|
15
|
+
import { getNPCManager } from '../npc/NPCManager.js';
|
|
16
|
+
import { getQuestManager } from '../quest/QuestManager.js';
|
|
17
|
+
import { initializeAI } from '../ai/PlayKitClient.js';
|
|
18
|
+
/**
|
|
19
|
+
* Main App class
|
|
20
|
+
*/
|
|
21
|
+
export class App {
|
|
22
|
+
state = {
|
|
23
|
+
isRunning: false,
|
|
24
|
+
game: null,
|
|
25
|
+
playerName: '',
|
|
26
|
+
};
|
|
27
|
+
router = getRouter();
|
|
28
|
+
bus = getEventBus();
|
|
29
|
+
screenManager = getScreenManager();
|
|
30
|
+
screen = getScreen();
|
|
31
|
+
input = getInput();
|
|
32
|
+
npcManager = getNPCManager();
|
|
33
|
+
questManager = getQuestManager();
|
|
34
|
+
/**
|
|
35
|
+
* Start the application
|
|
36
|
+
*/
|
|
37
|
+
async start() {
|
|
38
|
+
if (this.state.isRunning)
|
|
39
|
+
return;
|
|
40
|
+
this.state.isRunning = true;
|
|
41
|
+
try {
|
|
42
|
+
// Check terminal size
|
|
43
|
+
await this.ensureMinimumSize();
|
|
44
|
+
// Setup event handlers
|
|
45
|
+
this.setupEventHandlers();
|
|
46
|
+
// Register keybinds
|
|
47
|
+
this.registerKeybinds();
|
|
48
|
+
// Start screen manager
|
|
49
|
+
await this.screenManager.start();
|
|
50
|
+
// Initialize AI and get player name
|
|
51
|
+
const playerName = await this.initializeAndGetPlayerName();
|
|
52
|
+
this.state.playerName = playerName;
|
|
53
|
+
// Create and start game
|
|
54
|
+
await this.startGame(playerName);
|
|
55
|
+
// Navigate to explore
|
|
56
|
+
this.router.navigate({ type: 'explore' });
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
this.handleFatalError(error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Ensure terminal meets minimum size
|
|
64
|
+
*/
|
|
65
|
+
async ensureMinimumSize() {
|
|
66
|
+
const check = this.screen.checkMinimumSize();
|
|
67
|
+
if (check.valid)
|
|
68
|
+
return;
|
|
69
|
+
this.screen.renderSizeWarning();
|
|
70
|
+
return new Promise((resolve) => {
|
|
71
|
+
const checkSize = () => {
|
|
72
|
+
const newCheck = this.screen.checkMinimumSize();
|
|
73
|
+
if (newCheck.valid) {
|
|
74
|
+
this.screen.clear();
|
|
75
|
+
this.screen.forceRedraw();
|
|
76
|
+
resolve();
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
this.screen.renderSizeWarning();
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
this.screen.onResize(checkSize);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Setup event handlers
|
|
87
|
+
*/
|
|
88
|
+
setupEventHandlers() {
|
|
89
|
+
// Player movement
|
|
90
|
+
this.bus.subscribe('player:move', async ({ roomId }) => {
|
|
91
|
+
if (!this.state.game)
|
|
92
|
+
return;
|
|
93
|
+
const success = this.state.game.travelTo(roomId);
|
|
94
|
+
if (success) {
|
|
95
|
+
this.updateExploreScreen();
|
|
96
|
+
const gameState = this.state.game.getState();
|
|
97
|
+
if (gameState?.currentRoom) {
|
|
98
|
+
this.bus.log(`Moved to ${gameState.currentRoom.name}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
// Combat events
|
|
103
|
+
this.bus.subscribe('combat:end', ({ victory }) => {
|
|
104
|
+
if (victory) {
|
|
105
|
+
this.bus.toast('Victory!', 'success');
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this.bus.toast('Defeated...', 'error');
|
|
109
|
+
}
|
|
110
|
+
this.router.navigate({ type: 'explore' });
|
|
111
|
+
});
|
|
112
|
+
// UI events
|
|
113
|
+
this.bus.subscribe('ui:toast', ({ message, type }) => {
|
|
114
|
+
// Toasts are handled by screens
|
|
115
|
+
console.log(`[${type}] ${message}`);
|
|
116
|
+
});
|
|
117
|
+
this.bus.subscribe('ui:log', ({ message }) => {
|
|
118
|
+
const exploreScreen = this.screenManager.getScreen('explore');
|
|
119
|
+
if (exploreScreen) {
|
|
120
|
+
exploreScreen.addEvent(message);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
// Travel events
|
|
124
|
+
this.bus.subscribe('travel:complete', ({ roomId }) => {
|
|
125
|
+
this.bus.dispatch('player:move', { roomId });
|
|
126
|
+
});
|
|
127
|
+
// System events
|
|
128
|
+
this.bus.subscribe('system:error', ({ error }) => {
|
|
129
|
+
console.error('System error:', error);
|
|
130
|
+
});
|
|
131
|
+
// Router navigation handling
|
|
132
|
+
this.router.onNavigate((route, prev) => {
|
|
133
|
+
this.handleRouteChange(route, prev);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Handle route changes
|
|
138
|
+
*/
|
|
139
|
+
handleRouteChange(route, prev) {
|
|
140
|
+
// Update keybind context
|
|
141
|
+
const keybinds = getKeybindManager();
|
|
142
|
+
keybinds.pushContext(route.type);
|
|
143
|
+
// Special handling for certain routes
|
|
144
|
+
switch (route.type) {
|
|
145
|
+
case 'explore':
|
|
146
|
+
this.updateExploreScreen();
|
|
147
|
+
break;
|
|
148
|
+
case 'dialog':
|
|
149
|
+
this.setupDialogScreen(route.npcId);
|
|
150
|
+
break;
|
|
151
|
+
case 'travel':
|
|
152
|
+
this.handleTravel(route.targetRoomId);
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Update explore screen with current game state
|
|
158
|
+
*/
|
|
159
|
+
updateExploreScreen() {
|
|
160
|
+
if (!this.state.game)
|
|
161
|
+
return;
|
|
162
|
+
const exploreScreen = this.screenManager.getScreen('explore');
|
|
163
|
+
if (!exploreScreen)
|
|
164
|
+
return;
|
|
165
|
+
const gameState = this.state.game.getState();
|
|
166
|
+
if (!gameState)
|
|
167
|
+
return;
|
|
168
|
+
const npcs = this.npcManager.getByRoom(gameState.currentRoom.id);
|
|
169
|
+
const quests = this.questManager.getActiveQuests();
|
|
170
|
+
exploreScreen.updateState(gameState, npcs, quests);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Setup dialog screen with NPC
|
|
174
|
+
*/
|
|
175
|
+
setupDialogScreen(npcId) {
|
|
176
|
+
const npc = this.npcManager.get(npcId);
|
|
177
|
+
if (!npc) {
|
|
178
|
+
this.router.back();
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// Dialog screen is already created, just need to pass params
|
|
182
|
+
// The ScreenManager handles passing params through onEnter
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Handle travel to room
|
|
186
|
+
*/
|
|
187
|
+
handleTravel(targetRoomId) {
|
|
188
|
+
// For now, instant travel
|
|
189
|
+
// TODO: Implement travel animation/events
|
|
190
|
+
this.bus.dispatch('player:move', { roomId: targetRoomId });
|
|
191
|
+
this.router.navigate({ type: 'explore' });
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Register global keybinds
|
|
195
|
+
*/
|
|
196
|
+
registerKeybinds() {
|
|
197
|
+
const keybinds = getKeybindManager();
|
|
198
|
+
keybinds.register({
|
|
199
|
+
id: 'inventory',
|
|
200
|
+
name: 'Inventory',
|
|
201
|
+
keybind: { key: 'i' },
|
|
202
|
+
global: true,
|
|
203
|
+
action: () => this.router.navigate({ type: 'inventory' }),
|
|
204
|
+
});
|
|
205
|
+
keybinds.register({
|
|
206
|
+
id: 'help',
|
|
207
|
+
name: 'Help',
|
|
208
|
+
keybind: { key: 'h' },
|
|
209
|
+
global: true,
|
|
210
|
+
action: () => this.router.navigate({ type: 'help' }),
|
|
211
|
+
});
|
|
212
|
+
keybinds.register({
|
|
213
|
+
id: 'save',
|
|
214
|
+
name: 'Save Game',
|
|
215
|
+
keybind: { key: 's', ctrl: true },
|
|
216
|
+
global: true,
|
|
217
|
+
action: () => this.router.navigate({ type: 'save' }),
|
|
218
|
+
});
|
|
219
|
+
keybinds.register({
|
|
220
|
+
id: 'quit',
|
|
221
|
+
name: 'Quit',
|
|
222
|
+
keybind: { key: 'c', ctrl: true },
|
|
223
|
+
global: true,
|
|
224
|
+
action: () => this.stop(),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Initialize AI and get player name
|
|
229
|
+
*/
|
|
230
|
+
async initializeAndGetPlayerName() {
|
|
231
|
+
const titleScreen = this.screenManager.getScreen('title');
|
|
232
|
+
// Initialize AI - TitleScreen handles its own status display
|
|
233
|
+
await initializeAI();
|
|
234
|
+
// Wait for name input (TitleScreen handles the login flow internally)
|
|
235
|
+
return await titleScreen.waitForName();
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Start the game
|
|
239
|
+
*/
|
|
240
|
+
async startGame(playerName) {
|
|
241
|
+
this.state.game = new Game({
|
|
242
|
+
language: 'en',
|
|
243
|
+
autoSave: true,
|
|
244
|
+
autoSaveInterval: 60,
|
|
245
|
+
combatSpeed: 1,
|
|
246
|
+
soundEnabled: false,
|
|
247
|
+
});
|
|
248
|
+
await this.state.game.initialize(playerName);
|
|
249
|
+
// NPCManager initializes fixed NPCs in its constructor
|
|
250
|
+
// No additional initialization needed here
|
|
251
|
+
// Log welcome
|
|
252
|
+
this.bus.log(`Welcome, ${playerName}! Your adventure begins...`);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Stop the application
|
|
256
|
+
*/
|
|
257
|
+
async stop() {
|
|
258
|
+
this.state.isRunning = false;
|
|
259
|
+
await this.screenManager.cleanup();
|
|
260
|
+
process.exit(0);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Handle fatal errors
|
|
264
|
+
*/
|
|
265
|
+
handleFatalError(error) {
|
|
266
|
+
console.error('Fatal error:', error);
|
|
267
|
+
Sentry.captureException(error);
|
|
268
|
+
Sentry.flush(2000).finally(() => {
|
|
269
|
+
this.screenManager.cleanup().finally(() => {
|
|
270
|
+
process.exit(1);
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get game instance
|
|
276
|
+
*/
|
|
277
|
+
getGame() {
|
|
278
|
+
return this.state.game;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get app state
|
|
282
|
+
*/
|
|
283
|
+
getState() {
|
|
284
|
+
return this.state;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Singleton
|
|
288
|
+
let appInstance = null;
|
|
289
|
+
export function getApp() {
|
|
290
|
+
if (!appInstance) {
|
|
291
|
+
appInstance = new App();
|
|
292
|
+
}
|
|
293
|
+
return appInstance;
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=App.js.map
|
|
296
|
+
//# debugId=9193af86-567a-5e90-a3aa-d9eaa26e0e24
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sources":["app/App.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * App - Main application orchestrator\r\n * Connects all systems together\r\n */\r\n\r\nimport * as Sentry from '@sentry/node';\r\nimport { getRouter, type RouteType } from './Router.js';\r\nimport { getEventBus, type GameEvents } from './EventBus.js';\r\nimport { getScreenManager } from './ScreenManager.js';\r\nimport { getKeybindManager } from './Keybind.js';\r\nimport { getScreen, MIN_TERMINAL_SIZE } from '../tui/Screen.js';\r\nimport { getInput } from '../tui/Input.js';\r\nimport { Game } from '../core/Game.js';\r\nimport { getNPCManager } from '../npc/NPCManager.js';\r\nimport { getQuestManager } from '../quest/QuestManager.js';\r\nimport { initializeAI, getAIClient } from '../ai/PlayKitClient.js';\r\nimport type { TitleScreen } from './screens/TitleScreen.js';\r\nimport type { ExploreScreen } from './screens/ExploreScreen.js';\r\nimport type { DialogScreen } from './screens/DialogScreen.js';\r\n\r\n/**\r\n * Application state\r\n */\r\ninterface AppState {\r\n isRunning: boolean;\r\n game: Game | null;\r\n playerName: string;\r\n}\r\n\r\n/**\r\n * Main App class\r\n */\r\nexport class App {\r\n private state: AppState = {\r\n isRunning: false,\r\n game: null,\r\n playerName: '',\r\n };\r\n\r\n private router = getRouter();\r\n private bus = getEventBus();\r\n private screenManager = getScreenManager();\r\n private screen = getScreen();\r\n private input = getInput();\r\n private npcManager = getNPCManager();\r\n private questManager = getQuestManager();\r\n\r\n /**\r\n * Start the application\r\n */\r\n async start(): Promise<void> {\r\n if (this.state.isRunning) return;\r\n this.state.isRunning = true;\r\n\r\n try {\r\n // Check terminal size\r\n await this.ensureMinimumSize();\r\n\r\n // Setup event handlers\r\n this.setupEventHandlers();\r\n\r\n // Register keybinds\r\n this.registerKeybinds();\r\n\r\n // Start screen manager\r\n await this.screenManager.start();\r\n\r\n // Initialize AI and get player name\r\n const playerName = await this.initializeAndGetPlayerName();\r\n this.state.playerName = playerName;\r\n\r\n // Create and start game\r\n await this.startGame(playerName);\r\n\r\n // Navigate to explore\r\n this.router.navigate({ type: 'explore' });\r\n\r\n } catch (error) {\r\n this.handleFatalError(error as Error);\r\n }\r\n }\r\n\r\n /**\r\n * Ensure terminal meets minimum size\r\n */\r\n private async ensureMinimumSize(): Promise<void> {\r\n const check = this.screen.checkMinimumSize();\r\n if (check.valid) return;\r\n\r\n this.screen.renderSizeWarning();\r\n\r\n return new Promise((resolve) => {\r\n const checkSize = () => {\r\n const newCheck = this.screen.checkMinimumSize();\r\n if (newCheck.valid) {\r\n this.screen.clear();\r\n this.screen.forceRedraw();\r\n resolve();\r\n } else {\r\n this.screen.renderSizeWarning();\r\n }\r\n };\r\n this.screen.onResize(checkSize);\r\n });\r\n }\r\n\r\n /**\r\n * Setup event handlers\r\n */\r\n private setupEventHandlers(): void {\r\n // Player movement\r\n this.bus.subscribe('player:move', async ({ roomId }) => {\r\n if (!this.state.game) return;\r\n\r\n const success = this.state.game.travelTo(roomId);\r\n if (success) {\r\n this.updateExploreScreen();\r\n const gameState = this.state.game.getState();\r\n if (gameState?.currentRoom) {\r\n this.bus.log(`Moved to ${gameState.currentRoom.name}`);\r\n }\r\n }\r\n });\r\n\r\n // Combat events\r\n this.bus.subscribe('combat:end', ({ victory }) => {\r\n if (victory) {\r\n this.bus.toast('Victory!', 'success');\r\n } else {\r\n this.bus.toast('Defeated...', 'error');\r\n }\r\n this.router.navigate({ type: 'explore' });\r\n });\r\n\r\n // UI events\r\n this.bus.subscribe('ui:toast', ({ message, type }) => {\r\n // Toasts are handled by screens\r\n console.log(`[${type}] ${message}`);\r\n });\r\n\r\n this.bus.subscribe('ui:log', ({ message }) => {\r\n const exploreScreen = this.screenManager.getScreen('explore');\r\n if (exploreScreen) {\r\n exploreScreen.addEvent(message);\r\n }\r\n });\r\n\r\n // Travel events\r\n this.bus.subscribe('travel:complete', ({ roomId }) => {\r\n this.bus.dispatch('player:move', { roomId });\r\n });\r\n\r\n // System events\r\n this.bus.subscribe('system:error', ({ error }) => {\r\n console.error('System error:', error);\r\n });\r\n\r\n // Router navigation handling\r\n this.router.onNavigate((route, prev) => {\r\n this.handleRouteChange(route, prev);\r\n });\r\n }\r\n\r\n /**\r\n * Handle route changes\r\n */\r\n private handleRouteChange(route: RouteType, prev: RouteType | null): void {\r\n // Update keybind context\r\n const keybinds = getKeybindManager();\r\n keybinds.pushContext(route.type);\r\n\r\n // Special handling for certain routes\r\n switch (route.type) {\r\n case 'explore':\r\n this.updateExploreScreen();\r\n break;\r\n case 'dialog':\r\n this.setupDialogScreen(route.npcId);\r\n break;\r\n case 'travel':\r\n this.handleTravel(route.targetRoomId);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Update explore screen with current game state\r\n */\r\n private updateExploreScreen(): void {\r\n if (!this.state.game) return;\r\n\r\n const exploreScreen = this.screenManager.getScreen('explore');\r\n if (!exploreScreen) return;\r\n\r\n const gameState = this.state.game.getState();\r\n if (!gameState) return;\r\n\r\n const npcs = this.npcManager.getByRoom(gameState.currentRoom.id);\r\n const quests = this.questManager.getActiveQuests();\r\n\r\n exploreScreen.updateState(gameState, npcs, quests);\r\n }\r\n\r\n /**\r\n * Setup dialog screen with NPC\r\n */\r\n private setupDialogScreen(npcId: string): void {\r\n const npc = this.npcManager.get(npcId);\r\n if (!npc) {\r\n this.router.back();\r\n return;\r\n }\r\n\r\n // Dialog screen is already created, just need to pass params\r\n // The ScreenManager handles passing params through onEnter\r\n }\r\n\r\n /**\r\n * Handle travel to room\r\n */\r\n private handleTravel(targetRoomId: string): void {\r\n // For now, instant travel\r\n // TODO: Implement travel animation/events\r\n this.bus.dispatch('player:move', { roomId: targetRoomId });\r\n this.router.navigate({ type: 'explore' });\r\n }\r\n\r\n /**\r\n * Register global keybinds\r\n */\r\n private registerKeybinds(): void {\r\n const keybinds = getKeybindManager();\r\n\r\n keybinds.register({\r\n id: 'inventory',\r\n name: 'Inventory',\r\n keybind: { key: 'i' },\r\n global: true,\r\n action: () => this.router.navigate({ type: 'inventory' }),\r\n });\r\n\r\n keybinds.register({\r\n id: 'help',\r\n name: 'Help',\r\n keybind: { key: 'h' },\r\n global: true,\r\n action: () => this.router.navigate({ type: 'help' }),\r\n });\r\n\r\n keybinds.register({\r\n id: 'save',\r\n name: 'Save Game',\r\n keybind: { key: 's', ctrl: true },\r\n global: true,\r\n action: () => this.router.navigate({ type: 'save' }),\r\n });\r\n\r\n keybinds.register({\r\n id: 'quit',\r\n name: 'Quit',\r\n keybind: { key: 'c', ctrl: true },\r\n global: true,\r\n action: () => this.stop(),\r\n });\r\n }\r\n\r\n /**\r\n * Initialize AI and get player name\r\n */\r\n private async initializeAndGetPlayerName(): Promise<string> {\r\n const titleScreen = this.screenManager.getScreen('title') as TitleScreen;\r\n\r\n // Initialize AI - TitleScreen handles its own status display\r\n await initializeAI();\r\n\r\n // Wait for name input (TitleScreen handles the login flow internally)\r\n return await titleScreen.waitForName();\r\n }\r\n\r\n /**\r\n * Start the game\r\n */\r\n private async startGame(playerName: string): Promise<void> {\r\n this.state.game = new Game({\r\n language: 'en',\r\n autoSave: true,\r\n autoSaveInterval: 60,\r\n combatSpeed: 1,\r\n soundEnabled: false,\r\n });\r\n\r\n await this.state.game.initialize(playerName);\r\n\r\n // NPCManager initializes fixed NPCs in its constructor\r\n // No additional initialization needed here\r\n\r\n // Log welcome\r\n this.bus.log(`Welcome, ${playerName}! Your adventure begins...`);\r\n }\r\n\r\n /**\r\n * Stop the application\r\n */\r\n async stop(): Promise<void> {\r\n this.state.isRunning = false;\r\n await this.screenManager.cleanup();\r\n process.exit(0);\r\n }\r\n\r\n /**\r\n * Handle fatal errors\r\n */\r\n private handleFatalError(error: Error): void {\r\n console.error('Fatal error:', error);\r\n Sentry.captureException(error);\r\n Sentry.flush(2000).finally(() => {\r\n this.screenManager.cleanup().finally(() => {\r\n process.exit(1);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get game instance\r\n */\r\n getGame(): Game | null {\r\n return this.state.game;\r\n }\r\n\r\n /**\r\n * Get app state\r\n */\r\n getState(): Readonly<AppState> {\r\n return this.state;\r\n }\r\n}\r\n\r\n// Singleton\r\nlet appInstance: App | null = null;\r\n\r\nexport function getApp(): App {\r\n if (!appInstance) {\r\n appInstance = new App();\r\n }\r\n return appInstance;\r\n}\r\n"],"names":[],"mappings":"AAAA;;;GAGG;;;AAEH,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,WAAW,EAAmB,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,SAAS,EAAqB,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAe,MAAM,wBAAwB,CAAC;AAcnE;;GAEG;AACH,MAAM,OAAO,GAAG;IACN,KAAK,GAAa;QACxB,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,EAAE;KACf,CAAC;IAEM,MAAM,GAAG,SAAS,EAAE,CAAC;IACrB,GAAG,GAAG,WAAW,EAAE,CAAC;IACpB,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,GAAG,SAAS,EAAE,CAAC;IACrB,KAAK,GAAG,QAAQ,EAAE,CAAC;IACnB,UAAU,GAAG,aAAa,EAAE,CAAC;IAC7B,YAAY,GAAG,eAAe,EAAE,CAAC;IAEzC;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,OAAO;QACjC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QAE5B,IAAI,CAAC;YACH,sBAAsB;YACtB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAE/B,uBAAuB;YACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE1B,oBAAoB;YACpB,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAExB,uBAAuB;YACvB,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YAEjC,oCAAoC;YACpC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAC3D,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;YAEnC,wBAAwB;YACxB,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAEjC,sBAAsB;YACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAE5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,gBAAgB,CAAC,KAAc,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7C,IAAI,KAAK,CAAC,KAAK;YAAE,OAAO;QAExB,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAEhC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,SAAS,GAAG,GAAG,EAAE;gBACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAChD,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACnB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACpB,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC1B,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBAClC,CAAC;YACH,CAAC,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,kBAAkB;QACxB,kBAAkB;QAClB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACrD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO;YAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7C,IAAI,SAAS,EAAE,WAAW,EAAE,CAAC;oBAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YAC/C,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,YAAY;QACZ,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;YACnD,gCAAgC;YAChC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC9D,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;YACnD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YAC/C,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACrC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAgB,EAAE,IAAsB;QAChE,yBAAyB;QACzB,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QACrC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEjC,sCAAsC;QACtC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS;gBACZ,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACpC,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACtC,MAAM;QACV,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;YAAE,OAAO;QAE7B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;QAEnD,aAAa,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAa;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,6DAA6D;QAC7D,2DAA2D;IAC7D,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,YAAoB;QACvC,0BAA0B;QAC1B,0CAA0C;QAC1C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QAErC,QAAQ,CAAC,QAAQ,CAAC;YAChB,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;YACrB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SAC1D,CAAC,CAAC;QAEH,QAAQ,CAAC,QAAQ,CAAC;YAChB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;YACrB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACrD,CAAC,CAAC;QAEH,QAAQ,CAAC,QAAQ,CAAC;YAChB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;YACjC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACrD,CAAC,CAAC;QAEH,QAAQ,CAAC,QAAQ,CAAC;YAChB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;YACjC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;SAC1B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,0BAA0B;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAgB,CAAC;QAEzE,6DAA6D;QAC7D,MAAM,YAAY,EAAE,CAAC;QAErB,sEAAsE;QACtE,OAAO,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS,CAAC,UAAkB;QACxC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;YACzB,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,EAAE;YACpB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAE7C,uDAAuD;QACvD,2CAA2C;QAE3C,cAAc;QACd,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,UAAU,4BAA4B,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;QAC7B,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,KAAY;QACnC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YAC9B,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,YAAY;AACZ,IAAI,WAAW,GAAe,IAAI,CAAC;AAEnC,MAAM,UAAU,MAAM;IACpB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC","debug_id":"9193af86-567a-5e90-a3aa-d9eaa26e0e24"}
|