@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.
- package/CHANGELOG.md +56 -0
- package/apps/README.md +4 -0
- package/apps/hlidskjalf/README.md +68 -0
- package/apps/hlidskjalf/android/app/build.gradle +73 -0
- package/apps/hlidskjalf/android/app/capacitor.build.gradle +19 -0
- package/apps/hlidskjalf/android/app/proguard-rules.pro +21 -0
- package/apps/hlidskjalf/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +26 -0
- package/apps/hlidskjalf/android/app/src/main/AndroidManifest.xml +41 -0
- package/apps/hlidskjalf/android/app/src/main/java/org/zerwiz/ymir/MainActivity.java +5 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable/ic_launcher_background.xml +170 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable/splash.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable-land-hdpi/splash.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable-land-mdpi/splash.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable-land-xhdpi/splash.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable-land-xxhdpi/splash.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable-land-xxxhdpi/splash.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable-port-hdpi/splash.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable-port-mdpi/splash.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable-port-xhdpi/splash.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable-port-xxhdpi/splash.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable-port-xxxhdpi/splash.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +34 -0
- package/apps/hlidskjalf/android/app/src/main/res/layout/activity_main.xml +12 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/apps/hlidskjalf/android/app/src/main/res/values/ic_launcher_background.xml +4 -0
- package/apps/hlidskjalf/android/app/src/main/res/values/strings.xml +7 -0
- package/apps/hlidskjalf/android/app/src/main/res/values/styles.xml +22 -0
- package/apps/hlidskjalf/android/app/src/main/res/xml/file_paths.xml +5 -0
- package/apps/hlidskjalf/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +18 -0
- package/apps/hlidskjalf/android/build.gradle +29 -0
- package/apps/hlidskjalf/android/capacitor.settings.gradle +3 -0
- package/apps/hlidskjalf/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/apps/hlidskjalf/android/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/apps/hlidskjalf/android/gradle.properties +22 -0
- package/apps/hlidskjalf/android/gradlew +248 -0
- package/apps/hlidskjalf/android/gradlew.bat +92 -0
- package/apps/hlidskjalf/android/settings.gradle +5 -0
- package/apps/hlidskjalf/android/variables.gradle +16 -0
- package/apps/hlidskjalf/capacitor.config.ts +26 -0
- package/apps/hlidskjalf/dist/apple-touch-icon.png +0 -0
- package/apps/hlidskjalf/dist/assets/index-BWmNIyaG.css +1 -0
- package/apps/hlidskjalf/dist/assets/index-k7QEfNto.js +88 -0
- package/apps/hlidskjalf/dist/assets/index-k7QEfNto.js.map +1 -0
- package/apps/hlidskjalf/dist/icon.svg +7 -0
- package/apps/hlidskjalf/dist/index.html +64 -0
- package/apps/hlidskjalf/dist/manifest.webmanifest +31 -0
- package/apps/hlidskjalf/dist/og.jpg +0 -0
- package/apps/hlidskjalf/dist/og.png +0 -0
- package/apps/hlidskjalf/dist/og.svg +64 -0
- package/apps/hlidskjalf/dist/sw.js +39 -0
- package/apps/hlidskjalf/dist/ymir-icon.png +0 -0
- package/apps/hlidskjalf/dist/ymir-mark.svg +62 -0
- package/apps/hlidskjalf/electron/icon.png +0 -0
- package/apps/hlidskjalf/electron/main.cjs +236 -0
- package/apps/hlidskjalf/electron/preload.cjs +8 -0
- package/apps/hlidskjalf/electron/smidja-icon.png +0 -0
- package/apps/hlidskjalf/electron/ymir-hlidskjalf.desktop.in +12 -0
- package/apps/hlidskjalf/electron/ymir-smidja.desktop.in +12 -0
- package/apps/hlidskjalf/index.html +63 -0
- package/apps/hlidskjalf/package-lock.json +5398 -0
- package/apps/hlidskjalf/package.json +55 -0
- package/apps/hlidskjalf/public/apple-touch-icon.png +0 -0
- package/apps/hlidskjalf/public/icon.svg +7 -0
- package/apps/hlidskjalf/public/manifest.webmanifest +31 -0
- package/apps/hlidskjalf/public/og.jpg +0 -0
- package/apps/hlidskjalf/public/og.png +0 -0
- package/apps/hlidskjalf/public/og.svg +64 -0
- package/apps/hlidskjalf/public/sw.js +39 -0
- package/apps/hlidskjalf/public/ymir-icon.png +0 -0
- package/apps/hlidskjalf/public/ymir-mark.svg +62 -0
- package/apps/hlidskjalf/server/accounts.ts +159 -0
- package/apps/hlidskjalf/server/index.ts +2045 -0
- package/apps/hlidskjalf/src/app/App.tsx +116 -0
- package/apps/hlidskjalf/src/app/BottomStream.tsx +128 -0
- package/apps/hlidskjalf/src/app/MobileNav.tsx +87 -0
- package/apps/hlidskjalf/src/app/Rail.tsx +106 -0
- package/apps/hlidskjalf/src/app/Shell.tsx +135 -0
- package/apps/hlidskjalf/src/app/Topbar.tsx +130 -0
- package/apps/hlidskjalf/src/components/AccentPicker.tsx +207 -0
- package/apps/hlidskjalf/src/components/AccountMenu.tsx +115 -0
- package/apps/hlidskjalf/src/components/AgentCard.tsx +75 -0
- package/apps/hlidskjalf/src/components/EmberBackground.tsx +36 -0
- package/apps/hlidskjalf/src/components/Emblem.tsx +48 -0
- package/apps/hlidskjalf/src/components/Halls.tsx +155 -0
- package/apps/hlidskjalf/src/components/LoginModal.tsx +329 -0
- package/apps/hlidskjalf/src/components/Markdown.tsx +10 -0
- package/apps/hlidskjalf/src/components/MetricTile.tsx +40 -0
- package/apps/hlidskjalf/src/components/ModelPicker.tsx +100 -0
- package/apps/hlidskjalf/src/components/Overlay.tsx +134 -0
- package/apps/hlidskjalf/src/components/PRCard.tsx +154 -0
- package/apps/hlidskjalf/src/components/RecallPanel.tsx +116 -0
- package/apps/hlidskjalf/src/components/RuneTag.tsx +23 -0
- package/apps/hlidskjalf/src/components/Status.tsx +35 -0
- package/apps/hlidskjalf/src/components/TaskChip.tsx +23 -0
- package/apps/hlidskjalf/src/components/TraceRow.tsx +28 -0
- package/apps/hlidskjalf/src/data/lore.ts +127 -0
- package/apps/hlidskjalf/src/data/metadata.ts +147 -0
- package/apps/hlidskjalf/src/data/mythology.ts +95 -0
- package/apps/hlidskjalf/src/data/realms.ts +167 -0
- package/apps/hlidskjalf/src/gates/Cron.tsx +77 -0
- package/apps/hlidskjalf/src/gates/Decisions.tsx +67 -0
- package/apps/hlidskjalf/src/gates/Files.tsx +138 -0
- package/apps/hlidskjalf/src/gates/Fleet.tsx +184 -0
- package/apps/hlidskjalf/src/gates/Forge.tsx +486 -0
- package/apps/hlidskjalf/src/gates/OmniChat.tsx +217 -0
- package/apps/hlidskjalf/src/gates/Processes.tsx +162 -0
- package/apps/hlidskjalf/src/gates/Profile.tsx +225 -0
- package/apps/hlidskjalf/src/gates/Reviews.tsx +33 -0
- package/apps/hlidskjalf/src/gates/Runes.tsx +116 -0
- package/apps/hlidskjalf/src/gates/Runtime.tsx +106 -0
- package/apps/hlidskjalf/src/gates/Sessions.tsx +109 -0
- package/apps/hlidskjalf/src/gates/Stats.tsx +268 -0
- package/apps/hlidskjalf/src/gates/Tasks.tsx +173 -0
- package/apps/hlidskjalf/src/gates/Trace.tsx +155 -0
- package/apps/hlidskjalf/src/gates/Well.tsx +154 -0
- package/apps/hlidskjalf/src/gates/Worktrees.tsx +48 -0
- package/apps/hlidskjalf/src/hooks/useTenantDef.ts +13 -0
- package/apps/hlidskjalf/src/main.tsx +31 -0
- package/apps/hlidskjalf/src/services/api.ts +404 -0
- package/apps/hlidskjalf/src/services/auth.ts +107 -0
- package/apps/hlidskjalf/src/services/stream.ts +35 -0
- package/apps/hlidskjalf/src/state/store.ts +648 -0
- package/apps/hlidskjalf/src/state/ui.ts +62 -0
- package/apps/hlidskjalf/src/styles/auth.css +485 -0
- package/apps/hlidskjalf/src/styles/components.css +1259 -0
- package/apps/hlidskjalf/src/styles/forge.css +115 -0
- package/apps/hlidskjalf/src/styles/global.css +167 -0
- package/apps/hlidskjalf/src/styles/menus.css +175 -0
- package/apps/hlidskjalf/src/styles/mobile.css +298 -0
- package/apps/hlidskjalf/src/styles/overlays.css +205 -0
- package/apps/hlidskjalf/src/styles/shell.css +641 -0
- package/apps/hlidskjalf/src/types.ts +251 -0
- package/apps/hlidskjalf/src/vite-env.d.ts +9 -0
- package/apps/hlidskjalf/static/landing.md +6 -0
- package/apps/hlidskjalf/tsconfig.json +25 -0
- package/apps/hlidskjalf/vite.config.ts +49 -0
- package/apps/hlidskjalf-mobile/App.tsx +93 -0
- package/apps/hlidskjalf-mobile/app.json +13 -0
- package/apps/hlidskjalf-mobile/index.ts +4 -0
- package/apps/hlidskjalf-mobile/package.json +35 -0
- package/apps/hlidskjalf-mobile/public/icon.svg +7 -0
- package/apps/hlidskjalf-mobile/tsconfig.json +4 -0
- package/apps/odrerir/.astro/content.d.ts +159 -0
- package/apps/odrerir/.astro/dev.json +24 -0
- package/apps/odrerir/.astro/settings.json +5 -0
- package/apps/odrerir/.astro/types.d.ts +2 -0
- package/apps/odrerir/astro.config.mjs +79 -0
- package/apps/odrerir/dist/apple-touch-icon.png +0 -0
- package/apps/odrerir/dist/favicon-192.png +0 -0
- package/apps/odrerir/dist/favicon-32.png +0 -0
- package/apps/odrerir/dist/favicon-512.png +0 -0
- package/apps/odrerir/dist/favicon.svg +53 -0
- package/apps/odrerir/dist/icon.svg +7 -0
- package/apps/odrerir/dist/index.html +837 -0
- package/apps/odrerir/dist/og-square.png +0 -0
- package/apps/odrerir/dist/og-story.png +0 -0
- package/apps/odrerir/dist/og.png +0 -0
- package/apps/odrerir/dist/safari-pinned-tab.svg +7 -0
- package/apps/odrerir/dist/site.webmanifest +16 -0
- package/apps/odrerir/dist/styles/cloth.css +112 -0
- package/apps/odrerir/dist/styles/livehall.css +278 -0
- package/apps/odrerir/electron/icon.png +0 -0
- package/apps/odrerir/electron/main.cjs +183 -0
- package/apps/odrerir/electron/ymir-odrerir.desktop.in +12 -0
- package/apps/odrerir/package-lock.json +4195 -0
- package/apps/odrerir/package.json +30 -0
- package/apps/odrerir/public/apple-touch-icon.png +0 -0
- package/apps/odrerir/public/favicon-192.png +0 -0
- package/apps/odrerir/public/favicon-32.png +0 -0
- package/apps/odrerir/public/favicon-512.png +0 -0
- package/apps/odrerir/public/favicon.svg +53 -0
- package/apps/odrerir/public/icon.svg +7 -0
- package/apps/odrerir/public/og-square.png +0 -0
- package/apps/odrerir/public/og-story.png +0 -0
- package/apps/odrerir/public/og.png +0 -0
- package/apps/odrerir/public/safari-pinned-tab.svg +7 -0
- package/apps/odrerir/public/site.webmanifest +16 -0
- package/apps/odrerir/scripts/extract-cloth.mjs +101 -0
- package/apps/odrerir/src/index.html +837 -0
- package/apps/odrerir/src/styles/cloth.css +112 -0
- package/apps/odrerir/src/styles/livehall.css +278 -0
- package/apps/sessrumnir/.github/ISSUE_TEMPLATE/bug_report.yml +99 -0
- package/apps/sessrumnir/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/apps/sessrumnir/.github/ISSUE_TEMPLATE/feature_request.yml +46 -0
- package/apps/sessrumnir/.github/PULL_REQUEST_TEMPLATE.md +56 -0
- package/apps/sessrumnir/.github/SUPPORT.md +18 -0
- package/apps/sessrumnir/.github/workflows/build.yml +133 -0
- package/apps/sessrumnir/AGENTS.md +540 -0
- package/apps/sessrumnir/CLA.md +63 -0
- package/apps/sessrumnir/CONTRIBUTING.md +233 -0
- package/apps/sessrumnir/LICENSE +200 -0
- package/apps/sessrumnir/NOTICE +33 -0
- package/apps/sessrumnir/README.md +329 -0
- package/apps/sessrumnir/bin/sessrumnir-web.sh +117 -0
- package/apps/sessrumnir/bin/sessrumnir.js +169 -0
- package/apps/sessrumnir/docs/CNAME +1 -0
- package/apps/sessrumnir/docs/favicon.ico +0 -0
- package/apps/sessrumnir/docs/icon-512.png +0 -0
- package/apps/sessrumnir/docs/index.html +441 -0
- package/apps/sessrumnir/docs/robots.txt +4 -0
- package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_181929.png +0 -0
- package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182005.png +0 -0
- package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182020.png +0 -0
- package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182039.png +0 -0
- package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182117.png +0 -0
- package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182225.png +0 -0
- package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182248.png +0 -0
- package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182322.png +0 -0
- package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182340.png +0 -0
- package/apps/sessrumnir/docs/sitemap.xml +9 -0
- package/apps/sessrumnir/electron.vite.config.ts +49 -0
- package/apps/sessrumnir/eslint.config.mjs +75 -0
- package/apps/sessrumnir/i18next.config.ts +33 -0
- package/apps/sessrumnir/install.sh +144 -0
- package/apps/sessrumnir/out/main/index.js +10881 -0
- package/apps/sessrumnir/out/preload/index.js +722 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-400-normal-C8QS47vb.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-400-normal-D3EsxgFc.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-500-normal-B7dJQtg-.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-500-normal-BLlg2W5x.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-600-normal-BcIsDXzC.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-600-normal-CBymlcNF.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-400-normal-Bgrpe4p1.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-400-normal-BlcaxZtM.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-500-normal-CdQuyvtc.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-500-normal-pZw22qtS.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-600-normal-Dr-wLyOm.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-600-normal-dLR2-a_v.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-400-normal-BGH8Vunh.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-400-normal-C3_-2Ua-.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-500-normal-Dj3SQ6fR.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-500-normal-EBdSCOD3.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-600-normal-B254Xisw.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-600-normal-DUW-TI76.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-400-normal-DuQ88yz3.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-400-normal-DuXFa1Dr.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-500-normal-AH9qog1s.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-500-normal-DAuUCO41.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-600-normal-CD-dlDpD.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-600-normal-D3T6BBXG.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-400-normal-C-RiYxEf.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-400-normal-DmUuA7Y2.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-500-normal-DsPuwQHi.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-500-normal-tGBW_mI7.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-600-normal-Dar_cCT6.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-600-normal-GIs8CF2x.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-300-normal-Ba-HN6uq.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-300-normal-ByB2hQUF.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-300-normal-B8O3uHbr.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-300-normal-BbtBtHoB.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-300-normal-BPU54Tw3.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-300-normal-BRS-C4KA.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-300-normal-BEtQ2wm2.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-300-normal-CQbCaAQ4.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-300-normal-B6fSpYYV.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-300-normal-CpdbWO_2.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/index-BxqsRq2x.css +4858 -0
- package/apps/sessrumnir/out/renderer/assets/index-TaD69rFk.js +99435 -0
- package/apps/sessrumnir/out/renderer/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/newsreader-latin-ext-wght-italic-DFS986qL.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/newsreader-latin-wght-italic-Bxi8ein9.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/newsreader-vietnamese-wght-italic-xAqemagA.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/openmoji-color-9qo_2DLG.woff2 +0 -0
- package/apps/sessrumnir/out/renderer/assets/pi-logo-B6SVnhuS.svg +7 -0
- package/apps/sessrumnir/out/renderer/index.html +19 -0
- package/apps/sessrumnir/out/renderer/theme-boot.js +30 -0
- package/apps/sessrumnir/package-lock.json +10636 -0
- package/apps/sessrumnir/package.json +183 -0
- package/apps/sessrumnir/public/apple-touch-icon.png +0 -0
- package/apps/sessrumnir/public/icon.svg +7 -0
- package/apps/sessrumnir/resources/icons/generate_icons.py +38 -0
- package/apps/sessrumnir/resources/icons/icon-128.png +0 -0
- package/apps/sessrumnir/resources/icons/icon-16.png +0 -0
- package/apps/sessrumnir/resources/icons/icon-256.png +0 -0
- package/apps/sessrumnir/resources/icons/icon-32.png +0 -0
- package/apps/sessrumnir/resources/icons/icon-48.png +0 -0
- package/apps/sessrumnir/resources/icons/icon-512.png +0 -0
- package/apps/sessrumnir/resources/icons/icon-64.png +0 -0
- package/apps/sessrumnir/resources/icons/icon.icns +0 -0
- package/apps/sessrumnir/resources/icons/icon.ico +0 -0
- package/apps/sessrumnir/resources/icons/icon.png +0 -0
- package/apps/sessrumnir/resources/icons/icon.svg +7 -0
- package/apps/sessrumnir/resources/linux/after-install.sh +23 -0
- package/apps/sessrumnir/resources/linux/after-remove.sh +18 -0
- package/apps/sessrumnir/resources/locales/en/translation.json +1735 -0
- package/apps/sessrumnir/resources/permission-prompt-text.test.ts +111 -0
- package/apps/sessrumnir/resources/permission-prompt-text.ts +84 -0
- package/apps/sessrumnir/resources/permission-rules.test.ts +351 -0
- package/apps/sessrumnir/resources/permission-rules.ts +293 -0
- package/apps/sessrumnir/resources/pi-desktop-permissions.ts +62 -0
- package/apps/sessrumnir/resources/ymir-sessrumnir.desktop.in +12 -0
- package/apps/sessrumnir/scripts/check-semantic-colors.mjs +57 -0
- package/apps/sessrumnir/src/main/activity-stats.test.ts +240 -0
- package/apps/sessrumnir/src/main/activity-stats.ts +596 -0
- package/apps/sessrumnir/src/main/agent-detection.test.ts +25 -0
- package/apps/sessrumnir/src/main/agent-detection.ts +114 -0
- package/apps/sessrumnir/src/main/app-data-paths.test.ts +90 -0
- package/apps/sessrumnir/src/main/app-data-paths.ts +95 -0
- package/apps/sessrumnir/src/main/app-log.test.ts +114 -0
- package/apps/sessrumnir/src/main/app-log.ts +210 -0
- package/apps/sessrumnir/src/main/archived-sessions.test.ts +50 -0
- package/apps/sessrumnir/src/main/archived-sessions.ts +95 -0
- package/apps/sessrumnir/src/main/attachment-reader.test.ts +56 -0
- package/apps/sessrumnir/src/main/attachment-reader.ts +52 -0
- package/apps/sessrumnir/src/main/auto-tag.test.ts +38 -0
- package/apps/sessrumnir/src/main/auto-tag.ts +75 -0
- package/apps/sessrumnir/src/main/autostart-linux.test.ts +56 -0
- package/apps/sessrumnir/src/main/autostart-linux.ts +58 -0
- package/apps/sessrumnir/src/main/cmd-escape.test.ts +424 -0
- package/apps/sessrumnir/src/main/cmd-escape.ts +186 -0
- package/apps/sessrumnir/src/main/council-manager.test.ts +167 -0
- package/apps/sessrumnir/src/main/council-manager.ts +265 -0
- package/apps/sessrumnir/src/main/diagnostics-report.test.ts +140 -0
- package/apps/sessrumnir/src/main/diagnostics-report.ts +91 -0
- package/apps/sessrumnir/src/main/diagnostics.ts +111 -0
- package/apps/sessrumnir/src/main/editor-guard.test.ts +59 -0
- package/apps/sessrumnir/src/main/editor-guard.ts +50 -0
- package/apps/sessrumnir/src/main/extension-ui-ipc.test.ts +299 -0
- package/apps/sessrumnir/src/main/extension-ui-ipc.ts +117 -0
- package/apps/sessrumnir/src/main/file-service.test.ts +279 -0
- package/apps/sessrumnir/src/main/file-service.ts +652 -0
- package/apps/sessrumnir/src/main/fs-errors.ts +42 -0
- package/apps/sessrumnir/src/main/get-messages-trim.test.ts +77 -0
- package/apps/sessrumnir/src/main/get-messages-trim.ts +97 -0
- package/apps/sessrumnir/src/main/git-conveyor.test.ts +305 -0
- package/apps/sessrumnir/src/main/git-conveyor.ts +338 -0
- package/apps/sessrumnir/src/main/git-worktree.test.ts +101 -0
- package/apps/sessrumnir/src/main/git-worktree.ts +201 -0
- package/apps/sessrumnir/src/main/i18n.ts +31 -0
- package/apps/sessrumnir/src/main/index.ts +619 -0
- package/apps/sessrumnir/src/main/ipc/active-engine.ts +15 -0
- package/apps/sessrumnir/src/main/ipc/context.ts +58 -0
- package/apps/sessrumnir/src/main/ipc/council-handlers.ts +126 -0
- package/apps/sessrumnir/src/main/ipc/diagnostics-handlers.ts +8 -0
- package/apps/sessrumnir/src/main/ipc/file-handlers.ts +96 -0
- package/apps/sessrumnir/src/main/ipc/git-conveyor-handlers.ts +55 -0
- package/apps/sessrumnir/src/main/ipc/model-handlers.ts +33 -0
- package/apps/sessrumnir/src/main/ipc/models-config-handlers.ts +80 -0
- package/apps/sessrumnir/src/main/ipc/notes-handlers.ts +65 -0
- package/apps/sessrumnir/src/main/ipc/package-handlers.ts +330 -0
- package/apps/sessrumnir/src/main/ipc/permission-rules-handlers.ts +223 -0
- package/apps/sessrumnir/src/main/ipc/pi-handlers.ts +136 -0
- package/apps/sessrumnir/src/main/ipc/pi-start-options.ts +150 -0
- package/apps/sessrumnir/src/main/ipc/run-pi-cli.ts +53 -0
- package/apps/sessrumnir/src/main/ipc/session-handlers.ts +491 -0
- package/apps/sessrumnir/src/main/ipc/settings.ts +120 -0
- package/apps/sessrumnir/src/main/ipc/skills-mcp-handlers.ts +192 -0
- package/apps/sessrumnir/src/main/ipc/system-handlers.ts +131 -0
- package/apps/sessrumnir/src/main/ipc/tag-handlers.ts +69 -0
- package/apps/sessrumnir/src/main/ipc/terminal-handlers.ts +41 -0
- package/apps/sessrumnir/src/main/ipc/theme-handlers.ts +131 -0
- package/apps/sessrumnir/src/main/ipc/update-handlers.ts +61 -0
- package/apps/sessrumnir/src/main/ipc/validation.ts +45 -0
- package/apps/sessrumnir/src/main/ipc/workflow-handlers.ts +108 -0
- package/apps/sessrumnir/src/main/ipc/workspace-activity-wiring.ts +179 -0
- package/apps/sessrumnir/src/main/ipc/workspace-handlers.ts +133 -0
- package/apps/sessrumnir/src/main/ipc-handlers.ts +98 -0
- package/apps/sessrumnir/src/main/map-concurrent.test.ts +80 -0
- package/apps/sessrumnir/src/main/map-concurrent.ts +30 -0
- package/apps/sessrumnir/src/main/models-file.test.ts +114 -0
- package/apps/sessrumnir/src/main/models-file.ts +89 -0
- package/apps/sessrumnir/src/main/notes-manager.test.ts +64 -0
- package/apps/sessrumnir/src/main/notes-manager.ts +183 -0
- package/apps/sessrumnir/src/main/notify-decision.test.ts +39 -0
- package/apps/sessrumnir/src/main/notify-decision.ts +25 -0
- package/apps/sessrumnir/src/main/omp-fork-points.test.ts +119 -0
- package/apps/sessrumnir/src/main/omp-fork-points.ts +105 -0
- package/apps/sessrumnir/src/main/omp-plugin-list.test.ts +94 -0
- package/apps/sessrumnir/src/main/omp-plugin-list.ts +103 -0
- package/apps/sessrumnir/src/main/package-catalog.test.ts +157 -0
- package/apps/sessrumnir/src/main/package-catalog.ts +166 -0
- package/apps/sessrumnir/src/main/package-updates.test.ts +149 -0
- package/apps/sessrumnir/src/main/package-updates.ts +185 -0
- package/apps/sessrumnir/src/main/path-authorization.test.ts +64 -0
- package/apps/sessrumnir/src/main/path-authorization.ts +31 -0
- package/apps/sessrumnir/src/main/pi-binary-resolution.test.ts +582 -0
- package/apps/sessrumnir/src/main/pi-binary-resolution.ts +649 -0
- package/apps/sessrumnir/src/main/pi-event-router.test.ts +388 -0
- package/apps/sessrumnir/src/main/pi-event-router.ts +290 -0
- package/apps/sessrumnir/src/main/pi-paths.test.ts +134 -0
- package/apps/sessrumnir/src/main/pi-paths.ts +74 -0
- package/apps/sessrumnir/src/main/pi-rpc-manager.test.ts +467 -0
- package/apps/sessrumnir/src/main/pi-rpc-manager.ts +1319 -0
- package/apps/sessrumnir/src/main/process-tree.test.ts +94 -0
- package/apps/sessrumnir/src/main/renderer-origin.test.ts +33 -0
- package/apps/sessrumnir/src/main/renderer-origin.ts +35 -0
- package/apps/sessrumnir/src/main/session-lineage-reader.test.ts +317 -0
- package/apps/sessrumnir/src/main/session-lineage-reader.ts +111 -0
- package/apps/sessrumnir/src/main/session-metadata.test.ts +508 -0
- package/apps/sessrumnir/src/main/session-metadata.ts +526 -0
- package/apps/sessrumnir/src/main/session-name.test.ts +71 -0
- package/apps/sessrumnir/src/main/session-name.ts +69 -0
- package/apps/sessrumnir/src/main/session-paths.test.ts +110 -0
- package/apps/sessrumnir/src/main/session-paths.ts +88 -0
- package/apps/sessrumnir/src/main/session-tags.test.ts +61 -0
- package/apps/sessrumnir/src/main/session-tags.ts +253 -0
- package/apps/sessrumnir/src/main/session-trash.test.ts +66 -0
- package/apps/sessrumnir/src/main/session-trash.ts +65 -0
- package/apps/sessrumnir/src/main/settings-logic.ts +66 -0
- package/apps/sessrumnir/src/main/skills-discovery.test.ts +149 -0
- package/apps/sessrumnir/src/main/skills-discovery.ts +179 -0
- package/apps/sessrumnir/src/main/startup-launch.ts +63 -0
- package/apps/sessrumnir/src/main/terminal-service.ts +96 -0
- package/apps/sessrumnir/src/main/theme-store.test.ts +440 -0
- package/apps/sessrumnir/src/main/theme-store.ts +495 -0
- package/apps/sessrumnir/src/main/tray-decision.test.ts +46 -0
- package/apps/sessrumnir/src/main/tray-decision.ts +49 -0
- package/apps/sessrumnir/src/main/tray-manager.ts +220 -0
- package/apps/sessrumnir/src/main/tsconfig.json +20 -0
- package/apps/sessrumnir/src/main/window-background.test.ts +29 -0
- package/apps/sessrumnir/src/main/window-background.ts +16 -0
- package/apps/sessrumnir/src/main/workflow-discovery.test.ts +252 -0
- package/apps/sessrumnir/src/main/workflow-monitor.test.ts +371 -0
- package/apps/sessrumnir/src/main/workflow-monitor.ts +1020 -0
- package/apps/sessrumnir/src/main/workspace-activity.test.ts +227 -0
- package/apps/sessrumnir/src/main/workspace-activity.ts +215 -0
- package/apps/sessrumnir/src/main/workspace-manager.test.ts +680 -0
- package/apps/sessrumnir/src/main/workspace-manager.ts +1199 -0
- package/apps/sessrumnir/src/main/workspace-trust.test.ts +78 -0
- package/apps/sessrumnir/src/main/workspace-trust.ts +84 -0
- package/apps/sessrumnir/src/preload/index.ts +358 -0
- package/apps/sessrumnir/src/preload/tsconfig.json +20 -0
- package/apps/sessrumnir/src/renderer/index.html +18 -0
- package/apps/sessrumnir/src/renderer/public/theme-boot.js +30 -0
- package/apps/sessrumnir/src/renderer/src/app.tsx +194 -0
- package/apps/sessrumnir/src/renderer/src/assets/openmoji-color.woff2 +0 -0
- package/apps/sessrumnir/src/renderer/src/assets/pi-logo.svg +7 -0
- package/apps/sessrumnir/src/renderer/src/assets/ymir-mark.svg +55 -0
- package/apps/sessrumnir/src/renderer/src/assets.d.ts +7 -0
- package/apps/sessrumnir/src/renderer/src/components/chat-code-highlight.ts +239 -0
- package/apps/sessrumnir/src/renderer/src/components/chat-file-link.ts +140 -0
- package/apps/sessrumnir/src/renderer/src/components/chat-input.tsx +729 -0
- package/apps/sessrumnir/src/renderer/src/components/chat-panel-widths.test.ts +175 -0
- package/apps/sessrumnir/src/renderer/src/components/chat-panel-widths.ts +100 -0
- package/apps/sessrumnir/src/renderer/src/components/chat-panel.tsx +523 -0
- package/apps/sessrumnir/src/renderer/src/components/chat-project-picker.tsx +193 -0
- package/apps/sessrumnir/src/renderer/src/components/chat-search.tsx +251 -0
- package/apps/sessrumnir/src/renderer/src/components/code-editor-highlight.ts +85 -0
- package/apps/sessrumnir/src/renderer/src/components/code-editor-language.test.ts +19 -0
- package/apps/sessrumnir/src/renderer/src/components/code-editor-language.ts +88 -0
- package/apps/sessrumnir/src/renderer/src/components/code-editor.tsx +128 -0
- package/apps/sessrumnir/src/renderer/src/components/command-palette.tsx +315 -0
- package/apps/sessrumnir/src/renderer/src/components/command-results.tsx +80 -0
- package/apps/sessrumnir/src/renderer/src/components/composer-permission-menu.tsx +91 -0
- package/apps/sessrumnir/src/renderer/src/components/context-menu.tsx +457 -0
- package/apps/sessrumnir/src/renderer/src/components/copy-button.tsx +36 -0
- package/apps/sessrumnir/src/renderer/src/components/council-panels.tsx +193 -0
- package/apps/sessrumnir/src/renderer/src/components/custom-models-editor.tsx +330 -0
- package/apps/sessrumnir/src/renderer/src/components/diagnostics-panel.tsx +380 -0
- package/apps/sessrumnir/src/renderer/src/components/diff-viewer.tsx +318 -0
- package/apps/sessrumnir/src/renderer/src/components/ember-background.tsx +113 -0
- package/apps/sessrumnir/src/renderer/src/components/error-boundary.tsx +38 -0
- package/apps/sessrumnir/src/renderer/src/components/extension-ui-dialog-helpers.test.ts +43 -0
- package/apps/sessrumnir/src/renderer/src/components/extension-ui-dialog-helpers.ts +51 -0
- package/apps/sessrumnir/src/renderer/src/components/extension-ui-dialog.tsx +486 -0
- package/apps/sessrumnir/src/renderer/src/components/file-tree.tsx +784 -0
- package/apps/sessrumnir/src/renderer/src/components/git-conveyor-actions.tsx +246 -0
- package/apps/sessrumnir/src/renderer/src/components/home-screen.tsx +396 -0
- package/apps/sessrumnir/src/renderer/src/components/image-viewer.tsx +100 -0
- package/apps/sessrumnir/src/renderer/src/components/line-numbered-code.tsx +58 -0
- package/apps/sessrumnir/src/renderer/src/components/markdown-renderer.tsx +237 -0
- package/apps/sessrumnir/src/renderer/src/components/message-bubble.tsx +1006 -0
- package/apps/sessrumnir/src/renderer/src/components/mission-control.tsx +341 -0
- package/apps/sessrumnir/src/renderer/src/components/model-selector.tsx +219 -0
- package/apps/sessrumnir/src/renderer/src/components/note-picker.tsx +155 -0
- package/apps/sessrumnir/src/renderer/src/components/notes-panel.tsx +437 -0
- package/apps/sessrumnir/src/renderer/src/components/package-browser.tsx +604 -0
- package/apps/sessrumnir/src/renderer/src/components/permission-mode.test.ts +22 -0
- package/apps/sessrumnir/src/renderer/src/components/permission-mode.ts +49 -0
- package/apps/sessrumnir/src/renderer/src/components/permission-rules-editor-helpers.test.ts +44 -0
- package/apps/sessrumnir/src/renderer/src/components/permission-rules-editor-helpers.ts +35 -0
- package/apps/sessrumnir/src/renderer/src/components/permission-rules-editor.tsx +226 -0
- package/apps/sessrumnir/src/renderer/src/components/permission-selector.tsx +104 -0
- package/apps/sessrumnir/src/renderer/src/components/resize-handle.tsx +51 -0
- package/apps/sessrumnir/src/renderer/src/components/review-rail.tsx +194 -0
- package/apps/sessrumnir/src/renderer/src/components/session-menu-position.test.ts +22 -0
- package/apps/sessrumnir/src/renderer/src/components/session-menu-position.ts +34 -0
- package/apps/sessrumnir/src/renderer/src/components/session-panel.tsx +711 -0
- package/apps/sessrumnir/src/renderer/src/components/session-runtime-indicator.tsx +43 -0
- package/apps/sessrumnir/src/renderer/src/components/settings-panel.tsx +1360 -0
- package/apps/sessrumnir/src/renderer/src/components/sidebar-activity.test.ts +47 -0
- package/apps/sessrumnir/src/renderer/src/components/sidebar-activity.ts +76 -0
- package/apps/sessrumnir/src/renderer/src/components/sidebar-session-labels.test.ts +73 -0
- package/apps/sessrumnir/src/renderer/src/components/sidebar-session-labels.ts +47 -0
- package/apps/sessrumnir/src/renderer/src/components/sidebar.tsx +1045 -0
- package/apps/sessrumnir/src/renderer/src/components/skills-panel.tsx +159 -0
- package/apps/sessrumnir/src/renderer/src/components/stats-panel.tsx +368 -0
- package/apps/sessrumnir/src/renderer/src/components/status-bar.tsx +274 -0
- package/apps/sessrumnir/src/renderer/src/components/status-popover.tsx +481 -0
- package/apps/sessrumnir/src/renderer/src/components/streaming-bubble.tsx +128 -0
- package/apps/sessrumnir/src/renderer/src/components/subagent-progress.tsx +254 -0
- package/apps/sessrumnir/src/renderer/src/components/task-launcher.tsx +168 -0
- package/apps/sessrumnir/src/renderer/src/components/terminal.tsx +203 -0
- package/apps/sessrumnir/src/renderer/src/components/theme-editor-helpers.test.ts +35 -0
- package/apps/sessrumnir/src/renderer/src/components/theme-editor-helpers.ts +35 -0
- package/apps/sessrumnir/src/renderer/src/components/theme-editor.tsx +440 -0
- package/apps/sessrumnir/src/renderer/src/components/theme-gallery.tsx +373 -0
- package/apps/sessrumnir/src/renderer/src/components/thinking-level-selector.tsx +85 -0
- package/apps/sessrumnir/src/renderer/src/components/timeline.tsx +289 -0
- package/apps/sessrumnir/src/renderer/src/components/tool-call-icon.ts +32 -0
- package/apps/sessrumnir/src/renderer/src/components/workflow-navigator.tsx +901 -0
- package/apps/sessrumnir/src/renderer/src/components/workspace-tabs.tsx +241 -0
- package/apps/sessrumnir/src/renderer/src/global.d.ts +8 -0
- package/apps/sessrumnir/src/renderer/src/hooks/use-folder-drop.ts +101 -0
- package/apps/sessrumnir/src/renderer/src/hooks.test.ts +88 -0
- package/apps/sessrumnir/src/renderer/src/hooks.ts +574 -0
- package/apps/sessrumnir/src/renderer/src/i18n.test.ts +54 -0
- package/apps/sessrumnir/src/renderer/src/i18n.ts +89 -0
- package/apps/sessrumnir/src/renderer/src/index.css +425 -0
- package/apps/sessrumnir/src/renderer/src/main.tsx +42 -0
- package/apps/sessrumnir/src/renderer/src/message-grouping.test.ts +422 -0
- package/apps/sessrumnir/src/renderer/src/message-grouping.ts +410 -0
- package/apps/sessrumnir/src/renderer/src/message-parsing.test.ts +86 -0
- package/apps/sessrumnir/src/renderer/src/message-parsing.ts +166 -0
- package/apps/sessrumnir/src/renderer/src/store-external-prompts.test.ts +161 -0
- package/apps/sessrumnir/src/renderer/src/store-session-transitions.test.ts +2090 -0
- package/apps/sessrumnir/src/renderer/src/store-timeline.test.ts +52 -0
- package/apps/sessrumnir/src/renderer/src/store-turn-error.test.ts +136 -0
- package/apps/sessrumnir/src/renderer/src/store.ts +3726 -0
- package/apps/sessrumnir/src/renderer/src/subagent-detection.test.ts +55 -0
- package/apps/sessrumnir/src/renderer/src/theme/engine.test.ts +29 -0
- package/apps/sessrumnir/src/renderer/src/theme/engine.ts +20 -0
- package/apps/sessrumnir/src/renderer/src/themes/breeze-claudius.json +69 -0
- package/apps/sessrumnir/src/renderer/src/themes/breeze-dark.json +69 -0
- package/apps/sessrumnir/src/renderer/src/themes/breeze-light.json +69 -0
- package/apps/sessrumnir/src/renderer/src/themes/builtin-themes.test.ts +95 -0
- package/apps/sessrumnir/src/renderer/src/themes/dark.json +46 -0
- package/apps/sessrumnir/src/renderer/src/themes/fensalir.json +82 -0
- package/apps/sessrumnir/src/renderer/src/themes/gruvbox.json +69 -0
- package/apps/sessrumnir/src/renderer/src/themes/index.ts +60 -0
- package/apps/sessrumnir/src/renderer/src/themes/light.json +46 -0
- package/apps/sessrumnir/src/renderer/src/themes/nord.json +69 -0
- package/apps/sessrumnir/src/renderer/src/themes/sessrumnir.json +82 -0
- package/apps/sessrumnir/src/renderer/src/utils/debounced-buffer.test.ts +81 -0
- package/apps/sessrumnir/src/renderer/src/utils/debounced-buffer.ts +57 -0
- package/apps/sessrumnir/src/renderer/src/utils/format-relative-time.test.ts +62 -0
- package/apps/sessrumnir/src/renderer/src/utils/format-relative-time.ts +28 -0
- package/apps/sessrumnir/src/renderer/src/utils/heatmap-grid.test.ts +57 -0
- package/apps/sessrumnir/src/renderer/src/utils/heatmap-grid.ts +41 -0
- package/apps/sessrumnir/src/renderer/src/utils/ipc-error.test.ts +22 -0
- package/apps/sessrumnir/src/renderer/src/utils/ipc-error.ts +12 -0
- package/apps/sessrumnir/src/renderer/src/utils/model-search.test.ts +63 -0
- package/apps/sessrumnir/src/renderer/src/utils/model-search.ts +20 -0
- package/apps/sessrumnir/src/renderer/src/utils/planning-prompt.test.ts +31 -0
- package/apps/sessrumnir/src/renderer/src/utils/planning-prompt.ts +27 -0
- package/apps/sessrumnir/src/renderer/src/utils/preview-load-error.test.ts +15 -0
- package/apps/sessrumnir/src/renderer/src/utils/preview-load-error.ts +22 -0
- package/apps/sessrumnir/src/renderer/src/utils/process-status-label.test.ts +13 -0
- package/apps/sessrumnir/src/renderer/src/utils/process-status-label.ts +19 -0
- package/apps/sessrumnir/src/renderer/src/utils/quick-switcher.test.ts +68 -0
- package/apps/sessrumnir/src/renderer/src/utils/quick-switcher.ts +52 -0
- package/apps/sessrumnir/src/renderer/src/utils/rank-file-results.test.ts +46 -0
- package/apps/sessrumnir/src/renderer/src/utils/rank-file-results.ts +23 -0
- package/apps/sessrumnir/src/renderer/src/utils/relative-time.tsx +25 -0
- package/apps/sessrumnir/src/renderer/src/utils/session-title.test.ts +98 -0
- package/apps/sessrumnir/src/renderer/src/utils/session-title.ts +58 -0
- package/apps/sessrumnir/src/renderer/src/utils/stale-guard.test.ts +29 -0
- package/apps/sessrumnir/src/renderer/src/utils/stale-guard.ts +20 -0
- package/apps/sessrumnir/src/renderer/src/utils/theme.test.ts +174 -0
- package/apps/sessrumnir/src/renderer/src/utils/theme.ts +159 -0
- package/apps/sessrumnir/src/renderer/src/utils/workflow-runs.test.ts +130 -0
- package/apps/sessrumnir/src/renderer/src/utils/workflow-runs.ts +84 -0
- package/apps/sessrumnir/src/renderer/tsconfig.json +24 -0
- package/apps/sessrumnir/src/shared/agent-engine-label.test.ts +45 -0
- package/apps/sessrumnir/src/shared/agent-engine-label.ts +53 -0
- package/apps/sessrumnir/src/shared/app-settings.test.ts +25 -0
- package/apps/sessrumnir/src/shared/app-settings.ts +23 -0
- package/apps/sessrumnir/src/shared/bridge-http.ts +341 -0
- package/apps/sessrumnir/src/shared/bridge.ts +337 -0
- package/apps/sessrumnir/src/shared/council-config.test.ts +300 -0
- package/apps/sessrumnir/src/shared/council-config.ts +356 -0
- package/apps/sessrumnir/src/shared/default-settings.ts +39 -0
- package/apps/sessrumnir/src/shared/folder-drop.test.ts +118 -0
- package/apps/sessrumnir/src/shared/folder-drop.ts +74 -0
- package/apps/sessrumnir/src/shared/fork-point.test.ts +30 -0
- package/apps/sessrumnir/src/shared/fork-point.ts +24 -0
- package/apps/sessrumnir/src/shared/i18n/i18next.d.ts +10 -0
- package/apps/sessrumnir/src/shared/i18n/index.test.ts +51 -0
- package/apps/sessrumnir/src/shared/i18n/index.ts +50 -0
- package/apps/sessrumnir/src/shared/i18n/languages.ts +12 -0
- package/apps/sessrumnir/src/shared/i18n/locale-checks.ts +98 -0
- package/apps/sessrumnir/src/shared/i18n/locales.test.ts +92 -0
- package/apps/sessrumnir/src/shared/i18n/pseudo.test.ts +39 -0
- package/apps/sessrumnir/src/shared/i18n/pseudo.ts +44 -0
- package/apps/sessrumnir/src/shared/i18n/resolve.test.ts +43 -0
- package/apps/sessrumnir/src/shared/i18n/resolve.ts +41 -0
- package/apps/sessrumnir/src/shared/i18n/resources.ts +11 -0
- package/apps/sessrumnir/src/shared/ipc-contracts.ts +1539 -0
- package/apps/sessrumnir/src/shared/models-config.test.ts +124 -0
- package/apps/sessrumnir/src/shared/models-config.ts +167 -0
- package/apps/sessrumnir/src/shared/package-filter.ts +19 -0
- package/apps/sessrumnir/src/shared/package-spec.test.ts +51 -0
- package/apps/sessrumnir/src/shared/package-spec.ts +25 -0
- package/apps/sessrumnir/src/shared/path-compare.test.ts +38 -0
- package/apps/sessrumnir/src/shared/path-compare.ts +76 -0
- package/apps/sessrumnir/src/shared/permission-mode.ts +8 -0
- package/apps/sessrumnir/src/shared/pi-command.test.ts +165 -0
- package/apps/sessrumnir/src/shared/pi-command.ts +139 -0
- package/apps/sessrumnir/src/shared/product-name.ts +7 -0
- package/apps/sessrumnir/src/shared/session-lineage.test.ts +103 -0
- package/apps/sessrumnir/src/shared/session-lineage.ts +50 -0
- package/apps/sessrumnir/src/shared/session-preview.test.ts +93 -0
- package/apps/sessrumnir/src/shared/session-preview.ts +56 -0
- package/apps/sessrumnir/src/shared/sidebar-width.test.ts +58 -0
- package/apps/sessrumnir/src/shared/sidebar-width.ts +37 -0
- package/apps/sessrumnir/src/shared/theme/builtin-ids.ts +16 -0
- package/apps/sessrumnir/src/shared/theme/resolve.test.ts +66 -0
- package/apps/sessrumnir/src/shared/theme/resolve.ts +29 -0
- package/apps/sessrumnir/src/shared/theme/syntax-defaults.ts +24 -0
- package/apps/sessrumnir/src/shared/theme/theme-file.test.ts +88 -0
- package/apps/sessrumnir/src/shared/theme/theme-file.ts +132 -0
- package/apps/sessrumnir/src/shared/theme/tokens.test.ts +35 -0
- package/apps/sessrumnir/src/shared/theme/tokens.ts +86 -0
- package/apps/sessrumnir/src/shared/tsconfig.json +17 -0
- package/apps/sessrumnir/src/shared/untrusted-data.test.ts +32 -0
- package/apps/sessrumnir/src/shared/untrusted-data.ts +22 -0
- package/apps/sessrumnir/src/shared/version-compare.test.ts +33 -0
- package/apps/sessrumnir/src/shared/version-compare.ts +50 -0
- package/apps/sessrumnir/src/shared/workflow-control.ts +33 -0
- package/apps/sessrumnir/src/web-server.ts +315 -0
- package/apps/sessrumnir/tsconfig.json +26 -0
- package/apps/smidja/smidja_build.py +45 -0
- package/apps/smidja/smidja_build_review.py +76 -0
- package/apps/smidja/smidja_build_test.py +79 -0
- package/apps/smidja/smidja_document.py +76 -0
- package/apps/smidja/smidja_modules/agent_cc.py +15 -0
- package/apps/smidja/smidja_modules/agent_opencode.py +194 -0
- package/apps/smidja/smidja_modules/agent_pi.py +392 -0
- package/apps/smidja/smidja_modules/agents.py +993 -0
- package/apps/smidja/smidja_modules/changes.py +103 -0
- package/apps/smidja/smidja_modules/console.py +131 -0
- package/apps/smidja/smidja_modules/data_types.py +447 -0
- package/apps/smidja/smidja_modules/gates.py +108 -0
- package/apps/smidja/smidja_modules/git_helper.py +120 -0
- package/apps/smidja/smidja_modules/lm_local.py +144 -0
- package/apps/smidja/smidja_modules/permissions.py +194 -0
- package/apps/smidja/smidja_modules/prompts.py +21 -0
- package/apps/smidja/smidja_modules/quality.py +240 -0
- package/apps/smidja/smidja_modules/runner.py +155 -0
- package/apps/smidja/smidja_modules/session.py +50 -0
- package/apps/smidja/smidja_modules/stall_watch.py +149 -0
- package/apps/smidja/smidja_modules/tracer.py +271 -0
- package/apps/smidja/smidja_modules/utils.py +77 -0
- package/apps/smidja/smidja_orchestrate.py +162 -0
- package/apps/smidja/smidja_plan.py +45 -0
- package/apps/smidja/smidja_plan_build.py +55 -0
- package/apps/smidja/smidja_plan_build_test.py +86 -0
- package/apps/smidja/smidja_plan_build_test_quality.py +98 -0
- package/apps/smidja/smidja_prompt.py +44 -0
- package/apps/smidja/smidja_quality.py +49 -0
- package/apps/smidja/smidja_recon_iv.py +202 -0
- package/apps/smidja/smidja_scout.py +45 -0
- package/apps/smidja/smidja_simple_sdlc.py +183 -0
- package/apps/smidja/smidja_smidja_config/smidja.config.yaml +143 -0
- package/apps/smidja-factory/AGENTS.md +165 -0
- package/apps/smidja-factory/README.md +3 -0
- package/apps/smidja-factory/SKILL.md +18 -0
- package/apps/smidja-factory/apps/visualizer/.oxlintrc.json +18 -0
- package/apps/smidja-factory/apps/visualizer/bun.lock +269 -0
- package/apps/smidja-factory/apps/visualizer/desktop/icon.png +0 -0
- package/apps/smidja-factory/apps/visualizer/desktop/main.js +140 -0
- package/apps/smidja-factory/apps/visualizer/desktop/package-lock.json +871 -0
- package/apps/smidja-factory/apps/visualizer/desktop/package.json +18 -0
- package/apps/smidja-factory/apps/visualizer/desktop/preload.js +19 -0
- package/apps/smidja-factory/apps/visualizer/index.html +28 -0
- package/apps/smidja-factory/apps/visualizer/package.json +31 -0
- package/apps/smidja-factory/apps/visualizer/public/icon.svg +7 -0
- package/apps/smidja-factory/apps/visualizer/public/models/claude.png +0 -0
- package/apps/smidja-factory/apps/visualizer/public/models/gemini.png +0 -0
- package/apps/smidja-factory/apps/visualizer/public/models/kimi.png +0 -0
- package/apps/smidja-factory/apps/visualizer/public/models/openai.png +0 -0
- package/apps/smidja-factory/apps/visualizer/public/models/zai.png +0 -0
- package/apps/smidja-factory/apps/visualizer/server/chat.ts +425 -0
- package/apps/smidja-factory/apps/visualizer/server/db.ts +1050 -0
- package/apps/smidja-factory/apps/visualizer/server/index.ts +648 -0
- package/apps/smidja-factory/apps/visualizer/server/model-catalog.ts +90 -0
- package/apps/smidja-factory/apps/visualizer/server/roster-api.ts +75 -0
- package/apps/smidja-factory/apps/visualizer/server/roster_resolve.py +170 -0
- package/apps/smidja-factory/apps/visualizer/server/settings.ts +106 -0
- package/apps/smidja-factory/apps/visualizer/shared/types.ts +630 -0
- package/apps/smidja-factory/apps/visualizer/src/App.vue +379 -0
- package/apps/smidja-factory/apps/visualizer/src/components/ChatInput.vue +155 -0
- package/apps/smidja-factory/apps/visualizer/src/components/ChatThread.vue +219 -0
- package/apps/smidja-factory/apps/visualizer/src/components/ChatView.vue +335 -0
- package/apps/smidja-factory/apps/visualizer/src/components/DecisionsView.vue +177 -0
- package/apps/smidja-factory/apps/visualizer/src/components/DetailSection.vue +76 -0
- package/apps/smidja-factory/apps/visualizer/src/components/MemoryView.vue +397 -0
- package/apps/smidja-factory/apps/visualizer/src/components/PhaseDetail.vue +1354 -0
- package/apps/smidja-factory/apps/visualizer/src/components/PhaseDots.vue +55 -0
- package/apps/smidja-factory/apps/visualizer/src/components/SessionCard.vue +583 -0
- package/apps/smidja-factory/apps/visualizer/src/components/SessionMiniCard.vue +58 -0
- package/apps/smidja-factory/apps/visualizer/src/components/SessionPanel.vue +272 -0
- package/apps/smidja-factory/apps/visualizer/src/components/SessionStartForm.vue +152 -0
- package/apps/smidja-factory/apps/visualizer/src/components/SessionTrace.vue +1157 -0
- package/apps/smidja-factory/apps/visualizer/src/components/SessionsList.vue +96 -0
- package/apps/smidja-factory/apps/visualizer/src/components/SettingsView.vue +152 -0
- package/apps/smidja-factory/apps/visualizer/src/components/StatChip.vue +98 -0
- package/apps/smidja-factory/apps/visualizer/src/components/StatsView.vue +382 -0
- package/apps/smidja-factory/apps/visualizer/src/components/StatusChip.vue +73 -0
- package/apps/smidja-factory/apps/visualizer/src/components/ToolCallCard.vue +156 -0
- package/apps/smidja-factory/apps/visualizer/src/lib/api.ts +177 -0
- package/apps/smidja-factory/apps/visualizer/src/lib/chat-api.ts +95 -0
- package/apps/smidja-factory/apps/visualizer/src/lib/chat-store.ts +351 -0
- package/apps/smidja-factory/apps/visualizer/src/lib/events.ts +131 -0
- package/apps/smidja-factory/apps/visualizer/src/lib/format.ts +92 -0
- package/apps/smidja-factory/apps/visualizer/src/lib/highlight.ts +54 -0
- package/apps/smidja-factory/apps/visualizer/src/lib/markdown.ts +120 -0
- package/apps/smidja-factory/apps/visualizer/src/lib/models.ts +42 -0
- package/apps/smidja-factory/apps/visualizer/src/lib/router.ts +67 -0
- package/apps/smidja-factory/apps/visualizer/src/lib/types.ts +61 -0
- package/apps/smidja-factory/apps/visualizer/src/main.ts +13 -0
- package/apps/smidja-factory/apps/visualizer/src/style.css +592 -0
- package/apps/smidja-factory/apps/visualizer/tsconfig.json +30 -0
- package/apps/smidja-factory/apps/visualizer/vite.config.js +32 -0
- package/apps/smidja-factory/apps/visualizer/vite.config.ts +31 -0
- package/apps/smidja-factory/cookbooks/create_config.md +61 -0
- package/apps/smidja-factory/cookbooks/create_smidja.md +120 -0
- package/apps/smidja-factory/cookbooks/how_to_prompt_for_the_eng.md +110 -0
- package/apps/smidja-factory/cookbooks/install.md +56 -0
- package/apps/smidja-factory/cookbooks/run_smidja.md +122 -0
- package/apps/smidja-factory/cookbooks/smidja_overview.md +88 -0
- package/apps/smidja-factory/cookbooks/update_config.md +103 -0
- package/apps/smidja-factory/cookbooks/update_modules.md +100 -0
- package/apps/smidja-factory/cookbooks/update_smidja.md +90 -0
- package/apps/smidja-factory/docs/enhancement-plan.md +420 -0
- package/apps/smidja-factory/references/config.md +202 -0
- package/apps/smidja-factory/references/handoff.md +161 -0
- package/apps/smidja-factory/references/observability.md +166 -0
- package/apps/smidja-factory/scripts/install.py +113 -0
- package/apps/smidja-factory/scripts/make_config.py +35 -0
- package/apps/smidja-factory/scripts/make_smidja.py +119 -0
- package/apps/smidja-factory/skills/add-or-edit-ai-models/SKILL.md +151 -0
- package/apps/smidja-factory/skills/create-new-agent/SKILL.md +125 -0
- package/apps/smidja-factory/skills/create-new-teams/SKILL.md +151 -0
- package/apps/smidja-factory/skills/git-ops/README.md +25 -0
- package/apps/smidja-factory/skills/git-ops/SKILL.md +18 -0
- package/apps/smidja-factory/skills/git-ops/create_branch.sh +79 -0
- package/apps/smidja-factory/skills/git-ops/safe_commit.sh +82 -0
- package/apps/smidja-factory/skills/git-ops/sync_upstream.sh +94 -0
- package/apps/smidja-factory/skills/how-to-run-agent-teams/SKILL.md +117 -0
- package/apps/smidja-factory/skills/smidja-instructions/SKILL.md +168 -0
- package/apps/smidja-factory/skills/smidja-launcher/SKILL.md +155 -0
- package/apps/smidja-factory/skills/smidja-start/SKILL.md +266 -0
- package/apps/smidja-factory/skills/volundr/SKILL.md +232 -0
- package/apps/smidja-factory/skills/volundr/prompt/dispatch-prompt.md +91 -0
- package/apps/smidja-factory/skills/volundr/prompt/volundr-system.md +63 -0
- package/apps/smidja-factory/skills/volundr/scripts/volundr-observe.py +52 -0
- package/apps/smidja-factory/skills/volundr/scripts/volundr-recall.py +54 -0
- package/apps/smidja-factory/skills/volundr/scripts/volundr-status.py +51 -0
- package/apps/smidja-factory/skills/volundr/scripts/volundr-teach.py +47 -0
- package/apps/smidja-factory/templates/env.sample +28 -0
- package/apps/smidja-factory/templates/harness_engineering/subagents.ts +706 -0
- package/apps/smidja-factory/templates/harness_engineering/themeMap.ts +145 -0
- package/apps/smidja-factory/templates/justfile +89 -0
- package/apps/smidja-factory/templates/prompt_engineering/builder/system.md +13 -0
- package/apps/smidja-factory/templates/prompt_engineering/builder/user.md +34 -0
- package/apps/smidja-factory/templates/prompt_engineering/documenter/system.md +17 -0
- package/apps/smidja-factory/templates/prompt_engineering/documenter/user.md +48 -0
- package/apps/smidja-factory/templates/prompt_engineering/orchestrator/system.md +55 -0
- package/apps/smidja-factory/templates/prompt_engineering/orchestrator/user.md +39 -0
- package/apps/smidja-factory/templates/prompt_engineering/planner/system.md +21 -0
- package/apps/smidja-factory/templates/prompt_engineering/planner/user.md +45 -0
- package/apps/smidja-factory/templates/prompt_engineering/recon_orchestrator/system.md +51 -0
- package/apps/smidja-factory/templates/prompt_engineering/recon_orchestrator/user.md +26 -0
- package/apps/smidja-factory/templates/prompt_engineering/reviewer/system.md +16 -0
- package/apps/smidja-factory/templates/prompt_engineering/reviewer/user.md +44 -0
- package/apps/smidja-factory/templates/prompt_engineering/scout/system.md +32 -0
- package/apps/smidja-factory/templates/prompt_engineering/scout/user.md +34 -0
- package/apps/smidja-factory/templates/smidja/smidja_build.py +45 -0
- package/apps/smidja-factory/templates/smidja/smidja_build_review.py +76 -0
- package/apps/smidja-factory/templates/smidja/smidja_build_test.py +79 -0
- package/apps/smidja-factory/templates/smidja/smidja_document.py +76 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/agent_cc.py +15 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/agent_opencode.py +194 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/agent_pi.py +392 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/agents.py +993 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/changes.py +103 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/console.py +131 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/data_types.py +447 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/gates.py +108 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/git_helper.py +120 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/lm_local.py +144 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/permissions.py +194 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/prompts.py +21 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/quality.py +240 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/runner.py +155 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/session.py +50 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/stall_watch.py +149 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/tracer.py +271 -0
- package/apps/smidja-factory/templates/smidja/smidja_modules/utils.py +77 -0
- package/apps/smidja-factory/templates/smidja/smidja_orchestrate.py +162 -0
- package/apps/smidja-factory/templates/smidja/smidja_plan.py +45 -0
- package/apps/smidja-factory/templates/smidja/smidja_plan_build.py +55 -0
- package/apps/smidja-factory/templates/smidja/smidja_plan_build_test.py +86 -0
- package/apps/smidja-factory/templates/smidja/smidja_plan_build_test_quality.py +98 -0
- package/apps/smidja-factory/templates/smidja/smidja_prompt.py +44 -0
- package/apps/smidja-factory/templates/smidja/smidja_quality.py +49 -0
- package/apps/smidja-factory/templates/smidja/smidja_recon_iv.py +202 -0
- package/apps/smidja-factory/templates/smidja/smidja_scout.py +45 -0
- package/apps/smidja-factory/templates/smidja/smidja_simple_sdlc.py +183 -0
- package/apps/smidja-factory/templates/smidja.config.yaml +143 -0
- package/bin/app-build.sh +36 -0
- package/bin/electron-lib.sh +25 -0
- package/bin/sessrumnir.sh +1 -1
- package/bin/ymir-install.sh +7 -0
- package/install.sh +88 -0
- package/package.json +16 -7
- package/scripts/electron.sh +6 -2
- package/.agents/bus/messages.json +0 -1
- package/.agents/config/agents.machine.example.yaml +0 -16
- package/.pi/mcp.json +0 -16
- package/assets/reference/state/.branch-eligible-owner +0 -4
- package/assets/reference/state/.branch-mirror-cursor +0 -1
- package/assets/reference/state/.branch-outcomes-cursor +0 -1
- package/assets/reference/state/.branch-session +0 -1
- package/assets/reference/state/.count-default_wF_p5 +0 -1
- package/assets/reference/state/.count-default_wF_p6 +0 -1
- package/assets/reference/state/.count-default_wR_p2 +0 -1
- package/assets/reference/state/.count-default_wS_p2 +0 -1
- package/assets/reference/state/.count-firstmate_fm-server-knowledge +0 -1
- package/assets/reference/state/.hash-default_wF_p5 +0 -1
- package/assets/reference/state/.hash-default_wF_p6 +0 -1
- package/assets/reference/state/.hash-default_wR_p2 +0 -1
- package/assets/reference/state/.hash-default_wS_p2 +0 -1
- package/assets/reference/state/.hash-firstmate_fm-server-knowledge +0 -1
- package/assets/reference/state/.heartbeat-streak +0 -1
- package/assets/reference/state/.inactive-outcome-reconcile +0 -2
- package/assets/reference/state/.lock +0 -1
- package/assets/reference/state/.pi-branch-extension-loaded +0 -1
- package/assets/reference/state/.pi-turnend-extension-loaded +0 -2
- package/assets/reference/state/.pi-watch-extension-loaded +0 -2
- package/assets/reference/state/.seen-server-knowledge_turn-ended +0 -1
- package/assets/reference/state/.session-start-agents-baseline +0 -2
- package/assets/reference/state/.session-start-complete +0 -1
- package/assets/reference/state/.stale-default_wF_p5 +0 -1
- package/assets/reference/state/.stale-default_wR_p2 +0 -1
- package/assets/reference/state/.stale-firstmate_fm-server-knowledge +0 -1
- package/assets/reference/state/.stale-since-default_wF_p5 +0 -1
- package/assets/reference/state/.stale-since-default_wR_p2 +0 -1
- package/assets/reference/state/.stale-since-firstmate_fm-server-knowledge +0 -1
- package/assets/reference/state/.startup-network.delivered +0 -1
- package/assets/reference/state/.startup-network.report +0 -1
- package/assets/reference/state/.startup-network.status +0 -10
- package/assets/reference/state/.startup-network.timings +0 -6
- package/assets/reference/state/.trace-context-effective +0 -1
- package/assets/reference/state/.wake-queue +0 -0
- package/assets/reference/state/.wake-queue.seq +0 -1
- package/assets/reference/state/.wake-rows.consume.BcqXSq +0 -0
- package/assets/reference/state/.wake-rows.consume.NDZZei +0 -0
- package/assets/reference/state/.wake-rows.consume.VGkhYm +0 -0
- package/assets/reference/state/.wake-rows.consume.tR2rTy +0 -0
- package/assets/reference/state/.watch-arm-output.3581p6 +0 -0
- package/assets/reference/state/.watch-arm-output.3ciDNP +0 -0
- package/assets/reference/state/.watch-arm-output.SksR6k +0 -0
- package/assets/reference/state/.watch-cycle-exits.log +0 -22
- package/assets/reference/state/.watch-deliveries.log +0 -19
- package/assets/reference/state/.watch-triage.log +0 -38
- package/assets/reference/state/.watch.lock/fm-home +0 -1
- package/assets/reference/state/.watch.lock/pid +0 -1
- package/assets/reference/state/.watch.lock/pid-identity +0 -1
- package/assets/reference/state/.watch.lock/watcher-path +0 -1
- package/assets/reference/state/.watch.lock.owner.qqbxmS/fm-home +0 -1
- package/assets/reference/state/.watch.lock.owner.qqbxmS/pid +0 -1
- package/assets/reference/state/.watch.lock.owner.qqbxmS/pid-identity +0 -1
- package/assets/reference/state/.watch.lock.owner.qqbxmS/watcher-path +0 -1
- package/assets/reference/state/.watcher-down +0 -1
- package/assets/reference/state/branch-outcomes.jsonl +0 -1
- package/assets/reference/state/branch-session/2026-09-04T16-49-38-671Z_01a06d53-6b6f-7619-930d-e6dfd9a4a29e.jsonl +0 -211
- package/assets/reference/state/home-summary.json +0 -42
- package/assets/reference/state/server-knowledge.busy-gen +0 -1
- package/assets/reference/state/server-knowledge.busy-state +0 -1
- package/assets/reference/state/server-knowledge.herdr-presentation +0 -12
- package/assets/reference/state/server-knowledge.meta +0 -18
- package/assets/reference/state/server-knowledge.pi-ext.ts +0 -26
- package/assets/reference/state/server-knowledge.turn-ended +0 -0
- /package/{assets/reference/state/.last-check → apps/hlidskjalf/src/app/.gitkeep} +0 -0
- /package/{assets/reference/state/.last-heartbeat → apps/hlidskjalf/src/components/.gitkeep} +0 -0
- /package/{assets/reference/state/.last-watcher-beat → apps/hlidskjalf/src/services/.gitkeep} +0 -0
- /package/{assets/reference/state/.main-eligible-rows.tmp.p2HMKo → apps/smidja/smidja_modules/__init__.py} +0 -0
- /package/{assets/reference/state/.main-eligible-rows.tmp.Exxm82 → apps/smidja-factory/templates/smidja/smidja_modules/__init__.py} +0 -0
|
@@ -0,0 +1,837 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Óðrerir — The Live Hall · Ymir</title>
|
|
7
|
+
<meta name="description" content="Óðrerir — the Ymir fleet's planning glass, carved into the cloth: the tally of the hall, the armed errands dealt one slate at a time, the smiths and their states, and the carved ledger of what is underway, landed and charted. Read live, read-only — the write door stays inside the hall.">
|
|
8
|
+
<meta name="author" content="Ymir">
|
|
9
|
+
<meta name="robots" content="index,follow">
|
|
10
|
+
<meta name="color-scheme" content="dark">
|
|
11
|
+
<link rel="canonical" href="https://hall.ymir.zerwiz.org/">
|
|
12
|
+
|
|
13
|
+
<!-- icons — the carved cloth: stone and bronze -->
|
|
14
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
|
15
|
+
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png">
|
|
16
|
+
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192.png">
|
|
17
|
+
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
|
18
|
+
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#c9973f">
|
|
19
|
+
<link rel="manifest" href="/site.webmanifest">
|
|
20
|
+
<meta name="theme-color" content="#0e0c09">
|
|
21
|
+
<meta name="msapplication-TileColor" content="#0e0c09">
|
|
22
|
+
<meta name="apple-mobile-web-app-title" content="Óðrerir">
|
|
23
|
+
|
|
24
|
+
<!-- Open Graph — Facebook, WhatsApp, Telegram, LinkedIn, Slack, Discord, iMessage -->
|
|
25
|
+
<meta property="og:type" content="website">
|
|
26
|
+
<meta property="og:site_name" content="Ymir — Óðrerir">
|
|
27
|
+
<meta property="og:title" content="Óðrerir — The Live Hall">
|
|
28
|
+
<meta property="og:description" content="The fleet's planning glass, carved into the cloth — read live, dealt by hand, never a write door.">
|
|
29
|
+
<meta property="og:url" content="https://hall.ymir.zerwiz.org/">
|
|
30
|
+
<meta property="og:image" content="https://hall.ymir.zerwiz.org/og.png">
|
|
31
|
+
<meta property="og:image:secure_url" content="https://hall.ymir.zerwiz.org/og.png">
|
|
32
|
+
<meta property="og:image:type" content="image/png">
|
|
33
|
+
<meta property="og:image:width" content="1200">
|
|
34
|
+
<meta property="og:image:height" content="630">
|
|
35
|
+
<meta property="og:image:alt" content="Óðrerir — the Live Hall, cut in stone and bronze">
|
|
36
|
+
<meta property="og:locale" content="en_US">
|
|
37
|
+
|
|
38
|
+
<!-- Twitter / X -->
|
|
39
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
40
|
+
<meta name="twitter:title" content="Óðrerir — The Live Hall">
|
|
41
|
+
<meta name="twitter:description" content="The fleet's planning glass, carved into the cloth — read live, dealt by hand, never a write door.">
|
|
42
|
+
<meta name="twitter:image" content="https://hall.ymir.zerwiz.org/og.png">
|
|
43
|
+
<meta name="twitter:image:alt" content="Óðrerir — the Live Hall, cut in stone and bronze">
|
|
44
|
+
|
|
45
|
+
<!-- the glass reads this same snapshot; the link says so -->
|
|
46
|
+
<link rel="alternate" type="application/json" href="/livehall.json" title="the hall's own snapshot">
|
|
47
|
+
|
|
48
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
49
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
50
|
+
<link href="https://fonts.googleapis.com/css2?family=Cormorant:wght@400;500;600;700&family=IBM+Plex+Mono:wght@300;400;500&family=Newsreader:ital,opsz,wght@0,6..72,300..500;1,6..72,300..500&family=Noto+Sans+Runic&display=swap" rel="stylesheet">
|
|
51
|
+
<link rel="stylesheet" href="/styles/cloth.css">
|
|
52
|
+
<link rel="stylesheet" href="/styles/livehall.css">
|
|
53
|
+
</head>
|
|
54
|
+
<body>
|
|
55
|
+
|
|
56
|
+
<!-- the hearth — the landing page's fire, warming the hall (shared midgard/design-system/ember.js) -->
|
|
57
|
+
<canvas data-ember aria-hidden="true"
|
|
58
|
+
style="position:fixed;inset:0;width:100%;height:100%;pointer-events:none;z-index:0"></canvas>
|
|
59
|
+
<script type="module">
|
|
60
|
+
import { startAllEmbers } from '../../../midgard/design-system/ember.js';
|
|
61
|
+
startAllEmbers();
|
|
62
|
+
</script>
|
|
63
|
+
|
|
64
|
+
<!-- ======= TOPBAR — the hall's own deck ======= -->
|
|
65
|
+
<div class="hall-top">
|
|
66
|
+
<span><span class="rn">ᛈ</span>YMIR · ÓÐRERIR — THE LIVE HALL</span>
|
|
67
|
+
<a class="hall-back" href="https://ymirdell.zerwiz.org/" rel="noopener" title="the saga — ymirdell.zerwiz.org" aria-label="Back to the lore — the saga of Ymir">← the lore</a>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<!-- ================= ÓÐRERIR — THE LIVE HALL =================
|
|
71
|
+
The fleet's board on its own deck: the same machinery that drives the
|
|
72
|
+
/bearings board inside the hall, rebuilt in the carved cloth the landing
|
|
73
|
+
is cut from (cloth.css is extracted from the landing's :root; the kit is
|
|
74
|
+
livehall.css). Ported function-for-function: tally strip, the dealt call
|
|
75
|
+
stack with recommended marks + freeform + the 512-byte queue guard, the
|
|
76
|
+
carved ledger of underway / landed / charted thread rows, the dispatch
|
|
77
|
+
picker, stack navigation, fail-closed render.
|
|
78
|
+
HARD LINE: the public face is READ-ONLY. No visitor path writes to a hold;
|
|
79
|
+
an answer queued here is held in this page alone. The cards ask the saga's
|
|
80
|
+
own gates, and the tally is the saga's own count, told honestly.
|
|
81
|
+
-->
|
|
82
|
+
<main class="hall-wrap" id="livehall" aria-labelledby="lh-h2">
|
|
83
|
+
<header class="shead rv">
|
|
84
|
+
<span class="snum rn" aria-hidden="true">ᛈ</span>
|
|
85
|
+
<p class="skicker"><span class="rn">ᛈ</span>óðrœrir · the mead of poetry</p>
|
|
86
|
+
<h1 id="lh-h2">The Live Hall</h1>
|
|
87
|
+
<p class="ssub">the fleet's planning glass, carved into the cloth — read live, dealt by hand, never a write door</p>
|
|
88
|
+
</header>
|
|
89
|
+
|
|
90
|
+
<div class="prose rv">
|
|
91
|
+
<p>The hall keeps its own board, and it is the same one the fleet's mornings are read from: a tally
|
|
92
|
+
of what stands, one call dealt at a time off a slate pile, and a carved ledger of what is underway,
|
|
93
|
+
what has landed, and what is charted next. Every part of that board is here — rebuilt in the stone
|
|
94
|
+
the rest of this page is cut from, with its own machinery intact.</p>
|
|
95
|
+
</div>
|
|
96
|
+
<div class="prose rv">
|
|
97
|
+
<p>What it deals are the hall's own errands — the work the fleet has armed, the smith who holds
|
|
98
|
+
each one, and the carved ledger of what is underway, what has landed and what is charted next.
|
|
99
|
+
Nothing here is a door: a word queued on this page stays in this page alone, and the hall's own
|
|
100
|
+
board is where an errand is armed or released. If no snapshot is at hand the saga's own count
|
|
101
|
+
stands in its place, and says so.</p>
|
|
102
|
+
</div>
|
|
103
|
+
|
|
104
|
+
<div class="lh-board rv">
|
|
105
|
+
<noscript><p class="lh-nojs">The hall's board is dealt by script. Without it the tally stands
|
|
106
|
+
unwritten and the slates stay in the pile — the fleet's own board is where the machinery runs.</p></noscript>
|
|
107
|
+
|
|
108
|
+
<div class="lh-tally" id="lh-tally" aria-label="The tally of the hall"></div>
|
|
109
|
+
<div class="lh-smiths" id="lh-smiths" aria-label="The smiths of the hall"></div>
|
|
110
|
+
<p class="lh-count" id="lh-count"></p>
|
|
111
|
+
|
|
112
|
+
<div class="lh-cols">
|
|
113
|
+
<section class="lh-sec" aria-label="The hall's call — one slate at a time">
|
|
114
|
+
<div class="lh-sec-head">
|
|
115
|
+
<span class="lh-eyebrow"><span class="rn">ᚲ</span>the hall's call</span>
|
|
116
|
+
<span class="lh-sub" id="lh-call-sub"></span>
|
|
117
|
+
</div>
|
|
118
|
+
<div class="lh-callwrap">
|
|
119
|
+
<div class="lh-call" id="lh-call"></div>
|
|
120
|
+
<!-- the nav sits under the pile so the dealt slate's top edge lines up
|
|
121
|
+
with the charted slate across the row -->
|
|
122
|
+
<div class="lh-stacknav">
|
|
123
|
+
<span class="lh-stacknav__count" id="lh-stack-count" aria-live="polite">-</span>
|
|
124
|
+
<button type="button" class="lh-stacknav__btn" id="lh-stack-prev" aria-label="Previous slate">
|
|
125
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 18-6-6 6-6"/></svg>
|
|
126
|
+
</button>
|
|
127
|
+
<button type="button" class="lh-stacknav__btn" id="lh-stack-next" aria-label="Next slate">
|
|
128
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg>
|
|
129
|
+
</button>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
<p class="lh-note">a word queued here is <b>held in this page</b> — the hall's own board is where
|
|
133
|
+
a word becomes work</p>
|
|
134
|
+
</section>
|
|
135
|
+
|
|
136
|
+
<section class="lh-sec" aria-label="Charted next — the lanes waiting on a dispatch">
|
|
137
|
+
<div class="lh-sec-head">
|
|
138
|
+
<span class="lh-eyebrow"><span class="rn">ᛚ</span>charted next</span>
|
|
139
|
+
<span class="lh-sub" id="lh-charted-sub"></span>
|
|
140
|
+
</div>
|
|
141
|
+
<div class="lh-slate lh-slate--warm">
|
|
142
|
+
<div class="lh-rows" id="lh-charted"></div>
|
|
143
|
+
<div class="lh-dispatch" id="lh-dispatch" hidden>
|
|
144
|
+
<span class="lh-dispatch__count" id="lh-dispatch-count">nothing picked</span>
|
|
145
|
+
<span class="lh-queued" id="lh-dispatch-queued">
|
|
146
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg>
|
|
147
|
+
queued
|
|
148
|
+
</span>
|
|
149
|
+
<button type="button" class="lh-btn lh-btn--gold" id="lh-dispatch-btn">Queue the dispatch</button>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
</section>
|
|
153
|
+
</div>
|
|
154
|
+
|
|
155
|
+
<div class="lh-cols">
|
|
156
|
+
<section class="lh-sec" aria-label="Underway — what the hall keeps running">
|
|
157
|
+
<div class="lh-sec-head">
|
|
158
|
+
<span class="lh-eyebrow"><span class="rn">ᚠ</span>underway</span>
|
|
159
|
+
<span class="lh-sub" id="lh-underway-sub">kept by the hall</span>
|
|
160
|
+
</div>
|
|
161
|
+
<div class="lh-slate"><div class="lh-rows" id="lh-underway"></div></div>
|
|
162
|
+
</section>
|
|
163
|
+
|
|
164
|
+
<section class="lh-sec" aria-label="Recently landed — the carvings that stand">
|
|
165
|
+
<div class="lh-sec-head">
|
|
166
|
+
<span class="lh-eyebrow"><span class="rn">ᛏ</span><span id="lh-landed-k">landed as carvings</span></span>
|
|
167
|
+
<span class="lh-sub" id="lh-landed-sub">the saga's thirteen</span>
|
|
168
|
+
</div>
|
|
169
|
+
<div class="lh-slate"><div class="lh-rows" id="lh-landed"></div></div>
|
|
170
|
+
</section>
|
|
171
|
+
</div>
|
|
172
|
+
|
|
173
|
+
<div class="lh-provenance">
|
|
174
|
+
<span class="lh-asof" id="lh-asof">—</span>
|
|
175
|
+
<button type="button" class="lh-btn lh-btn--sm lh-refresh" id="lh-refresh" aria-label="Read the hall again"><span class="rn">ᛚ</span>Read again</button>
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
</main>
|
|
179
|
+
|
|
180
|
+
<footer class="hall-foot">
|
|
181
|
+
<div class="frule" aria-hidden="true"><span>ᚠ ᚢ ᚦ ᚨ ᚱ ᚲ ᚷ ᚹ ᚺ ᚾ ᛁ ᛇ ᛈ ᛉ ᛊ ᛏ ᛒ ᛖ ᛗ ᛚ ᛜ ᛞ ᛟ</span></div>
|
|
182
|
+
<p class="hall-foot-big">One call at a time — the board is shown, not written.</p>
|
|
183
|
+
<p class="hall-foot-close">a word queued here stays in this page<br>
|
|
184
|
+
the write door stays inside the hall</p>
|
|
185
|
+
</footer>
|
|
186
|
+
|
|
187
|
+
<!-- the board's payload: the saga's own gates and counts, no private names -->
|
|
188
|
+
<script id="lh-saga" type="application/json">
|
|
189
|
+
{
|
|
190
|
+
"schema": "ymir-livehall.v1",
|
|
191
|
+
"source": "saga",
|
|
192
|
+
"generated": "the saga, v2",
|
|
193
|
+
"smiths": ["brokk", "sindri", "bragi", "huginn", "mimir", "kvasir", "forseti", "snotra", "galdr"],
|
|
194
|
+
"houses": ["ymir labs", "brokk forge", "runestone labs", "muninn labs", "dvalin", "utgard studios", "askr", "mannheim"],
|
|
195
|
+
"captains_call": [
|
|
196
|
+
{
|
|
197
|
+
"key": "hall.forge",
|
|
198
|
+
"type": "decision",
|
|
199
|
+
"repo": "the forge",
|
|
200
|
+
"title": "What does the fleet forge next?",
|
|
201
|
+
"about": "the forge takes one order at a time — the smiths do not begin blind",
|
|
202
|
+
"decide": "which house's work the next blow falls on",
|
|
203
|
+
"recommend_value": "brokk",
|
|
204
|
+
"allow_freeform": true,
|
|
205
|
+
"freeform_hint": "or name the work in your own words…",
|
|
206
|
+
"options": [
|
|
207
|
+
{ "value": "brokk", "label": "Brokk Forge", "hint": "engineering & build tooling — isolated workers drive the task to a finished artifact" },
|
|
208
|
+
{ "value": "runestone", "label": "Runestone Labs", "hint": "records & compliance — the ledger and the gates; every action is inscribed" },
|
|
209
|
+
{ "value": "muninn", "label": "Muninn Labs", "hint": "memory & knowledge — the well and its engine; what is observed is remembered" },
|
|
210
|
+
{ "value": "utgard", "label": "Utgard Studios", "hint": "creative — shaped outside the walls, sealed and destroyed after each run" }
|
|
211
|
+
]
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"key": "hall.engine",
|
|
215
|
+
"type": "decision",
|
|
216
|
+
"repo": "the answer",
|
|
217
|
+
"title": "Which engine answers this task?",
|
|
218
|
+
"about": "no plan is spun from air — the answer is chosen before the work begins",
|
|
219
|
+
"decide": "where the task is answered",
|
|
220
|
+
"recommend_value": "local",
|
|
221
|
+
"allow_freeform": false,
|
|
222
|
+
"options": [
|
|
223
|
+
{ "value": "local", "label": "The hand on the machine", "hint": "a keyless model runs local — the work never leaves the hall" },
|
|
224
|
+
{ "value": "hosted", "label": "The far seeing", "hint": "a hosted model answers; the task crosses the bridge" },
|
|
225
|
+
{ "value": "sealed", "label": "The walled realm", "hint": "the task runs sealed in Utgard and is believed only when the artifact returns" },
|
|
226
|
+
{ "value": "well", "label": "The well", "hint": "the answer is drunk from memory before a single blow is struck" }
|
|
227
|
+
]
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"key": "hall.gate",
|
|
231
|
+
"type": "decision",
|
|
232
|
+
"repo": "the crossing",
|
|
233
|
+
"title": "Which gate does the crossing take?",
|
|
234
|
+
"about": "every crossing into Ymir passes over a gate; nothing bleeds between the halls",
|
|
235
|
+
"decide": "the road this work travels",
|
|
236
|
+
"recommend_value": "bifrost",
|
|
237
|
+
"allow_freeform": false,
|
|
238
|
+
"options": [
|
|
239
|
+
{ "value": "bifrost", "label": "Bifrost", "hint": "the burning bridge — the ingress every crossing passes over" },
|
|
240
|
+
{ "value": "svartalfaheim", "label": "Svartalfaheim", "hint": "the tenant halls — sandbox_isolated; nothing bleeds between halls" },
|
|
241
|
+
{ "value": "utgard", "label": "Utgard", "hint": "the walled outside — docker_ephemeral, sealed and destroyed after each task" },
|
|
242
|
+
{ "value": "ratatoskr", "label": "Ratatoskr", "hint": "the event stream — every word between gates, announced and carved" }
|
|
243
|
+
]
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"key": "hall.rune",
|
|
247
|
+
"type": "decision",
|
|
248
|
+
"repo": "the ledger",
|
|
249
|
+
"title": "What is carved into the ledger?",
|
|
250
|
+
"about": "the runes are carved once and cannot be un-carved",
|
|
251
|
+
"decide": "what the day's record will keep",
|
|
252
|
+
"recommend_value": "evidence",
|
|
253
|
+
"allow_freeform": true,
|
|
254
|
+
"freeform_hint": "or inscribe it in your own words…",
|
|
255
|
+
"options": [
|
|
256
|
+
{ "value": "act", "label": "The act and its actor", "hint": "who struck, and what was struck" },
|
|
257
|
+
{ "value": "reason", "label": "The reason", "hint": "why the blow fell where it did" },
|
|
258
|
+
{ "value": "evidence", "label": "The evidence", "hint": "nothing passes without evidence from the well — what is spun from air is not forged" },
|
|
259
|
+
{ "value": "seal", "label": "The seal", "hint": "the word of the one who approved it, kept in the human loop" }
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
],
|
|
263
|
+
"underway": [
|
|
264
|
+
{ "state": "working", "doing": "The forge is lit", "kind": "the hearth", "repo": "tended, never relit" },
|
|
265
|
+
{ "state": "working", "doing": "The watch is set", "kind": "the ward", "repo": "one who sees does not sleep" },
|
|
266
|
+
{ "state": "drawn", "doing": "The nornir are at their loom", "kind": "the seating", "repo": "schedule · select · source" }
|
|
267
|
+
],
|
|
268
|
+
"landed": [
|
|
269
|
+
{ "what": "The Creation", "repo": "ᚢ · the firth", "owner": "§I" },
|
|
270
|
+
{ "what": "The Builders", "repo": "ᚲ · the smiths", "owner": "§II" },
|
|
271
|
+
{ "what": "The Tree & the Seven Gates", "repo": "ᛇ · the trunk", "owner": "§III" },
|
|
272
|
+
{ "what": "The Well", "repo": "ᛚ · the memory", "owner": "§IV" },
|
|
273
|
+
{ "what": "The Artifacts", "repo": "ᛏ · the ledger", "owner": "§V" },
|
|
274
|
+
{ "what": "The Houses", "repo": "ᛟ · the seals", "owner": "§VI" },
|
|
275
|
+
{ "what": "The Forge-Master's Rule", "repo": "ᚠ · the anvil", "owner": "§VII" },
|
|
276
|
+
{ "what": "The Reforging", "repo": "ᛒ · the strike", "owner": "§VIII" },
|
|
277
|
+
{ "what": "The Frame", "repo": "ᛞ · the laws", "owner": "§IX" },
|
|
278
|
+
{ "what": "The Seating", "repo": "ᛊ · the seat", "owner": "§X" },
|
|
279
|
+
{ "what": "The Watch", "repo": "ᛉ · the ward", "owner": "§XI" },
|
|
280
|
+
{ "what": "The Renewal and the Healing", "repo": "ᛜ · the two hands", "owner": "§XII" },
|
|
281
|
+
{ "what": "The House Endures", "repo": "ᚦ · the roots", "owner": "§XIII" }
|
|
282
|
+
],
|
|
283
|
+
"charted": [
|
|
284
|
+
{ "id": "mannheim", "title": "Mannheim — the held seat", "repo": "a name reserved, its hall unbuilt", "reason": "on the chart", "dispatchable": true },
|
|
285
|
+
{ "id": "askr", "title": "Askr — human-facing flows", "repo": "onboarding and the first steps", "reason": "on the chart", "dispatchable": true },
|
|
286
|
+
{ "id": "utgard", "title": "Utgard Studios — the walled creative realm", "repo": "shaped outside the walls", "reason": "on the chart", "dispatchable": true },
|
|
287
|
+
{ "id": "the-cracks", "title": "The cracks found in the quiet hours", "repo": "the healer's round · §XII", "kind": "warning", "dispatchable": false }
|
|
288
|
+
],
|
|
289
|
+
"charted_more": 5,
|
|
290
|
+
"charted_warning_more": 0
|
|
291
|
+
}
|
|
292
|
+
</script>
|
|
293
|
+
|
|
294
|
+
<script>
|
|
295
|
+
/* ÓÐRERIR — the Live Hall: the fleet's planning glass.
|
|
296
|
+
|
|
297
|
+
Data: a same-origin snapshot at /livehall.json, written by the hall's own
|
|
298
|
+
generator and served from this deck's origin:
|
|
299
|
+
{ generated_at, realm, tally{runes,projects,loom,wake,smiths},
|
|
300
|
+
errands_armed[], smiths[{smith,state,pane}], ledger{underway,landed,charted} }
|
|
301
|
+
|
|
302
|
+
The glass paints the saga's own tale first (the inline payload), then reads
|
|
303
|
+
the snapshot and re-paints from it when it is present and valid; when it is
|
|
304
|
+
absent or unreadable the tale stands, and says so. "Read again" re-reads on
|
|
305
|
+
command; returning to the tab re-reads it (only when it has changed, so a
|
|
306
|
+
word queued in this page is never wiped out from under the reader).
|
|
307
|
+
|
|
308
|
+
The board's machinery is ported function-for-function from the saga-bearings
|
|
309
|
+
fleet board and rebuilt in the carved cloth: the dealt slate stack with
|
|
310
|
+
options + recommended marks + freeform + the 512-byte queue guard, stack
|
|
311
|
+
navigation, the carved ledger, the dispatch picker, fail-closed render.
|
|
312
|
+
|
|
313
|
+
READ-ONLY, ALWAYS. The glass shows; it does not write. There is no hold path
|
|
314
|
+
from this page — a word queued here stays in this page. The two fields the
|
|
315
|
+
snapshot carries that are machinery, not glass — `realm` and each smith's
|
|
316
|
+
`pane` — are deliberately never rendered. */
|
|
317
|
+
(function(){
|
|
318
|
+
'use strict';
|
|
319
|
+
var root = document.getElementById('livehall');
|
|
320
|
+
if(!root) return;
|
|
321
|
+
var $ = function(s){ return root.querySelector(s); };
|
|
322
|
+
var $$ = function(s){ return Array.prototype.slice.call(root.querySelectorAll(s)); };
|
|
323
|
+
|
|
324
|
+
function el(tag, cls, text){ var n = document.createElement(tag); if(cls) n.className = cls; if(text != null) n.textContent = text; return n; }
|
|
325
|
+
function badge(tone, text){ return el('span', 'lh-badge lh-badge--' + tone, text); }
|
|
326
|
+
function isWarning(t){ return t && t.kind === 'warning'; }
|
|
327
|
+
function chartedQueued(rows){ return (rows || []).filter(function(t){ return !isWarning(t); }); }
|
|
328
|
+
function utf8ByteLength(text){ return new TextEncoder().encode(text).length; }
|
|
329
|
+
function stateTone(state){
|
|
330
|
+
switch(String(state || '').toLowerCase()){
|
|
331
|
+
case 'working': case 'active': case 'running': case 'lit': return 'online';
|
|
332
|
+
case 'idle': case 'ready': case 'waiting': case 'drawn': return 'info';
|
|
333
|
+
case 'blocked': case 'stuck': case 'error': case 'failed': return 'danger';
|
|
334
|
+
default: return 'neutral';
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
var CHECK = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>';
|
|
338
|
+
|
|
339
|
+
/* Fail closed on the tale itself: a board with unreadable inline data says so
|
|
340
|
+
plainly instead of rendering an empty hall. */
|
|
341
|
+
function renderBoardError(msg){
|
|
342
|
+
var board = $('.lh-board');
|
|
343
|
+
if(!board) return;
|
|
344
|
+
board.innerHTML = '';
|
|
345
|
+
var slate = el('div', 'lh-slate lh-decision');
|
|
346
|
+
var pad = el('div', 'lh-pad');
|
|
347
|
+
pad.appendChild(el('h3', 'lh-title', 'The hall\u2019s board could not be carved'));
|
|
348
|
+
pad.appendChild(el('p', 'lh-detail', msg + ' — the saga stands, and the board is shown un-dealt.'));
|
|
349
|
+
slate.appendChild(pad);
|
|
350
|
+
board.appendChild(slate);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
var saga;
|
|
354
|
+
try {
|
|
355
|
+
saga = JSON.parse(document.getElementById('lh-saga').textContent);
|
|
356
|
+
} catch (e) {
|
|
357
|
+
renderBoardError('the hall\u2019s own tale is not valid JSON');
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
if(!saga || typeof saga !== 'object' || !Array.isArray(saga.captains_call)){
|
|
361
|
+
renderBoardError('the hall\u2019s own tale does not have the required structure');
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/* ============================================================
|
|
366
|
+
THE TWO SHAPES BECOME ONE MODEL
|
|
367
|
+
============================================================ */
|
|
368
|
+
function isFeed(d){
|
|
369
|
+
return !!(d && typeof d === 'object' && d.tally && typeof d.tally === 'object' &&
|
|
370
|
+
Array.isArray(d.errands_armed) && d.ledger && typeof d.ledger === 'object');
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/* the saga's own tale (the inline fallback) */
|
|
374
|
+
function modelFromSaga(d){
|
|
375
|
+
var smiths = (d.smiths || []).map(function(n){ return { smith: n, state: null }; });
|
|
376
|
+
var chartedMore = d.charted_more || 0;
|
|
377
|
+
return {
|
|
378
|
+
source: 'saga',
|
|
379
|
+
generated: d.generated || 'the tale',
|
|
380
|
+
countLine: (d.houses || []).length + ' houses · ' + (d.landed || []).length + ' carvings · one well — the saga\u2019s own count, told honestly',
|
|
381
|
+
smiths: smiths,
|
|
382
|
+
deck: (d.captains_call || []).map(function(item){
|
|
383
|
+
return {
|
|
384
|
+
key: item.key, type: item.type, title: item.title, repo: item.repo,
|
|
385
|
+
detail: item.detail, about: item.about, decide: item.decide,
|
|
386
|
+
options: item.options || [], recommend_value: item.recommend_value,
|
|
387
|
+
allow_freeform: !!item.allow_freeform, freeform_hint: item.freeform_hint
|
|
388
|
+
};
|
|
389
|
+
}),
|
|
390
|
+
underway: (d.underway || []).map(function(t){
|
|
391
|
+
return {
|
|
392
|
+
title: t.doing,
|
|
393
|
+
sub: t.kind + ' · ' + (t.repo || t.id),
|
|
394
|
+
badge: { tone: t.state === 'working' ? 'online' : 'info', label: t.state }
|
|
395
|
+
};
|
|
396
|
+
}),
|
|
397
|
+
landed: (d.landed || []).map(function(t){
|
|
398
|
+
return { title: t.what, sub: (t.repo || t.id) + ' · ' + t.owner };
|
|
399
|
+
}),
|
|
400
|
+
charted: (d.charted || []).map(function(t){
|
|
401
|
+
return { id: t.id, title: t.title, sub: t.repo || t.id, reason: t.reason,
|
|
402
|
+
kind: t.kind, dispatchable: !!t.dispatchable };
|
|
403
|
+
}),
|
|
404
|
+
chartedMore: chartedMore,
|
|
405
|
+
chartedWarningMore: d.charted_warning_more || 0,
|
|
406
|
+
tallyExtra: null
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/* the hall's own snapshot (the glass, read live) */
|
|
411
|
+
function modelFromFeed(f){
|
|
412
|
+
var tally = f.tally || {};
|
|
413
|
+
var smiths = (f.smiths || []).filter(function(s){ return s && s.smith; }).map(function(s){
|
|
414
|
+
return { smith: s.smith, state: s.state || null };
|
|
415
|
+
});
|
|
416
|
+
var stateOf = {};
|
|
417
|
+
smiths.forEach(function(s){ stateOf[s.smith] = s.state; });
|
|
418
|
+
var errands = (f.errands_armed || []).filter(function(n){ return typeof n === 'string' && n; });
|
|
419
|
+
var ledger = f.ledger || {};
|
|
420
|
+
return {
|
|
421
|
+
source: 'hall',
|
|
422
|
+
generated: f.generated_at || '',
|
|
423
|
+
countLine: 'read live from the hall\u2019s own snapshot — nothing here is written back',
|
|
424
|
+
smiths: smiths,
|
|
425
|
+
deck: errands.map(function(name){
|
|
426
|
+
return {
|
|
427
|
+
key: 'errand.' + name,
|
|
428
|
+
type: 'errand',
|
|
429
|
+
title: name,
|
|
430
|
+
smith: name,
|
|
431
|
+
state: stateOf[name] || null,
|
|
432
|
+
about: 'armed in the hall — the errand Brokk holds for this smith',
|
|
433
|
+
decide: 'the word that releases it, or holds it',
|
|
434
|
+
options: [], /* the snapshot carries no options; none are invented */
|
|
435
|
+
recommend_value: null,
|
|
436
|
+
allow_freeform: true,
|
|
437
|
+
freeform_hint: 'or inscribe the word in your own words…'
|
|
438
|
+
};
|
|
439
|
+
}),
|
|
440
|
+
underway: (ledger.underway || []).map(function(n){
|
|
441
|
+
return {
|
|
442
|
+
title: n,
|
|
443
|
+
sub: 'held in the hall',
|
|
444
|
+
badge: stateOf[n] ? { tone: stateTone(stateOf[n]), label: stateOf[n] } : null
|
|
445
|
+
};
|
|
446
|
+
}),
|
|
447
|
+
landed: (ledger.landed || []).map(function(n){
|
|
448
|
+
return { title: n, sub: 'landed as work' };
|
|
449
|
+
}),
|
|
450
|
+
charted: (ledger.charted || []).map(function(n){
|
|
451
|
+
return { id: n, title: n, sub: 'on the chart', reason: 'on the chart', dispatchable: true };
|
|
452
|
+
}),
|
|
453
|
+
chartedMore: 0,
|
|
454
|
+
chartedWarningMore: 0,
|
|
455
|
+
tallyExtra: [
|
|
456
|
+
{ n: tally.runes || 0, l: 'runes carved' },
|
|
457
|
+
{ n: tally.projects || 0, l: 'projects' },
|
|
458
|
+
{ n: tally.loom || 0, l: 'on the loom' },
|
|
459
|
+
{ n: tally.wake || 0, l: 'wake queue' },
|
|
460
|
+
{ n: tally.smiths || smiths.length, l: 'smiths' }
|
|
461
|
+
]
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/* ============================================================
|
|
466
|
+
THE RENDER — one model, one board
|
|
467
|
+
============================================================ */
|
|
468
|
+
var deck; /* #lh-call */
|
|
469
|
+
var cards = []; /* the dealt slates */
|
|
470
|
+
var active = 0; /* the slate under the hand */
|
|
471
|
+
var model = null;
|
|
472
|
+
|
|
473
|
+
function answeredCount(){ return deck.querySelectorAll('.is-queued').length; }
|
|
474
|
+
|
|
475
|
+
function renderTally(m){
|
|
476
|
+
var strip = $('#lh-tally');
|
|
477
|
+
strip.textContent = '';
|
|
478
|
+
var callTotal = m.deck.length;
|
|
479
|
+
var left = callTotal - answeredCount();
|
|
480
|
+
var stats = [{ n: left, l: callTotal === 1 ? 'errand armed' : (m.source === 'hall' ? 'errands armed' : 'calls on the board'), call: true }];
|
|
481
|
+
if(m.source === 'hall'){
|
|
482
|
+
stats[0].l = left === 1 ? 'errand armed' : 'errands armed';
|
|
483
|
+
stats = stats.concat(m.tallyExtra || []);
|
|
484
|
+
} else {
|
|
485
|
+
stats.push({ n: m.underway.length, l: 'kept underway' });
|
|
486
|
+
stats.push({ n: m.landed.length, l: m.source === 'hall' ? 'landed' : 'landed as carvings' });
|
|
487
|
+
stats.push({ n: chartedQueued(m.charted).length + m.chartedMore, l: 'charted next' });
|
|
488
|
+
}
|
|
489
|
+
stats.forEach(function(s){
|
|
490
|
+
var t = el('div', 'lh-stat' + (s.call ? ' lh-stat--call' : ''));
|
|
491
|
+
t.appendChild(el('span', 'lh-stat__num', String(s.n)));
|
|
492
|
+
t.appendChild(el('span', 'lh-stat__label', s.l));
|
|
493
|
+
strip.appendChild(t);
|
|
494
|
+
});
|
|
495
|
+
var sub = $('#lh-call-sub');
|
|
496
|
+
sub.textContent = left
|
|
497
|
+
? left + (left === 1 ? ' slate' : ' slates') + (m.source === 'hall' ? ' armed · dealt by hand' : ' dealt · the hall\u2019s own gates')
|
|
498
|
+
: 'every slate is queued — the board rests';
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
function renderSmiths(m){
|
|
502
|
+
var strip = $('#lh-smiths');
|
|
503
|
+
strip.textContent = '';
|
|
504
|
+
if(!m.smiths.length) return;
|
|
505
|
+
if(m.source === 'saga'){
|
|
506
|
+
strip.appendChild(document.createTextNode(m.smiths.length + ' named smiths — '));
|
|
507
|
+
m.smiths.forEach(function(s, i){
|
|
508
|
+
if(i) strip.appendChild(document.createTextNode(' \u00b7 '));
|
|
509
|
+
strip.appendChild(el('b', null, s.smith));
|
|
510
|
+
});
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
m.smiths.forEach(function(s){
|
|
514
|
+
var chip = el('span', 'lh-smith');
|
|
515
|
+
chip.appendChild(el('span', 'lh-smith__name', s.smith));
|
|
516
|
+
if(s.state) chip.appendChild(badge(stateTone(s.state), s.state));
|
|
517
|
+
strip.appendChild(chip);
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
function ctxRow(k, v, node){
|
|
522
|
+
var row = el('div', 'lh-ctx__row');
|
|
523
|
+
row.appendChild(el('span', 'lh-ctx__k', k));
|
|
524
|
+
var val = el('span', 'lh-ctx__v', v || null);
|
|
525
|
+
if(node) val.appendChild(node);
|
|
526
|
+
row.appendChild(val);
|
|
527
|
+
return row;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
function smithChip(name, state){
|
|
531
|
+
var chip = el('span', 'lh-smith-inline');
|
|
532
|
+
chip.appendChild(el('span', 'lh-smith__name', name));
|
|
533
|
+
if(state) chip.appendChild(badge(stateTone(state), state));
|
|
534
|
+
return chip;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
function renderDeck(m){
|
|
538
|
+
deck.textContent = '';
|
|
539
|
+
cards = [];
|
|
540
|
+
|
|
541
|
+
m.deck.forEach(function(item){
|
|
542
|
+
var card = el('div', 'lh-decision');
|
|
543
|
+
var pad = el('div', 'lh-pad');
|
|
544
|
+
|
|
545
|
+
var top = el('div', 'lh-top');
|
|
546
|
+
if(item.type === 'merge'){
|
|
547
|
+
top.appendChild(badge('online', 'checks green'));
|
|
548
|
+
top.appendChild(badge(item.risk === 'low' ? 'neutral' : 'warn', 'risk ' + item.risk));
|
|
549
|
+
} else if(item.type === 'errand'){
|
|
550
|
+
top.appendChild(badge('solid', 'an armed errand'));
|
|
551
|
+
if(item.smith) top.appendChild(smithChip(item.smith, item.state));
|
|
552
|
+
} else {
|
|
553
|
+
top.appendChild(badge('solid', 'the hall decides'));
|
|
554
|
+
if(item.repo) top.appendChild(el('span', 'lh-repo', item.repo));
|
|
555
|
+
}
|
|
556
|
+
pad.appendChild(top);
|
|
557
|
+
|
|
558
|
+
pad.appendChild(el('h3', 'lh-title', item.title));
|
|
559
|
+
if(item.detail) pad.appendChild(el('p', 'lh-detail', item.detail));
|
|
560
|
+
|
|
561
|
+
if(item.type !== 'merge' && (item.about || item.decide)){
|
|
562
|
+
var ctx = el('div', 'lh-ctx');
|
|
563
|
+
if(item.about) ctx.appendChild(ctxRow('about', item.about));
|
|
564
|
+
if(item.decide) ctx.appendChild(ctxRow('decide', item.decide));
|
|
565
|
+
if(item.type === 'errand' && item.smith) ctx.appendChild(ctxRow('smith', null, smithChip(item.smith, item.state)));
|
|
566
|
+
pad.appendChild(ctx);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
var form = document.createElement('form');
|
|
570
|
+
form.setAttribute('data-lh-question', item.key);
|
|
571
|
+
if(item.options && item.options.length){
|
|
572
|
+
var opts = el('div', 'lh-opts');
|
|
573
|
+
item.options.forEach(function(o){
|
|
574
|
+
var lab = el('label', 'lh-opt');
|
|
575
|
+
var input = document.createElement('input');
|
|
576
|
+
input.type = 'radio'; input.name = 'answer'; input.value = o.value;
|
|
577
|
+
lab.appendChild(input);
|
|
578
|
+
var body = el('span', 'lh-opt__body');
|
|
579
|
+
body.appendChild(el('span', 'lh-opt__label', o.label));
|
|
580
|
+
if(o.hint) body.appendChild(el('span', 'lh-opt__hint', o.hint));
|
|
581
|
+
lab.appendChild(body);
|
|
582
|
+
if(item.recommend_value && o.value === item.recommend_value) lab.appendChild(el('span', 'lh-opt__rec', 'rec'));
|
|
583
|
+
opts.appendChild(lab);
|
|
584
|
+
});
|
|
585
|
+
form.appendChild(opts);
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
if(item.allow_freeform){
|
|
589
|
+
var ff = document.createElement('input');
|
|
590
|
+
ff.type = 'text'; ff.name = 'note'; ff.className = 'lh-freeform';
|
|
591
|
+
ff.placeholder = item.freeform_hint || 'or answer in your own words…';
|
|
592
|
+
form.appendChild(ff);
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
var foot = el('div', 'lh-foot');
|
|
596
|
+
var btn = el('button', 'lh-btn ' + (item.type === 'merge' ? 'lh-btn--gold' : 'lh-btn--primary'), 'Queue the word');
|
|
597
|
+
btn.type = 'submit';
|
|
598
|
+
foot.appendChild(btn);
|
|
599
|
+
var q = el('span', 'lh-queued');
|
|
600
|
+
q.innerHTML = CHECK + 'queued';
|
|
601
|
+
foot.appendChild(q);
|
|
602
|
+
var limit = el('span', 'lh-limit');
|
|
603
|
+
limit.setAttribute('role', 'alert');
|
|
604
|
+
foot.appendChild(limit);
|
|
605
|
+
form.appendChild(foot);
|
|
606
|
+
|
|
607
|
+
form.addEventListener('submit', function(ev){
|
|
608
|
+
ev.preventDefault();
|
|
609
|
+
limit.classList.remove('is-visible');
|
|
610
|
+
var fd = new FormData(form);
|
|
611
|
+
var value = fd.get('answer');
|
|
612
|
+
var note = (fd.get('note') || '').trim();
|
|
613
|
+
var answer = value ? (note ? value + ' — ' + note : value) : note;
|
|
614
|
+
if(!answer) return;
|
|
615
|
+
if(utf8ByteLength(answer) > 512){
|
|
616
|
+
limit.textContent = 'the word is too long to queue (512 bytes at most).';
|
|
617
|
+
limit.classList.add('is-visible');
|
|
618
|
+
return;
|
|
619
|
+
}
|
|
620
|
+
/* READ-ONLY. The hall's own write path stays inside the hall; on the
|
|
621
|
+
glass the word is acknowledged here and goes no further. */
|
|
622
|
+
card.classList.add('is-queued');
|
|
623
|
+
renderTally(model);
|
|
624
|
+
setTimeout(function(){ showCard(active < cards.length - 1 ? active + 1 : active); }, 450);
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
pad.appendChild(form);
|
|
628
|
+
card.appendChild(pad);
|
|
629
|
+
deck.appendChild(card);
|
|
630
|
+
});
|
|
631
|
+
|
|
632
|
+
cards = Array.prototype.slice.call(deck.children);
|
|
633
|
+
active = 0;
|
|
634
|
+
var stackNav = $('#lh-stack-count').parentNode;
|
|
635
|
+
if(cards.length){
|
|
636
|
+
stackNav.hidden = false;
|
|
637
|
+
showCard(0);
|
|
638
|
+
} else {
|
|
639
|
+
deck.classList.add('lh-call--empty');
|
|
640
|
+
deck.appendChild(el('div', 'lh-empty', 'Nothing waits on the board right now.'));
|
|
641
|
+
stackNav.hidden = true;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
function showCard(i){
|
|
646
|
+
active = Math.max(0, Math.min(cards.length - 1, i));
|
|
647
|
+
cards.forEach(function(c, j){ c.hidden = j !== active; });
|
|
648
|
+
var answered = answeredCount();
|
|
649
|
+
$('#lh-stack-count').textContent = 'slate ' + (active + 1) + ' of ' + cards.length +
|
|
650
|
+
(answered ? ' · ' + answered + ' queued' : '');
|
|
651
|
+
$('#lh-stack-prev').disabled = active === 0;
|
|
652
|
+
$('#lh-stack-next').disabled = active === cards.length - 1;
|
|
653
|
+
deck.classList.toggle('lh-call--penult', active === cards.length - 2);
|
|
654
|
+
deck.classList.toggle('lh-call--last', active === cards.length - 1);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
function rows(host, items, opts){
|
|
658
|
+
host.textContent = '';
|
|
659
|
+
if(!items.length){
|
|
660
|
+
host.appendChild(el('div', 'lh-empty', opts.empty));
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
663
|
+
items.forEach(function(t){
|
|
664
|
+
var row = el('div', 'lh-row');
|
|
665
|
+
if(opts.check){
|
|
666
|
+
var chk = el('span', 'lh-row__check');
|
|
667
|
+
chk.innerHTML = CHECK;
|
|
668
|
+
row.appendChild(chk);
|
|
669
|
+
}
|
|
670
|
+
if(t.badge) row.appendChild(badge(t.badge.tone, t.badge.label));
|
|
671
|
+
var main = el('div', 'lh-row__main');
|
|
672
|
+
main.appendChild(el('div', 'lh-row__title', t.title));
|
|
673
|
+
main.appendChild(el('div', 'lh-row__sub', t.sub));
|
|
674
|
+
row.appendChild(main);
|
|
675
|
+
host.appendChild(row);
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
function renderCharted(m){
|
|
680
|
+
var ch = $('#lh-charted');
|
|
681
|
+
ch.textContent = '';
|
|
682
|
+
var bar = $('#lh-dispatch');
|
|
683
|
+
bar.classList.remove('is-queued');
|
|
684
|
+
var anyPickable = false;
|
|
685
|
+
|
|
686
|
+
if(!chartedQueued(m.charted).length && !m.chartedMore){
|
|
687
|
+
ch.appendChild(el('div', 'lh-empty', 'Nothing is charted.'));
|
|
688
|
+
}
|
|
689
|
+
m.charted.forEach(function(t){
|
|
690
|
+
var row = el('div', 'lh-row');
|
|
691
|
+
if(t.dispatchable && !isWarning(t)){
|
|
692
|
+
anyPickable = true;
|
|
693
|
+
var pick = document.createElement('input');
|
|
694
|
+
pick.type = 'checkbox'; pick.className = 'lh-pick'; pick.value = t.id;
|
|
695
|
+
pick.setAttribute('aria-label', 'Pick ' + t.id + ' for dispatch');
|
|
696
|
+
pick.addEventListener('change', function(){
|
|
697
|
+
if(pick.checked && utf8ByteLength(pickedIds().join(',')) > 512){
|
|
698
|
+
pick.checked = false;
|
|
699
|
+
refreshBar('the selection is too long (512 bytes at most). ');
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
702
|
+
refreshBar();
|
|
703
|
+
});
|
|
704
|
+
row.appendChild(pick);
|
|
705
|
+
} else {
|
|
706
|
+
row.appendChild(el('span', 'lh-pick-spacer'));
|
|
707
|
+
}
|
|
708
|
+
var main = el('div', 'lh-row__main');
|
|
709
|
+
main.appendChild(el('div', 'lh-row__title', t.title));
|
|
710
|
+
main.appendChild(el('div', 'lh-row__sub', t.reason ? t.reason + ' · ' + t.sub : t.sub));
|
|
711
|
+
row.appendChild(main);
|
|
712
|
+
if(isWarning(t)) row.appendChild(badge('danger', 'needs repair'));
|
|
713
|
+
else if(t.reason) row.appendChild(badge('warn', 'waiting'));
|
|
714
|
+
ch.appendChild(row);
|
|
715
|
+
});
|
|
716
|
+
var shown = chartedQueued(m.charted).length;
|
|
717
|
+
var total = shown + m.chartedMore;
|
|
718
|
+
$('#lh-charted-sub').textContent = m.chartedMore ? 'showing ' + shown + ' of ' + total : '';
|
|
719
|
+
if(m.chartedMore) ch.appendChild(el('span', 'lh-morechip', '+' + m.chartedMore + ' more charted — the saga holds them'));
|
|
720
|
+
if(m.chartedWarningMore) ch.appendChild(el('span', 'lh-morechip', '+' + m.chartedWarningMore + ' more crack' +
|
|
721
|
+
(m.chartedWarningMore === 1 ? '' : 's') + ' — the healer walks at night'));
|
|
722
|
+
|
|
723
|
+
if(anyPickable){
|
|
724
|
+
bar.hidden = false;
|
|
725
|
+
refreshBar();
|
|
726
|
+
} else {
|
|
727
|
+
bar.hidden = true;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
function pickedIds(){
|
|
732
|
+
return $$('.lh-pick:checked').map(function(c){ return c.value; });
|
|
733
|
+
}
|
|
734
|
+
function refreshBar(limitMessage){
|
|
735
|
+
var n = pickedIds().length;
|
|
736
|
+
$('#lh-dispatch-count').textContent = limitMessage || (n ? n + ' picked for the dispatch' : 'pick charted work to dispatch');
|
|
737
|
+
$('#lh-dispatch-btn').disabled = !n;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
function renderProvenance(m){
|
|
741
|
+
var asof = $('#lh-asof');
|
|
742
|
+
asof.textContent = m.source === 'hall'
|
|
743
|
+
? 'live · ' + (m.generated || 'just now')
|
|
744
|
+
: 'as the saga tells it · ' + (m.generated || 'the tale');
|
|
745
|
+
asof.classList.toggle('is-live', m.source === 'hall');
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
function render(m){
|
|
749
|
+
model = m;
|
|
750
|
+
renderDeck(m);
|
|
751
|
+
renderTally(m);
|
|
752
|
+
renderSmiths(m);
|
|
753
|
+
$('#lh-count').textContent = m.countLine || '';
|
|
754
|
+
var live = m.source === 'hall';
|
|
755
|
+
$('#lh-underway-sub').textContent = live ? 'held by the hall' : 'kept by the hall';
|
|
756
|
+
$('#lh-landed-k').textContent = live ? 'landed' : 'landed as carvings';
|
|
757
|
+
$('#lh-landed-sub').textContent = live ? 'the hall\u2019s own ledger' : 'the saga\u2019s thirteen';
|
|
758
|
+
rows($('#lh-underway'), m.underway, { empty: 'Nothing is underway.' });
|
|
759
|
+
var ld = $('#lh-landed');
|
|
760
|
+
ld.classList.add('lh-rows--scroll');
|
|
761
|
+
rows(ld, m.landed, { empty: live ? 'Nothing has landed yet.' : 'No carving has landed yet.', check: true });
|
|
762
|
+
renderCharted(m);
|
|
763
|
+
renderProvenance(m);
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
/* ============================================================
|
|
767
|
+
THE STACK NAVIGATION + THE GLASS'S OWN CONTROLS
|
|
768
|
+
============================================================ */
|
|
769
|
+
deck = $('#lh-call');
|
|
770
|
+
$('#lh-stack-prev').addEventListener('click', function(){ showCard(active - 1); });
|
|
771
|
+
$('#lh-stack-next').addEventListener('click', function(){ showCard(active + 1); });
|
|
772
|
+
$('#lh-dispatch-btn').addEventListener('click', function(){
|
|
773
|
+
var ids = pickedIds();
|
|
774
|
+
if(!ids.length) return;
|
|
775
|
+
if(utf8ByteLength(ids.join(',')) > 512){
|
|
776
|
+
refreshBar('the selection is too long (512 bytes at most). ');
|
|
777
|
+
return;
|
|
778
|
+
}
|
|
779
|
+
/* READ-ONLY: acknowledged here; the hall's own write path stays inside. */
|
|
780
|
+
$('#lh-dispatch').classList.add('is-queued');
|
|
781
|
+
});
|
|
782
|
+
|
|
783
|
+
/* ============================================================
|
|
784
|
+
PAINT, THEN READ THE HALL
|
|
785
|
+
============================================================ */
|
|
786
|
+
render(modelFromSaga(saga));
|
|
787
|
+
|
|
788
|
+
var lastFeed = null;
|
|
789
|
+
function readSnapshot(force){
|
|
790
|
+
try {
|
|
791
|
+
fetch('/livehall.json', { cache: 'no-store' })
|
|
792
|
+
.then(function(r){ return r.ok ? r.json() : null; })
|
|
793
|
+
.then(function(feed){
|
|
794
|
+
if(!isFeed(feed)) return; /* the tale stands */
|
|
795
|
+
var raw = JSON.stringify(feed);
|
|
796
|
+
if(!force && raw === lastFeed) return; /* nothing new to paint */
|
|
797
|
+
lastFeed = raw;
|
|
798
|
+
render(modelFromFeed(feed));
|
|
799
|
+
})
|
|
800
|
+
.catch(function(){ /* the tale stands */ });
|
|
801
|
+
} catch (e) { /* no fetch available — the tale stands */ }
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
var refreshBtn = $('#lh-refresh');
|
|
805
|
+
if(refreshBtn){
|
|
806
|
+
refreshBtn.addEventListener('click', function(){
|
|
807
|
+
refreshBtn.disabled = true;
|
|
808
|
+
readSnapshot(true);
|
|
809
|
+
setTimeout(function(){ refreshBtn.disabled = false; }, 400);
|
|
810
|
+
});
|
|
811
|
+
}
|
|
812
|
+
/* coming back to the glass re-reads it — but only when it has changed, so a
|
|
813
|
+
word queued in this page is never wiped out from under the reader */
|
|
814
|
+
document.addEventListener('visibilitychange', function(){
|
|
815
|
+
if(!document.hidden) readSnapshot(false);
|
|
816
|
+
});
|
|
817
|
+
readSnapshot(false);
|
|
818
|
+
})();
|
|
819
|
+
</script>
|
|
820
|
+
|
|
821
|
+
<script>
|
|
822
|
+
/* the Hall's reveal — the landing's own rhythm, kept local to this deck */
|
|
823
|
+
(function(){
|
|
824
|
+
'use strict';
|
|
825
|
+
document.documentElement.classList.add('js');
|
|
826
|
+
if(matchMedia('(prefers-reduced-motion: reduce)').matches){
|
|
827
|
+
document.querySelectorAll('.rv').forEach(function(el){ el.classList.add('in'); });
|
|
828
|
+
return;
|
|
829
|
+
}
|
|
830
|
+
var io = new IntersectionObserver(function(es){
|
|
831
|
+
es.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add('in'); io.unobserve(e.target); } });
|
|
832
|
+
}, { threshold: 0.18, rootMargin: '0px 0px -10% 0px' });
|
|
833
|
+
document.querySelectorAll('.rv').forEach(function(el){ io.observe(el); });
|
|
834
|
+
})();
|
|
835
|
+
</script>
|
|
836
|
+
</body>
|
|
837
|
+
</html>
|