@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,174 @@
|
|
|
1
|
+
import { test } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
3
|
+
import { readFileSync } from 'node:fs'
|
|
4
|
+
import { dirname, join } from 'node:path'
|
|
5
|
+
import { fileURLToPath } from 'node:url'
|
|
6
|
+
import { runInNewContext } from 'node:vm'
|
|
7
|
+
import { DEFAULT_SETTINGS } from '../../../shared/default-settings'
|
|
8
|
+
import { BUILTIN_THEMES } from '../themes'
|
|
9
|
+
import {
|
|
10
|
+
BOOT_THEME_STORAGE_KEY,
|
|
11
|
+
applyThemeSettings,
|
|
12
|
+
getAppliedThemeId,
|
|
13
|
+
registerThemes,
|
|
14
|
+
rememberBootTheme,
|
|
15
|
+
resolveSystemThemeSlot,
|
|
16
|
+
resolveThemeId,
|
|
17
|
+
subscribeAppliedTheme,
|
|
18
|
+
} from './theme'
|
|
19
|
+
|
|
20
|
+
// theme.ts reads the OS preference through matchMedia, writes CSS vars to
|
|
21
|
+
// <html>, and remembers the boot theme in localStorage; node has none of
|
|
22
|
+
// these, so stub the minimum surface those calls touch.
|
|
23
|
+
let prefersDark = false
|
|
24
|
+
const storage = new Map<string, string>()
|
|
25
|
+
Object.assign(globalThis, {
|
|
26
|
+
window: { matchMedia: () => ({ matches: prefersDark }) },
|
|
27
|
+
document: {
|
|
28
|
+
documentElement: {
|
|
29
|
+
style: { setProperty() {}, removeProperty() {}, colorScheme: '' },
|
|
30
|
+
classList: { toggle() {} },
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
localStorage: {
|
|
34
|
+
getItem: (key: string) => storage.get(key) ?? null,
|
|
35
|
+
setItem: (key: string, value: string) => { storage.set(key, value) },
|
|
36
|
+
},
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
const BOOT_SCRIPT = readFileSync(join(dirname(fileURLToPath(import.meta.url)), '../../public/theme-boot.js'), 'utf8')
|
|
40
|
+
|
|
41
|
+
interface BootResult {
|
|
42
|
+
vars: Record<string, string>
|
|
43
|
+
colorScheme: string
|
|
44
|
+
lightClass: boolean
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Runs the pre-paint boot script the way index.html does, against the value
|
|
48
|
+
// rememberBootTheme left in storage and the given OS preference.
|
|
49
|
+
function runBootScript(osPrefersDark: boolean, stored = storage.get(BOOT_THEME_STORAGE_KEY) ?? null): BootResult {
|
|
50
|
+
const result: BootResult = { vars: {}, colorScheme: '', lightClass: false }
|
|
51
|
+
const style = {
|
|
52
|
+
setProperty: (key: string, value: string) => { result.vars[key] = value },
|
|
53
|
+
set colorScheme(value: string) { result.colorScheme = value },
|
|
54
|
+
}
|
|
55
|
+
runInNewContext(BOOT_SCRIPT, {
|
|
56
|
+
window: { matchMedia: () => ({ matches: osPrefersDark }) },
|
|
57
|
+
localStorage: { getItem: () => stored },
|
|
58
|
+
document: {
|
|
59
|
+
documentElement: {
|
|
60
|
+
style,
|
|
61
|
+
classList: { toggle: (name: string, on: boolean) => { if (name === 'light') result.lightClass = on } },
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
})
|
|
65
|
+
return result
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const SYSTEM_WITH_GRUVBOX = { theme: 'system', systemLightTheme: 'breeze-light', systemDarkTheme: 'gruvbox' }
|
|
69
|
+
|
|
70
|
+
function builtinFile(id: string) {
|
|
71
|
+
const theme = BUILTIN_THEMES.find((candidate) => candidate.id === id)
|
|
72
|
+
assert.ok(theme, `missing built-in theme ${id}`)
|
|
73
|
+
return theme.file
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
test('System is the default theme', () => {
|
|
77
|
+
assert.equal(DEFAULT_SETTINGS.theme, 'system')
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
test('the default System themes are built-in themes of the matching kind', () => {
|
|
81
|
+
assert.equal(builtinFile(DEFAULT_SETTINGS.systemLightTheme).kind, 'light')
|
|
82
|
+
assert.equal(builtinFile(DEFAULT_SETTINGS.systemDarkTheme).kind, 'dark')
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
test('a concrete theme id resolves to itself', () => {
|
|
86
|
+
assert.equal(resolveThemeId('nord'), 'nord')
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
test('System resolves to the chosen light theme when the OS prefers light', () => {
|
|
90
|
+
prefersDark = false
|
|
91
|
+
applyThemeSettings(SYSTEM_WITH_GRUVBOX)
|
|
92
|
+
assert.equal(resolveThemeId('system'), 'breeze-light')
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
test('System resolves to the chosen dark theme when the OS prefers dark', () => {
|
|
96
|
+
prefersDark = true
|
|
97
|
+
applyThemeSettings(SYSTEM_WITH_GRUVBOX)
|
|
98
|
+
assert.equal(resolveThemeId('system'), 'gruvbox')
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
test('a missing System theme falls back to the built-in default for its slot', () => {
|
|
102
|
+
assert.equal(resolveSystemThemeSlot('dark', 'deleted-theme'), DEFAULT_SETTINGS.systemDarkTheme)
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
test('a System theme of the other kind falls back to the built-in default for its slot', () => {
|
|
106
|
+
assert.equal(resolveSystemThemeSlot('light', 'gruvbox'), DEFAULT_SETTINGS.systemLightTheme)
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
test('a registered user theme of the matching kind fills a System slot', () => {
|
|
110
|
+
registerThemes([{ id: 'my-dusk', file: { ...builtinFile('gruvbox'), name: 'My Dusk' } }])
|
|
111
|
+
assert.equal(resolveSystemThemeSlot('dark', 'my-dusk'), 'my-dusk')
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
test('applying System notifies subscribers with the theme it resolved to', () => {
|
|
115
|
+
prefersDark = true
|
|
116
|
+
applyThemeSettings({ ...SYSTEM_WITH_GRUVBOX, theme: 'light' })
|
|
117
|
+
const notified: string[] = []
|
|
118
|
+
const unsubscribe = subscribeAppliedTheme(() => notified.push(getAppliedThemeId() ?? ''))
|
|
119
|
+
applyThemeSettings(SYSTEM_WITH_GRUVBOX)
|
|
120
|
+
unsubscribe()
|
|
121
|
+
assert.deepEqual(notified, ['gruvbox'])
|
|
122
|
+
assert.equal(getAppliedThemeId(), 'gruvbox')
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
test('re-applying the same theme still notifies subscribers', () => {
|
|
126
|
+
applyThemeSettings({ ...SYSTEM_WITH_GRUVBOX, theme: 'nord' })
|
|
127
|
+
let notified = 0
|
|
128
|
+
const unsubscribe = subscribeAppliedTheme(() => { notified++ })
|
|
129
|
+
applyThemeSettings({ ...SYSTEM_WITH_GRUVBOX, theme: 'nord' })
|
|
130
|
+
unsubscribe()
|
|
131
|
+
assert.equal(notified, 1)
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
test('the boot script paints the remembered System dark theme on a dark OS', () => {
|
|
135
|
+
rememberBootTheme(SYSTEM_WITH_GRUVBOX)
|
|
136
|
+
const boot = runBootScript(true)
|
|
137
|
+
assert.equal(boot.vars['--color-app'], builtinFile('gruvbox').seeds.app)
|
|
138
|
+
assert.equal(boot.vars['--color-primary'], builtinFile('gruvbox').seeds.text)
|
|
139
|
+
assert.equal(boot.colorScheme, 'dark')
|
|
140
|
+
assert.equal(boot.lightClass, false)
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
test('the boot script paints the remembered System light theme on a light OS', () => {
|
|
144
|
+
rememberBootTheme(SYSTEM_WITH_GRUVBOX)
|
|
145
|
+
const boot = runBootScript(false)
|
|
146
|
+
assert.equal(boot.vars['--color-app'], builtinFile('breeze-light').seeds.app)
|
|
147
|
+
assert.equal(boot.colorScheme, 'light')
|
|
148
|
+
assert.equal(boot.lightClass, true)
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
test('the boot script paints a concrete theme the same on either OS', () => {
|
|
152
|
+
rememberBootTheme({ ...SYSTEM_WITH_GRUVBOX, theme: 'nord' })
|
|
153
|
+
assert.deepEqual(runBootScript(false), runBootScript(true))
|
|
154
|
+
assert.equal(runBootScript(false).vars['--color-app'], builtinFile('nord').seeds.app)
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
test('a missing concrete theme is remembered as the fallback theme', () => {
|
|
158
|
+
rememberBootTheme({ ...SYSTEM_WITH_GRUVBOX, theme: 'deleted-theme' })
|
|
159
|
+
assert.equal(runBootScript(false).vars['--color-app'], builtinFile('dark').seeds.app)
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
// With nothing remembered (first launch), the body must not paint the dark
|
|
163
|
+
// stylesheet default; a transparent app color lets the OS-mode canvas show.
|
|
164
|
+
test('without a remembered theme the boot script shows the OS-mode canvas', () => {
|
|
165
|
+
const boot = runBootScript(false, null)
|
|
166
|
+
assert.deepEqual(boot.vars, { '--color-app': 'transparent' })
|
|
167
|
+
assert.equal(boot.colorScheme, 'light')
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
test('the boot script ignores a corrupt remembered theme', () => {
|
|
171
|
+
const boot = runBootScript(true, '{not json')
|
|
172
|
+
assert.deepEqual(boot.vars, { '--color-app': 'transparent' })
|
|
173
|
+
assert.equal(boot.colorScheme, 'dark')
|
|
174
|
+
})
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import type { AppSettings } from '../../../shared/ipc-contracts'
|
|
2
|
+
import { DEFAULT_SETTINGS } from '../../../shared/default-settings'
|
|
3
|
+
import type { ThemeFile } from '../../../shared/theme/theme-file'
|
|
4
|
+
import { resolveThemeVars } from '../../../shared/theme/resolve'
|
|
5
|
+
import { cssVarForToken } from '../../../shared/theme/tokens'
|
|
6
|
+
import { BUILTIN_THEMES } from '../themes'
|
|
7
|
+
import { applyThemeVars } from '../theme/engine'
|
|
8
|
+
|
|
9
|
+
export interface RegisteredTheme { id: string; file: ThemeFile }
|
|
10
|
+
export type ThemeKind = ThemeFile['kind']
|
|
11
|
+
export type ThemeSettings = Pick<AppSettings, 'theme' | 'systemLightTheme' | 'systemDarkTheme'>
|
|
12
|
+
|
|
13
|
+
export const SYSTEM_THEME_ID = 'system'
|
|
14
|
+
const FALLBACK_THEME_ID = 'dark'
|
|
15
|
+
const DARK_SCHEME_QUERY = '(prefers-color-scheme: dark)'
|
|
16
|
+
const SYSTEM_THEME_DEFAULTS: Readonly<Record<ThemeKind, string>> = {
|
|
17
|
+
light: DEFAULT_SETTINGS.systemLightTheme,
|
|
18
|
+
dark: DEFAULT_SETTINGS.systemDarkTheme,
|
|
19
|
+
}
|
|
20
|
+
// Read by src/renderer/public/theme-boot.js before the first paint; keep the
|
|
21
|
+
// key and the BootPaint shape in sync with that script.
|
|
22
|
+
export const BOOT_THEME_STORAGE_KEY = 'pi-desktop.boot-theme'
|
|
23
|
+
const APP_COLOR_VAR = cssVarForToken('app')
|
|
24
|
+
const TEXT_COLOR_VAR = cssVarForToken('primary')
|
|
25
|
+
|
|
26
|
+
interface BootPaint { app: string; text: string; kind: ThemeKind }
|
|
27
|
+
|
|
28
|
+
const BUILTIN_IDS = new Set(BUILTIN_THEMES.map((t) => t.id))
|
|
29
|
+
const registry = new Map<string, ThemeFile>(BUILTIN_THEMES.map((t) => [t.id, t.file]))
|
|
30
|
+
let appliedVarKeys: string[] = []
|
|
31
|
+
// The themes 'system' maps to, set by applyThemeSettings from the saved
|
|
32
|
+
// settings or the unsaved draft, so every applyTheme('system') honors them.
|
|
33
|
+
let systemThemes: Record<ThemeKind, string> = { ...SYSTEM_THEME_DEFAULTS }
|
|
34
|
+
let appliedThemeId: string | null = null
|
|
35
|
+
const appliedThemeListeners = new Set<() => void>()
|
|
36
|
+
|
|
37
|
+
// Additive: adds or updates the given themes. Use for a single fresh
|
|
38
|
+
// add/update (import, URL install, editor save) where nothing needs removing.
|
|
39
|
+
export function registerThemes(themes: ReadonlyArray<RegisteredTheme>): void {
|
|
40
|
+
for (const theme of themes) registry.set(theme.id, theme.file)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Authoritative reconcile against the full user-theme set from themes.list():
|
|
44
|
+
// drops every current user (non-built-in) entry, then re-adds the given ones,
|
|
45
|
+
// so a deleted or renamed-away theme leaves the dropdown without an app
|
|
46
|
+
// restart. Built-in entries are never touched.
|
|
47
|
+
export function setUserThemes(themes: ReadonlyArray<RegisteredTheme>): void {
|
|
48
|
+
for (const id of [...registry.keys()]) {
|
|
49
|
+
if (!BUILTIN_IDS.has(id)) registry.delete(id)
|
|
50
|
+
}
|
|
51
|
+
for (const theme of themes) registry.set(theme.id, theme.file)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function getRegisteredThemes(): ReadonlyArray<RegisteredTheme> {
|
|
55
|
+
return [...registry.entries()].map(([id, file]) => ({ id, file }))
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let systemThemeWatched = false
|
|
59
|
+
let previewActive = false
|
|
60
|
+
|
|
61
|
+
// While a live preview owns the document's theme variables (the theme editor),
|
|
62
|
+
// external re-applies must yield or they overwrite the unsaved preview. The
|
|
63
|
+
// editor sets this for its lifetime; watchSystemTheme checks it.
|
|
64
|
+
export function setThemePreviewActive(active: boolean): void {
|
|
65
|
+
previewActive = active
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Re-applies the theme when the OS light/dark preference changes while the
|
|
69
|
+
// app is open, but only when the currently-effective theme is 'system' and no
|
|
70
|
+
// live preview is in progress. Subscribes once for the app's lifetime;
|
|
71
|
+
// repeated calls are no-ops.
|
|
72
|
+
export function watchSystemTheme(getEffectiveThemeId: () => string): void {
|
|
73
|
+
if (systemThemeWatched) return
|
|
74
|
+
systemThemeWatched = true
|
|
75
|
+
window.matchMedia(DARK_SCHEME_QUERY).addEventListener('change', () => {
|
|
76
|
+
if (previewActive) return
|
|
77
|
+
if (getEffectiveThemeId() === SYSTEM_THEME_ID) applyTheme(SYSTEM_THEME_ID)
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// A System slot keeps the user's choice only while it names a registered
|
|
82
|
+
// theme of the slot's kind. A deleted, renamed, or kind-flipped theme falls
|
|
83
|
+
// back to the built-in default, so 'system' never lands on a missing theme.
|
|
84
|
+
export function resolveSystemThemeSlot(kind: ThemeKind, themeId: string): string {
|
|
85
|
+
return registry.get(themeId)?.kind === kind ? themeId : SYSTEM_THEME_DEFAULTS[kind]
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Turns 'system' into the concrete theme id for the current OS preference;
|
|
89
|
+
// any other id is already concrete.
|
|
90
|
+
export function resolveThemeId(themeId: string): string {
|
|
91
|
+
if (themeId !== SYSTEM_THEME_ID) return themeId
|
|
92
|
+
const kind: ThemeKind = window.matchMedia(DARK_SCHEME_QUERY).matches ? 'dark' : 'light'
|
|
93
|
+
return resolveSystemThemeSlot(kind, systemThemes[kind])
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function registeredOrFallback(themeId: string): string {
|
|
97
|
+
return registry.has(themeId) ? themeId : FALLBACK_THEME_ID
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function applyTheme(themeId: string): void {
|
|
101
|
+
const id = registeredOrFallback(resolveThemeId(themeId))
|
|
102
|
+
const file = registry.get(id)!
|
|
103
|
+
const html = document.documentElement
|
|
104
|
+
appliedVarKeys = applyThemeVars(html, resolveThemeVars(file), appliedVarKeys)
|
|
105
|
+
html.classList.toggle('light', file.kind === 'light')
|
|
106
|
+
html.style.colorScheme = file.kind
|
|
107
|
+
appliedThemeId = id
|
|
108
|
+
for (const listener of appliedThemeListeners) listener()
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function bootPaint(themeId: string): BootPaint {
|
|
112
|
+
const file = registry.get(registeredOrFallback(themeId))!
|
|
113
|
+
const vars = resolveThemeVars(file)
|
|
114
|
+
return { app: vars[APP_COLOR_VAR], text: vars[TEXT_COLOR_VAR], kind: file.kind }
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Stores what theme-boot.js paints before the app loads: one entry per OS
|
|
118
|
+
// mode, so a System theme still starts right after the OS switched between
|
|
119
|
+
// launches. A concrete theme stores the same paint for both. Storage
|
|
120
|
+
// failures only cost the pre-paint, so they are ignored.
|
|
121
|
+
export function rememberBootTheme(settings: ThemeSettings): void {
|
|
122
|
+
const idFor = (kind: ThemeKind): string => settings.theme === SYSTEM_THEME_ID
|
|
123
|
+
? resolveSystemThemeSlot(kind, kind === 'light' ? settings.systemLightTheme : settings.systemDarkTheme)
|
|
124
|
+
: settings.theme
|
|
125
|
+
const paints: Record<ThemeKind, BootPaint> = { light: bootPaint(idFor('light')), dark: bootPaint(idFor('dark')) }
|
|
126
|
+
try {
|
|
127
|
+
localStorage.setItem(BOOT_THEME_STORAGE_KEY, JSON.stringify(paints))
|
|
128
|
+
} catch {
|
|
129
|
+
// Private-mode or quota failure: the next launch paints the default.
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Applies a theme settings snapshot (saved or unsaved draft), recording its
|
|
134
|
+
// System slots first so 'system' resolves to the user's light/dark choices.
|
|
135
|
+
export function applyThemeSettings(settings: ThemeSettings): void {
|
|
136
|
+
systemThemes = { light: settings.systemLightTheme, dark: settings.systemDarkTheme }
|
|
137
|
+
applyTheme(settings.theme)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// The concrete id of the theme on screen, for consumers that restyle on an
|
|
141
|
+
// OS light/dark switch, not only on a settings change. Shaped for
|
|
142
|
+
// useSyncExternalStore.
|
|
143
|
+
export function getAppliedThemeId(): string | null {
|
|
144
|
+
return appliedThemeId
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Listeners run after every applyTheme, even when the id is unchanged, so
|
|
148
|
+
// an edited theme saved under its own id still reaches them.
|
|
149
|
+
export function subscribeAppliedTheme(listener: () => void): () => void {
|
|
150
|
+
appliedThemeListeners.add(listener)
|
|
151
|
+
return () => {
|
|
152
|
+
appliedThemeListeners.delete(listener)
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function isLightTheme(themeId: string | null | undefined): boolean {
|
|
157
|
+
if (!themeId) return false
|
|
158
|
+
return registry.get(resolveThemeId(themeId))?.kind === 'light'
|
|
159
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import assert from 'node:assert/strict'
|
|
2
|
+
import { test } from 'node:test'
|
|
3
|
+
import {
|
|
4
|
+
canAbortRun,
|
|
5
|
+
canResumeRun,
|
|
6
|
+
filterRunsBySession,
|
|
7
|
+
filterRunsByWorkspace,
|
|
8
|
+
isTerminalRun,
|
|
9
|
+
isWorkflowActionAllowed,
|
|
10
|
+
resolveRunSessionId,
|
|
11
|
+
runActiveAgentCount,
|
|
12
|
+
} from './workflow-runs'
|
|
13
|
+
import type { WorkflowAgentStatus, WorkflowRunStatus, WorkflowRunSummary } from '../../../shared/ipc-contracts'
|
|
14
|
+
|
|
15
|
+
const HEADER_UUID = '01a01a28-f010-7b29-8312-21ba523d9edf'
|
|
16
|
+
const STEM = `2026-08-19T13-14-45-648Z_${HEADER_UUID}`
|
|
17
|
+
|
|
18
|
+
function run(sessionId: string | undefined, workspaceId = 'ws'): WorkflowRunSummary {
|
|
19
|
+
return {
|
|
20
|
+
workspaceId,
|
|
21
|
+
workspaceName: 'ws',
|
|
22
|
+
cwd: '/tmp',
|
|
23
|
+
runId: sessionId ?? 'no-session',
|
|
24
|
+
workflowName: 'w',
|
|
25
|
+
sessionId,
|
|
26
|
+
status: 'completed',
|
|
27
|
+
phases: ['plan'],
|
|
28
|
+
startedAt: '2026-08-19T13:00:00.000Z',
|
|
29
|
+
updatedAt: '2026-08-19T13:10:00.000Z',
|
|
30
|
+
agents: [],
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
test('resolveRunSessionId prefers Pi header UUID over the filename stem', () => {
|
|
35
|
+
assert.equal(resolveRunSessionId(HEADER_UUID, STEM), HEADER_UUID)
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
test('resolveRunSessionId derives the UUID from the stem suffix when the header is missing', () => {
|
|
39
|
+
assert.equal(resolveRunSessionId(undefined, STEM), HEADER_UUID)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
test('resolveRunSessionId never returns the raw stem (tags/archive key)', () => {
|
|
43
|
+
// A stem without the timestamp_ prefix has no derivable UUID.
|
|
44
|
+
assert.equal(resolveRunSessionId(undefined, 'not-a-uuid'), null)
|
|
45
|
+
assert.equal(resolveRunSessionId('', 'not-a-uuid'), null)
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
test('filterRunsBySession keeps only the requested session across different session IDs', () => {
|
|
49
|
+
const otherUuid = '01b2b3c4-d5e6-4f70-a8b9-0c1d2e3f4a5b'
|
|
50
|
+
const runs = [run(HEADER_UUID), run(otherUuid), run(HEADER_UUID), run(undefined)]
|
|
51
|
+
const filtered = filterRunsBySession(runs, HEADER_UUID)
|
|
52
|
+
assert.equal(filtered.length, 2)
|
|
53
|
+
assert.ok(filtered.every((r) => r.sessionId === HEADER_UUID))
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
test('filterRunsBySession with null is the global list', () => {
|
|
57
|
+
const runs = [run(HEADER_UUID), run('01b2b3c4-d5e6-4f70-a8b9-0c1d2e3f4a5b')]
|
|
58
|
+
assert.equal(filterRunsBySession(runs, null).length, 2)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
test('filterRunsByWorkspace keeps only runs recorded in the requested workspace', () => {
|
|
62
|
+
const runs = [run(HEADER_UUID, 'ws-a'), run(HEADER_UUID, 'ws-b'), run(undefined, 'ws-a')]
|
|
63
|
+
const filtered = filterRunsByWorkspace(runs, 'ws-a')
|
|
64
|
+
assert.equal(filtered.length, 2)
|
|
65
|
+
assert.ok(filtered.every((r) => r.workspaceId === 'ws-a'))
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
test('filterRunsByWorkspace with null is the global list', () => {
|
|
69
|
+
const runs = [run(HEADER_UUID, 'ws-a'), run(HEADER_UUID, 'ws-b')]
|
|
70
|
+
assert.equal(filterRunsByWorkspace(runs, null).length, 2)
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
// ─── Terminal presentation ───────────────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
test('isTerminalRun covers the finished statuses only', () => {
|
|
76
|
+
for (const status of ['completed', 'failed', 'aborted'] as WorkflowRunStatus[]) {
|
|
77
|
+
assert.equal(isTerminalRun(status), true, status)
|
|
78
|
+
}
|
|
79
|
+
for (const status of ['pending', 'running', 'paused', 'unknown'] as WorkflowRunStatus[]) {
|
|
80
|
+
assert.equal(isTerminalRun(status), false, status)
|
|
81
|
+
}
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
test('runActiveAgentCount reports zero active agents on terminal runs even with stale running agents', () => {
|
|
85
|
+
const agents = [
|
|
86
|
+
{ status: 'running' as WorkflowAgentStatus },
|
|
87
|
+
{ status: 'running' as WorkflowAgentStatus },
|
|
88
|
+
{ status: 'done' as WorkflowAgentStatus },
|
|
89
|
+
]
|
|
90
|
+
for (const status of ['completed', 'failed', 'aborted'] as WorkflowRunStatus[]) {
|
|
91
|
+
assert.equal(runActiveAgentCount(agents, status), 0, status)
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
test('runActiveAgentCount counts running agents only while the run is live', () => {
|
|
96
|
+
const agents = [
|
|
97
|
+
{ status: 'running' as WorkflowAgentStatus },
|
|
98
|
+
{ status: 'running' as WorkflowAgentStatus },
|
|
99
|
+
{ status: 'done' as WorkflowAgentStatus },
|
|
100
|
+
]
|
|
101
|
+
assert.equal(runActiveAgentCount(agents, 'running'), 2)
|
|
102
|
+
assert.equal(runActiveAgentCount(agents, 'paused'), 2)
|
|
103
|
+
assert.equal(runActiveAgentCount(agents, 'pending'), 2)
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
// ─── Control eligibility ─────────────────────────────────────────────────────
|
|
107
|
+
|
|
108
|
+
/** The extension's allowedActions, spelled out for every run status. */
|
|
109
|
+
const CONTROL_MATRIX: Record<WorkflowRunStatus, { stop: boolean; resume: boolean }> = {
|
|
110
|
+
pending: { stop: false, resume: true },
|
|
111
|
+
running: { stop: true, resume: false },
|
|
112
|
+
paused: { stop: true, resume: true },
|
|
113
|
+
completed: { stop: false, resume: false },
|
|
114
|
+
failed: { stop: false, resume: true },
|
|
115
|
+
aborted: { stop: false, resume: false },
|
|
116
|
+
unknown: { stop: false, resume: false },
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
test('the control matrix holds for every run status, through both entry points', () => {
|
|
120
|
+
for (const [name, expected] of Object.entries(CONTROL_MATRIX)) {
|
|
121
|
+
const status = name as WorkflowRunStatus
|
|
122
|
+
// The gate used by the main-process IPC handler...
|
|
123
|
+
assert.equal(isWorkflowActionAllowed('stop', status), expected.stop, `stop/${status}`)
|
|
124
|
+
assert.equal(isWorkflowActionAllowed('resume', status), expected.resume, `resume/${status}`)
|
|
125
|
+
// ...and the predicates the workflow components render with are the same
|
|
126
|
+
// implementation, so the two can never encode different rules.
|
|
127
|
+
assert.equal(canAbortRun(status), expected.stop, `canAbortRun/${status}`)
|
|
128
|
+
assert.equal(canResumeRun(status), expected.resume, `canResumeRun/${status}`)
|
|
129
|
+
}
|
|
130
|
+
})
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { WorkflowAgentStatus, WorkflowRunStatus, WorkflowRunSummary } from '../../../shared/ipc-contracts'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the Pi session identifier used to scope workflow runs.
|
|
5
|
+
*
|
|
6
|
+
* Persisted runs carry `run.sessionId` = Pi's header UUID (e.g.
|
|
7
|
+
* `01a01a28-f010-7b29-8312-21ba523d9edf`), so a session-scoped filter must
|
|
8
|
+
* compare UUIDs. When a session row's header is unreadable, `piSessionId`
|
|
9
|
+
* is missing; the session filename stem (`<timestamp>_<uuid>`) is still a
|
|
10
|
+
* valid source because its suffix IS the UUID. The raw stem — the registry
|
|
11
|
+
* key used by tags/archive — never matches a run's `sessionId`.
|
|
12
|
+
*
|
|
13
|
+
* Returns null when no UUID can be derived (defensive; session files are
|
|
14
|
+
* always named `<timestamp>_<uuid>.jsonl`).
|
|
15
|
+
*/
|
|
16
|
+
export function resolveRunSessionId(
|
|
17
|
+
piSessionId: string | undefined,
|
|
18
|
+
sessionId: string
|
|
19
|
+
): string | null {
|
|
20
|
+
if (piSessionId) return piSessionId
|
|
21
|
+
const underscore = sessionId.indexOf('_')
|
|
22
|
+
if (underscore <= 0 || underscore >= sessionId.length - 1) return null
|
|
23
|
+
return sessionId.slice(underscore + 1)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The single filter used by the workflow navigator. Global mode (`null`)
|
|
28
|
+
* returns every run; session mode matches `run.sessionId` exactly, so a
|
|
29
|
+
* scoped panel can never show another session's runs.
|
|
30
|
+
*/
|
|
31
|
+
export function filterRunsBySession(
|
|
32
|
+
runs: readonly WorkflowRunSummary[],
|
|
33
|
+
sessionId: string | null
|
|
34
|
+
): WorkflowRunSummary[] {
|
|
35
|
+
return sessionId ? runs.filter((run) => run.sessionId === sessionId) : [...runs]
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The workspace-scope filter for the sidebar's Activity → Workflows entry.
|
|
40
|
+
* Global mode (`null`) returns every run; workspace mode matches
|
|
41
|
+
* `run.workspaceId` exactly, so a scoped panel can never show another
|
|
42
|
+
* project's runs. Applied AFTER the session filter (session scope wins).
|
|
43
|
+
*/
|
|
44
|
+
export function filterRunsByWorkspace(
|
|
45
|
+
runs: readonly WorkflowRunSummary[],
|
|
46
|
+
workspaceId: string | null
|
|
47
|
+
): WorkflowRunSummary[] {
|
|
48
|
+
return workspaceId ? runs.filter((run) => run.workspaceId === workspaceId) : [...runs]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ─── Terminal presentation ───────────────────────────────────────────────────
|
|
52
|
+
// Persisted runs can freeze in-flight agents and currentPhase when a run is
|
|
53
|
+
// aborted/failed mid-flight. These helpers are presentation-only: the
|
|
54
|
+
// persisted agent statuses are never rewritten, they just stop looking active.
|
|
55
|
+
|
|
56
|
+
/** Run-level statuses that are finished; nothing below them is still spinning. */
|
|
57
|
+
export const TERMINAL_RUN_STATUSES: ReadonlySet<WorkflowRunStatus> = new Set([
|
|
58
|
+
'completed',
|
|
59
|
+
'failed',
|
|
60
|
+
'aborted',
|
|
61
|
+
])
|
|
62
|
+
|
|
63
|
+
export function isTerminalRun(status: WorkflowRunStatus): boolean {
|
|
64
|
+
return TERMINAL_RUN_STATUSES.has(status)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Agents that should render as actively working. On a terminal run a stale
|
|
69
|
+
* persisted `running` agent is frozen, not active — count it as idle.
|
|
70
|
+
*/
|
|
71
|
+
export function runActiveAgentCount(
|
|
72
|
+
agents: ReadonlyArray<{ status: WorkflowAgentStatus }>,
|
|
73
|
+
runStatus: WorkflowRunStatus
|
|
74
|
+
): number {
|
|
75
|
+
if (isTerminalRun(runStatus)) return 0
|
|
76
|
+
return agents.filter((agent) => agent.status === 'running').length
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ─── Control eligibility ─────────────────────────────────────────────────────
|
|
80
|
+
// One implementation, in shared/, so the main-process dispatch gate and these
|
|
81
|
+
// renderer call sites cannot encode different rules. Re-exported here because
|
|
82
|
+
// the workflow components already consume it from this module.
|
|
83
|
+
|
|
84
|
+
export { canAbortRun, canResumeRun, isWorkflowActionAllowed } from '../../../shared/workflow-control'
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"outDir": "../../out/renderer",
|
|
5
|
+
"rootDir": "../..",
|
|
6
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
7
|
+
"jsx": "react-jsx",
|
|
8
|
+
"composite": true,
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"noUnusedLocals": false,
|
|
11
|
+
"noUnusedParameters": false
|
|
12
|
+
},
|
|
13
|
+
"include": [
|
|
14
|
+
"./**/*.ts",
|
|
15
|
+
"./**/*.tsx",
|
|
16
|
+
"../shared/**/*.ts",
|
|
17
|
+
"./src/themes/*.json",
|
|
18
|
+
"../../resources/permission-rules.ts",
|
|
19
|
+
"../../resources/permission-rules.test.ts",
|
|
20
|
+
"../../resources/permission-prompt-text.ts",
|
|
21
|
+
"../../resources/permission-prompt-text.test.ts",
|
|
22
|
+
"../../resources/locales/*/translation.json"
|
|
23
|
+
]
|
|
24
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { test } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
3
|
+
import {
|
|
4
|
+
DEFAULT_AGENT_ENGINE_LABEL,
|
|
5
|
+
DEFAULT_AGENT_ENGINE_NAME,
|
|
6
|
+
agentEngineLabel,
|
|
7
|
+
agentEngineName,
|
|
8
|
+
} from './agent-engine-label'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The status bar named "Pi" while OMP was the configured engine, because the
|
|
12
|
+
* label came from a store default that only a running agent ever corrected.
|
|
13
|
+
* Every surface that names the agent now reads this one map.
|
|
14
|
+
*
|
|
15
|
+
* Two names live here: the narrative name the Allfather reads (Brokk, for either
|
|
16
|
+
* engine) and the technical CLI name (Pi / OMP) that Diagnostics and Settings
|
|
17
|
+
* quote as fact.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
test('both engines read as the one narrative agent', () => {
|
|
21
|
+
assert.equal(agentEngineLabel('pi'), 'Brokk')
|
|
22
|
+
assert.equal(agentEngineLabel('omp'), 'Brokk')
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test('the technical name keeps each CLI literal', () => {
|
|
26
|
+
assert.equal(agentEngineName('pi'), 'Pi')
|
|
27
|
+
assert.equal(agentEngineName('omp'), 'OMP')
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
test('an unknown engine has no name, so callers choose their own fallback', () => {
|
|
31
|
+
// Session rows show nothing rather than guess; the status bar falls back to
|
|
32
|
+
// the default. Returning a name here would tag rows with the wrong CLI.
|
|
33
|
+
assert.equal(agentEngineLabel(null), null)
|
|
34
|
+
assert.equal(agentEngineLabel(undefined), null)
|
|
35
|
+
assert.equal(agentEngineName(null), null)
|
|
36
|
+
assert.equal(agentEngineName(undefined), null)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
test('the fallbacks are real names, not placeholders', () => {
|
|
40
|
+
// The permission extension renders the narrative fallback when the GUI told it nothing.
|
|
41
|
+
assert.equal(DEFAULT_AGENT_ENGINE_LABEL, 'Brokk')
|
|
42
|
+
assert.equal(DEFAULT_AGENT_ENGINE_NAME, 'Pi')
|
|
43
|
+
assert.equal(agentEngineLabel('pi'), DEFAULT_AGENT_ENGINE_LABEL)
|
|
44
|
+
assert.equal(agentEngineName('pi'), DEFAULT_AGENT_ENGINE_NAME)
|
|
45
|
+
})
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { AgentEngineKind } from './ipc-contracts'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Display names for the two agent CLIs.
|
|
5
|
+
*
|
|
6
|
+
* Two names exist for each engine:
|
|
7
|
+
* - the NARRATIVE name the Allfather reads on conversational surfaces (status
|
|
8
|
+
* bar, empty chat, permission prompt, "is working" indicators, notifications).
|
|
9
|
+
* The agent is one figure — Brokk — whichever CLI carries the turn; the
|
|
10
|
+
* choice of executable is an implementation detail, not a character.
|
|
11
|
+
* - the TECHNICAL name for Diagnostics and Settings, where the literal
|
|
12
|
+
* executable (Pi / OMP) is a machine fact and must be quoted exactly.
|
|
13
|
+
*
|
|
14
|
+
* Shared by both processes because several surfaces name the running agent —
|
|
15
|
+
* the status bar, the empty chat state, the session row tags, and the
|
|
16
|
+
* permission prompt the agent itself raises — and they must agree.
|
|
17
|
+
*/
|
|
18
|
+
const AGENT_ENGINE_LABELS: Record<AgentEngineKind, string> = {
|
|
19
|
+
pi: 'Brokk',
|
|
20
|
+
omp: 'Brokk',
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const AGENT_ENGINE_NAMES: Record<AgentEngineKind, string> = {
|
|
24
|
+
pi: 'Pi',
|
|
25
|
+
omp: 'OMP',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Fallback for a caller that must render something. Used where the engine is
|
|
30
|
+
* not yet known but a name is unavoidable, such as a permission prompt raised
|
|
31
|
+
* before the GUI told the extension which engine it belongs to.
|
|
32
|
+
*/
|
|
33
|
+
export const DEFAULT_AGENT_ENGINE_LABEL = AGENT_ENGINE_LABELS.pi
|
|
34
|
+
|
|
35
|
+
/** Fallback technical name for Diagnostics/Settings when the engine is unknown. */
|
|
36
|
+
export const DEFAULT_AGENT_ENGINE_NAME = AGENT_ENGINE_NAMES.pi
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The narrative display name for an engine, or null when the engine is unknown.
|
|
40
|
+
* Callers that must render something choose their own fallback; callers that tag
|
|
41
|
+
* rows show nothing rather than guess.
|
|
42
|
+
*/
|
|
43
|
+
export function agentEngineLabel(engine: AgentEngineKind | null | undefined): string | null {
|
|
44
|
+
return engine ? AGENT_ENGINE_LABELS[engine] : null
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The literal CLI name (Pi / OMP) for Diagnostics and Settings, or null when the
|
|
49
|
+
* engine is unknown. These surfaces quote the executable as a fact.
|
|
50
|
+
*/
|
|
51
|
+
export function agentEngineName(engine: AgentEngineKind | null | undefined): string | null {
|
|
52
|
+
return engine ? AGENT_ENGINE_NAMES[engine] : null
|
|
53
|
+
}
|