@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,103 @@
|
|
|
1
|
+
"""Deterministic change capture: what was built, straight from git.
|
|
2
|
+
|
|
3
|
+
"What changed since main" is not a judgement call — it is two git commands and
|
|
4
|
+
a subtraction. So it is code, and an agent is only handed the result. The
|
|
5
|
+
capture writes the full diff into `context_handoff/` and returns a ChangeSet;
|
|
6
|
+
`as_envelope` adapts that into the one door every agent handoff uses.
|
|
7
|
+
|
|
8
|
+
The base is resolved, not assumed. Off the base branch the diff covers the
|
|
9
|
+
whole branch plus the working tree; on it, the uncommitted tree; and on a clean
|
|
10
|
+
tree, the last commit — because "document the work that was just done" still
|
|
11
|
+
has an answer right after a chain committed. Whichever it picked rides along in
|
|
12
|
+
`BaseRef.reason`, so the trace never leaves you guessing what a diff was
|
|
13
|
+
measured against.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from . import git_helper
|
|
19
|
+
from .data_types import BaseRef, ChangeCapture, ChangeSet, ChangesOutput
|
|
20
|
+
|
|
21
|
+
DIFF_FILENAME = "changes.diff"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def resolve_base(ref: str) -> BaseRef:
|
|
25
|
+
"""Pick the commit the work is measured from, and record why that one."""
|
|
26
|
+
if not git_helper.is_repo():
|
|
27
|
+
raise RuntimeError(
|
|
28
|
+
"not a git repository — change capture needs one. Run `git init` in "
|
|
29
|
+
"the repo root before running an smidja that documents a change.")
|
|
30
|
+
if not git_helper.ref_exists(ref):
|
|
31
|
+
raise RuntimeError(
|
|
32
|
+
f"base ref {ref!r} does not exist in this repository — pass --base "
|
|
33
|
+
f"with a ref that does (e.g. --base master, --base HEAD~1).")
|
|
34
|
+
|
|
35
|
+
# Built first, then given its reason: BaseRef.label knows how to print a
|
|
36
|
+
# pinned sha, and the reason is the line a human reads in the trace.
|
|
37
|
+
base = BaseRef(ref=ref, commit=git_helper.merge_base(ref, "HEAD"))
|
|
38
|
+
if git_helper.short_sha(base.commit) != git_helper.short_sha("HEAD"):
|
|
39
|
+
base.reason = (f"HEAD is ahead of {base.label} — diffing every commit since, "
|
|
40
|
+
f"plus the working tree")
|
|
41
|
+
elif git_helper.is_dirty():
|
|
42
|
+
base.reason = f"HEAD is on {base.label} — diffing the uncommitted working tree"
|
|
43
|
+
elif git_helper.ref_exists("HEAD~1"):
|
|
44
|
+
base.commit = git_helper.rev("HEAD~1")
|
|
45
|
+
base.reason = (f"HEAD is on {base.label} with a clean tree — falling back to "
|
|
46
|
+
f"the last commit")
|
|
47
|
+
else:
|
|
48
|
+
base.reason = f"HEAD is on {base.label} with a clean tree and no parent commit"
|
|
49
|
+
return base
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def capture(run, params: ChangeCapture) -> ChangeSet:
|
|
53
|
+
"""Diff the working tree against the resolved base and persist the evidence."""
|
|
54
|
+
base = resolve_base(params.base)
|
|
55
|
+
files = git_helper.diff_files(base.commit)
|
|
56
|
+
untracked = git_helper.untracked_files() if params.include_untracked else []
|
|
57
|
+
insertions, deletions = git_helper.diff_counts(base.commit)
|
|
58
|
+
stat = git_helper.diff_stat(base.commit)
|
|
59
|
+
|
|
60
|
+
text = git_helper.diff_text(base.commit)
|
|
61
|
+
lines = text.splitlines()
|
|
62
|
+
truncated = len(lines) > params.max_diff_lines
|
|
63
|
+
if truncated:
|
|
64
|
+
text = "\n".join(lines[:params.max_diff_lines])
|
|
65
|
+
text += (f"\n\n[truncated at {params.max_diff_lines} lines of "
|
|
66
|
+
f"{len(lines)} — run `git diff {base.commit}` for the rest]")
|
|
67
|
+
|
|
68
|
+
# Untracked files are absent from `git diff` by construction, so they are
|
|
69
|
+
# named here rather than silently missing from the record. The reader has
|
|
70
|
+
# `read` and can open any of them.
|
|
71
|
+
untracked_block = ("\n".join(f" {f}" for f in untracked) if untracked
|
|
72
|
+
else " (none)")
|
|
73
|
+
diff_path = run.context_handoff_dir / DIFF_FILENAME
|
|
74
|
+
diff_path.write_text(
|
|
75
|
+
f"# changes since {base.label} @ {git_helper.short_sha(base.commit)}\n"
|
|
76
|
+
f"# {base.reason}\n"
|
|
77
|
+
f"# +{insertions} -{deletions} across {len(files)} tracked file(s)\n\n"
|
|
78
|
+
f"## stat\n{stat or ' (no tracked changes)'}\n\n"
|
|
79
|
+
f"## untracked files\n{untracked_block}\n\n"
|
|
80
|
+
f"## diff\n{text}\n")
|
|
81
|
+
|
|
82
|
+
return ChangeSet(base=base, files=files, untracked=untracked,
|
|
83
|
+
insertions=insertions, deletions=deletions, stat=stat,
|
|
84
|
+
diff_path=str(diff_path), truncated=truncated)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def as_envelope(changes: ChangeSet, notes: str = "") -> ChangesOutput:
|
|
88
|
+
"""Wrap a captured change so an agent can be handed it directly."""
|
|
89
|
+
total = len(changes.files) + len(changes.untracked)
|
|
90
|
+
return ChangesOutput(
|
|
91
|
+
status="success",
|
|
92
|
+
summary=(f"{total} file(s) changed since {changes.base.label} "
|
|
93
|
+
f"(+{changes.insertions} -{changes.deletions})"),
|
|
94
|
+
artifacts=[changes.diff_path],
|
|
95
|
+
notes_for_next_agent=notes,
|
|
96
|
+
base=f"{changes.base.label} @ {git_helper.short_sha(changes.base.commit)} "
|
|
97
|
+
f"— {changes.base.reason}",
|
|
98
|
+
changed_files=changes.files + changes.untracked,
|
|
99
|
+
insertions=changes.insertions,
|
|
100
|
+
deletions=changes.deletions,
|
|
101
|
+
stat=changes.stat,
|
|
102
|
+
diff_path=changes.diff_path,
|
|
103
|
+
)
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"""Console reporter: one narrative, two destinations.
|
|
2
|
+
|
|
3
|
+
Every line an smidja prints ALSO lands in the db as a `log` event, so the swim-lane
|
|
4
|
+
UI reads the same story the terminal does. Both go through `_emit` — print and
|
|
5
|
+
trace cannot drift. Plain sequential lines only: no spinners, no live displays,
|
|
6
|
+
so a CI log reads exactly like a terminal.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from rich.console import Console as RichConsole
|
|
12
|
+
from rich.markup import escape
|
|
13
|
+
from rich.panel import Panel
|
|
14
|
+
from rich.text import Text
|
|
15
|
+
|
|
16
|
+
from .data_types import EnvelopeBase, EventRecord, Phase
|
|
17
|
+
|
|
18
|
+
KIND_COLOR = {"engineer": "cyan", "agent": "magenta", "code": "yellow"}
|
|
19
|
+
MAX_LINE = 160 # dynamic text (summaries, violations, errors) is clipped
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _clip(text: str, limit: int = MAX_LINE) -> str:
|
|
23
|
+
text = " ".join(str(text).split())
|
|
24
|
+
return text if len(text) <= limit else text[: limit - 1] + "…"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class Console:
|
|
28
|
+
"""Bound to one run's tracer. Reachable as `run.console` everywhere."""
|
|
29
|
+
|
|
30
|
+
def __init__(self, tracer, smidja_id: str):
|
|
31
|
+
self.tracer = tracer
|
|
32
|
+
self.smidja_id = smidja_id
|
|
33
|
+
self.phase_id = "" # current lane — log events attach to it
|
|
34
|
+
self.phase_name = ""
|
|
35
|
+
self.results: list[str] = [] # phase statuses, for the summary
|
|
36
|
+
self._finished = False # the summary panel prints once
|
|
37
|
+
self._out = RichConsole(highlight=False, soft_wrap=True)
|
|
38
|
+
|
|
39
|
+
# ── the one helper: print AND trace, always together ────────────────────
|
|
40
|
+
def _emit(self, markup: str, level: str = "info", renderable=None) -> None:
|
|
41
|
+
text = Text.from_markup(markup)
|
|
42
|
+
self._out.print(renderable if renderable is not None else text)
|
|
43
|
+
self.tracer.event(EventRecord(
|
|
44
|
+
smidja_id=self.smidja_id, phase_id=self.phase_id, type="log",
|
|
45
|
+
name=self.phase_name or "console",
|
|
46
|
+
payload={"message": text.plain, "level": level}))
|
|
47
|
+
|
|
48
|
+
# ── session ─────────────────────────────────────────────────────────────
|
|
49
|
+
def session_started(self, smidja_id: str, engineer: str) -> None:
|
|
50
|
+
self._emit(f"[bold cyan]smidja_id:[/bold cyan] [bold]{escape(smidja_id)}[/bold]"
|
|
51
|
+
f" [dim]engineer[/dim] {escape(engineer)}")
|
|
52
|
+
|
|
53
|
+
def session_finished(self, ok: bool, tokens: int, cost: float, db_path: str) -> None:
|
|
54
|
+
if self._finished:
|
|
55
|
+
return
|
|
56
|
+
self._finished = True
|
|
57
|
+
passed = sum(1 for r in self.results if r == "success")
|
|
58
|
+
status = "[green]✓ success[/green]" if ok else "[red]✗ fail[/red]"
|
|
59
|
+
rows = [f" [dim]status[/dim] {status}",
|
|
60
|
+
f" [dim]phases[/dim] {passed}/{len(self.results)} passed",
|
|
61
|
+
f" [dim]tokens[/dim] {tokens:,}",
|
|
62
|
+
f" [dim]cost[/dim] ${cost:.4f}",
|
|
63
|
+
f" [dim]smidja_id[/dim] {escape(self.smidja_id)}",
|
|
64
|
+
f" [dim]db[/dim] {escape(str(db_path))}",
|
|
65
|
+
f" [dim]next[/dim] [bold]just phases {escape(self.smidja_id)}[/bold]"]
|
|
66
|
+
panel = Panel(Text.from_markup("\n".join(rows)),
|
|
67
|
+
title="[bold]smidja complete[/bold]",
|
|
68
|
+
border_style="green" if ok else "red", expand=False)
|
|
69
|
+
plain = (f"session {self.smidja_id} {'success' if ok else 'fail'} · "
|
|
70
|
+
f"{passed}/{len(self.results)} phases · {tokens:,} tokens · ${cost:.4f}")
|
|
71
|
+
self._emit(escape(plain), level="info" if ok else "error", renderable=panel)
|
|
72
|
+
|
|
73
|
+
# ── phases ──────────────────────────────────────────────────────────────
|
|
74
|
+
def phase_started(self, phase: Phase) -> None:
|
|
75
|
+
self.phase_id, self.phase_name = phase.phase_id, phase.params.name
|
|
76
|
+
p = phase.params
|
|
77
|
+
color = KIND_COLOR.get(p.kind, "white")
|
|
78
|
+
line = (f"[bold {color}]▶ {phase.seq:02d} {escape(p.name)}[/bold {color}]"
|
|
79
|
+
f" [{color}]{p.kind}[/{color}] [dim]· {escape(p.owner)}[/dim]")
|
|
80
|
+
if p.description:
|
|
81
|
+
line += f" [dim]{escape(_clip(p.description))}[/dim]"
|
|
82
|
+
self._emit(line)
|
|
83
|
+
|
|
84
|
+
def phase_ended(self, phase: Phase, seconds: float) -> None:
|
|
85
|
+
ok = phase.status == "success"
|
|
86
|
+
self.results.append(phase.status)
|
|
87
|
+
line = (f" {'[green]✓[/green]' if ok else '[red]✗[/red]'} "
|
|
88
|
+
f"{escape(phase.params.name)} [dim]{seconds:.1f}s[/dim]")
|
|
89
|
+
if not ok and phase.error:
|
|
90
|
+
line += f" [red]{escape(_clip(phase.error))}[/red]"
|
|
91
|
+
self._emit(line, level="info" if ok else "error")
|
|
92
|
+
self.phase_id, self.phase_name = "", ""
|
|
93
|
+
|
|
94
|
+
def note(self, message: str) -> None:
|
|
95
|
+
"""Free-form detail inside the current phase — what `ph.log()` recorded."""
|
|
96
|
+
self._emit(f" [dim]· {escape(_clip(message))}[/dim]")
|
|
97
|
+
|
|
98
|
+
# ── agents ──────────────────────────────────────────────────────────────
|
|
99
|
+
def agent_started(self, name: str, model: str, session_id: str) -> None:
|
|
100
|
+
self._emit(f" [magenta]▸[/magenta] {escape(name)} [dim]{escape(model)}[/dim]"
|
|
101
|
+
f" [dim]session {escape(session_id)}[/dim]")
|
|
102
|
+
|
|
103
|
+
def agent_finished(self, name: str, tokens: int, cost: float) -> None:
|
|
104
|
+
self._emit(f" [dim]└ {escape(name)} used {tokens:,} tokens · ${cost:.4f}[/dim]")
|
|
105
|
+
|
|
106
|
+
def retry(self, name: str, attempt: int, limit: int, reason: str) -> None:
|
|
107
|
+
self._emit(f" [yellow]⟳[/yellow] {escape(name)} retry {attempt}/{limit} "
|
|
108
|
+
f"[dim]— same session · {escape(_clip(reason))}[/dim]", level="warn")
|
|
109
|
+
|
|
110
|
+
# ── verification ────────────────────────────────────────────────────────
|
|
111
|
+
def gate_result(self, name: str, report) -> None:
|
|
112
|
+
"""A gate reports WHAT it checked, not just whether it passed."""
|
|
113
|
+
ok = report.passed
|
|
114
|
+
mark = "[green]✓[/green]" if ok else "[red]✗[/red]"
|
|
115
|
+
summary = (f"{len(report.checks)} checked" if ok
|
|
116
|
+
else f"[red]{len(report.violations)} of {len(report.checks)} failed[/red]")
|
|
117
|
+
self._emit(f" {mark} gate [dim]{escape(name)}[/dim] [dim]{summary}[/dim]",
|
|
118
|
+
level="info" if ok else "error")
|
|
119
|
+
for check in report.checks:
|
|
120
|
+
style = "dim" if check.ok else "dim red"
|
|
121
|
+
detail = f" — {_clip(check.note)}" if check.note else ""
|
|
122
|
+
self._emit(f" [{style}]{'·' if check.ok else '✗'} {escape(_clip(check.item))}"
|
|
123
|
+
f"{escape(detail)}[/{style}]", level="info" if check.ok else "error")
|
|
124
|
+
|
|
125
|
+
def envelope_summary(self, envelope: EnvelopeBase) -> None:
|
|
126
|
+
ok = envelope.status == "success"
|
|
127
|
+
line = (f" {'[green]✓[/green]' if ok else '[red]✗[/red]'} "
|
|
128
|
+
f"{type(envelope).__name__} [dim]{escape(_clip(envelope.summary))}[/dim]")
|
|
129
|
+
self._emit(line, level="info" if ok else "error")
|
|
130
|
+
if envelope.artifacts:
|
|
131
|
+
self._emit(f" [dim]artifacts: {escape(_clip(', '.join(envelope.artifacts)))}[/dim]")
|
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
"""Concrete data types for the smidja smidja system.
|
|
2
|
+
|
|
3
|
+
RULE (four-param rule): any function that takes more than 4 parameters takes
|
|
4
|
+
ONE of these objects instead. AgentCall and PhaseParams are the pattern.
|
|
5
|
+
|
|
6
|
+
Every agent call declares a concrete output type — an EnvelopeBase subclass —
|
|
7
|
+
that its final JSON response is parsed against. No untyped handoffs.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from typing import Any, Callable, Literal, Optional, Type
|
|
13
|
+
|
|
14
|
+
from pydantic import BaseModel, Field, ValidationInfo, field_validator
|
|
15
|
+
|
|
16
|
+
PhaseKind = Literal["engineer", "agent", "code"]
|
|
17
|
+
PhaseStatus = Literal["queued", "running", "success", "fail"]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# ── Phases ────────────────────────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
class PhaseParams(BaseModel):
|
|
23
|
+
"""Everything run.phase() needs. Passed as one object, never loose params."""
|
|
24
|
+
|
|
25
|
+
name: str # short id, unique within the run: "plan", "build"
|
|
26
|
+
kind: PhaseKind # which lane the block renders in
|
|
27
|
+
owner: str # engineer's name, "git", or an agent name from config
|
|
28
|
+
description: str # REQUIRED: what this phase does and why — see below
|
|
29
|
+
retries: int = 0 # agent phases: gate-failure retries via continue
|
|
30
|
+
|
|
31
|
+
@field_validator("description")
|
|
32
|
+
@classmethod
|
|
33
|
+
def _description_must_be_earned(cls, value: str, info: ValidationInfo) -> str:
|
|
34
|
+
"""A phase name identifies; a description explains. Both are required.
|
|
35
|
+
|
|
36
|
+
The description is the only sentence the trace, the console, and the
|
|
37
|
+
phase block in the UI ever show about intent — everything else is ids,
|
|
38
|
+
statuses, and timings. `commit_plan: "Commit the plan"` tells a reader
|
|
39
|
+
nothing they could not already see, so an echo is rejected the same way
|
|
40
|
+
a blank one is. This is a construction-time error on purpose: it fires
|
|
41
|
+
before the phase opens, not after a run is already in the trace.
|
|
42
|
+
"""
|
|
43
|
+
text = " ".join(value.split())
|
|
44
|
+
name = str(info.data.get("name", "?"))
|
|
45
|
+
if not text:
|
|
46
|
+
raise ValueError(
|
|
47
|
+
f"phase {name!r}: description is required — one sentence on what this "
|
|
48
|
+
f"phase does and why. It is what the trace and the UI show.")
|
|
49
|
+
if text.rstrip(".").casefold() == name.replace("_", " ").casefold():
|
|
50
|
+
raise ValueError(
|
|
51
|
+
f"phase {name!r}: description {text!r} only restates the phase name — "
|
|
52
|
+
f"say what it does and why instead.")
|
|
53
|
+
return text
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class Phase(BaseModel):
|
|
57
|
+
"""The persisted phase record — PhaseParams plus lifecycle."""
|
|
58
|
+
|
|
59
|
+
phase_id: str
|
|
60
|
+
smidja_id: str
|
|
61
|
+
seq: int
|
|
62
|
+
params: PhaseParams
|
|
63
|
+
status: PhaseStatus = "fail" # success must be earned
|
|
64
|
+
attempt: int = 0
|
|
65
|
+
error: Optional[str] = None
|
|
66
|
+
started_at: Optional[str] = None
|
|
67
|
+
ended_at: Optional[str] = None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# ── Envelopes (agent output types) ───────────────────────────────────────────
|
|
71
|
+
|
|
72
|
+
class EnvelopeBase(BaseModel):
|
|
73
|
+
"""Base of every agent's final JSON response. Output types extend this."""
|
|
74
|
+
|
|
75
|
+
status: Literal["success", "fail"]
|
|
76
|
+
summary: str = ""
|
|
77
|
+
artifacts: list[str] = Field(default_factory=list)
|
|
78
|
+
notes_for_next_agent: str = ""
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class GenericOutput(EnvelopeBase):
|
|
82
|
+
pass
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class PlanOutput(EnvelopeBase):
|
|
86
|
+
# Subject for committing the PLAN — the spec file the planner wrote, not the
|
|
87
|
+
# implementation it describes. Each agent's commit_message covers its own
|
|
88
|
+
# work product, so a chain that commits per step never reuses one agent's
|
|
89
|
+
# words for another agent's diff.
|
|
90
|
+
commit_message: str = ""
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class BuildOutput(EnvelopeBase):
|
|
94
|
+
changed_files: list[str] = Field(default_factory=list)
|
|
95
|
+
commit_message: str = "" # consumed by the git commit phase
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class ScoutFinding(BaseModel):
|
|
99
|
+
file: str
|
|
100
|
+
note: str = ""
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class ScoutOutput(EnvelopeBase):
|
|
104
|
+
findings: list[ScoutFinding] = Field(default_factory=list)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class ReviewFinding(BaseModel):
|
|
108
|
+
"""One thing the request (or plan) asked for, and whether it is there."""
|
|
109
|
+
|
|
110
|
+
requirement: str # the ask, in the requester's words
|
|
111
|
+
met: bool
|
|
112
|
+
evidence: str = "" # where it lives, or what is missing
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class ReviewOutput(EnvelopeBase):
|
|
116
|
+
"""Confirmation that what was built is what was asked for — not a test run."""
|
|
117
|
+
|
|
118
|
+
approved: bool = False
|
|
119
|
+
findings: list[ReviewFinding] = Field(default_factory=list)
|
|
120
|
+
blocking: list[str] = Field(default_factory=list) # what must change before approval
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class DocumentOutput(EnvelopeBase):
|
|
124
|
+
"""Where the write-up of a completed change landed."""
|
|
125
|
+
|
|
126
|
+
document_path: str = "" # the doc in the repo, e.g. app_docs/<smidja_id>_<slug>.md
|
|
127
|
+
documented_files: list[str] = Field(default_factory=list)
|
|
128
|
+
commit_message: str = ""
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# ── Deterministic quality blocks ─────────────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
QualityArea = Literal["frontend", "backend"]
|
|
134
|
+
QualityOperation = Literal["lint", "typecheck", "build"]
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class QualityCheckSpec(BaseModel):
|
|
138
|
+
"""One deterministic quality command."""
|
|
139
|
+
|
|
140
|
+
name: str
|
|
141
|
+
area: QualityArea
|
|
142
|
+
operation: QualityOperation
|
|
143
|
+
argv: list[str]
|
|
144
|
+
timeout_seconds: int = 120
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class QualityCheckResult(BaseModel):
|
|
148
|
+
"""Captured evidence from one quality command."""
|
|
149
|
+
|
|
150
|
+
name: str
|
|
151
|
+
area: QualityArea
|
|
152
|
+
operation: QualityOperation
|
|
153
|
+
command: str
|
|
154
|
+
returncode: int
|
|
155
|
+
passed: bool
|
|
156
|
+
duration_seconds: float
|
|
157
|
+
output_artifact: str
|
|
158
|
+
# The tail of stdout+stderr, verbatim and unparsed. A failure has to travel
|
|
159
|
+
# back to the builder as an envelope, and the builder cannot open a log file
|
|
160
|
+
# it was never handed — so the evidence rides along. Deliberately raw: every
|
|
161
|
+
# runner formats failures differently and a generic parser would be
|
|
162
|
+
# confidently wrong. The full log is always at output_artifact.
|
|
163
|
+
output_tail: str = ""
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class QualityResult(BaseModel):
|
|
167
|
+
"""Aggregate result from a quality block: every check it ran, and the verdict."""
|
|
168
|
+
|
|
169
|
+
passed: bool
|
|
170
|
+
checks: list[QualityCheckResult] = Field(default_factory=list)
|
|
171
|
+
failures: list[str] = Field(default_factory=list)
|
|
172
|
+
artifacts: list[str] = Field(default_factory=list)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
# ── Change capture (git diff, deterministic) ─────────────────────────────────
|
|
176
|
+
|
|
177
|
+
class ChangeCapture(BaseModel):
|
|
178
|
+
"""Everything documentation.capture() needs. One object, never loose params."""
|
|
179
|
+
|
|
180
|
+
base: str = "main" # the ref the work is measured against
|
|
181
|
+
max_diff_lines: int = 2000 # the diff artifact is truncated past this
|
|
182
|
+
include_untracked: bool = True # a brand-new file is part of the change
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class BaseRef(BaseModel):
|
|
186
|
+
"""The commit a change is measured from, and why that one.
|
|
187
|
+
|
|
188
|
+
`reason` is the line the trace shows. A diff is only as trustworthy as the
|
|
189
|
+
thing it was taken against, so the smidja records that choice instead of
|
|
190
|
+
leaving the reader to infer it.
|
|
191
|
+
"""
|
|
192
|
+
|
|
193
|
+
ref: str # what was asked for: "main", or a pinned sha
|
|
194
|
+
commit: str # the commit actually diffed against
|
|
195
|
+
reason: str = ""
|
|
196
|
+
|
|
197
|
+
@property
|
|
198
|
+
def label(self) -> str:
|
|
199
|
+
"""Display form — a named ref as itself, a pinned raw sha shortened."""
|
|
200
|
+
if len(self.ref) == 40 and all(c in "0123456789abcdef" for c in self.ref):
|
|
201
|
+
return self.ref[:7]
|
|
202
|
+
return self.ref
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
class ChangeSet(BaseModel):
|
|
206
|
+
"""What changed since the base commit — pure git facts, no judgement."""
|
|
207
|
+
|
|
208
|
+
base: BaseRef
|
|
209
|
+
files: list[str] = Field(default_factory=list)
|
|
210
|
+
untracked: list[str] = Field(default_factory=list)
|
|
211
|
+
insertions: int = 0
|
|
212
|
+
deletions: int = 0
|
|
213
|
+
stat: str = "" # `git diff --stat` output, verbatim
|
|
214
|
+
diff_path: str = "" # the full diff, written into context_handoff/
|
|
215
|
+
truncated: bool = False
|
|
216
|
+
|
|
217
|
+
@property
|
|
218
|
+
def empty(self) -> bool:
|
|
219
|
+
return not (self.files or self.untracked)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
class ChangesOutput(EnvelopeBase):
|
|
223
|
+
"""A ChangeSet shaped as an envelope so an agent can be handed it directly.
|
|
224
|
+
|
|
225
|
+
Same adapter idea as VerifyOutput: code computes the diff, the documenter
|
|
226
|
+
consumes it through the one door every agent handoff uses.
|
|
227
|
+
"""
|
|
228
|
+
|
|
229
|
+
base: str = "" # "<ref> @ <commit> — <reason>"
|
|
230
|
+
changed_files: list[str] = Field(default_factory=list)
|
|
231
|
+
insertions: int = 0
|
|
232
|
+
deletions: int = 0
|
|
233
|
+
stat: str = ""
|
|
234
|
+
diff_path: str = "" # read this for the full diff
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
class VerifyOutput(EnvelopeBase):
|
|
238
|
+
"""A deterministic result, shaped as an envelope so an agent can consume it.
|
|
239
|
+
|
|
240
|
+
Agents hand each other typed envelopes; code blocks return QualityResult.
|
|
241
|
+
This is the adapter, so a failing lint or test run flows back into the
|
|
242
|
+
builder through exactly the same door a tester agent's report used to —
|
|
243
|
+
the smidja script is the only thing that knows the difference.
|
|
244
|
+
"""
|
|
245
|
+
|
|
246
|
+
passed: bool = False
|
|
247
|
+
failures: list[str] = Field(default_factory=list)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
# ── Agent calls ──────────────────────────────────────────────────────────────
|
|
251
|
+
|
|
252
|
+
class GateCheck(BaseModel):
|
|
253
|
+
"""One thing a gate looked at, and what it found.
|
|
254
|
+
|
|
255
|
+
`note` is the evidence — "exists, 2.1KB", "exit 0", "not in the diff". On a
|
|
256
|
+
failed check it doubles as the reason, so it is what the agent is told.
|
|
257
|
+
"""
|
|
258
|
+
|
|
259
|
+
item: str # what was checked: a path, a command, a test
|
|
260
|
+
ok: bool
|
|
261
|
+
note: str = ""
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
class GateReport(BaseModel):
|
|
265
|
+
"""What every gate returns: the checks it ran. Violations are derived.
|
|
266
|
+
|
|
267
|
+
Authoring stays a one-liner per item — `report.check(...)` appends and
|
|
268
|
+
returns self, so a gate is a loop and a return.
|
|
269
|
+
"""
|
|
270
|
+
|
|
271
|
+
checks: list[GateCheck] = Field(default_factory=list)
|
|
272
|
+
|
|
273
|
+
def check(self, item: str, ok: bool, note: str = "") -> "GateReport":
|
|
274
|
+
self.checks.append(GateCheck(item=item, ok=ok, note=note))
|
|
275
|
+
return self
|
|
276
|
+
|
|
277
|
+
@property
|
|
278
|
+
def violations(self) -> list[str]:
|
|
279
|
+
return [f"{c.item}: {c.note or 'failed'}" for c in self.checks if not c.ok]
|
|
280
|
+
|
|
281
|
+
@property
|
|
282
|
+
def passed(self) -> bool:
|
|
283
|
+
return not self.violations
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
class AgentCall(BaseModel):
|
|
287
|
+
"""One agent invocation: prompt in, typed envelope out, gates verified."""
|
|
288
|
+
|
|
289
|
+
model_config = {"arbitrary_types_allowed": True}
|
|
290
|
+
|
|
291
|
+
output_type: Type[EnvelopeBase]
|
|
292
|
+
prompt: str
|
|
293
|
+
previous: Optional[EnvelopeBase] = None
|
|
294
|
+
gates: list[Callable] = Field(default_factory=list) # gate(envelope, run) -> list[str]
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
# ── Config ───────────────────────────────────────────────────────────────────
|
|
298
|
+
|
|
299
|
+
class PromptEngineering(BaseModel):
|
|
300
|
+
system: str # path to system.md
|
|
301
|
+
user: str # path to user.md
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
class AgentConfig(BaseModel):
|
|
305
|
+
name: str
|
|
306
|
+
coding_agent: Literal["pi", "claude_code"] = "pi"
|
|
307
|
+
model: str = "google/gemini-3.6-flash"
|
|
308
|
+
thinking: str = "medium" # off | minimal | low | medium | high | xhigh | max
|
|
309
|
+
color: str = "" # hex swatch for this agent's lane in the UI
|
|
310
|
+
purpose: str = ""
|
|
311
|
+
prompt_engineering: PromptEngineering
|
|
312
|
+
harness_engineering: list[str] = Field(default_factory=list)
|
|
313
|
+
tools: Optional[list[str]] = None # allowlist; None = all tools usable
|
|
314
|
+
# What this agent may MODIFY in the repo, enforced in code after every call
|
|
315
|
+
# (see smidja_modules/permissions.py). `tools` cannot express this: `bash` runs
|
|
316
|
+
# anything and `write` reaches any path, so an agent's capability list is a
|
|
317
|
+
# statement of intent that nothing checks.
|
|
318
|
+
# None -> unrestricted, except the roster-wide `protected_files` paths
|
|
319
|
+
# [] -> read-only: may modify nothing tracked
|
|
320
|
+
# [...] -> only these. A trailing "/" means a directory prefix; a "*"
|
|
321
|
+
# makes it a glob; anything else is an exact path.
|
|
322
|
+
writes: Optional[list[str]] = None
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
class ConfigDefaults(BaseModel):
|
|
326
|
+
coding_agent: Literal["pi", "claude_code"] = "pi"
|
|
327
|
+
model: str = "google/gemini-3.6-flash"
|
|
328
|
+
thinking: str = "medium"
|
|
329
|
+
color: str = ""
|
|
330
|
+
harness_engineering: list[str] = Field(default_factory=list)
|
|
331
|
+
tools: Optional[list[str]] = None # roster-wide allowlist; None = all tools usable
|
|
332
|
+
# Off-limits to every agent that has not named them in its own `writes`.
|
|
333
|
+
# The smidja's own code is the default: an agent must not be able to edit
|
|
334
|
+
# the machinery that decides whether its work passed.
|
|
335
|
+
protected_files: list[str] = Field(default_factory=lambda: [
|
|
336
|
+
"smidja/smidja_modules/", "smidja/smidja_smidja_config/", "smidja/smidja_*.py",
|
|
337
|
+
])
|
|
338
|
+
data_dir: str = "smidja/smidja_data"
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
class ObservabilityConfig(BaseModel):
|
|
342
|
+
db: str = "smidja/smidja_data/smidja.db"
|
|
343
|
+
poll_ms: int = 500
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
class smidjaConfig(BaseModel):
|
|
347
|
+
defaults: ConfigDefaults = Field(default_factory=ConfigDefaults)
|
|
348
|
+
observability: ObservabilityConfig = Field(default_factory=ObservabilityConfig)
|
|
349
|
+
agents: list[AgentConfig] = Field(default_factory=list)
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
# ── Tracing ──────────────────────────────────────────────────────────────────
|
|
353
|
+
|
|
354
|
+
class EventRecord(BaseModel):
|
|
355
|
+
"""One traced event, always logged against smidja_id + phase."""
|
|
356
|
+
|
|
357
|
+
smidja_id: str
|
|
358
|
+
phase_id: str = ""
|
|
359
|
+
type: str # phase_start | agent_start | tool_call | handoff | gate_pass | gate_fail | log | agent_end | phase_end | error
|
|
360
|
+
name: str = ""
|
|
361
|
+
payload: dict[str, Any] = Field(default_factory=dict)
|
|
362
|
+
parent_id: str = ""
|
|
363
|
+
tokens: Optional[int] = None
|
|
364
|
+
# Spans: set both when an event covers real elapsed time (a tool call), so
|
|
365
|
+
# the UI lays it out on a time axis without parsing payload JSON. Left unset,
|
|
366
|
+
# the tracer stamps started_at with the moment the event was recorded.
|
|
367
|
+
started_at: Optional[str] = None
|
|
368
|
+
ended_at: Optional[str] = None
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
# ── Pi coding agent interface ────────────────────────────────────────────────
|
|
372
|
+
|
|
373
|
+
class PiRequest(BaseModel):
|
|
374
|
+
"""Everything one non-interactive pi run needs."""
|
|
375
|
+
|
|
376
|
+
prompt: str
|
|
377
|
+
system_prompt: str
|
|
378
|
+
model: str # registry pattern, resolved to provider + id
|
|
379
|
+
thinking: str = "medium"
|
|
380
|
+
session_id: str # pi --session-id: creates or continues
|
|
381
|
+
session_dir: str
|
|
382
|
+
raw_output_path: str # JSONL stream lands here
|
|
383
|
+
tools: Optional[list[str]] = None
|
|
384
|
+
extensions: list[str] = Field(default_factory=list)
|
|
385
|
+
cwd: str = "." # set from run.repo_root — the codebase root agents work in
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
class UsageBreakdown(BaseModel):
|
|
389
|
+
"""Tokens and the dollars they cost, per component, summed over a call.
|
|
390
|
+
|
|
391
|
+
Mirrors pi's `usage` shape one-for-one so the numbers reconcile with what
|
|
392
|
+
pi itself reports: `input` EXCLUDES cache reads, which bill at their own
|
|
393
|
+
(cheaper) rate — add them to learn the size of the prompt that was sent.
|
|
394
|
+
"""
|
|
395
|
+
input_tokens: int = 0
|
|
396
|
+
output_tokens: int = 0
|
|
397
|
+
cache_read_tokens: int = 0
|
|
398
|
+
cache_write_tokens: int = 0
|
|
399
|
+
# Thinking tokens. NOT a fifth component: measured across every session on
|
|
400
|
+
# disk, reasoning is always <= output and the four components above always
|
|
401
|
+
# sum to totalTokens, so reasoning is the thinking SHARE of output, billed
|
|
402
|
+
# at the output rate. Report it nested under output, never added to it.
|
|
403
|
+
reasoning_tokens: int = 0
|
|
404
|
+
total_tokens: int = 0
|
|
405
|
+
input_cost: float = 0.0
|
|
406
|
+
output_cost: float = 0.0
|
|
407
|
+
cache_read_cost: float = 0.0
|
|
408
|
+
cache_write_cost: float = 0.0
|
|
409
|
+
total_cost: float = 0.0
|
|
410
|
+
|
|
411
|
+
def add_turn(self, usage: dict, total_tokens: int) -> None:
|
|
412
|
+
"""Fold in one pi `message_end` usage object.
|
|
413
|
+
|
|
414
|
+
`total_tokens` is passed in rather than re-derived: the caller already
|
|
415
|
+
computes it pi's way (totalTokens, else the sum of the parts).
|
|
416
|
+
"""
|
|
417
|
+
cost = usage.get("cost") or {}
|
|
418
|
+
self.input_tokens += usage.get("input") or 0
|
|
419
|
+
self.output_tokens += usage.get("output") or 0
|
|
420
|
+
self.cache_read_tokens += usage.get("cacheRead") or 0
|
|
421
|
+
self.cache_write_tokens += usage.get("cacheWrite") or 0
|
|
422
|
+
self.reasoning_tokens += usage.get("reasoning") or 0
|
|
423
|
+
self.total_tokens += total_tokens
|
|
424
|
+
self.input_cost += cost.get("input") or 0.0
|
|
425
|
+
self.output_cost += cost.get("output") or 0.0
|
|
426
|
+
self.cache_read_cost += cost.get("cacheRead") or 0.0
|
|
427
|
+
self.cache_write_cost += cost.get("cacheWrite") or 0.0
|
|
428
|
+
self.total_cost += cost.get("total") or 0.0
|
|
429
|
+
|
|
430
|
+
def merge(self, other: "UsageBreakdown") -> None:
|
|
431
|
+
"""Add another call's usage — a phase that retries spends more than once."""
|
|
432
|
+
for field in self.model_fields:
|
|
433
|
+
setattr(self, field, getattr(self, field) + getattr(other, field))
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
class PiResult(BaseModel):
|
|
437
|
+
text: str = ""
|
|
438
|
+
returncode: int = 0
|
|
439
|
+
session_id: str = ""
|
|
440
|
+
tokens: int = 0
|
|
441
|
+
cost: float = 0.0
|
|
442
|
+
usage: UsageBreakdown = Field(default_factory=UsageBreakdown)
|
|
443
|
+
# Context occupancy after the LAST turn — not a sum. `tokens` bills every
|
|
444
|
+
# turn; this is how full the window is right now, which is what the
|
|
445
|
+
# visualizer's context bar measures against `context_window`.
|
|
446
|
+
context_tokens: int = 0
|
|
447
|
+
context_window: int = 0 # 0 when the registry declares no ceiling
|