@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,649 @@
|
|
|
1
|
+
import { basename, join, posix as posixPath } from 'path'
|
|
2
|
+
import { buildNpmPrefixCommand, escapeCmdSpawn } from './cmd-escape'
|
|
3
|
+
import { i18n, type Translate } from '../shared/i18n'
|
|
4
|
+
import type { PiResolutionSource } from '../shared/ipc-contracts'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Locating the Pi CLI is the single most failure-prone step at startup, and the
|
|
8
|
+
* failures are all environmental rather than logical: a GUI app started from
|
|
9
|
+
* Finder or a desktop launcher inherits a minimal PATH, version managers hide
|
|
10
|
+
* global installs under per-version directories, and Windows ships shims that
|
|
11
|
+
* cannot be spawned without a shell.
|
|
12
|
+
*
|
|
13
|
+
* Everything here is pure with respect to injected `ResolutionDeps`, so the
|
|
14
|
+
* whole search order is unit-testable without touching the real filesystem.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export const PI_PACKAGE = '@earendil-works/pi-coding-agent'
|
|
18
|
+
export const PI_CLI_REL = join('node_modules', PI_PACKAGE, 'dist', 'cli.js')
|
|
19
|
+
export const OMP_PACKAGE = '@oh-my-pi/pi-coding-agent'
|
|
20
|
+
/** The commands shown in `errors.pi.installHint`, as `{{npmCommand}}`/`{{bunCommand}}` placeholders. */
|
|
21
|
+
export const PI_NPM_INSTALL_COMMAND = `npm install -g ${PI_PACKAGE}`
|
|
22
|
+
export const OMP_BUN_INSTALL_COMMAND = `bun install -g ${OMP_PACKAGE}`
|
|
23
|
+
export const PI_FALLBACK_BINARY_POSIX = 'pi'
|
|
24
|
+
export const PI_FALLBACK_BINARY_WINDOWS = 'pi.cmd'
|
|
25
|
+
export const OMP_FALLBACK_BINARY_POSIX = 'omp'
|
|
26
|
+
export const OMP_FALLBACK_BINARY_WINDOWS = 'omp.exe'
|
|
27
|
+
export const DEFAULT_LOGIN_SHELL = '/bin/bash'
|
|
28
|
+
export const FISH_SHELL_NAME = 'fish'
|
|
29
|
+
/** Sentinels bracket the PATH so rc-file chatter can be discarded. */
|
|
30
|
+
export const SHELL_PATH_START = '__PI_PATH_START__'
|
|
31
|
+
export const SHELL_PATH_END = '__PI_PATH_END__'
|
|
32
|
+
/** A login shell sources the user's whole rc chain; give it room but bound it. */
|
|
33
|
+
export const SHELL_PROBE_TIMEOUT_MS = 5_000
|
|
34
|
+
export const NPM_PREFIX_TIMEOUT_MS = 5_000
|
|
35
|
+
/** `--version` prints a cached string and exits; it never waits on the network. */
|
|
36
|
+
const IDENTITY_PROBE_TIMEOUT_MS = 5_000
|
|
37
|
+
const VERSION_FLAG = '--version'
|
|
38
|
+
/** Any dotted number in the output: both `0.4.1` and `omp 0.4.1` qualify. */
|
|
39
|
+
const VERSION_OUTPUT_PATTERN = /\d+\.\d+/
|
|
40
|
+
const WINDOWS_PATH_DELIMITER = ';'
|
|
41
|
+
const POSIX_PATH_DELIMITER = ':'
|
|
42
|
+
const DEFAULT_WINDOWS_PATHEXT = '.COM;.EXE;.BAT;.CMD'
|
|
43
|
+
const JS_EXTENSION = '.js'
|
|
44
|
+
const SHELL_SCRIPT_PATTERN = /\.(cmd|bat|ps1)$/i
|
|
45
|
+
const VERSION_NUMBER_PATTERN = /\d+/g
|
|
46
|
+
const OMP_BINARY_PATTERN = /(?:^|[\\/])omp(?:\.(?:cmd|exe|bat|ps1))?$/i
|
|
47
|
+
|
|
48
|
+
export interface CaptureOptions {
|
|
49
|
+
shell: boolean
|
|
50
|
+
timeoutMs: number
|
|
51
|
+
/** PATH to hand the child, so probes see version-manager shims too. */
|
|
52
|
+
pathEnv: string
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Filesystem and process access, injected so the search order can be tested. */
|
|
56
|
+
export interface ResolutionDeps {
|
|
57
|
+
isWindows: boolean
|
|
58
|
+
env: NodeJS.ProcessEnv
|
|
59
|
+
exists(path: string): boolean
|
|
60
|
+
isDirectory(path: string): boolean
|
|
61
|
+
/** Immediate child names of a directory; empty when unreadable. */
|
|
62
|
+
listDir(path: string): string[]
|
|
63
|
+
/** Run a command and return trimmed stdout, or null if it failed. */
|
|
64
|
+
capture(command: string, args: string[], options: CaptureOptions): string | null
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export type PiEngine = 'auto' | 'pi' | 'omp'
|
|
68
|
+
|
|
69
|
+
export interface PiResolution {
|
|
70
|
+
/** Path to spawn: either a cli.js (with node) or an executable/shim. */
|
|
71
|
+
script: string
|
|
72
|
+
/** True when `script` is a .js entry point that needs a Node binary. */
|
|
73
|
+
useNode: boolean
|
|
74
|
+
/** True when `script` is a Windows shim that spawn cannot invoke directly. */
|
|
75
|
+
needsShell: boolean
|
|
76
|
+
source: PiResolutionSource
|
|
77
|
+
/** False when nothing was found and `script` is only a hopeful fallback. */
|
|
78
|
+
found: boolean
|
|
79
|
+
/** A configured override that pointed at nothing; null when unset or valid. */
|
|
80
|
+
rejectedOverride: string | null
|
|
81
|
+
/** PATH with the login shell's entries merged in, for spawned children. */
|
|
82
|
+
pathEnv: string
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function homeDir(env: NodeJS.ProcessEnv): string {
|
|
86
|
+
return env.HOME ?? env.USERPROFILE ?? ''
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function pathDelimiterFor(isWindows: boolean): string {
|
|
90
|
+
return isWindows ? WINDOWS_PATH_DELIMITER : POSIX_PATH_DELIMITER
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Turn the raw `piExecutablePath` setting into a usable path, or null when it
|
|
95
|
+
* carries no information. Blank values and the bare binary name both mean
|
|
96
|
+
* "auto-detect"; quotes and a leading `~` are normalized away because both are
|
|
97
|
+
* common in hand-entered or pasted paths.
|
|
98
|
+
*/
|
|
99
|
+
export function normalizeOverride(raw: string | undefined | null, home: string): string | null {
|
|
100
|
+
if (!raw) return null
|
|
101
|
+
let value = raw.trim()
|
|
102
|
+
if (!value) return null
|
|
103
|
+
const quoted =
|
|
104
|
+
(value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))
|
|
105
|
+
if (quoted && value.length >= 2) value = value.slice(1, -1).trim()
|
|
106
|
+
if (!value) return null
|
|
107
|
+
|
|
108
|
+
const lower = value.toLowerCase()
|
|
109
|
+
if (lower === PI_FALLBACK_BINARY_POSIX || lower === PI_FALLBACK_BINARY_WINDOWS) return null
|
|
110
|
+
// `omp` is an intentional engine selector, not a filesystem path. Keep it
|
|
111
|
+
// for resolvePiBinary() so the Settings field can switch runtimes without
|
|
112
|
+
// requiring the user to find the installed executable.
|
|
113
|
+
if (lower === OMP_FALLBACK_BINARY_POSIX || lower === OMP_FALLBACK_BINARY_WINDOWS) return value
|
|
114
|
+
|
|
115
|
+
if (value === '~') return home
|
|
116
|
+
if (value.startsWith('~/') || value.startsWith('~\\')) {
|
|
117
|
+
return join(home, value.slice(2))
|
|
118
|
+
}
|
|
119
|
+
return value
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Extract the PATH the login shell printed between our sentinels. */
|
|
123
|
+
export function parseShellPath(stdout: string): string | null {
|
|
124
|
+
const start = stdout.indexOf(SHELL_PATH_START)
|
|
125
|
+
if (start < 0) return null
|
|
126
|
+
const from = start + SHELL_PATH_START.length
|
|
127
|
+
const end = stdout.indexOf(SHELL_PATH_END, from)
|
|
128
|
+
if (end < 0) return null
|
|
129
|
+
const value = stdout.slice(from, end).trim()
|
|
130
|
+
return value || null
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Args that make a login shell print its PATH. Interactive (`-i`) *and* login
|
|
135
|
+
* (`-l`) because nvm/fnm/asdf initialization lives in `.bashrc`/`.zshrc` for
|
|
136
|
+
* some users and in the profile files for others.
|
|
137
|
+
*/
|
|
138
|
+
export function buildLoginShellArgs(shellPath: string): string[] {
|
|
139
|
+
// fish stores PATH as a list, so `$PATH` interpolates space-separated.
|
|
140
|
+
const pathExpression =
|
|
141
|
+
basename(shellPath) === FISH_SHELL_NAME ? '(string join : $PATH)' : '"$PATH"'
|
|
142
|
+
return [
|
|
143
|
+
'-i',
|
|
144
|
+
'-l',
|
|
145
|
+
'-c',
|
|
146
|
+
`printf '%s%s%s' '${SHELL_PATH_START}' ${pathExpression} '${SHELL_PATH_END}'`,
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Ask the user's login shell for its PATH. Returns null on Windows (where the
|
|
152
|
+
* GUI already inherits the full user PATH) or when the probe yields nothing.
|
|
153
|
+
*/
|
|
154
|
+
export function loginShellPath(deps: ResolutionDeps): string | null {
|
|
155
|
+
if (deps.isWindows) return null
|
|
156
|
+
const shell = deps.env.SHELL ?? DEFAULT_LOGIN_SHELL
|
|
157
|
+
const stdout = deps.capture(shell, buildLoginShellArgs(shell), {
|
|
158
|
+
shell: false,
|
|
159
|
+
timeoutMs: SHELL_PROBE_TIMEOUT_MS,
|
|
160
|
+
pathEnv: deps.env.PATH ?? '',
|
|
161
|
+
})
|
|
162
|
+
if (!stdout) return null
|
|
163
|
+
return parseShellPath(stdout)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Append entries from `incoming` that `current` does not already contain. */
|
|
167
|
+
export function mergePathEntries(current: string, incoming: string, isWindows: boolean): string {
|
|
168
|
+
const delimiter = pathDelimiterFor(isWindows)
|
|
169
|
+
const existing = current.split(delimiter).filter(Boolean)
|
|
170
|
+
const seen = new Set(existing)
|
|
171
|
+
for (const entry of incoming.split(delimiter).filter(Boolean)) {
|
|
172
|
+
if (seen.has(entry)) continue
|
|
173
|
+
seen.add(entry)
|
|
174
|
+
existing.push(entry)
|
|
175
|
+
}
|
|
176
|
+
return existing.join(delimiter)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** Sort comparator putting the highest version-like directory name first. */
|
|
180
|
+
export function compareVersionsDesc(a: string, b: string): number {
|
|
181
|
+
const left = a.match(VERSION_NUMBER_PATTERN)?.map(Number) ?? []
|
|
182
|
+
const right = b.match(VERSION_NUMBER_PATTERN)?.map(Number) ?? []
|
|
183
|
+
const length = Math.max(left.length, right.length)
|
|
184
|
+
for (let i = 0; i < length; i++) {
|
|
185
|
+
const diff = (right[i] ?? 0) - (left[i] ?? 0)
|
|
186
|
+
if (diff !== 0) return diff
|
|
187
|
+
}
|
|
188
|
+
return b.localeCompare(a)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** A directory whose children are node versions, plus the prefix inside one. */
|
|
192
|
+
interface VersionRoot {
|
|
193
|
+
root: string
|
|
194
|
+
/** Path segments appended to a version directory to reach its npm prefix. */
|
|
195
|
+
prefixSuffix: string[]
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function posixVersionRoots(env: NodeJS.ProcessEnv): VersionRoot[] {
|
|
199
|
+
const home = homeDir(env)
|
|
200
|
+
const fnmDir = env.FNM_DIR ?? ''
|
|
201
|
+
const asdfDir = env.ASDF_DATA_DIR ?? join(home, '.asdf')
|
|
202
|
+
const roots: VersionRoot[] = [
|
|
203
|
+
{ root: join(home, '.nvm', 'versions', 'node'), prefixSuffix: [] },
|
|
204
|
+
{ root: join(home, '.local', 'share', 'fnm', 'node-versions'), prefixSuffix: ['installation'] },
|
|
205
|
+
{
|
|
206
|
+
root: join(home, 'Library', 'Application Support', 'fnm', 'node-versions'),
|
|
207
|
+
prefixSuffix: ['installation'],
|
|
208
|
+
},
|
|
209
|
+
{ root: join(home, '.volta', 'tools', 'image', 'node'), prefixSuffix: [] },
|
|
210
|
+
{ root: join(asdfDir, 'installs', 'nodejs'), prefixSuffix: [] },
|
|
211
|
+
{ root: join(home, '.local', 'share', 'mise', 'installs', 'node'), prefixSuffix: [] },
|
|
212
|
+
{ root: join(home, '.nodenv', 'versions'), prefixSuffix: [] },
|
|
213
|
+
{ root: join('/usr/local/n', 'versions', 'node'), prefixSuffix: [] },
|
|
214
|
+
]
|
|
215
|
+
if (fnmDir) {
|
|
216
|
+
roots.push({ root: join(fnmDir, 'node-versions'), prefixSuffix: ['installation'] })
|
|
217
|
+
}
|
|
218
|
+
return roots
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function windowsVersionRoots(env: NodeJS.ProcessEnv): VersionRoot[] {
|
|
222
|
+
const appData = env.APPDATA ?? ''
|
|
223
|
+
const localAppData = env.LOCALAPPDATA ?? ''
|
|
224
|
+
const nvmHome = env.NVM_HOME ?? ''
|
|
225
|
+
const roots: VersionRoot[] = []
|
|
226
|
+
if (nvmHome) roots.push({ root: nvmHome, prefixSuffix: [] })
|
|
227
|
+
if (appData) {
|
|
228
|
+
roots.push({ root: join(appData, 'nvm'), prefixSuffix: [] })
|
|
229
|
+
roots.push({ root: join(appData, 'fnm', 'node-versions'), prefixSuffix: ['installation'] })
|
|
230
|
+
}
|
|
231
|
+
if (localAppData) {
|
|
232
|
+
roots.push({ root: join(localAppData, 'fnm', 'node-versions'), prefixSuffix: ['installation'] })
|
|
233
|
+
roots.push({ root: join(localAppData, 'Volta', 'tools', 'image', 'node'), prefixSuffix: [] })
|
|
234
|
+
}
|
|
235
|
+
return roots
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Every per-version npm prefix a node version manager may have created, newest
|
|
240
|
+
* version first. These are the installs a bare PATH search can never see.
|
|
241
|
+
*/
|
|
242
|
+
export function versionManagerPrefixes(deps: ResolutionDeps): string[] {
|
|
243
|
+
const roots = deps.isWindows ? windowsVersionRoots(deps.env) : posixVersionRoots(deps.env)
|
|
244
|
+
const prefixes: string[] = []
|
|
245
|
+
const seen = new Set<string>()
|
|
246
|
+
for (const { root, prefixSuffix } of roots) {
|
|
247
|
+
if (!deps.exists(root)) continue
|
|
248
|
+
const versions = deps
|
|
249
|
+
.listDir(root)
|
|
250
|
+
.filter((name) => deps.isDirectory(join(root, name)))
|
|
251
|
+
.sort(compareVersionsDesc)
|
|
252
|
+
for (const version of versions) {
|
|
253
|
+
const prefix = join(root, version, ...prefixSuffix)
|
|
254
|
+
if (seen.has(prefix)) continue
|
|
255
|
+
seen.add(prefix)
|
|
256
|
+
prefixes.push(prefix)
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return prefixes
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Look for the Pi cli.js under a directory that behaves like an npm prefix.
|
|
264
|
+
* Covers the three global-install layouts: Windows (`<prefix>/node_modules`),
|
|
265
|
+
* POSIX (`<prefix>/lib/node_modules`), and shim-adjacent installs where the
|
|
266
|
+
* shim sits one level below the prefix.
|
|
267
|
+
*/
|
|
268
|
+
export function findCliJsNear(deps: ResolutionDeps, dir: string): string | null {
|
|
269
|
+
const candidates = [
|
|
270
|
+
join(dir, PI_CLI_REL),
|
|
271
|
+
join(dir, 'lib', PI_CLI_REL),
|
|
272
|
+
join(dir, '..', PI_CLI_REL),
|
|
273
|
+
join(dir, '..', 'lib', PI_CLI_REL),
|
|
274
|
+
]
|
|
275
|
+
for (const candidate of candidates) {
|
|
276
|
+
if (deps.exists(candidate)) return candidate
|
|
277
|
+
}
|
|
278
|
+
return null
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/** Executable shim names an npm prefix may expose, per platform. */
|
|
282
|
+
function shimCandidates(deps: ResolutionDeps, prefix: string): string[] {
|
|
283
|
+
return deps.isWindows
|
|
284
|
+
? [join(prefix, 'pi.cmd'), join(prefix, 'pi.ps1'), join(prefix, 'pi.exe')]
|
|
285
|
+
: [join(prefix, 'bin', 'pi'), join(prefix, 'pi')]
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function usableFile(deps: ResolutionDeps, path: string): boolean {
|
|
289
|
+
return deps.exists(path) && !deps.isDirectory(path)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Resolve a prefix to a spawnable Pi path, preferring its JS entry point.
|
|
294
|
+
*/
|
|
295
|
+
function resolveFromPrefix(deps: ResolutionDeps, prefix: string): string | null {
|
|
296
|
+
const cliJs = findCliJsNear(deps, prefix)
|
|
297
|
+
if (cliJs) return cliJs
|
|
298
|
+
for (const shim of shimCandidates(deps, prefix)) {
|
|
299
|
+
if (usableFile(deps, shim)) return shim
|
|
300
|
+
}
|
|
301
|
+
return null
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Resolve a configured OMP executable or install directory.
|
|
305
|
+
*/
|
|
306
|
+
function resolveOmpOverride(deps: ResolutionDeps, overridePath: string): string | null {
|
|
307
|
+
if (deps.isDirectory(overridePath)) {
|
|
308
|
+
for (const shim of ompShimCandidates(deps, overridePath)) {
|
|
309
|
+
if (usableFile(deps, shim)) return shim
|
|
310
|
+
}
|
|
311
|
+
return null
|
|
312
|
+
}
|
|
313
|
+
return usableFile(deps, overridePath) ? overridePath : null
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/** Search PATH for an executable, honoring PATHEXT on Windows. */
|
|
317
|
+
export function whichInPath(deps: ResolutionDeps, name: string, pathEnv: string): string | null {
|
|
318
|
+
const dirs = pathEnv.split(pathDelimiterFor(deps.isWindows)).filter(Boolean)
|
|
319
|
+
const pathJoin = deps.isWindows ? join : posixPath.join
|
|
320
|
+
const extensions = deps.isWindows
|
|
321
|
+
? (deps.env.PATHEXT ?? DEFAULT_WINDOWS_PATHEXT).split(';').map((e) => e.toLowerCase())
|
|
322
|
+
: ['']
|
|
323
|
+
for (const dir of dirs) {
|
|
324
|
+
for (const extension of extensions) {
|
|
325
|
+
const candidate = pathJoin(dir, name + extension)
|
|
326
|
+
if (usableFile(deps, candidate)) return candidate
|
|
327
|
+
// Tests inject a platform independent path separator while running on
|
|
328
|
+
// the host OS; accept that spelling as a fallback in the seam.
|
|
329
|
+
if (!deps.isWindows) {
|
|
330
|
+
const hostCandidate = join(dir, name + extension)
|
|
331
|
+
if (hostCandidate !== candidate && usableFile(deps, hostCandidate)) return hostCandidate
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return null
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/** Ask npm where its global prefix is; null when npm is unreachable. */
|
|
339
|
+
function npmGlobalPrefix(deps: ResolutionDeps, pathEnv: string): string | null {
|
|
340
|
+
const command = buildNpmPrefixCommand(deps.isWindows)
|
|
341
|
+
const stdout = deps.capture(command.file, command.args, {
|
|
342
|
+
shell: deps.isWindows,
|
|
343
|
+
timeoutMs: NPM_PREFIX_TIMEOUT_MS,
|
|
344
|
+
pathEnv,
|
|
345
|
+
})
|
|
346
|
+
if (!stdout) return null
|
|
347
|
+
const prefix = stdout.trim()
|
|
348
|
+
if (!prefix || !deps.exists(prefix)) return null
|
|
349
|
+
return prefix
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/** Hardcoded install locations, used only after every dynamic probe fails. */
|
|
353
|
+
function ompShimCandidates(deps: ResolutionDeps, prefix: string): string[] {
|
|
354
|
+
return deps.isWindows
|
|
355
|
+
? [join(prefix, 'omp.cmd'), join(prefix, 'omp.exe'), join(prefix, 'omp.ps1')]
|
|
356
|
+
: [join(prefix, 'bin', 'omp'), join(prefix, 'omp')]
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function ompLocations(deps: ResolutionDeps): string[] {
|
|
360
|
+
const { env } = deps
|
|
361
|
+
const home = homeDir(env)
|
|
362
|
+
if (deps.isWindows) {
|
|
363
|
+
const appData = env.APPDATA ?? ''
|
|
364
|
+
const localAppData = env.LOCALAPPDATA ?? ''
|
|
365
|
+
const userProfile = env.USERPROFILE ?? home
|
|
366
|
+
return [
|
|
367
|
+
appData ? join(appData, 'npm', OMP_FALLBACK_BINARY_WINDOWS) : '',
|
|
368
|
+
localAppData ? join(localAppData, 'npm', OMP_FALLBACK_BINARY_WINDOWS) : '',
|
|
369
|
+
localAppData ? join(localAppData, 'omp', OMP_FALLBACK_BINARY_WINDOWS) : '',
|
|
370
|
+
join(userProfile, '.bun', 'bin', OMP_FALLBACK_BINARY_WINDOWS),
|
|
371
|
+
].filter(Boolean)
|
|
372
|
+
}
|
|
373
|
+
return [
|
|
374
|
+
join(home, '.local', 'bin', OMP_FALLBACK_BINARY_POSIX),
|
|
375
|
+
join(home, '.bun', 'bin', OMP_FALLBACK_BINARY_POSIX),
|
|
376
|
+
join(home, '.npm-global', 'bin', OMP_FALLBACK_BINARY_POSIX),
|
|
377
|
+
join(home, '.npm-packages', 'bin', OMP_FALLBACK_BINARY_POSIX),
|
|
378
|
+
'/opt/homebrew/bin/omp',
|
|
379
|
+
'/usr/local/bin/omp',
|
|
380
|
+
'/usr/bin/omp',
|
|
381
|
+
]
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Every OMP candidate, most authoritative first. A generator rather than an
|
|
386
|
+
* array so the `npm prefix -g` subprocess is only spawned when the cheaper
|
|
387
|
+
* PATH and common-location lookups came up empty.
|
|
388
|
+
*/
|
|
389
|
+
function* ompCandidates(deps: ResolutionDeps, pathEnv: string): Generator<string> {
|
|
390
|
+
const onPath = whichInPath(deps, OMP_FALLBACK_BINARY_POSIX, pathEnv)
|
|
391
|
+
if (onPath) yield onPath
|
|
392
|
+
for (const candidate of ompLocations(deps)) {
|
|
393
|
+
if (usableFile(deps, candidate)) yield candidate
|
|
394
|
+
}
|
|
395
|
+
const prefix = npmGlobalPrefix(deps, pathEnv)
|
|
396
|
+
if (prefix) {
|
|
397
|
+
for (const candidate of ompShimCandidates(deps, prefix)) {
|
|
398
|
+
if (usableFile(deps, candidate)) yield candidate
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/** The first OMP candidate, taken on trust because the engine is explicit. */
|
|
404
|
+
function resolveOmpBinary(deps: ResolutionDeps, pathEnv: string): string | null {
|
|
405
|
+
for (const candidate of ompCandidates(deps, pathEnv)) return candidate
|
|
406
|
+
return null
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Ask a candidate to identify itself. `deps.capture` yields stdout only for a
|
|
411
|
+
* clean exit, so an unreadable file, a non-executable one and a script that
|
|
412
|
+
* errors out all answer null.
|
|
413
|
+
*/
|
|
414
|
+
function respondsToVersion(deps: ResolutionDeps, script: string, pathEnv: string): boolean {
|
|
415
|
+
// A .cmd/.ps1 shim only starts through cmd.exe, which quotes nothing itself:
|
|
416
|
+
// escape both tokens exactly as the real spawn path does.
|
|
417
|
+
const viaCmd = deps.isWindows && SHELL_SCRIPT_PATTERN.test(script)
|
|
418
|
+
const command = escapeCmdSpawn(viaCmd, script, [VERSION_FLAG])
|
|
419
|
+
const stdout = deps.capture(command.file, command.args, {
|
|
420
|
+
shell: viaCmd,
|
|
421
|
+
timeoutMs: IDENTITY_PROBE_TIMEOUT_MS,
|
|
422
|
+
pathEnv,
|
|
423
|
+
})
|
|
424
|
+
return stdout !== null && VERSION_OUTPUT_PATTERN.test(stdout)
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* The first OMP candidate that behaves like a CLI. `omp` is a short, common
|
|
429
|
+
* name, and auto-detection reaches this point only when the user asked for
|
|
430
|
+
* nothing in particular — accepting a same-named data file or unrelated script
|
|
431
|
+
* would mark the resolution found, replacing the actionable "install Pi with…"
|
|
432
|
+
* message with a spawn timeout minutes later.
|
|
433
|
+
*/
|
|
434
|
+
function resolveVerifiedOmpBinary(deps: ResolutionDeps, pathEnv: string): string | null {
|
|
435
|
+
for (const candidate of ompCandidates(deps, pathEnv)) {
|
|
436
|
+
if (respondsToVersion(deps, candidate, pathEnv)) return candidate
|
|
437
|
+
}
|
|
438
|
+
return null
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
export function isOmpExecutable(script: string): boolean {
|
|
442
|
+
return OMP_BINARY_PATTERN.test(script)
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
function commonLocations(deps: ResolutionDeps): string[] {
|
|
446
|
+
const { env } = deps
|
|
447
|
+
const home = homeDir(env)
|
|
448
|
+
if (deps.isWindows) {
|
|
449
|
+
const appData = env.APPDATA ?? ''
|
|
450
|
+
const localAppData = env.LOCALAPPDATA ?? ''
|
|
451
|
+
const programFiles = env.ProgramFiles ?? 'C:\\Program Files'
|
|
452
|
+
const paths: string[] = []
|
|
453
|
+
if (appData) paths.push(join(appData, 'npm', PI_CLI_REL), join(appData, 'npm', 'pi.cmd'))
|
|
454
|
+
if (localAppData) {
|
|
455
|
+
paths.push(join(localAppData, 'npm', PI_CLI_REL), join(localAppData, 'npm', 'pi.cmd'))
|
|
456
|
+
}
|
|
457
|
+
paths.push(join(programFiles, 'nodejs', PI_CLI_REL))
|
|
458
|
+
return paths
|
|
459
|
+
}
|
|
460
|
+
return [
|
|
461
|
+
join(home, '.npm-global', PI_CLI_REL),
|
|
462
|
+
join(home, '.npm-packages', PI_CLI_REL),
|
|
463
|
+
join('/opt/homebrew/lib', PI_CLI_REL),
|
|
464
|
+
join('/usr/local/lib', PI_CLI_REL),
|
|
465
|
+
join('/usr/lib', PI_CLI_REL),
|
|
466
|
+
join(home, '.npm-global', 'bin', 'pi'),
|
|
467
|
+
'/opt/homebrew/bin/pi',
|
|
468
|
+
'/usr/local/bin/pi',
|
|
469
|
+
'/usr/bin/pi',
|
|
470
|
+
join(home, '.local/bin/pi'),
|
|
471
|
+
]
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
function finalize(
|
|
475
|
+
deps: ResolutionDeps,
|
|
476
|
+
script: string,
|
|
477
|
+
source: PiResolutionSource,
|
|
478
|
+
found: boolean,
|
|
479
|
+
rejectedOverride: string | null,
|
|
480
|
+
pathEnv: string
|
|
481
|
+
): PiResolution {
|
|
482
|
+
const useNode = script.toLowerCase().endsWith(JS_EXTENSION)
|
|
483
|
+
return {
|
|
484
|
+
script,
|
|
485
|
+
useNode,
|
|
486
|
+
needsShell: deps.isWindows && !useNode && SHELL_SCRIPT_PATTERN.test(script),
|
|
487
|
+
source,
|
|
488
|
+
found,
|
|
489
|
+
rejectedOverride,
|
|
490
|
+
pathEnv,
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* Find the Pi CLI. Order, most authoritative first:
|
|
496
|
+
*
|
|
497
|
+
* 0. Merge the login shell's PATH into ours, so every later probe sees what
|
|
498
|
+
* the user's terminal sees. A GUI process started from Finder or a desktop
|
|
499
|
+
* launcher otherwise gets a minimal PATH with no version-manager shims.
|
|
500
|
+
* 1. The path configured in Settings, if it exists. A directory is accepted
|
|
501
|
+
* and searched; a stale value is reported rather than silently obeyed.
|
|
502
|
+
* 2. npm's own global prefix.
|
|
503
|
+
* 3. A PATH search.
|
|
504
|
+
* 4. Per-version prefixes created by node version managers.
|
|
505
|
+
* 5. Hardcoded common install locations.
|
|
506
|
+
* 6. OMP fallback when Pi is not installed, accepted only after the
|
|
507
|
+
* candidate answers a `--version` probe.
|
|
508
|
+
* 7. The bare binary name, flagged as not found.
|
|
509
|
+
*/
|
|
510
|
+
export function resolvePiBinary(
|
|
511
|
+
deps: ResolutionDeps,
|
|
512
|
+
overridePath: string | null,
|
|
513
|
+
engine: PiEngine = 'auto'
|
|
514
|
+
): PiResolution {
|
|
515
|
+
const basePath = deps.env.PATH ?? ''
|
|
516
|
+
const shellPath = loginShellPath(deps)
|
|
517
|
+
const pathEnv = shellPath ? mergePathEntries(basePath, shellPath, deps.isWindows) : basePath
|
|
518
|
+
let rejectedOverride: string | null = null
|
|
519
|
+
|
|
520
|
+
if (engine === 'omp') {
|
|
521
|
+
if (overridePath && overridePath.toLowerCase() !== OMP_FALLBACK_BINARY_POSIX && overridePath.toLowerCase() !== OMP_FALLBACK_BINARY_WINDOWS) {
|
|
522
|
+
const override = resolveOmpOverride(deps, overridePath)
|
|
523
|
+
return override
|
|
524
|
+
? finalize(deps, override, 'override', true, null, pathEnv)
|
|
525
|
+
: finalize(
|
|
526
|
+
deps,
|
|
527
|
+
deps.isWindows ? OMP_FALLBACK_BINARY_WINDOWS : OMP_FALLBACK_BINARY_POSIX,
|
|
528
|
+
'fallback',
|
|
529
|
+
false,
|
|
530
|
+
overridePath,
|
|
531
|
+
pathEnv
|
|
532
|
+
)
|
|
533
|
+
}
|
|
534
|
+
const omp = resolveOmpBinary(deps, pathEnv)
|
|
535
|
+
return omp
|
|
536
|
+
? finalize(deps, omp, 'omp', true, null, pathEnv)
|
|
537
|
+
: finalize(
|
|
538
|
+
deps,
|
|
539
|
+
deps.isWindows ? OMP_FALLBACK_BINARY_WINDOWS : OMP_FALLBACK_BINARY_POSIX,
|
|
540
|
+
'fallback',
|
|
541
|
+
false,
|
|
542
|
+
null,
|
|
543
|
+
pathEnv
|
|
544
|
+
)
|
|
545
|
+
}
|
|
546
|
+
if (overridePath && (overridePath.toLowerCase() === OMP_FALLBACK_BINARY_POSIX || overridePath.toLowerCase() === OMP_FALLBACK_BINARY_WINDOWS)) {
|
|
547
|
+
const omp = resolveOmpBinary(deps, pathEnv)
|
|
548
|
+
if (omp) return finalize(deps, omp, 'override', true, null, pathEnv)
|
|
549
|
+
return finalize(
|
|
550
|
+
deps,
|
|
551
|
+
deps.isWindows ? OMP_FALLBACK_BINARY_WINDOWS : OMP_FALLBACK_BINARY_POSIX,
|
|
552
|
+
'fallback',
|
|
553
|
+
false,
|
|
554
|
+
overridePath,
|
|
555
|
+
pathEnv
|
|
556
|
+
)
|
|
557
|
+
}
|
|
558
|
+
if (overridePath) {
|
|
559
|
+
if (deps.isDirectory(overridePath)) {
|
|
560
|
+
const fromDir = resolveFromPrefix(deps, overridePath)
|
|
561
|
+
if (fromDir) return finalize(deps, fromDir, 'override', true, null, pathEnv)
|
|
562
|
+
rejectedOverride = overridePath
|
|
563
|
+
} else if (deps.exists(overridePath)) {
|
|
564
|
+
return finalize(deps, overridePath, 'override', true, null, pathEnv)
|
|
565
|
+
} else {
|
|
566
|
+
rejectedOverride = overridePath
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
const prefix = npmGlobalPrefix(deps, pathEnv)
|
|
571
|
+
if (prefix) {
|
|
572
|
+
const fromPrefix = resolveFromPrefix(deps, prefix)
|
|
573
|
+
if (fromPrefix) return finalize(deps, fromPrefix, 'npm-prefix', true, rejectedOverride, pathEnv)
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
const onPath = whichInPath(deps, PI_FALLBACK_BINARY_POSIX, pathEnv)
|
|
577
|
+
if (onPath) {
|
|
578
|
+
// A .cmd/.ps1 shim is spawnable only through a shell, which breaks the
|
|
579
|
+
// JSONL stdio piping RPC mode needs. Prefer the cli.js it wraps.
|
|
580
|
+
if (SHELL_SCRIPT_PATTERN.test(onPath)) {
|
|
581
|
+
const cliJs = findCliJsNear(deps, join(onPath, '..'))
|
|
582
|
+
if (cliJs) return finalize(deps, cliJs, 'path', true, rejectedOverride, pathEnv)
|
|
583
|
+
}
|
|
584
|
+
return finalize(deps, onPath, 'path', true, rejectedOverride, pathEnv)
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
for (const versionPrefix of versionManagerPrefixes(deps)) {
|
|
588
|
+
const fromVersion = resolveFromPrefix(deps, versionPrefix)
|
|
589
|
+
if (fromVersion) {
|
|
590
|
+
return finalize(deps, fromVersion, 'version-manager', true, rejectedOverride, pathEnv)
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
for (const candidate of commonLocations(deps)) {
|
|
595
|
+
if (deps.exists(candidate)) {
|
|
596
|
+
return finalize(deps, candidate, 'common-location', true, rejectedOverride, pathEnv)
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// Keep the historical Pi-first preference, but make an OMP-only machine
|
|
601
|
+
// work without forcing the user to discover the Agent Executable field.
|
|
602
|
+
// This is the one branch nobody asked for, so it is also the one that has to
|
|
603
|
+
// prove the binary is real before claiming the search succeeded.
|
|
604
|
+
if (engine === 'auto') {
|
|
605
|
+
const omp = resolveVerifiedOmpBinary(deps, pathEnv)
|
|
606
|
+
if (omp) return finalize(deps, omp, 'omp', true, rejectedOverride, pathEnv)
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
const fallback = deps.isWindows ? PI_FALLBACK_BINARY_WINDOWS : PI_FALLBACK_BINARY_POSIX
|
|
610
|
+
return finalize(deps, fallback, 'fallback', false, rejectedOverride, pathEnv)
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* Explain a failed resolution. A stale configured path is the headline when
|
|
615
|
+
* one exists, because "Pi is not installed" is actively misleading to someone
|
|
616
|
+
* who did point the app at their install. `t` defaults to the interface
|
|
617
|
+
* language.
|
|
618
|
+
*/
|
|
619
|
+
export function describePiResolutionFailure(resolution: PiResolution, t: Translate = i18n.t): string {
|
|
620
|
+
const settingsHint = t('errors.pi.settingsHint')
|
|
621
|
+
const installHint = t('errors.pi.installHint', {
|
|
622
|
+
npmCommand: PI_NPM_INSTALL_COMMAND,
|
|
623
|
+
bunCommand: OMP_BUN_INSTALL_COMMAND,
|
|
624
|
+
})
|
|
625
|
+
if (resolution.rejectedOverride) {
|
|
626
|
+
return t('errors.pi.configuredPathMissing', {
|
|
627
|
+
settingsHint,
|
|
628
|
+
path: resolution.rejectedOverride,
|
|
629
|
+
installHint,
|
|
630
|
+
})
|
|
631
|
+
}
|
|
632
|
+
return t('errors.pi.notFound', { installHint, settingsHint })
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/**
|
|
636
|
+
* Why a resolved Pi invocation cannot start. Kept as data, not text, so each
|
|
637
|
+
* sink renders it in its own language: the interface language for the UI,
|
|
638
|
+
* English for the log and the diagnostics report.
|
|
639
|
+
*/
|
|
640
|
+
export type PiStartFailure =
|
|
641
|
+
| { kind: 'pi-not-found'; resolution: PiResolution }
|
|
642
|
+
| { kind: 'node-not-found'; node: string }
|
|
643
|
+
|
|
644
|
+
/** Render a start failure with `t` (interface text) or `tEnglish` (log, report). */
|
|
645
|
+
export function describePiStartFailure(failure: PiStartFailure, t: Translate): string {
|
|
646
|
+
return failure.kind === 'pi-not-found'
|
|
647
|
+
? describePiResolutionFailure(failure.resolution, t)
|
|
648
|
+
: t('errors.pi.nodeNotFound', { node: failure.node })
|
|
649
|
+
}
|