@zerwiz/ymir 0.1.33 → 0.1.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (930) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/apps/README.md +4 -0
  3. package/apps/hlidskjalf/README.md +68 -0
  4. package/apps/hlidskjalf/android/app/build.gradle +73 -0
  5. package/apps/hlidskjalf/android/app/capacitor.build.gradle +19 -0
  6. package/apps/hlidskjalf/android/app/proguard-rules.pro +21 -0
  7. package/apps/hlidskjalf/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +26 -0
  8. package/apps/hlidskjalf/android/app/src/main/AndroidManifest.xml +41 -0
  9. package/apps/hlidskjalf/android/app/src/main/java/org/zerwiz/ymir/MainActivity.java +5 -0
  10. package/apps/hlidskjalf/android/app/src/main/res/drawable/ic_launcher_background.xml +170 -0
  11. package/apps/hlidskjalf/android/app/src/main/res/drawable/splash.png +0 -0
  12. package/apps/hlidskjalf/android/app/src/main/res/drawable-land-hdpi/splash.png +0 -0
  13. package/apps/hlidskjalf/android/app/src/main/res/drawable-land-mdpi/splash.png +0 -0
  14. package/apps/hlidskjalf/android/app/src/main/res/drawable-land-xhdpi/splash.png +0 -0
  15. package/apps/hlidskjalf/android/app/src/main/res/drawable-land-xxhdpi/splash.png +0 -0
  16. package/apps/hlidskjalf/android/app/src/main/res/drawable-land-xxxhdpi/splash.png +0 -0
  17. package/apps/hlidskjalf/android/app/src/main/res/drawable-port-hdpi/splash.png +0 -0
  18. package/apps/hlidskjalf/android/app/src/main/res/drawable-port-mdpi/splash.png +0 -0
  19. package/apps/hlidskjalf/android/app/src/main/res/drawable-port-xhdpi/splash.png +0 -0
  20. package/apps/hlidskjalf/android/app/src/main/res/drawable-port-xxhdpi/splash.png +0 -0
  21. package/apps/hlidskjalf/android/app/src/main/res/drawable-port-xxxhdpi/splash.png +0 -0
  22. package/apps/hlidskjalf/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +34 -0
  23. package/apps/hlidskjalf/android/app/src/main/res/layout/activity_main.xml +12 -0
  24. package/apps/hlidskjalf/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
  25. package/apps/hlidskjalf/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
  26. package/apps/hlidskjalf/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  27. package/apps/hlidskjalf/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png +0 -0
  28. package/apps/hlidskjalf/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  29. package/apps/hlidskjalf/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  30. package/apps/hlidskjalf/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png +0 -0
  31. package/apps/hlidskjalf/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  32. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  33. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
  34. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  35. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  36. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
  37. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  38. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  39. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
  40. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  41. package/apps/hlidskjalf/android/app/src/main/res/values/ic_launcher_background.xml +4 -0
  42. package/apps/hlidskjalf/android/app/src/main/res/values/strings.xml +7 -0
  43. package/apps/hlidskjalf/android/app/src/main/res/values/styles.xml +22 -0
  44. package/apps/hlidskjalf/android/app/src/main/res/xml/file_paths.xml +5 -0
  45. package/apps/hlidskjalf/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +18 -0
  46. package/apps/hlidskjalf/android/build.gradle +29 -0
  47. package/apps/hlidskjalf/android/capacitor.settings.gradle +3 -0
  48. package/apps/hlidskjalf/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  49. package/apps/hlidskjalf/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  50. package/apps/hlidskjalf/android/gradle.properties +22 -0
  51. package/apps/hlidskjalf/android/gradlew +248 -0
  52. package/apps/hlidskjalf/android/gradlew.bat +92 -0
  53. package/apps/hlidskjalf/android/settings.gradle +5 -0
  54. package/apps/hlidskjalf/android/variables.gradle +16 -0
  55. package/apps/hlidskjalf/capacitor.config.ts +26 -0
  56. package/apps/hlidskjalf/dist/apple-touch-icon.png +0 -0
  57. package/apps/hlidskjalf/dist/assets/index-BWmNIyaG.css +1 -0
  58. package/apps/hlidskjalf/dist/assets/index-k7QEfNto.js +88 -0
  59. package/apps/hlidskjalf/dist/assets/index-k7QEfNto.js.map +1 -0
  60. package/apps/hlidskjalf/dist/icon.svg +7 -0
  61. package/apps/hlidskjalf/dist/index.html +64 -0
  62. package/apps/hlidskjalf/dist/manifest.webmanifest +31 -0
  63. package/apps/hlidskjalf/dist/og.jpg +0 -0
  64. package/apps/hlidskjalf/dist/og.png +0 -0
  65. package/apps/hlidskjalf/dist/og.svg +64 -0
  66. package/apps/hlidskjalf/dist/sw.js +39 -0
  67. package/apps/hlidskjalf/dist/ymir-icon.png +0 -0
  68. package/apps/hlidskjalf/dist/ymir-mark.svg +62 -0
  69. package/apps/hlidskjalf/electron/icon.png +0 -0
  70. package/apps/hlidskjalf/electron/main.cjs +236 -0
  71. package/apps/hlidskjalf/electron/preload.cjs +8 -0
  72. package/apps/hlidskjalf/electron/smidja-icon.png +0 -0
  73. package/apps/hlidskjalf/electron/ymir-hlidskjalf.desktop.in +12 -0
  74. package/apps/hlidskjalf/electron/ymir-smidja.desktop.in +12 -0
  75. package/apps/hlidskjalf/index.html +63 -0
  76. package/apps/hlidskjalf/package-lock.json +5398 -0
  77. package/apps/hlidskjalf/package.json +55 -0
  78. package/apps/hlidskjalf/public/apple-touch-icon.png +0 -0
  79. package/apps/hlidskjalf/public/icon.svg +7 -0
  80. package/apps/hlidskjalf/public/manifest.webmanifest +31 -0
  81. package/apps/hlidskjalf/public/og.jpg +0 -0
  82. package/apps/hlidskjalf/public/og.png +0 -0
  83. package/apps/hlidskjalf/public/og.svg +64 -0
  84. package/apps/hlidskjalf/public/sw.js +39 -0
  85. package/apps/hlidskjalf/public/ymir-icon.png +0 -0
  86. package/apps/hlidskjalf/public/ymir-mark.svg +62 -0
  87. package/apps/hlidskjalf/server/accounts.ts +159 -0
  88. package/apps/hlidskjalf/server/index.ts +2045 -0
  89. package/apps/hlidskjalf/src/app/App.tsx +116 -0
  90. package/apps/hlidskjalf/src/app/BottomStream.tsx +128 -0
  91. package/apps/hlidskjalf/src/app/MobileNav.tsx +87 -0
  92. package/apps/hlidskjalf/src/app/Rail.tsx +106 -0
  93. package/apps/hlidskjalf/src/app/Shell.tsx +135 -0
  94. package/apps/hlidskjalf/src/app/Topbar.tsx +130 -0
  95. package/apps/hlidskjalf/src/components/AccentPicker.tsx +207 -0
  96. package/apps/hlidskjalf/src/components/AccountMenu.tsx +115 -0
  97. package/apps/hlidskjalf/src/components/AgentCard.tsx +75 -0
  98. package/apps/hlidskjalf/src/components/EmberBackground.tsx +36 -0
  99. package/apps/hlidskjalf/src/components/Emblem.tsx +48 -0
  100. package/apps/hlidskjalf/src/components/Halls.tsx +155 -0
  101. package/apps/hlidskjalf/src/components/LoginModal.tsx +329 -0
  102. package/apps/hlidskjalf/src/components/Markdown.tsx +10 -0
  103. package/apps/hlidskjalf/src/components/MetricTile.tsx +40 -0
  104. package/apps/hlidskjalf/src/components/ModelPicker.tsx +100 -0
  105. package/apps/hlidskjalf/src/components/Overlay.tsx +134 -0
  106. package/apps/hlidskjalf/src/components/PRCard.tsx +154 -0
  107. package/apps/hlidskjalf/src/components/RecallPanel.tsx +116 -0
  108. package/apps/hlidskjalf/src/components/RuneTag.tsx +23 -0
  109. package/apps/hlidskjalf/src/components/Status.tsx +35 -0
  110. package/apps/hlidskjalf/src/components/TaskChip.tsx +23 -0
  111. package/apps/hlidskjalf/src/components/TraceRow.tsx +28 -0
  112. package/apps/hlidskjalf/src/data/lore.ts +127 -0
  113. package/apps/hlidskjalf/src/data/metadata.ts +147 -0
  114. package/apps/hlidskjalf/src/data/mythology.ts +95 -0
  115. package/apps/hlidskjalf/src/data/realms.ts +167 -0
  116. package/apps/hlidskjalf/src/gates/Cron.tsx +77 -0
  117. package/apps/hlidskjalf/src/gates/Decisions.tsx +67 -0
  118. package/apps/hlidskjalf/src/gates/Files.tsx +138 -0
  119. package/apps/hlidskjalf/src/gates/Fleet.tsx +184 -0
  120. package/apps/hlidskjalf/src/gates/Forge.tsx +486 -0
  121. package/apps/hlidskjalf/src/gates/OmniChat.tsx +217 -0
  122. package/apps/hlidskjalf/src/gates/Processes.tsx +162 -0
  123. package/apps/hlidskjalf/src/gates/Profile.tsx +225 -0
  124. package/apps/hlidskjalf/src/gates/Reviews.tsx +33 -0
  125. package/apps/hlidskjalf/src/gates/Runes.tsx +116 -0
  126. package/apps/hlidskjalf/src/gates/Runtime.tsx +106 -0
  127. package/apps/hlidskjalf/src/gates/Sessions.tsx +109 -0
  128. package/apps/hlidskjalf/src/gates/Stats.tsx +268 -0
  129. package/apps/hlidskjalf/src/gates/Tasks.tsx +173 -0
  130. package/apps/hlidskjalf/src/gates/Trace.tsx +155 -0
  131. package/apps/hlidskjalf/src/gates/Well.tsx +154 -0
  132. package/apps/hlidskjalf/src/gates/Worktrees.tsx +48 -0
  133. package/apps/hlidskjalf/src/hooks/useTenantDef.ts +13 -0
  134. package/apps/hlidskjalf/src/main.tsx +31 -0
  135. package/apps/hlidskjalf/src/services/api.ts +404 -0
  136. package/apps/hlidskjalf/src/services/auth.ts +107 -0
  137. package/apps/hlidskjalf/src/services/stream.ts +35 -0
  138. package/apps/hlidskjalf/src/state/store.ts +648 -0
  139. package/apps/hlidskjalf/src/state/ui.ts +62 -0
  140. package/apps/hlidskjalf/src/styles/auth.css +485 -0
  141. package/apps/hlidskjalf/src/styles/components.css +1259 -0
  142. package/apps/hlidskjalf/src/styles/forge.css +115 -0
  143. package/apps/hlidskjalf/src/styles/global.css +167 -0
  144. package/apps/hlidskjalf/src/styles/menus.css +175 -0
  145. package/apps/hlidskjalf/src/styles/mobile.css +298 -0
  146. package/apps/hlidskjalf/src/styles/overlays.css +205 -0
  147. package/apps/hlidskjalf/src/styles/shell.css +641 -0
  148. package/apps/hlidskjalf/src/types.ts +251 -0
  149. package/apps/hlidskjalf/src/vite-env.d.ts +9 -0
  150. package/apps/hlidskjalf/static/landing.md +6 -0
  151. package/apps/hlidskjalf/tsconfig.json +25 -0
  152. package/apps/hlidskjalf/vite.config.ts +49 -0
  153. package/apps/hlidskjalf-mobile/App.tsx +93 -0
  154. package/apps/hlidskjalf-mobile/app.json +13 -0
  155. package/apps/hlidskjalf-mobile/index.ts +4 -0
  156. package/apps/hlidskjalf-mobile/package.json +35 -0
  157. package/apps/hlidskjalf-mobile/public/icon.svg +7 -0
  158. package/apps/hlidskjalf-mobile/tsconfig.json +4 -0
  159. package/apps/odrerir/.astro/content.d.ts +159 -0
  160. package/apps/odrerir/.astro/dev.json +24 -0
  161. package/apps/odrerir/.astro/settings.json +5 -0
  162. package/apps/odrerir/.astro/types.d.ts +2 -0
  163. package/apps/odrerir/astro.config.mjs +79 -0
  164. package/apps/odrerir/dist/apple-touch-icon.png +0 -0
  165. package/apps/odrerir/dist/favicon-192.png +0 -0
  166. package/apps/odrerir/dist/favicon-32.png +0 -0
  167. package/apps/odrerir/dist/favicon-512.png +0 -0
  168. package/apps/odrerir/dist/favicon.svg +53 -0
  169. package/apps/odrerir/dist/icon.svg +7 -0
  170. package/apps/odrerir/dist/index.html +837 -0
  171. package/apps/odrerir/dist/og-square.png +0 -0
  172. package/apps/odrerir/dist/og-story.png +0 -0
  173. package/apps/odrerir/dist/og.png +0 -0
  174. package/apps/odrerir/dist/safari-pinned-tab.svg +7 -0
  175. package/apps/odrerir/dist/site.webmanifest +16 -0
  176. package/apps/odrerir/dist/styles/cloth.css +112 -0
  177. package/apps/odrerir/dist/styles/livehall.css +278 -0
  178. package/apps/odrerir/electron/icon.png +0 -0
  179. package/apps/odrerir/electron/main.cjs +183 -0
  180. package/apps/odrerir/electron/ymir-odrerir.desktop.in +12 -0
  181. package/apps/odrerir/package-lock.json +4195 -0
  182. package/apps/odrerir/package.json +30 -0
  183. package/apps/odrerir/public/apple-touch-icon.png +0 -0
  184. package/apps/odrerir/public/favicon-192.png +0 -0
  185. package/apps/odrerir/public/favicon-32.png +0 -0
  186. package/apps/odrerir/public/favicon-512.png +0 -0
  187. package/apps/odrerir/public/favicon.svg +53 -0
  188. package/apps/odrerir/public/icon.svg +7 -0
  189. package/apps/odrerir/public/og-square.png +0 -0
  190. package/apps/odrerir/public/og-story.png +0 -0
  191. package/apps/odrerir/public/og.png +0 -0
  192. package/apps/odrerir/public/safari-pinned-tab.svg +7 -0
  193. package/apps/odrerir/public/site.webmanifest +16 -0
  194. package/apps/odrerir/scripts/extract-cloth.mjs +101 -0
  195. package/apps/odrerir/src/index.html +837 -0
  196. package/apps/odrerir/src/styles/cloth.css +112 -0
  197. package/apps/odrerir/src/styles/livehall.css +278 -0
  198. package/apps/sessrumnir/.github/ISSUE_TEMPLATE/bug_report.yml +99 -0
  199. package/apps/sessrumnir/.github/ISSUE_TEMPLATE/config.yml +8 -0
  200. package/apps/sessrumnir/.github/ISSUE_TEMPLATE/feature_request.yml +46 -0
  201. package/apps/sessrumnir/.github/PULL_REQUEST_TEMPLATE.md +56 -0
  202. package/apps/sessrumnir/.github/SUPPORT.md +18 -0
  203. package/apps/sessrumnir/.github/workflows/build.yml +133 -0
  204. package/apps/sessrumnir/AGENTS.md +540 -0
  205. package/apps/sessrumnir/CLA.md +63 -0
  206. package/apps/sessrumnir/CONTRIBUTING.md +233 -0
  207. package/apps/sessrumnir/LICENSE +200 -0
  208. package/apps/sessrumnir/NOTICE +33 -0
  209. package/apps/sessrumnir/README.md +329 -0
  210. package/apps/sessrumnir/bin/sessrumnir-web.sh +117 -0
  211. package/apps/sessrumnir/bin/sessrumnir.js +169 -0
  212. package/apps/sessrumnir/docs/CNAME +1 -0
  213. package/apps/sessrumnir/docs/favicon.ico +0 -0
  214. package/apps/sessrumnir/docs/icon-512.png +0 -0
  215. package/apps/sessrumnir/docs/index.html +441 -0
  216. package/apps/sessrumnir/docs/robots.txt +4 -0
  217. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_181929.png +0 -0
  218. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182005.png +0 -0
  219. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182020.png +0 -0
  220. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182039.png +0 -0
  221. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182117.png +0 -0
  222. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182225.png +0 -0
  223. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182248.png +0 -0
  224. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182322.png +0 -0
  225. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182340.png +0 -0
  226. package/apps/sessrumnir/docs/sitemap.xml +9 -0
  227. package/apps/sessrumnir/electron.vite.config.ts +49 -0
  228. package/apps/sessrumnir/eslint.config.mjs +75 -0
  229. package/apps/sessrumnir/i18next.config.ts +33 -0
  230. package/apps/sessrumnir/install.sh +144 -0
  231. package/apps/sessrumnir/out/main/index.js +10881 -0
  232. package/apps/sessrumnir/out/preload/index.js +722 -0
  233. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-400-normal-C8QS47vb.woff2 +0 -0
  234. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-400-normal-D3EsxgFc.woff +0 -0
  235. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-500-normal-B7dJQtg-.woff +0 -0
  236. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-500-normal-BLlg2W5x.woff2 +0 -0
  237. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-600-normal-BcIsDXzC.woff2 +0 -0
  238. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-600-normal-CBymlcNF.woff +0 -0
  239. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-400-normal-Bgrpe4p1.woff +0 -0
  240. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-400-normal-BlcaxZtM.woff2 +0 -0
  241. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-500-normal-CdQuyvtc.woff +0 -0
  242. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-500-normal-pZw22qtS.woff2 +0 -0
  243. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-600-normal-Dr-wLyOm.woff +0 -0
  244. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-600-normal-dLR2-a_v.woff2 +0 -0
  245. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-400-normal-BGH8Vunh.woff2 +0 -0
  246. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-400-normal-C3_-2Ua-.woff +0 -0
  247. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-500-normal-Dj3SQ6fR.woff +0 -0
  248. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-500-normal-EBdSCOD3.woff2 +0 -0
  249. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-600-normal-B254Xisw.woff2 +0 -0
  250. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-600-normal-DUW-TI76.woff +0 -0
  251. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-400-normal-DuQ88yz3.woff2 +0 -0
  252. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-400-normal-DuXFa1Dr.woff +0 -0
  253. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-500-normal-AH9qog1s.woff2 +0 -0
  254. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-500-normal-DAuUCO41.woff +0 -0
  255. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-600-normal-CD-dlDpD.woff +0 -0
  256. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-600-normal-D3T6BBXG.woff2 +0 -0
  257. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-400-normal-C-RiYxEf.woff2 +0 -0
  258. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-400-normal-DmUuA7Y2.woff +0 -0
  259. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-500-normal-DsPuwQHi.woff2 +0 -0
  260. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-500-normal-tGBW_mI7.woff +0 -0
  261. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-600-normal-Dar_cCT6.woff2 +0 -0
  262. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-600-normal-GIs8CF2x.woff +0 -0
  263. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-300-normal-Ba-HN6uq.woff +0 -0
  264. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-300-normal-ByB2hQUF.woff2 +0 -0
  265. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
  266. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
  267. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
  268. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
  269. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-300-normal-B8O3uHbr.woff +0 -0
  270. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-300-normal-BbtBtHoB.woff2 +0 -0
  271. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
  272. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
  273. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
  274. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
  275. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-300-normal-BPU54Tw3.woff +0 -0
  276. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-300-normal-BRS-C4KA.woff2 +0 -0
  277. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  278. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  279. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  280. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  281. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-300-normal-BEtQ2wm2.woff2 +0 -0
  282. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-300-normal-CQbCaAQ4.woff +0 -0
  283. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
  284. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
  285. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
  286. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
  287. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-300-normal-B6fSpYYV.woff +0 -0
  288. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-300-normal-CpdbWO_2.woff2 +0 -0
  289. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
  290. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
  291. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
  292. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
  293. package/apps/sessrumnir/out/renderer/assets/index-BxqsRq2x.css +4858 -0
  294. package/apps/sessrumnir/out/renderer/assets/index-TaD69rFk.js +99435 -0
  295. package/apps/sessrumnir/out/renderer/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  296. package/apps/sessrumnir/out/renderer/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  297. package/apps/sessrumnir/out/renderer/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  298. package/apps/sessrumnir/out/renderer/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  299. package/apps/sessrumnir/out/renderer/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  300. package/apps/sessrumnir/out/renderer/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  301. package/apps/sessrumnir/out/renderer/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  302. package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  303. package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  304. package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  305. package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  306. package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  307. package/apps/sessrumnir/out/renderer/assets/newsreader-latin-ext-wght-italic-DFS986qL.woff2 +0 -0
  308. package/apps/sessrumnir/out/renderer/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  309. package/apps/sessrumnir/out/renderer/assets/newsreader-latin-wght-italic-Bxi8ein9.woff2 +0 -0
  310. package/apps/sessrumnir/out/renderer/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  311. package/apps/sessrumnir/out/renderer/assets/newsreader-vietnamese-wght-italic-xAqemagA.woff2 +0 -0
  312. package/apps/sessrumnir/out/renderer/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  313. package/apps/sessrumnir/out/renderer/assets/openmoji-color-9qo_2DLG.woff2 +0 -0
  314. package/apps/sessrumnir/out/renderer/assets/pi-logo-B6SVnhuS.svg +7 -0
  315. package/apps/sessrumnir/out/renderer/index.html +19 -0
  316. package/apps/sessrumnir/out/renderer/theme-boot.js +30 -0
  317. package/apps/sessrumnir/package-lock.json +10636 -0
  318. package/apps/sessrumnir/package.json +183 -0
  319. package/apps/sessrumnir/public/apple-touch-icon.png +0 -0
  320. package/apps/sessrumnir/public/icon.svg +7 -0
  321. package/apps/sessrumnir/resources/icons/generate_icons.py +38 -0
  322. package/apps/sessrumnir/resources/icons/icon-128.png +0 -0
  323. package/apps/sessrumnir/resources/icons/icon-16.png +0 -0
  324. package/apps/sessrumnir/resources/icons/icon-256.png +0 -0
  325. package/apps/sessrumnir/resources/icons/icon-32.png +0 -0
  326. package/apps/sessrumnir/resources/icons/icon-48.png +0 -0
  327. package/apps/sessrumnir/resources/icons/icon-512.png +0 -0
  328. package/apps/sessrumnir/resources/icons/icon-64.png +0 -0
  329. package/apps/sessrumnir/resources/icons/icon.icns +0 -0
  330. package/apps/sessrumnir/resources/icons/icon.ico +0 -0
  331. package/apps/sessrumnir/resources/icons/icon.png +0 -0
  332. package/apps/sessrumnir/resources/icons/icon.svg +7 -0
  333. package/apps/sessrumnir/resources/linux/after-install.sh +23 -0
  334. package/apps/sessrumnir/resources/linux/after-remove.sh +18 -0
  335. package/apps/sessrumnir/resources/locales/en/translation.json +1735 -0
  336. package/apps/sessrumnir/resources/permission-prompt-text.test.ts +111 -0
  337. package/apps/sessrumnir/resources/permission-prompt-text.ts +84 -0
  338. package/apps/sessrumnir/resources/permission-rules.test.ts +351 -0
  339. package/apps/sessrumnir/resources/permission-rules.ts +293 -0
  340. package/apps/sessrumnir/resources/pi-desktop-permissions.ts +62 -0
  341. package/apps/sessrumnir/resources/ymir-sessrumnir.desktop.in +12 -0
  342. package/apps/sessrumnir/scripts/check-semantic-colors.mjs +57 -0
  343. package/apps/sessrumnir/src/main/activity-stats.test.ts +240 -0
  344. package/apps/sessrumnir/src/main/activity-stats.ts +596 -0
  345. package/apps/sessrumnir/src/main/agent-detection.test.ts +25 -0
  346. package/apps/sessrumnir/src/main/agent-detection.ts +114 -0
  347. package/apps/sessrumnir/src/main/app-data-paths.test.ts +90 -0
  348. package/apps/sessrumnir/src/main/app-data-paths.ts +95 -0
  349. package/apps/sessrumnir/src/main/app-log.test.ts +114 -0
  350. package/apps/sessrumnir/src/main/app-log.ts +210 -0
  351. package/apps/sessrumnir/src/main/archived-sessions.test.ts +50 -0
  352. package/apps/sessrumnir/src/main/archived-sessions.ts +95 -0
  353. package/apps/sessrumnir/src/main/attachment-reader.test.ts +56 -0
  354. package/apps/sessrumnir/src/main/attachment-reader.ts +52 -0
  355. package/apps/sessrumnir/src/main/auto-tag.test.ts +38 -0
  356. package/apps/sessrumnir/src/main/auto-tag.ts +75 -0
  357. package/apps/sessrumnir/src/main/autostart-linux.test.ts +56 -0
  358. package/apps/sessrumnir/src/main/autostart-linux.ts +58 -0
  359. package/apps/sessrumnir/src/main/cmd-escape.test.ts +424 -0
  360. package/apps/sessrumnir/src/main/cmd-escape.ts +186 -0
  361. package/apps/sessrumnir/src/main/council-manager.test.ts +167 -0
  362. package/apps/sessrumnir/src/main/council-manager.ts +265 -0
  363. package/apps/sessrumnir/src/main/diagnostics-report.test.ts +140 -0
  364. package/apps/sessrumnir/src/main/diagnostics-report.ts +91 -0
  365. package/apps/sessrumnir/src/main/diagnostics.ts +111 -0
  366. package/apps/sessrumnir/src/main/editor-guard.test.ts +59 -0
  367. package/apps/sessrumnir/src/main/editor-guard.ts +50 -0
  368. package/apps/sessrumnir/src/main/extension-ui-ipc.test.ts +299 -0
  369. package/apps/sessrumnir/src/main/extension-ui-ipc.ts +117 -0
  370. package/apps/sessrumnir/src/main/file-service.test.ts +279 -0
  371. package/apps/sessrumnir/src/main/file-service.ts +652 -0
  372. package/apps/sessrumnir/src/main/fs-errors.ts +42 -0
  373. package/apps/sessrumnir/src/main/get-messages-trim.test.ts +77 -0
  374. package/apps/sessrumnir/src/main/get-messages-trim.ts +97 -0
  375. package/apps/sessrumnir/src/main/git-conveyor.test.ts +305 -0
  376. package/apps/sessrumnir/src/main/git-conveyor.ts +338 -0
  377. package/apps/sessrumnir/src/main/git-worktree.test.ts +101 -0
  378. package/apps/sessrumnir/src/main/git-worktree.ts +201 -0
  379. package/apps/sessrumnir/src/main/i18n.ts +31 -0
  380. package/apps/sessrumnir/src/main/index.ts +619 -0
  381. package/apps/sessrumnir/src/main/ipc/active-engine.ts +15 -0
  382. package/apps/sessrumnir/src/main/ipc/context.ts +58 -0
  383. package/apps/sessrumnir/src/main/ipc/council-handlers.ts +126 -0
  384. package/apps/sessrumnir/src/main/ipc/diagnostics-handlers.ts +8 -0
  385. package/apps/sessrumnir/src/main/ipc/file-handlers.ts +96 -0
  386. package/apps/sessrumnir/src/main/ipc/git-conveyor-handlers.ts +55 -0
  387. package/apps/sessrumnir/src/main/ipc/model-handlers.ts +33 -0
  388. package/apps/sessrumnir/src/main/ipc/models-config-handlers.ts +80 -0
  389. package/apps/sessrumnir/src/main/ipc/notes-handlers.ts +65 -0
  390. package/apps/sessrumnir/src/main/ipc/package-handlers.ts +330 -0
  391. package/apps/sessrumnir/src/main/ipc/permission-rules-handlers.ts +223 -0
  392. package/apps/sessrumnir/src/main/ipc/pi-handlers.ts +136 -0
  393. package/apps/sessrumnir/src/main/ipc/pi-start-options.ts +150 -0
  394. package/apps/sessrumnir/src/main/ipc/run-pi-cli.ts +53 -0
  395. package/apps/sessrumnir/src/main/ipc/session-handlers.ts +491 -0
  396. package/apps/sessrumnir/src/main/ipc/settings.ts +120 -0
  397. package/apps/sessrumnir/src/main/ipc/skills-mcp-handlers.ts +192 -0
  398. package/apps/sessrumnir/src/main/ipc/system-handlers.ts +131 -0
  399. package/apps/sessrumnir/src/main/ipc/tag-handlers.ts +69 -0
  400. package/apps/sessrumnir/src/main/ipc/terminal-handlers.ts +41 -0
  401. package/apps/sessrumnir/src/main/ipc/theme-handlers.ts +131 -0
  402. package/apps/sessrumnir/src/main/ipc/update-handlers.ts +61 -0
  403. package/apps/sessrumnir/src/main/ipc/validation.ts +45 -0
  404. package/apps/sessrumnir/src/main/ipc/workflow-handlers.ts +108 -0
  405. package/apps/sessrumnir/src/main/ipc/workspace-activity-wiring.ts +179 -0
  406. package/apps/sessrumnir/src/main/ipc/workspace-handlers.ts +133 -0
  407. package/apps/sessrumnir/src/main/ipc-handlers.ts +98 -0
  408. package/apps/sessrumnir/src/main/map-concurrent.test.ts +80 -0
  409. package/apps/sessrumnir/src/main/map-concurrent.ts +30 -0
  410. package/apps/sessrumnir/src/main/models-file.test.ts +114 -0
  411. package/apps/sessrumnir/src/main/models-file.ts +89 -0
  412. package/apps/sessrumnir/src/main/notes-manager.test.ts +64 -0
  413. package/apps/sessrumnir/src/main/notes-manager.ts +183 -0
  414. package/apps/sessrumnir/src/main/notify-decision.test.ts +39 -0
  415. package/apps/sessrumnir/src/main/notify-decision.ts +25 -0
  416. package/apps/sessrumnir/src/main/omp-fork-points.test.ts +119 -0
  417. package/apps/sessrumnir/src/main/omp-fork-points.ts +105 -0
  418. package/apps/sessrumnir/src/main/omp-plugin-list.test.ts +94 -0
  419. package/apps/sessrumnir/src/main/omp-plugin-list.ts +103 -0
  420. package/apps/sessrumnir/src/main/package-catalog.test.ts +157 -0
  421. package/apps/sessrumnir/src/main/package-catalog.ts +166 -0
  422. package/apps/sessrumnir/src/main/package-updates.test.ts +149 -0
  423. package/apps/sessrumnir/src/main/package-updates.ts +185 -0
  424. package/apps/sessrumnir/src/main/path-authorization.test.ts +64 -0
  425. package/apps/sessrumnir/src/main/path-authorization.ts +31 -0
  426. package/apps/sessrumnir/src/main/pi-binary-resolution.test.ts +582 -0
  427. package/apps/sessrumnir/src/main/pi-binary-resolution.ts +649 -0
  428. package/apps/sessrumnir/src/main/pi-event-router.test.ts +388 -0
  429. package/apps/sessrumnir/src/main/pi-event-router.ts +290 -0
  430. package/apps/sessrumnir/src/main/pi-paths.test.ts +134 -0
  431. package/apps/sessrumnir/src/main/pi-paths.ts +74 -0
  432. package/apps/sessrumnir/src/main/pi-rpc-manager.test.ts +467 -0
  433. package/apps/sessrumnir/src/main/pi-rpc-manager.ts +1319 -0
  434. package/apps/sessrumnir/src/main/process-tree.test.ts +94 -0
  435. package/apps/sessrumnir/src/main/renderer-origin.test.ts +33 -0
  436. package/apps/sessrumnir/src/main/renderer-origin.ts +35 -0
  437. package/apps/sessrumnir/src/main/session-lineage-reader.test.ts +317 -0
  438. package/apps/sessrumnir/src/main/session-lineage-reader.ts +111 -0
  439. package/apps/sessrumnir/src/main/session-metadata.test.ts +508 -0
  440. package/apps/sessrumnir/src/main/session-metadata.ts +526 -0
  441. package/apps/sessrumnir/src/main/session-name.test.ts +71 -0
  442. package/apps/sessrumnir/src/main/session-name.ts +69 -0
  443. package/apps/sessrumnir/src/main/session-paths.test.ts +110 -0
  444. package/apps/sessrumnir/src/main/session-paths.ts +88 -0
  445. package/apps/sessrumnir/src/main/session-tags.test.ts +61 -0
  446. package/apps/sessrumnir/src/main/session-tags.ts +253 -0
  447. package/apps/sessrumnir/src/main/session-trash.test.ts +66 -0
  448. package/apps/sessrumnir/src/main/session-trash.ts +65 -0
  449. package/apps/sessrumnir/src/main/settings-logic.ts +66 -0
  450. package/apps/sessrumnir/src/main/skills-discovery.test.ts +149 -0
  451. package/apps/sessrumnir/src/main/skills-discovery.ts +179 -0
  452. package/apps/sessrumnir/src/main/startup-launch.ts +63 -0
  453. package/apps/sessrumnir/src/main/terminal-service.ts +96 -0
  454. package/apps/sessrumnir/src/main/theme-store.test.ts +440 -0
  455. package/apps/sessrumnir/src/main/theme-store.ts +495 -0
  456. package/apps/sessrumnir/src/main/tray-decision.test.ts +46 -0
  457. package/apps/sessrumnir/src/main/tray-decision.ts +49 -0
  458. package/apps/sessrumnir/src/main/tray-manager.ts +220 -0
  459. package/apps/sessrumnir/src/main/tsconfig.json +20 -0
  460. package/apps/sessrumnir/src/main/window-background.test.ts +29 -0
  461. package/apps/sessrumnir/src/main/window-background.ts +16 -0
  462. package/apps/sessrumnir/src/main/workflow-discovery.test.ts +252 -0
  463. package/apps/sessrumnir/src/main/workflow-monitor.test.ts +371 -0
  464. package/apps/sessrumnir/src/main/workflow-monitor.ts +1020 -0
  465. package/apps/sessrumnir/src/main/workspace-activity.test.ts +227 -0
  466. package/apps/sessrumnir/src/main/workspace-activity.ts +215 -0
  467. package/apps/sessrumnir/src/main/workspace-manager.test.ts +680 -0
  468. package/apps/sessrumnir/src/main/workspace-manager.ts +1199 -0
  469. package/apps/sessrumnir/src/main/workspace-trust.test.ts +78 -0
  470. package/apps/sessrumnir/src/main/workspace-trust.ts +84 -0
  471. package/apps/sessrumnir/src/preload/index.ts +358 -0
  472. package/apps/sessrumnir/src/preload/tsconfig.json +20 -0
  473. package/apps/sessrumnir/src/renderer/index.html +18 -0
  474. package/apps/sessrumnir/src/renderer/public/theme-boot.js +30 -0
  475. package/apps/sessrumnir/src/renderer/src/app.tsx +194 -0
  476. package/apps/sessrumnir/src/renderer/src/assets/openmoji-color.woff2 +0 -0
  477. package/apps/sessrumnir/src/renderer/src/assets/pi-logo.svg +7 -0
  478. package/apps/sessrumnir/src/renderer/src/assets/ymir-mark.svg +55 -0
  479. package/apps/sessrumnir/src/renderer/src/assets.d.ts +7 -0
  480. package/apps/sessrumnir/src/renderer/src/components/chat-code-highlight.ts +239 -0
  481. package/apps/sessrumnir/src/renderer/src/components/chat-file-link.ts +140 -0
  482. package/apps/sessrumnir/src/renderer/src/components/chat-input.tsx +729 -0
  483. package/apps/sessrumnir/src/renderer/src/components/chat-panel-widths.test.ts +175 -0
  484. package/apps/sessrumnir/src/renderer/src/components/chat-panel-widths.ts +100 -0
  485. package/apps/sessrumnir/src/renderer/src/components/chat-panel.tsx +523 -0
  486. package/apps/sessrumnir/src/renderer/src/components/chat-project-picker.tsx +193 -0
  487. package/apps/sessrumnir/src/renderer/src/components/chat-search.tsx +251 -0
  488. package/apps/sessrumnir/src/renderer/src/components/code-editor-highlight.ts +85 -0
  489. package/apps/sessrumnir/src/renderer/src/components/code-editor-language.test.ts +19 -0
  490. package/apps/sessrumnir/src/renderer/src/components/code-editor-language.ts +88 -0
  491. package/apps/sessrumnir/src/renderer/src/components/code-editor.tsx +128 -0
  492. package/apps/sessrumnir/src/renderer/src/components/command-palette.tsx +315 -0
  493. package/apps/sessrumnir/src/renderer/src/components/command-results.tsx +80 -0
  494. package/apps/sessrumnir/src/renderer/src/components/composer-permission-menu.tsx +91 -0
  495. package/apps/sessrumnir/src/renderer/src/components/context-menu.tsx +457 -0
  496. package/apps/sessrumnir/src/renderer/src/components/copy-button.tsx +36 -0
  497. package/apps/sessrumnir/src/renderer/src/components/council-panels.tsx +193 -0
  498. package/apps/sessrumnir/src/renderer/src/components/custom-models-editor.tsx +330 -0
  499. package/apps/sessrumnir/src/renderer/src/components/diagnostics-panel.tsx +380 -0
  500. package/apps/sessrumnir/src/renderer/src/components/diff-viewer.tsx +318 -0
  501. package/apps/sessrumnir/src/renderer/src/components/ember-background.tsx +113 -0
  502. package/apps/sessrumnir/src/renderer/src/components/error-boundary.tsx +38 -0
  503. package/apps/sessrumnir/src/renderer/src/components/extension-ui-dialog-helpers.test.ts +43 -0
  504. package/apps/sessrumnir/src/renderer/src/components/extension-ui-dialog-helpers.ts +51 -0
  505. package/apps/sessrumnir/src/renderer/src/components/extension-ui-dialog.tsx +486 -0
  506. package/apps/sessrumnir/src/renderer/src/components/file-tree.tsx +784 -0
  507. package/apps/sessrumnir/src/renderer/src/components/git-conveyor-actions.tsx +246 -0
  508. package/apps/sessrumnir/src/renderer/src/components/home-screen.tsx +396 -0
  509. package/apps/sessrumnir/src/renderer/src/components/image-viewer.tsx +100 -0
  510. package/apps/sessrumnir/src/renderer/src/components/line-numbered-code.tsx +58 -0
  511. package/apps/sessrumnir/src/renderer/src/components/markdown-renderer.tsx +237 -0
  512. package/apps/sessrumnir/src/renderer/src/components/message-bubble.tsx +1006 -0
  513. package/apps/sessrumnir/src/renderer/src/components/mission-control.tsx +341 -0
  514. package/apps/sessrumnir/src/renderer/src/components/model-selector.tsx +219 -0
  515. package/apps/sessrumnir/src/renderer/src/components/note-picker.tsx +155 -0
  516. package/apps/sessrumnir/src/renderer/src/components/notes-panel.tsx +437 -0
  517. package/apps/sessrumnir/src/renderer/src/components/package-browser.tsx +604 -0
  518. package/apps/sessrumnir/src/renderer/src/components/permission-mode.test.ts +22 -0
  519. package/apps/sessrumnir/src/renderer/src/components/permission-mode.ts +49 -0
  520. package/apps/sessrumnir/src/renderer/src/components/permission-rules-editor-helpers.test.ts +44 -0
  521. package/apps/sessrumnir/src/renderer/src/components/permission-rules-editor-helpers.ts +35 -0
  522. package/apps/sessrumnir/src/renderer/src/components/permission-rules-editor.tsx +226 -0
  523. package/apps/sessrumnir/src/renderer/src/components/permission-selector.tsx +104 -0
  524. package/apps/sessrumnir/src/renderer/src/components/resize-handle.tsx +51 -0
  525. package/apps/sessrumnir/src/renderer/src/components/review-rail.tsx +194 -0
  526. package/apps/sessrumnir/src/renderer/src/components/session-menu-position.test.ts +22 -0
  527. package/apps/sessrumnir/src/renderer/src/components/session-menu-position.ts +34 -0
  528. package/apps/sessrumnir/src/renderer/src/components/session-panel.tsx +711 -0
  529. package/apps/sessrumnir/src/renderer/src/components/session-runtime-indicator.tsx +43 -0
  530. package/apps/sessrumnir/src/renderer/src/components/settings-panel.tsx +1360 -0
  531. package/apps/sessrumnir/src/renderer/src/components/sidebar-activity.test.ts +47 -0
  532. package/apps/sessrumnir/src/renderer/src/components/sidebar-activity.ts +76 -0
  533. package/apps/sessrumnir/src/renderer/src/components/sidebar-session-labels.test.ts +73 -0
  534. package/apps/sessrumnir/src/renderer/src/components/sidebar-session-labels.ts +47 -0
  535. package/apps/sessrumnir/src/renderer/src/components/sidebar.tsx +1045 -0
  536. package/apps/sessrumnir/src/renderer/src/components/skills-panel.tsx +159 -0
  537. package/apps/sessrumnir/src/renderer/src/components/stats-panel.tsx +368 -0
  538. package/apps/sessrumnir/src/renderer/src/components/status-bar.tsx +274 -0
  539. package/apps/sessrumnir/src/renderer/src/components/status-popover.tsx +481 -0
  540. package/apps/sessrumnir/src/renderer/src/components/streaming-bubble.tsx +128 -0
  541. package/apps/sessrumnir/src/renderer/src/components/subagent-progress.tsx +254 -0
  542. package/apps/sessrumnir/src/renderer/src/components/task-launcher.tsx +168 -0
  543. package/apps/sessrumnir/src/renderer/src/components/terminal.tsx +203 -0
  544. package/apps/sessrumnir/src/renderer/src/components/theme-editor-helpers.test.ts +35 -0
  545. package/apps/sessrumnir/src/renderer/src/components/theme-editor-helpers.ts +35 -0
  546. package/apps/sessrumnir/src/renderer/src/components/theme-editor.tsx +440 -0
  547. package/apps/sessrumnir/src/renderer/src/components/theme-gallery.tsx +373 -0
  548. package/apps/sessrumnir/src/renderer/src/components/thinking-level-selector.tsx +85 -0
  549. package/apps/sessrumnir/src/renderer/src/components/timeline.tsx +289 -0
  550. package/apps/sessrumnir/src/renderer/src/components/tool-call-icon.ts +32 -0
  551. package/apps/sessrumnir/src/renderer/src/components/workflow-navigator.tsx +901 -0
  552. package/apps/sessrumnir/src/renderer/src/components/workspace-tabs.tsx +241 -0
  553. package/apps/sessrumnir/src/renderer/src/global.d.ts +8 -0
  554. package/apps/sessrumnir/src/renderer/src/hooks/use-folder-drop.ts +101 -0
  555. package/apps/sessrumnir/src/renderer/src/hooks.test.ts +88 -0
  556. package/apps/sessrumnir/src/renderer/src/hooks.ts +574 -0
  557. package/apps/sessrumnir/src/renderer/src/i18n.test.ts +54 -0
  558. package/apps/sessrumnir/src/renderer/src/i18n.ts +89 -0
  559. package/apps/sessrumnir/src/renderer/src/index.css +425 -0
  560. package/apps/sessrumnir/src/renderer/src/main.tsx +42 -0
  561. package/apps/sessrumnir/src/renderer/src/message-grouping.test.ts +422 -0
  562. package/apps/sessrumnir/src/renderer/src/message-grouping.ts +410 -0
  563. package/apps/sessrumnir/src/renderer/src/message-parsing.test.ts +86 -0
  564. package/apps/sessrumnir/src/renderer/src/message-parsing.ts +166 -0
  565. package/apps/sessrumnir/src/renderer/src/store-external-prompts.test.ts +161 -0
  566. package/apps/sessrumnir/src/renderer/src/store-session-transitions.test.ts +2090 -0
  567. package/apps/sessrumnir/src/renderer/src/store-timeline.test.ts +52 -0
  568. package/apps/sessrumnir/src/renderer/src/store-turn-error.test.ts +136 -0
  569. package/apps/sessrumnir/src/renderer/src/store.ts +3726 -0
  570. package/apps/sessrumnir/src/renderer/src/subagent-detection.test.ts +55 -0
  571. package/apps/sessrumnir/src/renderer/src/theme/engine.test.ts +29 -0
  572. package/apps/sessrumnir/src/renderer/src/theme/engine.ts +20 -0
  573. package/apps/sessrumnir/src/renderer/src/themes/breeze-claudius.json +69 -0
  574. package/apps/sessrumnir/src/renderer/src/themes/breeze-dark.json +69 -0
  575. package/apps/sessrumnir/src/renderer/src/themes/breeze-light.json +69 -0
  576. package/apps/sessrumnir/src/renderer/src/themes/builtin-themes.test.ts +95 -0
  577. package/apps/sessrumnir/src/renderer/src/themes/dark.json +46 -0
  578. package/apps/sessrumnir/src/renderer/src/themes/fensalir.json +82 -0
  579. package/apps/sessrumnir/src/renderer/src/themes/gruvbox.json +69 -0
  580. package/apps/sessrumnir/src/renderer/src/themes/index.ts +60 -0
  581. package/apps/sessrumnir/src/renderer/src/themes/light.json +46 -0
  582. package/apps/sessrumnir/src/renderer/src/themes/nord.json +69 -0
  583. package/apps/sessrumnir/src/renderer/src/themes/sessrumnir.json +82 -0
  584. package/apps/sessrumnir/src/renderer/src/utils/debounced-buffer.test.ts +81 -0
  585. package/apps/sessrumnir/src/renderer/src/utils/debounced-buffer.ts +57 -0
  586. package/apps/sessrumnir/src/renderer/src/utils/format-relative-time.test.ts +62 -0
  587. package/apps/sessrumnir/src/renderer/src/utils/format-relative-time.ts +28 -0
  588. package/apps/sessrumnir/src/renderer/src/utils/heatmap-grid.test.ts +57 -0
  589. package/apps/sessrumnir/src/renderer/src/utils/heatmap-grid.ts +41 -0
  590. package/apps/sessrumnir/src/renderer/src/utils/ipc-error.test.ts +22 -0
  591. package/apps/sessrumnir/src/renderer/src/utils/ipc-error.ts +12 -0
  592. package/apps/sessrumnir/src/renderer/src/utils/model-search.test.ts +63 -0
  593. package/apps/sessrumnir/src/renderer/src/utils/model-search.ts +20 -0
  594. package/apps/sessrumnir/src/renderer/src/utils/planning-prompt.test.ts +31 -0
  595. package/apps/sessrumnir/src/renderer/src/utils/planning-prompt.ts +27 -0
  596. package/apps/sessrumnir/src/renderer/src/utils/preview-load-error.test.ts +15 -0
  597. package/apps/sessrumnir/src/renderer/src/utils/preview-load-error.ts +22 -0
  598. package/apps/sessrumnir/src/renderer/src/utils/process-status-label.test.ts +13 -0
  599. package/apps/sessrumnir/src/renderer/src/utils/process-status-label.ts +19 -0
  600. package/apps/sessrumnir/src/renderer/src/utils/quick-switcher.test.ts +68 -0
  601. package/apps/sessrumnir/src/renderer/src/utils/quick-switcher.ts +52 -0
  602. package/apps/sessrumnir/src/renderer/src/utils/rank-file-results.test.ts +46 -0
  603. package/apps/sessrumnir/src/renderer/src/utils/rank-file-results.ts +23 -0
  604. package/apps/sessrumnir/src/renderer/src/utils/relative-time.tsx +25 -0
  605. package/apps/sessrumnir/src/renderer/src/utils/session-title.test.ts +98 -0
  606. package/apps/sessrumnir/src/renderer/src/utils/session-title.ts +58 -0
  607. package/apps/sessrumnir/src/renderer/src/utils/stale-guard.test.ts +29 -0
  608. package/apps/sessrumnir/src/renderer/src/utils/stale-guard.ts +20 -0
  609. package/apps/sessrumnir/src/renderer/src/utils/theme.test.ts +174 -0
  610. package/apps/sessrumnir/src/renderer/src/utils/theme.ts +159 -0
  611. package/apps/sessrumnir/src/renderer/src/utils/workflow-runs.test.ts +130 -0
  612. package/apps/sessrumnir/src/renderer/src/utils/workflow-runs.ts +84 -0
  613. package/apps/sessrumnir/src/renderer/tsconfig.json +24 -0
  614. package/apps/sessrumnir/src/shared/agent-engine-label.test.ts +45 -0
  615. package/apps/sessrumnir/src/shared/agent-engine-label.ts +53 -0
  616. package/apps/sessrumnir/src/shared/app-settings.test.ts +25 -0
  617. package/apps/sessrumnir/src/shared/app-settings.ts +23 -0
  618. package/apps/sessrumnir/src/shared/bridge-http.ts +341 -0
  619. package/apps/sessrumnir/src/shared/bridge.ts +337 -0
  620. package/apps/sessrumnir/src/shared/council-config.test.ts +300 -0
  621. package/apps/sessrumnir/src/shared/council-config.ts +356 -0
  622. package/apps/sessrumnir/src/shared/default-settings.ts +39 -0
  623. package/apps/sessrumnir/src/shared/folder-drop.test.ts +118 -0
  624. package/apps/sessrumnir/src/shared/folder-drop.ts +74 -0
  625. package/apps/sessrumnir/src/shared/fork-point.test.ts +30 -0
  626. package/apps/sessrumnir/src/shared/fork-point.ts +24 -0
  627. package/apps/sessrumnir/src/shared/i18n/i18next.d.ts +10 -0
  628. package/apps/sessrumnir/src/shared/i18n/index.test.ts +51 -0
  629. package/apps/sessrumnir/src/shared/i18n/index.ts +50 -0
  630. package/apps/sessrumnir/src/shared/i18n/languages.ts +12 -0
  631. package/apps/sessrumnir/src/shared/i18n/locale-checks.ts +98 -0
  632. package/apps/sessrumnir/src/shared/i18n/locales.test.ts +92 -0
  633. package/apps/sessrumnir/src/shared/i18n/pseudo.test.ts +39 -0
  634. package/apps/sessrumnir/src/shared/i18n/pseudo.ts +44 -0
  635. package/apps/sessrumnir/src/shared/i18n/resolve.test.ts +43 -0
  636. package/apps/sessrumnir/src/shared/i18n/resolve.ts +41 -0
  637. package/apps/sessrumnir/src/shared/i18n/resources.ts +11 -0
  638. package/apps/sessrumnir/src/shared/ipc-contracts.ts +1539 -0
  639. package/apps/sessrumnir/src/shared/models-config.test.ts +124 -0
  640. package/apps/sessrumnir/src/shared/models-config.ts +167 -0
  641. package/apps/sessrumnir/src/shared/package-filter.ts +19 -0
  642. package/apps/sessrumnir/src/shared/package-spec.test.ts +51 -0
  643. package/apps/sessrumnir/src/shared/package-spec.ts +25 -0
  644. package/apps/sessrumnir/src/shared/path-compare.test.ts +38 -0
  645. package/apps/sessrumnir/src/shared/path-compare.ts +76 -0
  646. package/apps/sessrumnir/src/shared/permission-mode.ts +8 -0
  647. package/apps/sessrumnir/src/shared/pi-command.test.ts +165 -0
  648. package/apps/sessrumnir/src/shared/pi-command.ts +139 -0
  649. package/apps/sessrumnir/src/shared/product-name.ts +7 -0
  650. package/apps/sessrumnir/src/shared/session-lineage.test.ts +103 -0
  651. package/apps/sessrumnir/src/shared/session-lineage.ts +50 -0
  652. package/apps/sessrumnir/src/shared/session-preview.test.ts +93 -0
  653. package/apps/sessrumnir/src/shared/session-preview.ts +56 -0
  654. package/apps/sessrumnir/src/shared/sidebar-width.test.ts +58 -0
  655. package/apps/sessrumnir/src/shared/sidebar-width.ts +37 -0
  656. package/apps/sessrumnir/src/shared/theme/builtin-ids.ts +16 -0
  657. package/apps/sessrumnir/src/shared/theme/resolve.test.ts +66 -0
  658. package/apps/sessrumnir/src/shared/theme/resolve.ts +29 -0
  659. package/apps/sessrumnir/src/shared/theme/syntax-defaults.ts +24 -0
  660. package/apps/sessrumnir/src/shared/theme/theme-file.test.ts +88 -0
  661. package/apps/sessrumnir/src/shared/theme/theme-file.ts +132 -0
  662. package/apps/sessrumnir/src/shared/theme/tokens.test.ts +35 -0
  663. package/apps/sessrumnir/src/shared/theme/tokens.ts +86 -0
  664. package/apps/sessrumnir/src/shared/tsconfig.json +17 -0
  665. package/apps/sessrumnir/src/shared/untrusted-data.test.ts +32 -0
  666. package/apps/sessrumnir/src/shared/untrusted-data.ts +22 -0
  667. package/apps/sessrumnir/src/shared/version-compare.test.ts +33 -0
  668. package/apps/sessrumnir/src/shared/version-compare.ts +50 -0
  669. package/apps/sessrumnir/src/shared/workflow-control.ts +33 -0
  670. package/apps/sessrumnir/src/web-server.ts +315 -0
  671. package/apps/sessrumnir/tsconfig.json +26 -0
  672. package/apps/smidja/smidja_build.py +45 -0
  673. package/apps/smidja/smidja_build_review.py +76 -0
  674. package/apps/smidja/smidja_build_test.py +79 -0
  675. package/apps/smidja/smidja_document.py +76 -0
  676. package/apps/smidja/smidja_modules/agent_cc.py +15 -0
  677. package/apps/smidja/smidja_modules/agent_opencode.py +194 -0
  678. package/apps/smidja/smidja_modules/agent_pi.py +392 -0
  679. package/apps/smidja/smidja_modules/agents.py +993 -0
  680. package/apps/smidja/smidja_modules/changes.py +103 -0
  681. package/apps/smidja/smidja_modules/console.py +131 -0
  682. package/apps/smidja/smidja_modules/data_types.py +447 -0
  683. package/apps/smidja/smidja_modules/gates.py +108 -0
  684. package/apps/smidja/smidja_modules/git_helper.py +120 -0
  685. package/apps/smidja/smidja_modules/lm_local.py +144 -0
  686. package/apps/smidja/smidja_modules/permissions.py +194 -0
  687. package/apps/smidja/smidja_modules/prompts.py +21 -0
  688. package/apps/smidja/smidja_modules/quality.py +240 -0
  689. package/apps/smidja/smidja_modules/runner.py +155 -0
  690. package/apps/smidja/smidja_modules/session.py +50 -0
  691. package/apps/smidja/smidja_modules/stall_watch.py +149 -0
  692. package/apps/smidja/smidja_modules/tracer.py +271 -0
  693. package/apps/smidja/smidja_modules/utils.py +77 -0
  694. package/apps/smidja/smidja_orchestrate.py +162 -0
  695. package/apps/smidja/smidja_plan.py +45 -0
  696. package/apps/smidja/smidja_plan_build.py +55 -0
  697. package/apps/smidja/smidja_plan_build_test.py +86 -0
  698. package/apps/smidja/smidja_plan_build_test_quality.py +98 -0
  699. package/apps/smidja/smidja_prompt.py +44 -0
  700. package/apps/smidja/smidja_quality.py +49 -0
  701. package/apps/smidja/smidja_recon_iv.py +202 -0
  702. package/apps/smidja/smidja_scout.py +45 -0
  703. package/apps/smidja/smidja_simple_sdlc.py +183 -0
  704. package/apps/smidja/smidja_smidja_config/smidja.config.yaml +143 -0
  705. package/apps/smidja-factory/AGENTS.md +165 -0
  706. package/apps/smidja-factory/README.md +3 -0
  707. package/apps/smidja-factory/SKILL.md +18 -0
  708. package/apps/smidja-factory/apps/visualizer/.oxlintrc.json +18 -0
  709. package/apps/smidja-factory/apps/visualizer/bun.lock +269 -0
  710. package/apps/smidja-factory/apps/visualizer/desktop/icon.png +0 -0
  711. package/apps/smidja-factory/apps/visualizer/desktop/main.js +140 -0
  712. package/apps/smidja-factory/apps/visualizer/desktop/package-lock.json +871 -0
  713. package/apps/smidja-factory/apps/visualizer/desktop/package.json +18 -0
  714. package/apps/smidja-factory/apps/visualizer/desktop/preload.js +19 -0
  715. package/apps/smidja-factory/apps/visualizer/index.html +28 -0
  716. package/apps/smidja-factory/apps/visualizer/package.json +31 -0
  717. package/apps/smidja-factory/apps/visualizer/public/icon.svg +7 -0
  718. package/apps/smidja-factory/apps/visualizer/public/models/claude.png +0 -0
  719. package/apps/smidja-factory/apps/visualizer/public/models/gemini.png +0 -0
  720. package/apps/smidja-factory/apps/visualizer/public/models/kimi.png +0 -0
  721. package/apps/smidja-factory/apps/visualizer/public/models/openai.png +0 -0
  722. package/apps/smidja-factory/apps/visualizer/public/models/zai.png +0 -0
  723. package/apps/smidja-factory/apps/visualizer/server/chat.ts +425 -0
  724. package/apps/smidja-factory/apps/visualizer/server/db.ts +1050 -0
  725. package/apps/smidja-factory/apps/visualizer/server/index.ts +648 -0
  726. package/apps/smidja-factory/apps/visualizer/server/model-catalog.ts +90 -0
  727. package/apps/smidja-factory/apps/visualizer/server/roster-api.ts +75 -0
  728. package/apps/smidja-factory/apps/visualizer/server/roster_resolve.py +170 -0
  729. package/apps/smidja-factory/apps/visualizer/server/settings.ts +106 -0
  730. package/apps/smidja-factory/apps/visualizer/shared/types.ts +630 -0
  731. package/apps/smidja-factory/apps/visualizer/src/App.vue +379 -0
  732. package/apps/smidja-factory/apps/visualizer/src/components/ChatInput.vue +155 -0
  733. package/apps/smidja-factory/apps/visualizer/src/components/ChatThread.vue +219 -0
  734. package/apps/smidja-factory/apps/visualizer/src/components/ChatView.vue +335 -0
  735. package/apps/smidja-factory/apps/visualizer/src/components/DecisionsView.vue +177 -0
  736. package/apps/smidja-factory/apps/visualizer/src/components/DetailSection.vue +76 -0
  737. package/apps/smidja-factory/apps/visualizer/src/components/MemoryView.vue +397 -0
  738. package/apps/smidja-factory/apps/visualizer/src/components/PhaseDetail.vue +1354 -0
  739. package/apps/smidja-factory/apps/visualizer/src/components/PhaseDots.vue +55 -0
  740. package/apps/smidja-factory/apps/visualizer/src/components/SessionCard.vue +583 -0
  741. package/apps/smidja-factory/apps/visualizer/src/components/SessionMiniCard.vue +58 -0
  742. package/apps/smidja-factory/apps/visualizer/src/components/SessionPanel.vue +272 -0
  743. package/apps/smidja-factory/apps/visualizer/src/components/SessionStartForm.vue +152 -0
  744. package/apps/smidja-factory/apps/visualizer/src/components/SessionTrace.vue +1157 -0
  745. package/apps/smidja-factory/apps/visualizer/src/components/SessionsList.vue +96 -0
  746. package/apps/smidja-factory/apps/visualizer/src/components/SettingsView.vue +152 -0
  747. package/apps/smidja-factory/apps/visualizer/src/components/StatChip.vue +98 -0
  748. package/apps/smidja-factory/apps/visualizer/src/components/StatsView.vue +382 -0
  749. package/apps/smidja-factory/apps/visualizer/src/components/StatusChip.vue +73 -0
  750. package/apps/smidja-factory/apps/visualizer/src/components/ToolCallCard.vue +156 -0
  751. package/apps/smidja-factory/apps/visualizer/src/lib/api.ts +177 -0
  752. package/apps/smidja-factory/apps/visualizer/src/lib/chat-api.ts +95 -0
  753. package/apps/smidja-factory/apps/visualizer/src/lib/chat-store.ts +351 -0
  754. package/apps/smidja-factory/apps/visualizer/src/lib/events.ts +131 -0
  755. package/apps/smidja-factory/apps/visualizer/src/lib/format.ts +92 -0
  756. package/apps/smidja-factory/apps/visualizer/src/lib/highlight.ts +54 -0
  757. package/apps/smidja-factory/apps/visualizer/src/lib/markdown.ts +120 -0
  758. package/apps/smidja-factory/apps/visualizer/src/lib/models.ts +42 -0
  759. package/apps/smidja-factory/apps/visualizer/src/lib/router.ts +67 -0
  760. package/apps/smidja-factory/apps/visualizer/src/lib/types.ts +61 -0
  761. package/apps/smidja-factory/apps/visualizer/src/main.ts +13 -0
  762. package/apps/smidja-factory/apps/visualizer/src/style.css +592 -0
  763. package/apps/smidja-factory/apps/visualizer/tsconfig.json +30 -0
  764. package/apps/smidja-factory/apps/visualizer/vite.config.js +32 -0
  765. package/apps/smidja-factory/apps/visualizer/vite.config.ts +31 -0
  766. package/apps/smidja-factory/cookbooks/create_config.md +61 -0
  767. package/apps/smidja-factory/cookbooks/create_smidja.md +120 -0
  768. package/apps/smidja-factory/cookbooks/how_to_prompt_for_the_eng.md +110 -0
  769. package/apps/smidja-factory/cookbooks/install.md +56 -0
  770. package/apps/smidja-factory/cookbooks/run_smidja.md +122 -0
  771. package/apps/smidja-factory/cookbooks/smidja_overview.md +88 -0
  772. package/apps/smidja-factory/cookbooks/update_config.md +103 -0
  773. package/apps/smidja-factory/cookbooks/update_modules.md +100 -0
  774. package/apps/smidja-factory/cookbooks/update_smidja.md +90 -0
  775. package/apps/smidja-factory/docs/enhancement-plan.md +420 -0
  776. package/apps/smidja-factory/references/config.md +202 -0
  777. package/apps/smidja-factory/references/handoff.md +161 -0
  778. package/apps/smidja-factory/references/observability.md +166 -0
  779. package/apps/smidja-factory/scripts/install.py +113 -0
  780. package/apps/smidja-factory/scripts/make_config.py +35 -0
  781. package/apps/smidja-factory/scripts/make_smidja.py +119 -0
  782. package/apps/smidja-factory/skills/add-or-edit-ai-models/SKILL.md +151 -0
  783. package/apps/smidja-factory/skills/create-new-agent/SKILL.md +125 -0
  784. package/apps/smidja-factory/skills/create-new-teams/SKILL.md +151 -0
  785. package/apps/smidja-factory/skills/git-ops/README.md +25 -0
  786. package/apps/smidja-factory/skills/git-ops/SKILL.md +18 -0
  787. package/apps/smidja-factory/skills/git-ops/create_branch.sh +79 -0
  788. package/apps/smidja-factory/skills/git-ops/safe_commit.sh +82 -0
  789. package/apps/smidja-factory/skills/git-ops/sync_upstream.sh +94 -0
  790. package/apps/smidja-factory/skills/how-to-run-agent-teams/SKILL.md +117 -0
  791. package/apps/smidja-factory/skills/smidja-instructions/SKILL.md +168 -0
  792. package/apps/smidja-factory/skills/smidja-launcher/SKILL.md +155 -0
  793. package/apps/smidja-factory/skills/smidja-start/SKILL.md +266 -0
  794. package/apps/smidja-factory/skills/volundr/SKILL.md +232 -0
  795. package/apps/smidja-factory/skills/volundr/prompt/dispatch-prompt.md +91 -0
  796. package/apps/smidja-factory/skills/volundr/prompt/volundr-system.md +63 -0
  797. package/apps/smidja-factory/skills/volundr/scripts/volundr-observe.py +52 -0
  798. package/apps/smidja-factory/skills/volundr/scripts/volundr-recall.py +54 -0
  799. package/apps/smidja-factory/skills/volundr/scripts/volundr-status.py +51 -0
  800. package/apps/smidja-factory/skills/volundr/scripts/volundr-teach.py +47 -0
  801. package/apps/smidja-factory/templates/env.sample +28 -0
  802. package/apps/smidja-factory/templates/harness_engineering/subagents.ts +706 -0
  803. package/apps/smidja-factory/templates/harness_engineering/themeMap.ts +145 -0
  804. package/apps/smidja-factory/templates/justfile +89 -0
  805. package/apps/smidja-factory/templates/prompt_engineering/builder/system.md +13 -0
  806. package/apps/smidja-factory/templates/prompt_engineering/builder/user.md +34 -0
  807. package/apps/smidja-factory/templates/prompt_engineering/documenter/system.md +17 -0
  808. package/apps/smidja-factory/templates/prompt_engineering/documenter/user.md +48 -0
  809. package/apps/smidja-factory/templates/prompt_engineering/orchestrator/system.md +55 -0
  810. package/apps/smidja-factory/templates/prompt_engineering/orchestrator/user.md +39 -0
  811. package/apps/smidja-factory/templates/prompt_engineering/planner/system.md +21 -0
  812. package/apps/smidja-factory/templates/prompt_engineering/planner/user.md +45 -0
  813. package/apps/smidja-factory/templates/prompt_engineering/recon_orchestrator/system.md +51 -0
  814. package/apps/smidja-factory/templates/prompt_engineering/recon_orchestrator/user.md +26 -0
  815. package/apps/smidja-factory/templates/prompt_engineering/reviewer/system.md +16 -0
  816. package/apps/smidja-factory/templates/prompt_engineering/reviewer/user.md +44 -0
  817. package/apps/smidja-factory/templates/prompt_engineering/scout/system.md +32 -0
  818. package/apps/smidja-factory/templates/prompt_engineering/scout/user.md +34 -0
  819. package/apps/smidja-factory/templates/smidja/smidja_build.py +45 -0
  820. package/apps/smidja-factory/templates/smidja/smidja_build_review.py +76 -0
  821. package/apps/smidja-factory/templates/smidja/smidja_build_test.py +79 -0
  822. package/apps/smidja-factory/templates/smidja/smidja_document.py +76 -0
  823. package/apps/smidja-factory/templates/smidja/smidja_modules/agent_cc.py +15 -0
  824. package/apps/smidja-factory/templates/smidja/smidja_modules/agent_opencode.py +194 -0
  825. package/apps/smidja-factory/templates/smidja/smidja_modules/agent_pi.py +392 -0
  826. package/apps/smidja-factory/templates/smidja/smidja_modules/agents.py +993 -0
  827. package/apps/smidja-factory/templates/smidja/smidja_modules/changes.py +103 -0
  828. package/apps/smidja-factory/templates/smidja/smidja_modules/console.py +131 -0
  829. package/apps/smidja-factory/templates/smidja/smidja_modules/data_types.py +447 -0
  830. package/apps/smidja-factory/templates/smidja/smidja_modules/gates.py +108 -0
  831. package/apps/smidja-factory/templates/smidja/smidja_modules/git_helper.py +120 -0
  832. package/apps/smidja-factory/templates/smidja/smidja_modules/lm_local.py +144 -0
  833. package/apps/smidja-factory/templates/smidja/smidja_modules/permissions.py +194 -0
  834. package/apps/smidja-factory/templates/smidja/smidja_modules/prompts.py +21 -0
  835. package/apps/smidja-factory/templates/smidja/smidja_modules/quality.py +240 -0
  836. package/apps/smidja-factory/templates/smidja/smidja_modules/runner.py +155 -0
  837. package/apps/smidja-factory/templates/smidja/smidja_modules/session.py +50 -0
  838. package/apps/smidja-factory/templates/smidja/smidja_modules/stall_watch.py +149 -0
  839. package/apps/smidja-factory/templates/smidja/smidja_modules/tracer.py +271 -0
  840. package/apps/smidja-factory/templates/smidja/smidja_modules/utils.py +77 -0
  841. package/apps/smidja-factory/templates/smidja/smidja_orchestrate.py +162 -0
  842. package/apps/smidja-factory/templates/smidja/smidja_plan.py +45 -0
  843. package/apps/smidja-factory/templates/smidja/smidja_plan_build.py +55 -0
  844. package/apps/smidja-factory/templates/smidja/smidja_plan_build_test.py +86 -0
  845. package/apps/smidja-factory/templates/smidja/smidja_plan_build_test_quality.py +98 -0
  846. package/apps/smidja-factory/templates/smidja/smidja_prompt.py +44 -0
  847. package/apps/smidja-factory/templates/smidja/smidja_quality.py +49 -0
  848. package/apps/smidja-factory/templates/smidja/smidja_recon_iv.py +202 -0
  849. package/apps/smidja-factory/templates/smidja/smidja_scout.py +45 -0
  850. package/apps/smidja-factory/templates/smidja/smidja_simple_sdlc.py +183 -0
  851. package/apps/smidja-factory/templates/smidja.config.yaml +143 -0
  852. package/bin/app-build.sh +36 -0
  853. package/bin/electron-lib.sh +25 -0
  854. package/bin/sessrumnir.sh +1 -1
  855. package/bin/ymir-install.sh +7 -0
  856. package/install.sh +88 -0
  857. package/package.json +16 -7
  858. package/scripts/electron.sh +6 -2
  859. package/.agents/bus/messages.json +0 -1
  860. package/.agents/config/agents.machine.example.yaml +0 -16
  861. package/.pi/mcp.json +0 -16
  862. package/assets/reference/state/.branch-eligible-owner +0 -4
  863. package/assets/reference/state/.branch-mirror-cursor +0 -1
  864. package/assets/reference/state/.branch-outcomes-cursor +0 -1
  865. package/assets/reference/state/.branch-session +0 -1
  866. package/assets/reference/state/.count-default_wF_p5 +0 -1
  867. package/assets/reference/state/.count-default_wF_p6 +0 -1
  868. package/assets/reference/state/.count-default_wR_p2 +0 -1
  869. package/assets/reference/state/.count-default_wS_p2 +0 -1
  870. package/assets/reference/state/.count-firstmate_fm-server-knowledge +0 -1
  871. package/assets/reference/state/.hash-default_wF_p5 +0 -1
  872. package/assets/reference/state/.hash-default_wF_p6 +0 -1
  873. package/assets/reference/state/.hash-default_wR_p2 +0 -1
  874. package/assets/reference/state/.hash-default_wS_p2 +0 -1
  875. package/assets/reference/state/.hash-firstmate_fm-server-knowledge +0 -1
  876. package/assets/reference/state/.heartbeat-streak +0 -1
  877. package/assets/reference/state/.inactive-outcome-reconcile +0 -2
  878. package/assets/reference/state/.lock +0 -1
  879. package/assets/reference/state/.pi-branch-extension-loaded +0 -1
  880. package/assets/reference/state/.pi-turnend-extension-loaded +0 -2
  881. package/assets/reference/state/.pi-watch-extension-loaded +0 -2
  882. package/assets/reference/state/.seen-server-knowledge_turn-ended +0 -1
  883. package/assets/reference/state/.session-start-agents-baseline +0 -2
  884. package/assets/reference/state/.session-start-complete +0 -1
  885. package/assets/reference/state/.stale-default_wF_p5 +0 -1
  886. package/assets/reference/state/.stale-default_wR_p2 +0 -1
  887. package/assets/reference/state/.stale-firstmate_fm-server-knowledge +0 -1
  888. package/assets/reference/state/.stale-since-default_wF_p5 +0 -1
  889. package/assets/reference/state/.stale-since-default_wR_p2 +0 -1
  890. package/assets/reference/state/.stale-since-firstmate_fm-server-knowledge +0 -1
  891. package/assets/reference/state/.startup-network.delivered +0 -1
  892. package/assets/reference/state/.startup-network.report +0 -1
  893. package/assets/reference/state/.startup-network.status +0 -10
  894. package/assets/reference/state/.startup-network.timings +0 -6
  895. package/assets/reference/state/.trace-context-effective +0 -1
  896. package/assets/reference/state/.wake-queue +0 -0
  897. package/assets/reference/state/.wake-queue.seq +0 -1
  898. package/assets/reference/state/.wake-rows.consume.BcqXSq +0 -0
  899. package/assets/reference/state/.wake-rows.consume.NDZZei +0 -0
  900. package/assets/reference/state/.wake-rows.consume.VGkhYm +0 -0
  901. package/assets/reference/state/.wake-rows.consume.tR2rTy +0 -0
  902. package/assets/reference/state/.watch-arm-output.3581p6 +0 -0
  903. package/assets/reference/state/.watch-arm-output.3ciDNP +0 -0
  904. package/assets/reference/state/.watch-arm-output.SksR6k +0 -0
  905. package/assets/reference/state/.watch-cycle-exits.log +0 -22
  906. package/assets/reference/state/.watch-deliveries.log +0 -19
  907. package/assets/reference/state/.watch-triage.log +0 -38
  908. package/assets/reference/state/.watch.lock/fm-home +0 -1
  909. package/assets/reference/state/.watch.lock/pid +0 -1
  910. package/assets/reference/state/.watch.lock/pid-identity +0 -1
  911. package/assets/reference/state/.watch.lock/watcher-path +0 -1
  912. package/assets/reference/state/.watch.lock.owner.qqbxmS/fm-home +0 -1
  913. package/assets/reference/state/.watch.lock.owner.qqbxmS/pid +0 -1
  914. package/assets/reference/state/.watch.lock.owner.qqbxmS/pid-identity +0 -1
  915. package/assets/reference/state/.watch.lock.owner.qqbxmS/watcher-path +0 -1
  916. package/assets/reference/state/.watcher-down +0 -1
  917. package/assets/reference/state/branch-outcomes.jsonl +0 -1
  918. package/assets/reference/state/branch-session/2026-09-04T16-49-38-671Z_01a06d53-6b6f-7619-930d-e6dfd9a4a29e.jsonl +0 -211
  919. package/assets/reference/state/home-summary.json +0 -42
  920. package/assets/reference/state/server-knowledge.busy-gen +0 -1
  921. package/assets/reference/state/server-knowledge.busy-state +0 -1
  922. package/assets/reference/state/server-knowledge.herdr-presentation +0 -12
  923. package/assets/reference/state/server-knowledge.meta +0 -18
  924. package/assets/reference/state/server-knowledge.pi-ext.ts +0 -26
  925. package/assets/reference/state/server-knowledge.turn-ended +0 -0
  926. /package/{assets/reference/state/.last-check → apps/hlidskjalf/src/app/.gitkeep} +0 -0
  927. /package/{assets/reference/state/.last-heartbeat → apps/hlidskjalf/src/components/.gitkeep} +0 -0
  928. /package/{assets/reference/state/.last-watcher-beat → apps/hlidskjalf/src/services/.gitkeep} +0 -0
  929. /package/{assets/reference/state/.main-eligible-rows.tmp.p2HMKo → apps/smidja/smidja_modules/__init__.py} +0 -0
  930. /package/{assets/reference/state/.main-eligible-rows.tmp.Exxm82 → apps/smidja-factory/templates/smidja/smidja_modules/__init__.py} +0 -0
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <resources>
3
+
4
+ <!-- Base application theme. -->
5
+ <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
6
+ <!-- Customize your theme here. -->
7
+ <item name="colorPrimary">@color/colorPrimary</item>
8
+ <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
9
+ <item name="colorAccent">@color/colorAccent</item>
10
+ </style>
11
+
12
+ <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
13
+ <item name="windowActionBar">false</item>
14
+ <item name="windowNoTitle">true</item>
15
+ <item name="android:background">@null</item>
16
+ </style>
17
+
18
+
19
+ <style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
20
+ <item name="android:background">@drawable/splash</item>
21
+ </style>
22
+ </resources>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <paths xmlns:android="http://schemas.android.com/apk/res/android">
3
+ <external-path name="my_images" path="." />
4
+ <cache-path name="my_cache_images" path="." />
5
+ </paths>
@@ -0,0 +1,18 @@
1
+ package com.getcapacitor.myapp;
2
+
3
+ import static org.junit.Assert.*;
4
+
5
+ import org.junit.Test;
6
+
7
+ /**
8
+ * Example local unit test, which will execute on the development machine (host).
9
+ *
10
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
11
+ */
12
+ public class ExampleUnitTest {
13
+
14
+ @Test
15
+ public void addition_isCorrect() throws Exception {
16
+ assertEquals(4, 2 + 2);
17
+ }
18
+ }
@@ -0,0 +1,29 @@
1
+ // Top-level build file where you can add configuration options common to all sub-projects/modules.
2
+
3
+ buildscript {
4
+
5
+ repositories {
6
+ google()
7
+ mavenCentral()
8
+ }
9
+ dependencies {
10
+ classpath 'com.android.tools.build:gradle:8.2.1'
11
+ classpath 'com.google.gms:google-services:4.4.0'
12
+
13
+ // NOTE: Do not place your application dependencies here; they belong
14
+ // in the individual module build.gradle files
15
+ }
16
+ }
17
+
18
+ apply from: "variables.gradle"
19
+
20
+ allprojects {
21
+ repositories {
22
+ google()
23
+ mavenCentral()
24
+ }
25
+ }
26
+
27
+ task clean(type: Delete) {
28
+ delete rootProject.buildDir
29
+ }
@@ -0,0 +1,3 @@
1
+ // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
2
+ include ':capacitor-android'
3
+ project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
@@ -0,0 +1,7 @@
1
+ distributionBase=GRADLE_USER_HOME
2
+ distributionPath=wrapper/dists
3
+ distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip
4
+ networkTimeout=10000
5
+ validateDistributionUrl=true
6
+ zipStoreBase=GRADLE_USER_HOME
7
+ zipStorePath=wrapper/dists
@@ -0,0 +1,22 @@
1
+ # Project-wide Gradle settings.
2
+
3
+ # IDE (e.g. Android Studio) users:
4
+ # Gradle settings configured through the IDE *will override*
5
+ # any settings specified in this file.
6
+
7
+ # For more details on how to configure your build environment visit
8
+ # http://www.gradle.org/docs/current/userguide/build_environment.html
9
+
10
+ # Specifies the JVM arguments used for the daemon process.
11
+ # The setting is particularly useful for tweaking memory settings.
12
+ org.gradle.jvmargs=-Xmx1536m
13
+
14
+ # When configured, Gradle will run in incubating parallel mode.
15
+ # This option should only be used with decoupled projects. More details, visit
16
+ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17
+ # org.gradle.parallel=true
18
+
19
+ # AndroidX package structure to make it clearer which packages are bundled with the
20
+ # Android operating system, and which are packaged with your app's APK
21
+ # https://developer.android.com/topic/libraries/support-library/androidx-rn
22
+ android.useAndroidX=true
@@ -0,0 +1,248 @@
1
+ #!/bin/sh
2
+
3
+ #
4
+ # Copyright © 2015-2021 the original authors.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # https://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ ##############################################################################
20
+ #
21
+ # Gradle start up script for POSIX generated by Gradle.
22
+ #
23
+ # Important for running:
24
+ #
25
+ # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
26
+ # noncompliant, but you have some other compliant shell such as ksh or
27
+ # bash, then to run this script, type that shell name before the whole
28
+ # command line, like:
29
+ #
30
+ # ksh Gradle
31
+ #
32
+ # Busybox and similar reduced shells will NOT work, because this script
33
+ # requires all of these POSIX shell features:
34
+ # * functions;
35
+ # * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
36
+ # «${var#prefix}», «${var%suffix}», and «$( cmd )»;
37
+ # * compound commands having a testable exit status, especially «case»;
38
+ # * various built-in commands including «command», «set», and «ulimit».
39
+ #
40
+ # Important for patching:
41
+ #
42
+ # (2) This script targets any POSIX shell, so it avoids extensions provided
43
+ # by Bash, Ksh, etc; in particular arrays are avoided.
44
+ #
45
+ # The "traditional" practice of packing multiple parameters into a
46
+ # space-separated string is a well documented source of bugs and security
47
+ # problems, so this is (mostly) avoided, by progressively accumulating
48
+ # options in "$@", and eventually passing that to Java.
49
+ #
50
+ # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
51
+ # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
52
+ # see the in-line comments for details.
53
+ #
54
+ # There are tweaks for specific operating systems such as AIX, CygWin,
55
+ # Darwin, MinGW, and NonStop.
56
+ #
57
+ # (3) This script is generated from the Groovy template
58
+ # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
59
+ # within the Gradle project.
60
+ #
61
+ # You can find Gradle at https://github.com/gradle/gradle/.
62
+ #
63
+ ##############################################################################
64
+
65
+ # Attempt to set APP_HOME
66
+
67
+ # Resolve links: $0 may be a link
68
+ app_path=$0
69
+
70
+ # Need this for daisy-chained symlinks.
71
+ while
72
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
73
+ [ -h "$app_path" ]
74
+ do
75
+ ls=$( ls -ld "$app_path" )
76
+ link=${ls#*' -> '}
77
+ case $link in #(
78
+ /*) app_path=$link ;; #(
79
+ *) app_path=$APP_HOME$link ;;
80
+ esac
81
+ done
82
+
83
+ # This is normally unused
84
+ # shellcheck disable=SC2034
85
+ APP_BASE_NAME=${0##*/}
86
+ APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
87
+
88
+ # Use the maximum available, or set MAX_FD != -1 to use that value.
89
+ MAX_FD=maximum
90
+
91
+ warn () {
92
+ echo "$*"
93
+ } >&2
94
+
95
+ die () {
96
+ echo
97
+ echo "$*"
98
+ echo
99
+ exit 1
100
+ } >&2
101
+
102
+ # OS specific support (must be 'true' or 'false').
103
+ cygwin=false
104
+ msys=false
105
+ darwin=false
106
+ nonstop=false
107
+ case "$( uname )" in #(
108
+ CYGWIN* ) cygwin=true ;; #(
109
+ Darwin* ) darwin=true ;; #(
110
+ MSYS* | MINGW* ) msys=true ;; #(
111
+ NONSTOP* ) nonstop=true ;;
112
+ esac
113
+
114
+ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
115
+
116
+
117
+ # Determine the Java command to use to start the JVM.
118
+ if [ -n "$JAVA_HOME" ] ; then
119
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
120
+ # IBM's JDK on AIX uses strange locations for the executables
121
+ JAVACMD=$JAVA_HOME/jre/sh/java
122
+ else
123
+ JAVACMD=$JAVA_HOME/bin/java
124
+ fi
125
+ if [ ! -x "$JAVACMD" ] ; then
126
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
127
+
128
+ Please set the JAVA_HOME variable in your environment to match the
129
+ location of your Java installation."
130
+ fi
131
+ else
132
+ JAVACMD=java
133
+ if ! command -v java >/dev/null 2>&1
134
+ then
135
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
136
+
137
+ Please set the JAVA_HOME variable in your environment to match the
138
+ location of your Java installation."
139
+ fi
140
+ fi
141
+
142
+ # Increase the maximum file descriptors if we can.
143
+ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
144
+ case $MAX_FD in #(
145
+ max*)
146
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
147
+ # shellcheck disable=SC3045
148
+ MAX_FD=$( ulimit -H -n ) ||
149
+ warn "Could not query maximum file descriptor limit"
150
+ esac
151
+ case $MAX_FD in #(
152
+ '' | soft) :;; #(
153
+ *)
154
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
155
+ # shellcheck disable=SC3045
156
+ ulimit -n "$MAX_FD" ||
157
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
158
+ esac
159
+ fi
160
+
161
+ # Collect all arguments for the java command, stacking in reverse order:
162
+ # * args from the command line
163
+ # * the main class name
164
+ # * -classpath
165
+ # * -D...appname settings
166
+ # * --module-path (only if needed)
167
+ # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
168
+
169
+ # For Cygwin or MSYS, switch paths to Windows format before running java
170
+ if "$cygwin" || "$msys" ; then
171
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
172
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
173
+
174
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
175
+
176
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
177
+ for arg do
178
+ if
179
+ case $arg in #(
180
+ -*) false ;; # don't mess with options #(
181
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
182
+ [ -e "$t" ] ;; #(
183
+ *) false ;;
184
+ esac
185
+ then
186
+ arg=$( cygpath --path --ignore --mixed "$arg" )
187
+ fi
188
+ # Roll the args list around exactly as many times as the number of
189
+ # args, so each arg winds up back in the position where it started, but
190
+ # possibly modified.
191
+ #
192
+ # NB: a `for` loop captures its iteration list before it begins, so
193
+ # changing the positional parameters here affects neither the number of
194
+ # iterations, nor the values presented in `arg`.
195
+ shift # remove old arg
196
+ set -- "$@" "$arg" # push replacement arg
197
+ done
198
+ fi
199
+
200
+
201
+ # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
202
+ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
203
+
204
+ # Collect all arguments for the java command;
205
+ # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
206
+ # shell script including quotes and variable substitutions, so put them in
207
+ # double quotes to make sure that they get re-expanded; and
208
+ # * put everything else in single quotes, so that it's not re-expanded.
209
+
210
+ set -- \
211
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
212
+ -classpath "$CLASSPATH" \
213
+ org.gradle.wrapper.GradleWrapperMain \
214
+ "$@"
215
+
216
+ # Stop when "xargs" is not available.
217
+ if ! command -v xargs >/dev/null 2>&1
218
+ then
219
+ die "xargs is not available"
220
+ fi
221
+
222
+ # Use "xargs" to parse quoted args.
223
+ #
224
+ # With -n1 it outputs one arg per line, with the quotes and backslashes removed.
225
+ #
226
+ # In Bash we could simply go:
227
+ #
228
+ # readarray ARGS < <( xargs -n1 <<<"$var" ) &&
229
+ # set -- "${ARGS[@]}" "$@"
230
+ #
231
+ # but POSIX shell has neither arrays nor command substitution, so instead we
232
+ # post-process each arg (as a line of input to sed) to backslash-escape any
233
+ # character that might be a shell metacharacter, then use eval to reverse
234
+ # that process (while maintaining the separation between arguments), and wrap
235
+ # the whole thing up as a single "set" statement.
236
+ #
237
+ # This will of course break if any of these variables contains a newline or
238
+ # an unmatched quote.
239
+ #
240
+
241
+ eval "set -- $(
242
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
243
+ xargs -n1 |
244
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
245
+ tr '\n' ' '
246
+ )" '"$@"'
247
+
248
+ exec "$JAVACMD" "$@"
@@ -0,0 +1,92 @@
1
+ @rem
2
+ @rem Copyright 2015 the original author or authors.
3
+ @rem
4
+ @rem Licensed under the Apache License, Version 2.0 (the "License");
5
+ @rem you may not use this file except in compliance with the License.
6
+ @rem You may obtain a copy of the License at
7
+ @rem
8
+ @rem https://www.apache.org/licenses/LICENSE-2.0
9
+ @rem
10
+ @rem Unless required by applicable law or agreed to in writing, software
11
+ @rem distributed under the License is distributed on an "AS IS" BASIS,
12
+ @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ @rem See the License for the specific language governing permissions and
14
+ @rem limitations under the License.
15
+ @rem
16
+
17
+ @if "%DEBUG%"=="" @echo off
18
+ @rem ##########################################################################
19
+ @rem
20
+ @rem Gradle startup script for Windows
21
+ @rem
22
+ @rem ##########################################################################
23
+
24
+ @rem Set local scope for the variables with windows NT shell
25
+ if "%OS%"=="Windows_NT" setlocal
26
+
27
+ set DIRNAME=%~dp0
28
+ if "%DIRNAME%"=="" set DIRNAME=.
29
+ @rem This is normally unused
30
+ set APP_BASE_NAME=%~n0
31
+ set APP_HOME=%DIRNAME%
32
+
33
+ @rem Resolve any "." and ".." in APP_HOME to make it shorter.
34
+ for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
35
+
36
+ @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
37
+ set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
38
+
39
+ @rem Find java.exe
40
+ if defined JAVA_HOME goto findJavaFromJavaHome
41
+
42
+ set JAVA_EXE=java.exe
43
+ %JAVA_EXE% -version >NUL 2>&1
44
+ if %ERRORLEVEL% equ 0 goto execute
45
+
46
+ echo.
47
+ echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
48
+ echo.
49
+ echo Please set the JAVA_HOME variable in your environment to match the
50
+ echo location of your Java installation.
51
+
52
+ goto fail
53
+
54
+ :findJavaFromJavaHome
55
+ set JAVA_HOME=%JAVA_HOME:"=%
56
+ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
57
+
58
+ if exist "%JAVA_EXE%" goto execute
59
+
60
+ echo.
61
+ echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
62
+ echo.
63
+ echo Please set the JAVA_HOME variable in your environment to match the
64
+ echo location of your Java installation.
65
+
66
+ goto fail
67
+
68
+ :execute
69
+ @rem Setup the command line
70
+
71
+ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
72
+
73
+
74
+ @rem Execute Gradle
75
+ "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
76
+
77
+ :end
78
+ @rem End local scope for the variables with windows NT shell
79
+ if %ERRORLEVEL% equ 0 goto mainEnd
80
+
81
+ :fail
82
+ rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83
+ rem the _cmd.exe /c_ return code!
84
+ set EXIT_CODE=%ERRORLEVEL%
85
+ if %EXIT_CODE% equ 0 set EXIT_CODE=1
86
+ if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
87
+ exit /b %EXIT_CODE%
88
+
89
+ :mainEnd
90
+ if "%OS%"=="Windows_NT" endlocal
91
+
92
+ :omega
@@ -0,0 +1,5 @@
1
+ include ':app'
2
+ include ':capacitor-cordova-android-plugins'
3
+ project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/')
4
+
5
+ apply from: 'capacitor.settings.gradle'
@@ -0,0 +1,16 @@
1
+ ext {
2
+ minSdkVersion = 22
3
+ compileSdkVersion = 34
4
+ targetSdkVersion = 34
5
+ androidxActivityVersion = '1.8.0'
6
+ androidxAppCompatVersion = '1.6.1'
7
+ androidxCoordinatorLayoutVersion = '1.2.0'
8
+ androidxCoreVersion = '1.12.0'
9
+ androidxFragmentVersion = '1.6.2'
10
+ coreSplashScreenVersion = '1.0.1'
11
+ androidxWebkitVersion = '1.9.0'
12
+ junitVersion = '4.13.2'
13
+ androidxJunitVersion = '1.1.5'
14
+ androidxEspressoCoreVersion = '3.5.1'
15
+ cordovaAndroidVersion = '10.1.1'
16
+ }
@@ -0,0 +1,26 @@
1
+ import type { CapacitorConfig } from '@capacitor/cli';
2
+
3
+ // The APK is a thin native shell over the Hlidskjalf web app. Point it at the
4
+ // tunnel by default; change the address later with YMIR_SERVER_URL (e.g. your
5
+ // own server) — no code change needed.
6
+ // Where the app looks for its own gate. A fresh install serves it locally;
7
+ // an operator with a tunnel sets YMIR_SERVER_URL to their own hostname.
8
+ const serverUrl = process.env.YMIR_SERVER_URL ?? 'http://127.0.0.1:3888';
9
+
10
+ const config: CapacitorConfig = {
11
+ appId: 'org.ymir.hlidskjalf',
12
+ appName: 'Ymir',
13
+ webDir: 'dist',
14
+ server: {
15
+ url: serverUrl,
16
+ cleartext: false,
17
+ androidScheme: 'https',
18
+ // Only the host the operator actually serves from, never a fixed domain.
19
+ allowNavigation: [new URL(serverUrl).host],
20
+ },
21
+ android: {
22
+ allowMixedContent: false,
23
+ },
24
+ };
25
+
26
+ export default config;
@@ -0,0 +1 @@
1
+ :root{--ymir-bg-0: #0e0c09;--ymir-bg-1: #151209;--ymir-bg-2: #1a1610;--ymir-bg-3: #221d14;--ymir-cyan-1: #c9973f;--ymir-cyan-2: #7d5f2a;--ymir-violet-1: #96a0a8;--ymir-violet-2: #5f686e;--ymir-steel-1: #2b241a;--ymir-steel-2: #7d5f2a;--ymir-steel-3: #9a8f75;--ymir-chisel: #c9973f;--ymir-ok: #96a0a8;--ymir-warn: #c9973f;--ymir-danger: #c2584a;--ymir-info: #9a8f75;--ymir-ok-dim: rgba(150, 160, 168, .15);--ymir-warn-dim: rgba(201, 151, 79, .15);--ymir-danger-dim: rgba(194, 88, 74, .15);--ymir-info-dim: rgba(154, 143, 117, .15);--ymir-text-0: #cfc3a9;--ymir-text-1: rgba(207, 195, 169, .82);--ymir-text-2: #9a8f75;--ymir-text-3: #6b6250;--ymir-house-ymirlabs: #c9973f;--ymir-house-brokkforge: #f59e0b;--ymir-house-runestone: #f43f5e;--ymir-house-muninn: #8b5cf6;--ymir-house-dvalin: #94a3b8;--ymir-house-utgard: #d946ef;--ymir-house-askr: #34d399;--ymir-house-mannheim: #64748b;--ymir-font-head: "Cormorant", "Noto Sans Runic", Georgia, serif;--ymir-font-mono: "IBM Plex Mono", "Noto Sans Runic", ui-monospace, "Cascadia Mono", monospace;--ymir-font-body: "Newsreader", Georgia, "Noto Sans Runic", serif;--ymir-s-mono-s: 12px / 16px;--ymir-s-mono-m: 14px / 20px;--ymir-s-mono-l: 18px / 24px;--ymir-s-display: clamp(28px, 4vw, 44px) / 1.1;--ymir-s-body: 15px / 22px;--ymir-s-caption: 13px / 18px;--ymir-space-1: 4px;--ymir-space-2: 8px;--ymir-space-3: 12px;--ymir-space-4: 16px;--ymir-space-5: 24px;--ymir-space-6: 32px;--ymir-space-7: 48px;--ymir-radius: 8px;--ymir-radius-panel: 12px;--ymir-border: 1px solid var(--ymir-steel-1);--ymir-bevel: inset 0 0 0 1px rgba(201, 151, 79, .12);--ymir-shadow-panel: 0 1px 2px rgba(0, 0, 0, .5);--ymir-shadow-raise: 0 8px 24px rgba(0, 0, 0, .55);--ymir-dur-fast: .12s;--ymir-dur-task: .18s;--ymir-dur-hop: .22s;--ymir-dur-roll: .24s;--ymir-ease: cubic-bezier(.4, 0, .2, 1)}.tabular{font-variant-numeric:tabular-nums;font-family:var(--ymir-font-mono)}.status-ok{color:var(--ymir-ok);background:var(--ymir-ok-dim)}.status-warn{color:var(--ymir-warn);background:var(--ymir-warn-dim)}.status-danger{color:var(--ymir-danger);background:var(--ymir-danger-dim)}.status-info{color:var(--ymir-info);background:var(--ymir-info-dim)}@media(prefers-reduced-motion:reduce){*{transition-duration:.12s!important;animation-duration:.12s!important}}*,*:before,*:after{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;background:var(--ymir-bg-0);color:var(--ymir-text-0);font-family:var(--ymir-font-body);font-size:15px;line-height:22px;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;overflow:hidden}h1,h2,h3,h4{margin:0;font-family:var(--ymir-font-head);font-weight:600;letter-spacing:.02em;color:var(--ymir-text-0)}p{margin:0}button{font:inherit;color:inherit;background:none;border:none;cursor:pointer}input,textarea{font:inherit;color:inherit}a{color:var(--ymir-cyan-1);text-decoration:none}::selection{background:color-mix(in srgb,var(--ymir-cyan-1) 28%,transparent)}:focus-visible{outline:none;box-shadow:0 0 0 2px var(--ymir-bg-0),0 0 0 4px var(--ymir-chisel);border-radius:var(--ymir-radius)}.mono{font-family:var(--ymir-font-mono);font-variant-numeric:tabular-nums}.cinzel{font-family:var(--ymir-font-head)}.muted{color:var(--ymir-text-2)}.dim{color:var(--ymir-text-3)}.eyebrow{font-family:var(--ymir-font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ymir-text-2)}*{scrollbar-width:thin;scrollbar-color:var(--ymir-steel-1) transparent}*::-webkit-scrollbar{width:10px;height:10px}*::-webkit-scrollbar-track{background:transparent}*::-webkit-scrollbar-thumb{background:var(--ymir-steel-1);border-radius:8px;border:2px solid var(--ymir-bg-0)}*::-webkit-scrollbar-thumb:hover{background:var(--ymir-steel-2)}:root,:root[data-realm=way-of]{--realm-tint: #c9973f;--realm-tint-2: #7d5f2a;--realm-tint-dim: rgba(201, 151, 79, .14)}:root[data-realm=personal]{--realm-tint: #96a0a8;--realm-tint-2: #5f686e;--realm-tint-dim: rgba(150, 160, 168, .14)}:root[data-realm=craig]{--realm-tint: #7d5f2a;--realm-tint-2: #6b6250;--realm-tint-dim: rgba(125, 95, 42, .14)}.row{display:flex;align-items:center;gap:var(--ymir-space-2)}.row-between{display:flex;align-items:center;justify-content:space-between;gap:var(--ymir-space-2)}.col{display:flex;flex-direction:column}.grow{flex:1;min-width:0}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hidden{display:none}.shell{--rail-w: 236px;--topbar-h: 56px;--stream-h: 192px;display:grid;grid-template-columns:var(--rail-w) 1fr;grid-template-rows:var(--topbar-h) minmax(0,1fr) var(--stream-h);grid-template-areas:"rail topbar" "rail stage" "rail stream";height:100%;width:100%;background:radial-gradient(1200px 600px at 18% -10%,var(--realm-tint-dim),transparent 60%),var(--ymir-bg-0);transition:background .22s var(--ymir-ease)}.shell[data-density=compact]{--ymir-s-body: 14px / 20px}.rail{grid-area:rail;display:flex;flex-direction:column;min-height:0;background:linear-gradient(180deg,var(--ymir-bg-1),var(--ymir-bg-0));border-right:1px solid var(--ymir-steel-1);box-shadow:var(--ymir-bevel)}.brand{display:flex;align-items:center;gap:var(--ymir-space-3);height:var(--topbar-h);padding:0 var(--ymir-space-4);border-bottom:1px solid var(--ymir-steel-1);flex-shrink:0}.emblem{width:34px;height:34px;flex-shrink:0;filter:drop-shadow(0 0 8px color-mix(in srgb,var(--ymir-chisel) 25%,transparent))}.brand-mark{width:34px;height:34px;border-radius:9px;flex-shrink:0;box-shadow:var(--ymir-bevel),0 0 14px color-mix(in srgb,var(--ymir-chisel) 18%,transparent)}.login-brand .brand-mark{width:44px;height:44px;border-radius:12px}.wordmark{display:flex;flex-direction:column;line-height:1;min-width:0}.wordmark-name{font-family:var(--ymir-font-head);font-weight:700;font-size:18px;letter-spacing:.22em;color:var(--ymir-text-0)}.wordmark-sub{font-family:var(--ymir-font-mono);font-size:9px;letter-spacing:.32em;color:var(--realm-tint);text-transform:uppercase;margin-top:3px}.nav{display:flex;flex-direction:column;gap:2px;padding:var(--ymir-space-3) var(--ymir-space-2);overflow-y:auto;flex:1;min-height:0}.gate{position:relative;display:flex;align-items:center;gap:var(--ymir-space-3);padding:9px var(--ymir-space-3);border-radius:var(--ymir-radius);color:var(--ymir-text-1);text-align:left;border:1px solid transparent;transition:background var(--ymir-dur-fast) var(--ymir-ease),color var(--ymir-dur-fast) var(--ymir-ease),border-color var(--ymir-dur-fast) var(--ymir-ease)}.gate:hover{background:var(--ymir-bg-2);color:var(--ymir-text-0)}.gate[aria-current=true]{background:var(--realm-tint-dim);color:var(--ymir-text-0);border-color:color-mix(in srgb,var(--realm-tint) 40%,transparent);box-shadow:var(--ymir-bevel)}.gate[aria-current=true]:before{content:"";position:absolute;left:-2px;top:50%;transform:translateY(-50%);width:3px;height:60%;border-radius:2px;background:var(--realm-tint);box-shadow:0 0 8px var(--realm-tint)}.gate-glyph{width:22px;text-align:center;font-family:var(--ymir-font-head);font-size:19px;color:var(--realm-tint);flex-shrink:0}.gate-label{font-size:14px;font-weight:500;flex:1}.gate-count{font-family:var(--ymir-font-mono);font-size:11px;color:var(--ymir-text-2);background:var(--ymir-bg-3);border-radius:999px;padding:1px 7px}.rail-foot{flex-shrink:0;border-top:1px solid var(--ymir-steel-1);padding:var(--ymir-space-3);display:flex;flex-direction:column;gap:var(--ymir-space-3)}.realm-switch{display:flex;flex-direction:column;gap:4px}.realm-opt{display:flex;align-items:center;gap:var(--ymir-space-2);padding:6px var(--ymir-space-2);border-radius:var(--ymir-radius);border:1px solid transparent;color:var(--ymir-text-1);font-size:13px;transition:background var(--ymir-dur-fast) var(--ymir-ease)}.realm-opt:hover{background:var(--ymir-bg-2);color:var(--ymir-text-0)}.realm-opt[aria-current=true]{background:var(--ymir-bg-2);border-color:var(--ymir-steel-1);color:var(--ymir-text-0)}.realm-swatch{width:10px;height:10px;border-radius:3px;flex-shrink:0;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ymir-text-0) 15%,transparent)}.rail-node{display:flex;align-items:center;gap:var(--ymir-space-2);font-family:var(--ymir-font-mono);font-size:10px;letter-spacing:.08em;color:var(--ymir-text-2);text-transform:uppercase}.topbar{grid-area:topbar;position:relative;z-index:30;display:flex;align-items:center;gap:var(--ymir-space-3);padding:0 var(--ymir-space-5);background:color-mix(in srgb,var(--ymir-bg-1) 88%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid var(--ymir-steel-1)}.realm-chip{display:flex;align-items:center;gap:var(--ymir-space-2);padding:5px 11px 5px 9px;border-radius:999px;background:var(--realm-tint-dim);border:1px solid color-mix(in srgb,var(--realm-tint) 35%,transparent);font-family:var(--ymir-font-mono);font-size:12px;letter-spacing:.06em;color:var(--ymir-text-0);white-space:nowrap}.realm-chip .house-glyph{color:var(--realm-tint);font-family:var(--ymir-font-head);font-size:15px}.search{flex:1;max-width:440px;display:flex;align-items:center;gap:var(--ymir-space-2);padding:0 var(--ymir-space-3);height:34px;border-radius:var(--ymir-radius);background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);color:var(--ymir-text-2);transition:border-color var(--ymir-dur-fast) var(--ymir-ease)}.search:focus-within{border-color:var(--ymir-chisel);box-shadow:var(--ymir-bevel)}.search input{flex:1;min-width:0;background:none;border:none;outline:none;font-size:13px;color:var(--ymir-text-0)}.search input::placeholder{color:var(--ymir-text-3)}.search kbd{font-family:var(--ymir-font-mono);font-size:10px;color:var(--ymir-text-3);border:1px solid var(--ymir-steel-1);border-radius:4px;padding:1px 5px}.topbar-spacer{flex:1}.trace-chip{display:flex;align-items:center;gap:var(--ymir-space-2);padding:4px 12px;border-radius:var(--ymir-radius);background:var(--ymir-bg-2);border:1px solid var(--ymir-steel-1);box-shadow:var(--ymir-bevel);font-family:var(--ymir-font-mono);white-space:nowrap}.trace-chip .label{font-size:10px;letter-spacing:.1em;color:var(--ymir-text-2);text-transform:uppercase}.trace-chip .value{font-size:16px;font-weight:600;color:var(--ymir-ok);font-variant-numeric:tabular-nums}.icon-btn{width:34px;height:34px;display:grid;place-items:center;border-radius:var(--ymir-radius);border:1px solid var(--ymir-steel-1);background:var(--ymir-bg-1);color:var(--ymir-text-1);font-family:var(--ymir-font-head);font-size:15px;transition:background var(--ymir-dur-fast) var(--ymir-ease),color var(--ymir-dur-fast) var(--ymir-ease)}.icon-btn:hover{background:var(--ymir-bg-3);color:var(--ymir-text-0)}.icon-btn[aria-pressed=true]{background:var(--realm-tint-dim);border-color:color-mix(in srgb,var(--realm-tint) 40%,transparent);color:var(--realm-tint)}.hall-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border-radius:999px;border:1px solid color-mix(in srgb,var(--realm-tint) 35%,transparent);background:var(--realm-tint-dim);color:var(--realm-tint);font-family:var(--ymir-font-mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;text-decoration:none;white-space:nowrap}.hall-btn .glyph{font-family:var(--ymir-font-head);font-size:13px}.hall-btn:hover{background:color-mix(in srgb,var(--realm-tint) 22%,transparent);border-color:var(--realm-tint);color:var(--ymir-text-0)}.user-menu{display:flex;align-items:center;gap:var(--ymir-space-2);padding-left:var(--ymir-space-3);border-left:1px solid var(--ymir-steel-1)}.avatar{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;background:linear-gradient(135deg,var(--realm-tint),var(--realm-tint-2));color:var(--ymir-bg-0);font-family:var(--ymir-font-mono);font-weight:700;font-size:12px}.stage{grid-area:stage;min-height:0;overflow-y:auto;overflow-x:hidden;padding:var(--ymir-space-5) var(--ymir-space-5) var(--ymir-space-6)}.stage-head{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--ymir-space-4);margin-bottom:var(--ymir-space-4)}.stage-title{font-size:clamp(22px,2.4vw,32px);line-height:1.1}.stage-deck{font-family:var(--ymir-font-mono);font-size:12px;color:var(--ymir-text-2);margin-top:6px;letter-spacing:.02em}.stream{grid-area:stream;display:flex;flex-direction:column;min-height:0;background:linear-gradient(180deg,var(--ymir-bg-1),var(--ymir-bg-0));border-top:1px solid var(--ymir-steel-1);box-shadow:inset 0 1px color-mix(in srgb,var(--ymir-chisel) 6%,transparent);position:relative}.stream-resizer{position:absolute;top:-5px;left:0;right:0;height:10px;cursor:ns-resize;display:flex;align-items:center;justify-content:center;z-index:5;touch-action:none}.stream-resizer .grip{width:52px;height:4px;border-radius:3px;background:var(--ymir-steel-2);transition:width var(--ymir-dur-fast) var(--ymir-ease),background var(--ymir-dur-fast) var(--ymir-ease)}.stream-resizer:hover .grip,.stream-resizer:focus-visible .grip,body:has(.stream-resizer:active) .stream-resizer .grip{width:84px;background:var(--ymir-chisel);box-shadow:0 0 10px color-mix(in srgb,var(--ymir-chisel) 60%,transparent)}.stream-resizer:focus-visible{outline:none;box-shadow:none}.stream-head{display:flex;align-items:center;gap:var(--ymir-space-3);height:34px;padding:0 var(--ymir-space-5);border-bottom:1px solid var(--ymir-steel-1);flex-shrink:0}.stream-title{font-family:var(--ymir-font-head);font-size:13px;letter-spacing:.14em;text-transform:uppercase;color:var(--ymir-text-1)}.stream-tabs{display:flex;gap:2px}.stream-tab{font-family:var(--ymir-font-mono);font-size:11px;padding:2px 9px;border-radius:999px;color:var(--ymir-text-2);border:1px solid transparent}.stream-tab[aria-pressed=true]{color:var(--realm-tint);background:var(--realm-tint-dim)}.live-dot{width:7px;height:7px;border-radius:50%;background:var(--ymir-ok);box-shadow:0 0 0 0 var(--ymir-ok);animation:pulse 2s infinite}.live-dot.paused{background:var(--ymir-warn);animation:none}@keyframes pulse{0%{box-shadow:0 0 color-mix(in srgb,var(--ymir-ok) 50%,transparent)}70%{box-shadow:0 0 0 6px color-mix(in srgb,var(--ymir-ok) 0%,transparent)}to{box-shadow:0 0 color-mix(in srgb,var(--ymir-ok) 0%,transparent)}}.stream-body{flex:1;min-height:0;overflow-y:auto;padding:4px var(--ymir-space-5);font-family:var(--ymir-font-mono);font-size:12px}.stream-line{display:grid;grid-template-columns:74px 132px 1fr auto;gap:var(--ymir-space-3);padding:3px 0;border-bottom:1px solid color-mix(in srgb,var(--ymir-steel-2) 35%,transparent);align-items:baseline}.stream-line .ts{color:var(--ymir-text-3)}.stream-line .actor{color:var(--ymir-text-1)}.stream-line .actor .to{color:var(--ymir-text-3)}.stream-line .msg{color:var(--ymir-text-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.stream-line .kind{font-size:10px;letter-spacing:.08em;text-transform:uppercase}.kind.ratatoskr{color:var(--ymir-violet-1)}.kind.rune{color:var(--ymir-cyan-1)}@media(max-width:900px){.shell{--rail-w: 64px}.wordmark,.gate-label,.gate-count,.realm-opt span.label,.rail-node span{display:none}.brand{justify-content:center;padding:0}.gate{justify-content:center;padding:10px 0}.rail-foot{align-items:center}.realm-opt{justify-content:center}}.ws-switch{display:flex;align-items:center;gap:4px}.ws-chip{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:999px;border:1px solid var(--ymir-steel-1);background:var(--ymir-bg-2);color:var(--ymir-text-1);font-size:12px;cursor:pointer}.ws-chip:hover{color:var(--ymir-text-0);border-color:var(--ymir-chisel)}.ws-chip.on{background:var(--realm-tint-dim);border-color:var(--realm-tint);color:var(--ymir-text-0)}.ws-chip.add{padding:5px 9px;color:var(--ymir-text-2)}.ws-chip .house-glyph{color:var(--realm-tint)}.trace-chip{flex-shrink:0}.topbar .search{min-width:280px}.panel{background:var(--ymir-bg-2);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius-panel);box-shadow:var(--ymir-bevel),var(--ymir-shadow-panel);display:flex;flex-direction:column;min-width:0}.panel-head{display:flex;align-items:center;justify-content:space-between;gap:var(--ymir-space-3);padding:var(--ymir-space-3) var(--ymir-space-4);border-bottom:1px solid var(--ymir-steel-1)}.panel-title{font-family:var(--ymir-font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ymir-text-2);display:flex;align-items:center;gap:var(--ymir-space-2)}.panel-title .glyph{color:var(--realm-tint);font-family:var(--ymir-font-head);font-size:14px}.panel-body{padding:var(--ymir-space-4);min-width:0}.panel-body.flush{padding:0}.btn{display:inline-flex;align-items:center;gap:var(--ymir-space-2);padding:7px 14px;border-radius:var(--ymir-radius);border:1px solid var(--ymir-steel-1);background:var(--ymir-bg-3);color:var(--ymir-text-0);font-size:13px;font-weight:500;transition:background var(--ymir-dur-fast) var(--ymir-ease),border-color var(--ymir-dur-fast) var(--ymir-ease)}.btn:hover{border-color:var(--ymir-steel-2);background:color-mix(in srgb,var(--ymir-bg-3) 70%,var(--realm-tint) 8%)}.btn-primary{background:var(--realm-tint-dim);border-color:color-mix(in srgb,var(--realm-tint) 45%,transparent);color:var(--realm-tint)}.btn-primary:hover{background:color-mix(in srgb,var(--realm-tint) 22%,transparent)}.btn-seal{color:var(--ymir-ok);border-color:color-mix(in srgb,var(--ymir-ok) 40%,transparent);background:var(--ymir-ok-dim)}.btn-danger{color:var(--ymir-danger);border-color:color-mix(in srgb,var(--ymir-danger) 40%,transparent);background:var(--ymir-danger-dim)}.btn[disabled]{opacity:.45;cursor:not-allowed}.btn-sm{padding:3px 9px;font-size:11px;gap:5px;border-radius:6px;font-family:var(--ymir-font-mono);letter-spacing:.02em}.btn-sm .glyph{font-size:9px;line-height:1}.status{display:inline-flex;align-items:center;gap:5px;font-family:var(--ymir-font-mono);font-size:11px;letter-spacing:.08em;padding:2px 8px;border-radius:999px;white-space:nowrap}.status .dot{font-size:11px;line-height:1}.rune-tag{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:999px;font-family:var(--ymir-font-mono);font-size:11px;letter-spacing:.03em;border:1px solid color-mix(in srgb,var(--tag-color, var(--ymir-steel-2)) 45%,transparent);color:var(--tag-color, var(--ymir-text-1));background:color-mix(in srgb,var(--tag-color, var(--ymir-steel-2)) 12%,transparent)}.rune-tag .g{font-family:var(--ymir-font-head);font-size:12px}.metric-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:var(--ymir-space-3)}.metric-tile{background:var(--ymir-bg-2);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);padding:var(--ymir-space-3) var(--ymir-space-4);box-shadow:var(--ymir-bevel);position:relative;overflow:hidden}.metric-tile .label{font-family:var(--ymir-font-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ymir-text-2)}.metric-tile .value{font-family:var(--ymir-font-mono);font-size:26px;font-weight:600;font-variant-numeric:tabular-nums;margin-top:4px;line-height:1.1}.metric-tile .delta{font-family:var(--ymir-font-mono);font-size:11px;margin-top:3px;color:var(--ymir-text-2)}.metric-tile .spark{position:absolute;right:0;bottom:0;opacity:.6}.agent-card{background:var(--ymir-bg-2);border:1px solid var(--ymir-steel-1);border-left:3px solid var(--house, var(--ymir-steel-2));border-radius:var(--ymir-radius);padding:var(--ymir-space-4);box-shadow:var(--ymir-bevel);display:flex;flex-direction:column;gap:var(--ymir-space-3);transition:border-color var(--ymir-dur-task) var(--ymir-ease),transform var(--ymir-dur-task) var(--ymir-ease)}.agent-card:hover{transform:translateY(-1px);border-color:var(--ymir-steel-2)}.agent-card .ac-head{display:flex;align-items:flex-start;gap:var(--ymir-space-3)}.agent-seal{width:38px;height:38px;border-radius:var(--ymir-radius);display:grid;place-items:center;flex-shrink:0;font-family:var(--ymir-font-head);font-size:20px;color:var(--house, var(--ymir-cyan-1));background:color-mix(in srgb,var(--house, var(--ymir-cyan-1)) 14%,transparent);border:1px solid color-mix(in srgb,var(--house, var(--ymir-cyan-1)) 40%,transparent);box-shadow:var(--ymir-bevel)}.agent-name{font-family:var(--ymir-font-head);font-size:17px;font-weight:600}.agent-role{font-size:12px;color:var(--ymir-text-2)}.agent-meta{display:flex;flex-wrap:wrap;gap:var(--ymir-space-2);font-family:var(--ymir-font-mono);font-size:11px;color:var(--ymir-text-2)}.agent-skills{display:flex;flex-wrap:wrap;gap:5px}.agent-stats{display:flex;gap:var(--ymir-space-4);border-top:1px solid var(--ymir-steel-1);padding-top:var(--ymir-space-3);font-family:var(--ymir-font-mono);font-size:11px;color:var(--ymir-text-2)}.agent-stats b{color:var(--ymir-text-0);font-weight:600}.task-chip{display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border-radius:999px;font-family:var(--ymir-font-mono);font-size:11px;letter-spacing:.04em;border:1px solid currentColor;background:color-mix(in srgb,currentColor 12%,transparent)}.trace-row{display:grid;grid-template-columns:128px 112px minmax(150px,220px) minmax(0,1fr) 96px;gap:var(--ymir-space-3);padding:7px var(--ymir-space-4);border-bottom:1px solid color-mix(in srgb,var(--ymir-steel-2) 40%,transparent);font-family:var(--ymir-font-mono);font-size:12px;align-items:center}.trace-row>*{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trace-row:hover{background:var(--ymir-bg-3)}.trace-row .ts{color:var(--ymir-text-2)}.trace-row .agent{color:var(--ymir-text-0)}.trace-row .module{color:var(--ymir-violet-1)}.trace-row .event{color:var(--ymir-text-1)}.trace-row .checksum{color:var(--ymir-text-3);text-align:right}.recall-search{display:flex;gap:var(--ymir-space-2)}.recall-search input{flex:1;height:38px;padding:0 var(--ymir-space-3);border-radius:var(--ymir-radius);background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);outline:none;font-family:var(--ymir-font-mono);font-size:13px}.recall-search input:focus{border-color:var(--ymir-chisel);box-shadow:var(--ymir-bevel)}.episode{padding:var(--ymir-space-4);border-bottom:1px solid var(--ymir-steel-1)}.episode:hover{background:var(--ymir-bg-3)}.episode .ep-head{display:flex;justify-content:space-between;gap:var(--ymir-space-3)}.episode .ep-title{font-weight:600;color:var(--ymir-text-0)}.episode .ep-body{color:var(--ymir-text-1);font-size:13px;margin-top:4px;line-height:20px}.episode .ep-foot{display:flex;gap:var(--ymir-space-3);margin-top:var(--ymir-space-2);font-family:var(--ymir-font-mono);font-size:10px;color:var(--ymir-text-3)}.score-bar{width:92px;height:6px;border-radius:3px;background:var(--ymir-bg-0);overflow:hidden;border:1px solid var(--ymir-steel-1)}.score-bar>span{display:block;height:100%;background:linear-gradient(90deg,var(--ymir-cyan-2),var(--ymir-chisel))}.score-val{font-family:var(--ymir-font-mono);font-size:12px;color:var(--ymir-cyan-1);min-width:32px;text-align:right}.pr-card{background:var(--ymir-bg-2);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);box-shadow:var(--ymir-bevel);padding:var(--ymir-space-4);display:flex;flex-direction:column;gap:var(--ymir-space-3)}.pr-card .pr-title{font-weight:600;color:var(--ymir-text-0)}.pr-num{font-family:var(--ymir-font-mono);color:var(--ymir-text-2)}.pr-diff{font-family:var(--ymir-font-mono);font-size:12px}.pr-diff .add{color:var(--ymir-ok)}.pr-diff .del{color:var(--ymir-danger)}.check-row{display:flex;align-items:center;gap:var(--ymir-space-2);font-family:var(--ymir-font-mono);font-size:11px;color:var(--ymir-text-2);flex-wrap:wrap}.checklist{display:flex;flex-direction:column;gap:5px}.check-item{display:flex;align-items:center;gap:var(--ymir-space-2);font-size:13px;color:var(--ymir-text-1)}.check-item .box{width:15px;height:15px;display:grid;place-items:center;border-radius:4px;border:1px solid var(--ymir-steel-1);font-size:10px;flex-shrink:0}.check-item.done .box{color:var(--ymir-ok);border-color:color-mix(in srgb,var(--ymir-ok) 45%,transparent);background:var(--ymir-ok-dim)}.pr-actions{display:flex;gap:var(--ymir-space-2);border-top:1px solid var(--ymir-steel-1);padding-top:var(--ymir-space-3)}.progress{height:6px;border-radius:3px;background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);overflow:hidden}.progress>span{display:block;height:100%;background:linear-gradient(90deg,var(--realm-tint-2),var(--realm-tint));transition:width var(--ymir-dur-task) var(--ymir-ease)}.empty{display:grid;place-items:center;gap:var(--ymir-space-3);padding:var(--ymir-space-7);text-align:center;color:var(--ymir-text-2)}.empty .glyph{font-family:var(--ymir-font-head);font-size:42px;color:var(--ymir-steel-2)}.gate-grid{display:grid;gap:var(--ymir-space-4)}.cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.span-2{grid-column:span 2}@media(max-width:1200px){.cols-3,.cols-4{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:760px){.cols-2,.cols-3,.cols-4{grid-template-columns:1fr}.span-2{grid-column:auto}}.fleet-graph{position:relative;min-height:340px;background:radial-gradient(circle at 50% 50%,var(--ymir-bg-3),transparent 70%),var(--ymir-bg-1);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);overflow:hidden}.fleet-node{position:absolute;transform:translate(-50%,-50%);width:46px;height:46px;display:grid;place-items:center}.fleet-node .node-ring{width:46px;height:46px;border-radius:50%;display:grid;place-items:center;font-family:var(--ymir-font-head);font-size:22px;background:var(--ymir-bg-2);border:2px solid var(--house, var(--ymir-steel-2));box-shadow:var(--ymir-bevel)}.fleet-node .node-ring[data-status=nominal]{box-shadow:0 0 0 3px var(--ymir-ok-dim),var(--ymir-bevel)}.fleet-node .node-ring[data-status=degraded]{box-shadow:0 0 0 3px var(--ymir-warn-dim),var(--ymir-bevel)}.fleet-node .node-ring[data-status=down]{box-shadow:0 0 0 3px var(--ymir-danger-dim),var(--ymir-bevel);border-style:dashed}.fleet-node .node-label{position:absolute;top:calc(100% + 3px);left:50%;transform:translate(-50%);white-space:nowrap;font-family:var(--ymir-font-mono);font-size:10px;color:var(--ymir-text-1);line-height:1.2;pointer-events:none}.fleet-edges{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none}.fleet-edge{stroke:var(--ymir-violet-2);stroke-width:1.5;fill:none;opacity:.55;stroke-dasharray:5 6;animation:dash 1.4s linear infinite}@keyframes dash{to{stroke-dashoffset:-22}}.board{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--ymir-space-3);align-items:start}.board-col{background:var(--ymir-bg-1);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);min-height:120px}.board-col-head{display:flex;align-items:center;justify-content:space-between;padding:var(--ymir-space-3);border-bottom:1px solid var(--ymir-steel-1)}.board-col-body{padding:var(--ymir-space-2);display:flex;flex-direction:column;gap:var(--ymir-space-2)}.task-mini{background:var(--ymir-bg-2);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);padding:var(--ymir-space-3);cursor:pointer;text-align:left;transition:border-color var(--ymir-dur-fast) var(--ymir-ease)}.task-mini:hover{border-color:var(--ymir-steel-2)}.task-mini[aria-selected=true]{border-color:var(--realm-tint);box-shadow:var(--ymir-bevel)}.task-mini .tm-title{font-size:13px;color:var(--ymir-text-0);line-height:18px}.task-mini .tm-meta{font-family:var(--ymir-font-mono);font-size:10px;color:var(--ymir-text-3);margin-top:6px;display:flex;justify-content:space-between}.task-detail{position:sticky;top:0}.log-line{font-family:var(--ymir-font-mono);font-size:12px;color:var(--ymir-text-1);padding:5px 0;border-bottom:1px solid color-mix(in srgb,var(--ymir-steel-2) 35%,transparent);display:flex;gap:var(--ymir-space-2)}.log-line .caret{color:var(--realm-tint)}.data-table{width:100%;border-collapse:collapse;font-size:13px}.data-table th{text-align:left;font-family:var(--ymir-font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ymir-text-2);padding:var(--ymir-space-3) var(--ymir-space-4);border-bottom:1px solid var(--ymir-steel-1);font-weight:500;white-space:nowrap}.data-table td{padding:var(--ymir-space-3) var(--ymir-space-4);border-bottom:1px solid color-mix(in srgb,var(--ymir-steel-2) 40%,transparent);vertical-align:middle}.data-table tbody tr:hover{background:var(--ymir-bg-3)}.data-table .num{font-family:var(--ymir-font-mono);font-variant-numeric:tabular-nums;color:var(--ymir-text-1)}.files-layout{display:grid;grid-template-columns:300px 1fr;gap:var(--ymir-space-4);min-height:420px}.file-tree{padding:var(--ymir-space-2) 0;overflow-y:auto}.file-node{display:flex;align-items:center;gap:var(--ymir-space-2);width:100%;padding:5px var(--ymir-space-3);font-family:var(--ymir-font-mono);font-size:12px;color:var(--ymir-text-1);border-radius:6px;text-align:left}.file-node:hover{background:var(--ymir-bg-3)}.file-node[aria-selected=true]{background:var(--realm-tint-dim);color:var(--ymir-text-0)}.file-node .f-glyph{color:var(--realm-tint);width:15px;text-align:center}.file-preview{font-family:var(--ymir-font-mono);font-size:12px;line-height:20px;color:var(--ymir-text-1);padding:var(--ymir-space-4);white-space:pre-wrap;word-break:break-word;overflow-y:auto;max-height:520px}.file-preview.md-preview{font-family:var(--ymir-font-body);font-size:13.5px;line-height:1.65;white-space:normal}.md-render>:first-child{margin-top:0}.md-render>:last-child{margin-bottom:0}.md-render h1,.md-render h2,.md-render h3,.md-render h4{color:var(--ymir-text-0);line-height:1.25;margin:var(--ymir-space-5) 0 var(--ymir-space-3)}.md-render h1{font-size:21px;padding-bottom:var(--ymir-space-2);border-bottom:1px solid var(--ymir-steel-1)}.md-render h2{font-size:17px}.md-render h3{font-size:15px}.md-render h4{font-size:13px;letter-spacing:.06em;text-transform:uppercase;color:var(--ymir-text-2)}.md-render p{margin:0 0 var(--ymir-space-3)}.md-render a{color:var(--ymir-cyan-1)}.md-render a:hover{text-decoration:underline}.md-render strong{color:var(--ymir-text-0)}.md-render ul,.md-render ol{margin:0 0 var(--ymir-space-3);padding-left:22px}.md-render li{margin:2px 0}.md-render li::marker{color:var(--realm-tint)}.md-render code{font-family:var(--ymir-font-mono);font-size:12px;background:var(--ymir-bg-3);border:1px solid var(--ymir-steel-1);border-radius:4px;padding:1px 5px}.md-render pre{background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);padding:var(--ymir-space-3);overflow-x:auto;margin:0 0 var(--ymir-space-3)}.md-render pre code{background:none;border:none;padding:0;font-size:12px;line-height:1.55}.md-render blockquote{margin:0 0 var(--ymir-space-3);padding:var(--ymir-space-1) var(--ymir-space-3);border-left:3px solid var(--realm-tint);color:var(--ymir-text-2)}.md-render hr{border:0;border-top:1px solid var(--ymir-steel-1);margin:var(--ymir-space-5) 0}.md-render table{border-collapse:collapse;width:100%;margin:0 0 var(--ymir-space-3);font-size:12px}.md-render th,.md-render td{border:1px solid var(--ymir-steel-1);padding:5px 9px;text-align:left;vertical-align:top}.md-render th{background:var(--ymir-bg-3);color:var(--ymir-text-0);font-family:var(--ymir-font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase}.md-render input[type=checkbox]{margin-right:6px;accent-color:var(--realm-tint)}.md-render img{max-width:100%}.ep-body .md-render p{margin:0 0 6px}.modal-content.md-preview{font-family:var(--ymir-font-body);font-size:13px;line-height:1.55;white-space:normal}.chat-layout{display:grid;grid-template-columns:220px 1fr 280px;gap:var(--ymir-space-4);height:100%}.chat-scroll{flex:1;min-height:0;overflow-y:auto;padding:var(--ymir-space-4);display:flex;flex-direction:column;gap:var(--ymir-space-3)}.bubble{max-width:78%;padding:var(--ymir-space-3) var(--ymir-space-4);border-radius:var(--ymir-radius-panel);font-size:14px;line-height:21px}.bubble.user{align-self:flex-end;background:var(--realm-tint-dim);border:1px solid color-mix(in srgb,var(--realm-tint) 35%,transparent);color:var(--ymir-text-0)}.bubble.kaia{align-self:flex-start;background:var(--ymir-bg-2);border:1px solid var(--ymir-steel-1);color:var(--ymir-text-1)}.bubble .b-meta{font-family:var(--ymir-font-mono);font-size:10px;color:var(--ymir-text-3);margin-top:5px;display:flex;gap:var(--ymir-space-2);align-items:center}.chat-compose{display:flex;gap:var(--ymir-space-2);padding:var(--ymir-space-3);border-top:1px solid var(--ymir-steel-1)}.chat-compose input{flex:1;height:40px;padding:0 var(--ymir-space-4);border-radius:var(--ymir-radius);background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);outline:none;font-size:14px}.chat-compose input:focus{border-color:var(--ymir-chisel)}.forge-load{display:grid;place-items:center;height:100%;gap:var(--ymir-space-4);color:var(--ymir-text-2);font-family:var(--ymir-font-mono);font-size:12px}.ember{width:44px;height:44px;border-radius:50%;background:radial-gradient(circle at 50% 60%,var(--ymir-warn),var(--ymir-danger) 45%,transparent 72%);filter:blur(1px);animation:ember 1.8s ease-in-out infinite}@keyframes ember{0%,to{opacity:.55;transform:scale(.96)}50%{opacity:1;transform:scale(1.05)}}.split-bar{display:flex;height:10px;border-radius:6px;overflow:hidden;background:var(--ymir-bg-0);margin:10px 0 8px}.split-local{background:linear-gradient(90deg,var(--ymir-ok),color-mix(in srgb,var(--ymir-ok) 60%,white));transition:width .3s ease}.split-online{background:linear-gradient(90deg,var(--ymir-warn),var(--ymir-danger));transition:width .3s ease}.split-legend{display:flex;gap:16px;font-size:12px;color:var(--ymir-text-2);margin-bottom:12px;flex-wrap:wrap}.split-legend .dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px}.dot-local{background:var(--ymir-ok)}.dot-online{background:var(--ymir-warn)}.badge{display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;border-radius:999px;padding:2px 8px}.badge.local{color:var(--ymir-ok);background:color-mix(in srgb,var(--ymir-ok) 12%,transparent);border:1px solid color-mix(in srgb,var(--ymir-ok) 30%,transparent)}.badge.online{color:var(--ymir-warn);background:color-mix(in srgb,var(--ymir-warn) 12%,transparent);border:1px solid color-mix(in srgb,var(--ymir-warn) 30%,transparent)}.field input{background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);padding:10px 12px;color:var(--ymir-text-0);outline:none;font-size:14px;font-family:var(--ymir-font-body)}.field input:focus{border-color:var(--ymir-chisel);box-shadow:var(--ymir-bevel)}.chat-side{display:flex;flex-direction:column;min-height:460px}.chat-side-list{overflow-y:auto;max-height:520px}.chat-session{display:grid;grid-template-columns:1fr auto auto;gap:8px;align-items:center;padding:9px 12px;cursor:pointer;border-bottom:1px solid var(--ymir-steel-1);font-size:12px;color:var(--ymir-text-1)}.chat-session:hover{background:var(--ymir-bg-3)}.chat-session.active{background:var(--realm-tint-dim);box-shadow:inset 3px 0 0 var(--realm-tint);color:var(--ymir-text-0)}.icon-btn{background:none;border:none;color:var(--ymir-text-3);cursor:pointer;font-size:12px;padding:2px 4px;border-radius:4px}.icon-btn:hover{color:var(--ymir-danger);background:var(--ymir-bg-0)}.btn-sm{padding:4px 10px;font-size:12px}.bubble.err{border-color:color-mix(in srgb,var(--ymir-danger) 45%,transparent);color:var(--ymir-danger)}.thinking{display:flex;align-items:center;gap:8px;color:var(--ymir-text-2);font-style:italic}.dots{display:inline-flex;gap:3px}.dots i{width:6px;height:6px;border-radius:50%;background:var(--ymir-cyan-1);animation:ydot 1.2s infinite ease-in-out}.dots i:nth-child(2){animation-delay:.15s}.dots i:nth-child(3){animation-delay:.3s}@keyframes ydot{0%,80%,to{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-3px)}}.lane-toggles{display:flex;flex-wrap:wrap;gap:6px}.chip{background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);border-radius:999px;color:var(--ymir-text-2);font-size:12px;padding:3px 10px;cursor:pointer}.chip.on{background:var(--realm-tint-dim);border-color:var(--realm-tint);color:var(--ymir-text-0)}.prompt-editor{width:100%;font-family:var(--ymir-font-mono);font-size:12.5px;line-height:1.6;resize:vertical;background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);color:var(--ymir-text-0);padding:12px;outline:none}.prompt-editor:focus{border-color:var(--ymir-chisel);box-shadow:var(--ymir-bevel)}.model-picker{position:relative;width:100%}.model-picker input{width:100%}.model-current{margin-top:5px;font-family:var(--ymir-font-mono);font-size:11px;color:var(--ymir-text-3);word-break:break-all;line-height:1.4}.model-menu{position:absolute;z-index:60;top:calc(100% + 4px);left:0;min-width:100%;width:max-content;max-width:min(420px,88vw);margin:0;padding:4px;list-style:none;max-height:240px;overflow-y:auto;background:var(--ymir-bg-2);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);box-shadow:0 12px 28px #00000073}.model-menu li{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:6px;font-size:12px;color:var(--ymir-text-1);cursor:pointer}.model-menu li .mono{white-space:normal;word-break:break-all}.model-menu li:hover,.model-menu li.active{background:var(--realm-tint-dim);color:var(--ymir-text-0)}.model-menu li.free{color:var(--ymir-cyan-1);border-top:1px solid var(--ymir-steel-1)}.episode-link{cursor:pointer;transition:background .15s ease}.episode-link:hover{background:var(--ymir-bg-3)}.episode-link:focus-visible{outline:2px solid var(--ymir-chisel);outline-offset:-2px}.stage-header-row{display:flex;align-items:baseline;justify-content:space-between;gap:var(--ymir-space-4);margin-bottom:var(--ymir-space-4);flex-wrap:wrap}.page-feed{display:flex;flex-direction:column;gap:2px;min-width:260px;max-width:56%;font-family:var(--ymir-font-mono);font-size:10.5px;color:var(--ymir-text-2);overflow:hidden}.pf-line{display:flex;gap:8px;align-items:baseline;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;animation:pf-in .35s ease}.pf-ts{color:var(--ymir-text-3);flex-shrink:0}.pf-from{color:var(--ymir-cyan-1);flex-shrink:0}.pf-msg{overflow:hidden;text-overflow:ellipsis}@keyframes pf-in{0%{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:none}}.login{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;height:100dvh;min-height:100%;width:100%;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;display:grid;align-items:start;align-items:safe center;justify-items:center;padding:var(--ymir-space-6);background:radial-gradient(900px 500px at 50% -10%,color-mix(in srgb,var(--ymir-cyan-1) 14%,transparent),transparent 60%),radial-gradient(700px 500px at 100% 110%,color-mix(in srgb,var(--ymir-cyan-1) 9%,transparent),transparent 60%),var(--ymir-bg-0);overflow-y:auto}.login-card{width:100%;max-width:460px;min-width:0;background:var(--ymir-bg-1);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius-panel);box-shadow:var(--ymir-bevel),var(--ymir-shadow-raise);padding:var(--ymir-space-6);display:flex;flex-direction:column;gap:var(--ymir-space-4)}.login .gate{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,460px);gap:var(--ymir-space-6);align-items:center;width:100%;max-width:1040px}.gate-lore{display:flex;flex-direction:column;gap:var(--ymir-space-3);min-width:0;padding:var(--ymir-space-5) var(--ymir-space-4)}.lore-kicker{font-family:var(--ymir-font-mono);font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--ymir-cyan-1)}.lore-hero{font-family:var(--ymir-font-head);font-size:34px;line-height:1.12;letter-spacing:.01em;color:var(--ymir-text-0)}.lore-lede{color:var(--ymir-text-2);font-size:15px;line-height:23px}.lore-beats{list-style:none;display:flex;flex-direction:column;gap:0;margin:var(--ymir-space-2) 0 0;padding:0}.lore-beats li{display:grid;grid-template-columns:22px 104px 1fr;align-items:baseline;gap:var(--ymir-space-2);padding:var(--ymir-space-2) 0;border-top:1px solid var(--ymir-steel-1)}.lore-rune{font-family:var(--ymir-font-head);color:var(--ymir-cyan-1);font-size:15px}.lore-name{font-family:var(--ymir-font-head);font-size:13px;letter-spacing:.08em;color:var(--ymir-text-0)}.lore-line{color:var(--ymir-text-2);font-size:13px;line-height:20px}.lore-close{margin-top:var(--ymir-space-2);color:var(--ymir-text-1);font-size:14px;line-height:21px}.lore-cta{color:var(--ymir-cyan-1)}.lore-more{align-self:flex-start;margin-top:var(--ymir-space-1)}.lore-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:60;background:#0e0c09d1;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);display:flex;justify-content:center;padding:var(--ymir-space-6) var(--ymir-space-4);overflow-y:auto}.lore-parchment{width:100%;max-width:760px;align-self:flex-start;background:var(--ymir-bg-1);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius-panel);box-shadow:var(--ymir-bevel),var(--ymir-shadow-raise);padding:var(--ymir-space-6);display:flex;flex-direction:column;gap:var(--ymir-space-4)}.lore-parchment-head{display:flex;align-items:center;justify-content:space-between;gap:var(--ymir-space-3);position:sticky;top:calc(var(--ymir-space-6) * -1);padding:var(--ymir-space-2) 0;background:var(--ymir-bg-1);border-bottom:1px solid var(--ymir-steel-1);z-index:1}.lore-sec{display:flex;flex-direction:column;gap:var(--ymir-space-2)}.lore-sec-title{font-family:var(--ymir-font-head);font-size:17px;letter-spacing:.04em;color:var(--ymir-text-0)}.lore-sec-p{color:var(--ymir-text-2);font-size:14px;line-height:22px}.lore-end{color:var(--ymir-text-1);font-style:italic;border-top:1px solid var(--ymir-steel-1);padding-top:var(--ymir-space-3)}.lore-names{list-style:none;display:flex;flex-direction:column;gap:0;margin:0;padding:0}.lore-names li{display:grid;grid-template-columns:22px 150px 1fr;align-items:baseline;gap:var(--ymir-space-2);padding:var(--ymir-space-2) 0;border-top:1px solid var(--ymir-steel-1)}.lore-names .lore-line{font-size:12.5px}@media(max-width:620px){.lore-names li{grid-template-columns:22px 1fr}.lore-names .lore-line{grid-column:2}}@media(max-width:960px){.login .gate{grid-template-columns:1fr;max-width:460px}.gate-lore{padding:var(--ymir-space-2) var(--ymir-space-1)}.lore-hero{font-size:26px}.lore-beats li{grid-template-columns:22px 1fr}.lore-line{grid-column:2}}.login-brand{display:flex;align-items:center;gap:var(--ymir-space-3)}.login-brand .name{font-family:var(--ymir-font-head);font-size:22px;letter-spacing:.2em;font-weight:700}.login-brand .sub{font-family:var(--ymir-font-mono);font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--ymir-cyan-1)}.login-title{font-size:26px;line-height:1.15}.login-deck{color:var(--ymir-text-2);font-size:14px;line-height:21px}.login-about{display:flex;flex-direction:column;gap:6px;padding:var(--ymir-space-3);border-left:2px solid var(--ymir-cyan-1);background:var(--ymir-bg-2);border-radius:0 var(--ymir-radius) var(--ymir-radius) 0}.login-about p{color:var(--ymir-text-1);font-size:13px;line-height:20px}.mock-flag{align-self:flex-start;font-family:var(--ymir-font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ymir-warn);background:var(--ymir-warn-dim);border:1px solid color-mix(in srgb,var(--ymir-warn) 35%,transparent);border-radius:999px;padding:3px 10px}.gh-btn{display:flex;align-items:center;justify-content:center;gap:var(--ymir-space-3);width:100%;padding:12px;border-radius:var(--ymir-radius);background:var(--ymir-text-0);color:var(--ymir-bg-0);font-weight:600;font-size:14px;border:1px solid color-mix(in srgb,var(--ymir-text-0) 60%,transparent);transition:transform var(--ymir-dur-fast) var(--ymir-ease),background var(--ymir-dur-fast) var(--ymir-ease)}.gh-btn:hover{background:color-mix(in srgb,var(--ymir-text-0) 90%,var(--ymir-chisel) 10%);transform:translateY(-1px)}.identity-list{display:flex;flex-direction:column;gap:6px}.identity{display:flex;align-items:center;gap:var(--ymir-space-3);width:100%;padding:var(--ymir-space-3);border-radius:var(--ymir-radius);border:1px solid var(--ymir-steel-1);background:var(--ymir-bg-2);text-align:left;transition:border-color var(--ymir-dur-fast) var(--ymir-ease),background var(--ymir-dur-fast) var(--ymir-ease)}.identity:hover{border-color:var(--ymir-steel-2);background:var(--ymir-bg-3)}.identity .who{flex:1;min-width:0}.identity .gh-login{font-family:var(--ymir-font-mono);font-size:13px;color:var(--ymir-text-0)}.identity .meta{font-family:var(--ymir-font-mono);font-size:11px;color:var(--ymir-text-2)}.identity .arrow{color:var(--ymir-text-3)}.gh-avatar{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;background:linear-gradient(135deg,var(--ymir-cyan-1),var(--ymir-violet-1));color:var(--ymir-bg-0);font-family:var(--ymir-font-mono);font-weight:700;font-size:12px;flex-shrink:0}.divider{display:flex;align-items:center;gap:var(--ymir-space-3);color:var(--ymir-text-3);font-family:var(--ymir-font-mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase}.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--ymir-steel-1)}.legal{font-family:var(--ymir-font-mono);font-size:10px;color:var(--ymir-text-3);line-height:16px}.demo-link{align-self:flex-start;font-family:var(--ymir-font-mono);font-size:10px;letter-spacing:.08em;color:var(--ymir-text-3);text-decoration:underline dotted;padding:0}.demo-link:hover{color:var(--ymir-text-2)}.house-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:6px}.house-opt{display:flex;align-items:center;gap:var(--ymir-space-2);padding:var(--ymir-space-2) var(--ymir-space-3);border-radius:var(--ymir-radius);border:1px solid var(--ymir-steel-1);background:var(--ymir-bg-2);font-size:12px;color:var(--ymir-text-1);text-align:left}.house-opt .seal{font-family:var(--ymir-font-head);font-size:16px}.house-opt[aria-pressed=true]{border-color:var(--ymir-chisel);background:var(--ymir-bg-3);color:var(--ymir-text-0);box-shadow:var(--ymir-bevel)}.wizard-path{font-family:var(--ymir-font-mono);font-size:12px;color:var(--ymir-cyan-1);background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);padding:var(--ymir-space-3);word-break:break-all}.stack-options{display:flex;flex-direction:column;gap:6px}.opt{display:flex;align-items:center;gap:var(--ymir-space-3);padding:var(--ymir-space-3);border-radius:var(--ymir-radius);border:1px solid var(--ymir-steel-1);background:var(--ymir-bg-2);font-size:13px;text-align:left}.opt .box{width:16px;height:16px;border-radius:4px;border:1px solid var(--ymir-steel-2);display:grid;place-items:center;font-size:11px;flex-shrink:0}.opt[aria-pressed=true] .box{color:var(--ymir-ok);border-color:color-mix(in srgb,var(--ymir-ok) 50%,transparent);background:var(--ymir-ok-dim)}.stepper{display:flex;gap:var(--ymir-space-2);font-family:var(--ymir-font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ymir-text-3)}.stepper .on{color:var(--ymir-cyan-1)}.menu-wrap{position:relative}.accent-dot{width:14px;height:14px;border-radius:50%;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ymir-text-0) 25%,transparent),0 0 8px #0006}.user-trigger{display:flex;align-items:center;gap:var(--ymir-space-2);padding:4px 8px 4px 4px;border-radius:var(--ymir-radius);border:1px solid transparent;transition:background var(--ymir-dur-fast) var(--ymir-ease)}.user-trigger:hover,.user-trigger[aria-expanded=true]{background:var(--ymir-bg-2);border-color:var(--ymir-steel-1)}.popover{position:absolute;top:calc(100% + 8px);right:0;width:300px;background:var(--ymir-bg-1);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius-panel);box-shadow:var(--ymir-bevel),var(--ymir-shadow-raise);padding:var(--ymir-space-3);z-index:60;animation:pop .14s var(--ymir-ease)}@keyframes pop{0%{opacity:0;transform:translateY(-4px) scale(.99)}to{opacity:1;transform:translateY(0) scale(1)}}.popover-head{display:flex;align-items:center;justify-content:space-between;gap:var(--ymir-space-2);padding:var(--ymir-space-2) var(--ymir-space-2) var(--ymir-space-3);font-family:var(--ymir-font-mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--ymir-text-2)}.swatch-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--ymir-space-2);padding:0 var(--ymir-space-1)}.swatch{aspect-ratio:1;border-radius:8px;border:1px solid color-mix(in srgb,var(--ymir-text-0) 12%,transparent);box-shadow:var(--ymir-bevel);display:grid;place-items:center;transition:transform var(--ymir-dur-fast) var(--ymir-ease)}.swatch:hover{transform:translateY(-1px) scale(1.05)}.swatch[aria-pressed=true]{outline:2px solid var(--ymir-chisel);outline-offset:2px}.swatch-check{color:var(--ymir-bg-0);font-size:13px;font-weight:700}.swatch-realm{color:var(--ymir-bg-0);font-family:var(--ymir-font-head);font-size:15px}.custom-color{display:flex;align-items:center;gap:var(--ymir-space-3);margin-top:var(--ymir-space-3);padding:var(--ymir-space-3) var(--ymir-space-1) 0;border-top:1px solid var(--ymir-steel-1)}.custom-color input[type=color]{width:34px;height:26px;padding:0;border:1px solid var(--ymir-steel-1);border-radius:6px;background:none;cursor:pointer}.restore-btn{width:100%;justify-content:center;margin-top:var(--ymir-space-3)}.account-popover{width:330px}.account-head{display:flex;align-items:center;gap:var(--ymir-space-3);padding:var(--ymir-space-2) var(--ymir-space-1) var(--ymir-space-3);border-bottom:1px solid var(--ymir-steel-1)}.account-tenants{display:flex;flex-direction:column;gap:4px;padding-bottom:var(--ymir-space-2)}.account-tenant{display:flex;align-items:center;gap:var(--ymir-space-2);padding:var(--ymir-space-2) var(--ymir-space-3);border-radius:var(--ymir-radius);border:1px solid transparent;color:var(--ymir-text-1);font-size:13px}.account-tenant:hover{background:var(--ymir-bg-3);color:var(--ymir-text-0)}.account-tenant[aria-current=true]{background:var(--realm-tint-dim);border-color:color-mix(in srgb,var(--realm-tint) 40%,transparent);color:var(--ymir-text-0)}.account-foot{display:flex;align-items:center;justify-content:space-between;gap:var(--ymir-space-2);padding-top:var(--ymir-space-3);border-top:1px solid var(--ymir-steel-1)}@media(max-width:900px){.user-trigger .col{display:none}}.btn,.icon-btn,.hall-btn,.gate,.task-mini,.realm-opt,.identity,.house-opt,.opt,.gh-btn,.swatch,.user-trigger,.stream-tab,.account-tenant{transition:transform 90ms var(--ymir-ease),background var(--ymir-dur-fast) var(--ymir-ease),border-color var(--ymir-dur-fast) var(--ymir-ease),color var(--ymir-dur-fast) var(--ymir-ease)}.btn:active,.icon-btn:active,.hall-btn:active,.task-mini:active,.realm-opt:active,.identity:active,.house-opt:active,.opt:active,.gh-btn:active,.swatch:active,.user-trigger:active,.stream-tab:active,.account-tenant:active{transform:translateY(1px) scale(.97)}.gate:active{transform:scale(.985)}@keyframes overlay-fade{0%{opacity:0}to{opacity:1}}@keyframes modal-reveal{0%{opacity:0;transform:translateY(10px) scale(.985)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes toast-in{0%{opacity:0;transform:translate(16px) scale(.98)}to{opacity:1;transform:translate(0) scale(1)}}.overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:200;display:grid;place-items:center;padding:var(--ymir-space-5);background:#0e0c09b8;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);animation:overlay-fade .15s var(--ymir-ease)}.modal{width:min(580px,100%);max-height:86vh;overflow-y:auto;background:var(--ymir-bg-1);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius-panel);box-shadow:var(--ymir-shadow-raise),var(--ymir-bevel);animation:modal-reveal .18s var(--ymir-ease)}.modal-head{display:flex;align-items:center;gap:var(--ymir-space-3);padding:var(--ymir-space-4) var(--ymir-space-5);border-bottom:1px solid var(--ymir-steel-1);position:sticky;top:0;background:var(--ymir-bg-1);z-index:1}.modal-title{font-size:18px;line-height:1.2}.modal-body{padding:var(--ymir-space-4) var(--ymir-space-5) 0;color:var(--ymir-text-1);font-size:14px;line-height:21px}.modal-content{margin:var(--ymir-space-4) var(--ymir-space-5) 0;padding:var(--ymir-space-4);background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);font-size:12px;line-height:18px;max-height:44vh;overflow:auto;white-space:pre-wrap;color:var(--ymir-text-1)}.modal-fields{padding:var(--ymir-space-4) var(--ymir-space-5) 0;display:flex;flex-direction:column;gap:var(--ymir-space-3)}.field{display:flex;flex-direction:column;gap:6px}.field input,.field textarea{background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);padding:10px 12px;color:var(--ymir-text-0);outline:none;font-size:14px;font-family:var(--ymir-font-body);resize:vertical}.field input:focus,.field textarea:focus{border-color:var(--ymir-chisel);box-shadow:var(--ymir-bevel)}.modal-foot{display:flex;justify-content:flex-end;gap:var(--ymir-space-2);padding:var(--ymir-space-5)}.toast-host{position:fixed;right:var(--ymir-space-5);bottom:var(--ymir-space-5);z-index:250;display:flex;flex-direction:column;gap:var(--ymir-space-2);width:min(370px,calc(100vw - 40px))}.toast{display:flex;align-items:flex-start;gap:var(--ymir-space-3);padding:var(--ymir-space-3) var(--ymir-space-4);border-radius:var(--ymir-radius);background:var(--ymir-bg-1);border:1px solid var(--ymir-steel-1);box-shadow:var(--ymir-shadow-raise);animation:toast-in .22s var(--ymir-ease)}.toast strong{font-size:13px;color:var(--ymir-text-0)}.toast-body{font-size:12px;color:var(--ymir-text-2);line-height:17px}.toast-glyph{font-family:var(--ymir-font-head);font-size:17px;line-height:1.2}.toast-x{color:var(--ymir-text-3);font-size:12px;padding:2px 4px}.toast-x:hover{color:var(--ymir-text-0)}.forge-layout{display:grid;grid-template-columns:320px minmax(0,1fr);gap:var(--ymir-space-4);align-items:start}@media(max-width:980px){.forge-layout{grid-template-columns:1fr}}.forge-list{display:flex;flex-direction:column;max-height:620px;overflow-y:auto}.forge-item{display:flex;align-items:center;gap:var(--ymir-space-3);padding:var(--ymir-space-3) var(--ymir-space-4);border-bottom:1px solid color-mix(in srgb,var(--ymir-steel-2) 40%,transparent);color:var(--ymir-text-1);text-align:left}.forge-item:hover{background:var(--ymir-bg-3);color:var(--ymir-text-0)}.forge-item[aria-selected=true]{background:var(--realm-tint-dim);color:var(--ymir-text-0);box-shadow:inset 3px 0 0 var(--realm-tint)}.field select{background:var(--ymir-bg-0);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);padding:10px 12px;color:var(--ymir-text-0);outline:none;font-size:14px;font-family:var(--ymir-font-body)}.field select:focus{border-color:var(--ymir-chisel);box-shadow:var(--ymir-bevel)}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--ymir-space-3)}@media(max-width:700px){.form-grid{grid-template-columns:1fr}}.chips{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.chip{font-family:var(--ymir-font-mono);font-size:11px;padding:5px 10px;border-radius:999px;border:1px solid var(--ymir-steel-1);background:var(--ymir-bg-2);color:var(--ymir-text-1)}.chip:hover{border-color:var(--ymir-chisel);color:var(--ymir-text-0);transform:translateY(-1px)}.tenant-row{display:flex;align-items:center;gap:var(--ymir-space-3);padding:var(--ymir-space-3);border:1px solid var(--ymir-steel-1);border-radius:var(--ymir-radius);background:var(--ymir-bg-2)}.tenant-row input[type=color]{width:36px;height:30px;padding:0;border:1px solid var(--ymir-steel-1);border-radius:6px;background:none;cursor:pointer;flex-shrink:0}.btn[aria-pressed=true]{border-color:color-mix(in srgb,var(--realm-tint) 45%,transparent);background:var(--realm-tint-dim);color:var(--realm-tint)}@media(max-width:780px){.shell{--rail-w: 0px;grid-template-columns:1fr;grid-template-rows:auto var(--topbar-h) minmax(0,1fr) var(--stream-h);grid-template-areas:"rail" "topbar" "stage" "stream"}.rail{flex-direction:row;align-items:center;gap:var(--ymir-space-2);height:auto;padding:6px var(--ymir-space-3);overflow-x:auto;overflow-y:hidden;border-right:none;border-bottom:1px solid var(--ymir-steel-1)}.rail .brand{padding:0 4px 0 0}.rail .gate{padding:8px 10px}.rail-foot{flex-direction:row;align-items:center;gap:6px;margin-left:auto}.wordmark,.gate-label,.gate-count,.realm-opt span.label,.rail-node span{display:none}.topbar{gap:var(--ymir-space-2);padding:0 var(--ymir-space-3)}.topbar .search{display:none}.ws-switch{overflow-x:auto;max-width:44vw}.trace-chip{display:none}.stage{padding:var(--ymir-space-3)}.stage-head{flex-direction:column;align-items:flex-start;gap:8px}.stage-title{font-size:22px}.stage-header-row{flex-direction:column;align-items:flex-start}.page-feed{max-width:100%;min-width:0}.gate-grid,.cols-2,.cols-3,.cols-4{grid-template-columns:1fr!important}.span-2{grid-column:auto!important}.metric-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.panel-body.flush,.panel-body{overflow-x:auto}.data-table{min-width:520px}.chat-layout{grid-template-columns:1fr!important;height:auto}.chat-side{min-height:0}.chat-side-list{max-height:180px}.chat-scroll{min-height:300px}.login{align-items:start;min-height:100dvh;padding:var(--ymir-space-4)}.gate{grid-template-columns:1fr;gap:var(--ymir-space-4)}.gate-lore{order:2;padding:var(--ymir-space-2) 0}.login-card{max-width:100%;padding:var(--ymir-space-4)}.login-card input,.field input,.field select,.chat-compose input{font-size:16px}.stream-body{max-height:26vh}.stream-line{grid-template-columns:62px 80px 1fr!important}.stream-line .kind{display:none}}@media(max-width:520px){.metric-grid{grid-template-columns:1fr}.ws-switch{max-width:52vw}}.m-nav,.m-sheet{display:none}@media(max-width:780px){.rail,.stream{display:none}.shell{grid-template-columns:1fr;grid-template-rows:var(--topbar-h) minmax(0,1fr);grid-template-areas:"topbar" "stage"}.stage{padding-bottom:84px}.m-nav{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:50;height:58px;padding-bottom:env(safe-area-inset-bottom);background:color-mix(in srgb,var(--ymir-bg-1) 94%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-top:1px solid var(--ymir-steel-1)}.m-tab{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;background:none;border:none;color:var(--ymir-text-2);font-size:10px;letter-spacing:.02em;padding:6px 0}.m-tab.on{color:var(--realm-tint)}.m-tab .m-glyph{font-size:18px}.m-sheet{display:flex;position:fixed;top:0;right:0;bottom:0;left:0;z-index:70;align-items:flex-end;background:#0000008c}.m-sheet-inner{width:100%;background:var(--ymir-bg-1);border-top:1px solid var(--ymir-steel-1);border-radius:16px 16px 0 0;padding:10px var(--ymir-space-4) calc(var(--ymir-space-4) + env(safe-area-inset-bottom));box-shadow:var(--ymir-shadow-raise)}.m-sheet-grip{width:40px;height:4px;border-radius:2px;background:var(--ymir-steel-2);margin:0 auto 10px}.m-sheet-head{font-weight:600;margin-bottom:10px}.m-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.m-cell{display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 4px;border:1px solid var(--ymir-steel-1);border-radius:10px;background:var(--ymir-bg-2);color:var(--ymir-text-1);font-size:11px}.m-cell.on{border-color:var(--realm-tint);color:var(--ymir-text-0)}.m-cell .m-glyph{font-size:20px}.chat-compose{padding-bottom:calc(var(--ymir-space-3) + env(safe-area-inset-bottom))}}@media(max-width:780px){.m-sheet-grip{cursor:grab;touch-action:none;width:100%;height:16px;margin:0 0 10px;background:none}.m-sheet-grip:before{content:"";display:block;width:40px;height:4px;border-radius:2px;background:var(--ymir-steel-2);margin:0 auto}}@media(max-width:780px){.login{display:block;text-align:center}.login .gate,.login-card{margin-left:auto;margin-right:auto;text-align:left}}