@zerwiz/ymir 0.1.34 → 0.1.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (929) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/apps/README.md +4 -0
  3. package/apps/hlidskjalf/README.md +68 -0
  4. package/apps/hlidskjalf/android/app/build.gradle +73 -0
  5. package/apps/hlidskjalf/android/app/capacitor.build.gradle +19 -0
  6. package/apps/hlidskjalf/android/app/proguard-rules.pro +21 -0
  7. package/apps/hlidskjalf/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +26 -0
  8. package/apps/hlidskjalf/android/app/src/main/AndroidManifest.xml +41 -0
  9. package/apps/hlidskjalf/android/app/src/main/java/org/zerwiz/ymir/MainActivity.java +5 -0
  10. package/apps/hlidskjalf/android/app/src/main/res/drawable/ic_launcher_background.xml +170 -0
  11. package/apps/hlidskjalf/android/app/src/main/res/drawable/splash.png +0 -0
  12. package/apps/hlidskjalf/android/app/src/main/res/drawable-land-hdpi/splash.png +0 -0
  13. package/apps/hlidskjalf/android/app/src/main/res/drawable-land-mdpi/splash.png +0 -0
  14. package/apps/hlidskjalf/android/app/src/main/res/drawable-land-xhdpi/splash.png +0 -0
  15. package/apps/hlidskjalf/android/app/src/main/res/drawable-land-xxhdpi/splash.png +0 -0
  16. package/apps/hlidskjalf/android/app/src/main/res/drawable-land-xxxhdpi/splash.png +0 -0
  17. package/apps/hlidskjalf/android/app/src/main/res/drawable-port-hdpi/splash.png +0 -0
  18. package/apps/hlidskjalf/android/app/src/main/res/drawable-port-mdpi/splash.png +0 -0
  19. package/apps/hlidskjalf/android/app/src/main/res/drawable-port-xhdpi/splash.png +0 -0
  20. package/apps/hlidskjalf/android/app/src/main/res/drawable-port-xxhdpi/splash.png +0 -0
  21. package/apps/hlidskjalf/android/app/src/main/res/drawable-port-xxxhdpi/splash.png +0 -0
  22. package/apps/hlidskjalf/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +34 -0
  23. package/apps/hlidskjalf/android/app/src/main/res/layout/activity_main.xml +12 -0
  24. package/apps/hlidskjalf/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
  25. package/apps/hlidskjalf/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
  26. package/apps/hlidskjalf/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  27. package/apps/hlidskjalf/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png +0 -0
  28. package/apps/hlidskjalf/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  29. package/apps/hlidskjalf/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  30. package/apps/hlidskjalf/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png +0 -0
  31. package/apps/hlidskjalf/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  32. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  33. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
  34. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  35. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  36. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
  37. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  38. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  39. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
  40. package/apps/hlidskjalf/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  41. package/apps/hlidskjalf/android/app/src/main/res/values/ic_launcher_background.xml +4 -0
  42. package/apps/hlidskjalf/android/app/src/main/res/values/strings.xml +7 -0
  43. package/apps/hlidskjalf/android/app/src/main/res/values/styles.xml +22 -0
  44. package/apps/hlidskjalf/android/app/src/main/res/xml/file_paths.xml +5 -0
  45. package/apps/hlidskjalf/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +18 -0
  46. package/apps/hlidskjalf/android/build.gradle +29 -0
  47. package/apps/hlidskjalf/android/capacitor.settings.gradle +3 -0
  48. package/apps/hlidskjalf/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  49. package/apps/hlidskjalf/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  50. package/apps/hlidskjalf/android/gradle.properties +22 -0
  51. package/apps/hlidskjalf/android/gradlew +248 -0
  52. package/apps/hlidskjalf/android/gradlew.bat +92 -0
  53. package/apps/hlidskjalf/android/settings.gradle +5 -0
  54. package/apps/hlidskjalf/android/variables.gradle +16 -0
  55. package/apps/hlidskjalf/capacitor.config.ts +26 -0
  56. package/apps/hlidskjalf/dist/apple-touch-icon.png +0 -0
  57. package/apps/hlidskjalf/dist/assets/index-BWmNIyaG.css +1 -0
  58. package/apps/hlidskjalf/dist/assets/index-k7QEfNto.js +88 -0
  59. package/apps/hlidskjalf/dist/assets/index-k7QEfNto.js.map +1 -0
  60. package/apps/hlidskjalf/dist/icon.svg +7 -0
  61. package/apps/hlidskjalf/dist/index.html +64 -0
  62. package/apps/hlidskjalf/dist/manifest.webmanifest +31 -0
  63. package/apps/hlidskjalf/dist/og.jpg +0 -0
  64. package/apps/hlidskjalf/dist/og.png +0 -0
  65. package/apps/hlidskjalf/dist/og.svg +64 -0
  66. package/apps/hlidskjalf/dist/sw.js +39 -0
  67. package/apps/hlidskjalf/dist/ymir-icon.png +0 -0
  68. package/apps/hlidskjalf/dist/ymir-mark.svg +62 -0
  69. package/apps/hlidskjalf/electron/icon.png +0 -0
  70. package/apps/hlidskjalf/electron/main.cjs +236 -0
  71. package/apps/hlidskjalf/electron/preload.cjs +8 -0
  72. package/apps/hlidskjalf/electron/smidja-icon.png +0 -0
  73. package/apps/hlidskjalf/electron/ymir-hlidskjalf.desktop.in +12 -0
  74. package/apps/hlidskjalf/electron/ymir-smidja.desktop.in +12 -0
  75. package/apps/hlidskjalf/index.html +63 -0
  76. package/apps/hlidskjalf/package-lock.json +5398 -0
  77. package/apps/hlidskjalf/package.json +55 -0
  78. package/apps/hlidskjalf/public/apple-touch-icon.png +0 -0
  79. package/apps/hlidskjalf/public/icon.svg +7 -0
  80. package/apps/hlidskjalf/public/manifest.webmanifest +31 -0
  81. package/apps/hlidskjalf/public/og.jpg +0 -0
  82. package/apps/hlidskjalf/public/og.png +0 -0
  83. package/apps/hlidskjalf/public/og.svg +64 -0
  84. package/apps/hlidskjalf/public/sw.js +39 -0
  85. package/apps/hlidskjalf/public/ymir-icon.png +0 -0
  86. package/apps/hlidskjalf/public/ymir-mark.svg +62 -0
  87. package/apps/hlidskjalf/server/accounts.ts +159 -0
  88. package/apps/hlidskjalf/server/index.ts +2045 -0
  89. package/apps/hlidskjalf/src/app/App.tsx +116 -0
  90. package/apps/hlidskjalf/src/app/BottomStream.tsx +128 -0
  91. package/apps/hlidskjalf/src/app/MobileNav.tsx +87 -0
  92. package/apps/hlidskjalf/src/app/Rail.tsx +106 -0
  93. package/apps/hlidskjalf/src/app/Shell.tsx +135 -0
  94. package/apps/hlidskjalf/src/app/Topbar.tsx +130 -0
  95. package/apps/hlidskjalf/src/components/AccentPicker.tsx +207 -0
  96. package/apps/hlidskjalf/src/components/AccountMenu.tsx +115 -0
  97. package/apps/hlidskjalf/src/components/AgentCard.tsx +75 -0
  98. package/apps/hlidskjalf/src/components/EmberBackground.tsx +36 -0
  99. package/apps/hlidskjalf/src/components/Emblem.tsx +48 -0
  100. package/apps/hlidskjalf/src/components/Halls.tsx +155 -0
  101. package/apps/hlidskjalf/src/components/LoginModal.tsx +329 -0
  102. package/apps/hlidskjalf/src/components/Markdown.tsx +10 -0
  103. package/apps/hlidskjalf/src/components/MetricTile.tsx +40 -0
  104. package/apps/hlidskjalf/src/components/ModelPicker.tsx +100 -0
  105. package/apps/hlidskjalf/src/components/Overlay.tsx +134 -0
  106. package/apps/hlidskjalf/src/components/PRCard.tsx +154 -0
  107. package/apps/hlidskjalf/src/components/RecallPanel.tsx +116 -0
  108. package/apps/hlidskjalf/src/components/RuneTag.tsx +23 -0
  109. package/apps/hlidskjalf/src/components/Status.tsx +35 -0
  110. package/apps/hlidskjalf/src/components/TaskChip.tsx +23 -0
  111. package/apps/hlidskjalf/src/components/TraceRow.tsx +28 -0
  112. package/apps/hlidskjalf/src/data/lore.ts +127 -0
  113. package/apps/hlidskjalf/src/data/metadata.ts +147 -0
  114. package/apps/hlidskjalf/src/data/mythology.ts +95 -0
  115. package/apps/hlidskjalf/src/data/realms.ts +167 -0
  116. package/apps/hlidskjalf/src/gates/Cron.tsx +77 -0
  117. package/apps/hlidskjalf/src/gates/Decisions.tsx +67 -0
  118. package/apps/hlidskjalf/src/gates/Files.tsx +138 -0
  119. package/apps/hlidskjalf/src/gates/Fleet.tsx +184 -0
  120. package/apps/hlidskjalf/src/gates/Forge.tsx +486 -0
  121. package/apps/hlidskjalf/src/gates/OmniChat.tsx +217 -0
  122. package/apps/hlidskjalf/src/gates/Processes.tsx +162 -0
  123. package/apps/hlidskjalf/src/gates/Profile.tsx +225 -0
  124. package/apps/hlidskjalf/src/gates/Reviews.tsx +33 -0
  125. package/apps/hlidskjalf/src/gates/Runes.tsx +116 -0
  126. package/apps/hlidskjalf/src/gates/Runtime.tsx +106 -0
  127. package/apps/hlidskjalf/src/gates/Sessions.tsx +109 -0
  128. package/apps/hlidskjalf/src/gates/Stats.tsx +268 -0
  129. package/apps/hlidskjalf/src/gates/Tasks.tsx +173 -0
  130. package/apps/hlidskjalf/src/gates/Trace.tsx +155 -0
  131. package/apps/hlidskjalf/src/gates/Well.tsx +154 -0
  132. package/apps/hlidskjalf/src/gates/Worktrees.tsx +48 -0
  133. package/apps/hlidskjalf/src/hooks/useTenantDef.ts +13 -0
  134. package/apps/hlidskjalf/src/main.tsx +31 -0
  135. package/apps/hlidskjalf/src/services/api.ts +404 -0
  136. package/apps/hlidskjalf/src/services/auth.ts +107 -0
  137. package/apps/hlidskjalf/src/services/stream.ts +35 -0
  138. package/apps/hlidskjalf/src/state/store.ts +648 -0
  139. package/apps/hlidskjalf/src/state/ui.ts +62 -0
  140. package/apps/hlidskjalf/src/styles/auth.css +485 -0
  141. package/apps/hlidskjalf/src/styles/components.css +1259 -0
  142. package/apps/hlidskjalf/src/styles/forge.css +115 -0
  143. package/apps/hlidskjalf/src/styles/global.css +167 -0
  144. package/apps/hlidskjalf/src/styles/menus.css +175 -0
  145. package/apps/hlidskjalf/src/styles/mobile.css +298 -0
  146. package/apps/hlidskjalf/src/styles/overlays.css +205 -0
  147. package/apps/hlidskjalf/src/styles/shell.css +641 -0
  148. package/apps/hlidskjalf/src/types.ts +251 -0
  149. package/apps/hlidskjalf/src/vite-env.d.ts +9 -0
  150. package/apps/hlidskjalf/static/landing.md +6 -0
  151. package/apps/hlidskjalf/tsconfig.json +25 -0
  152. package/apps/hlidskjalf/vite.config.ts +49 -0
  153. package/apps/hlidskjalf-mobile/App.tsx +93 -0
  154. package/apps/hlidskjalf-mobile/app.json +13 -0
  155. package/apps/hlidskjalf-mobile/index.ts +4 -0
  156. package/apps/hlidskjalf-mobile/package.json +35 -0
  157. package/apps/hlidskjalf-mobile/public/icon.svg +7 -0
  158. package/apps/hlidskjalf-mobile/tsconfig.json +4 -0
  159. package/apps/odrerir/.astro/content.d.ts +159 -0
  160. package/apps/odrerir/.astro/dev.json +24 -0
  161. package/apps/odrerir/.astro/settings.json +5 -0
  162. package/apps/odrerir/.astro/types.d.ts +2 -0
  163. package/apps/odrerir/astro.config.mjs +79 -0
  164. package/apps/odrerir/dist/apple-touch-icon.png +0 -0
  165. package/apps/odrerir/dist/favicon-192.png +0 -0
  166. package/apps/odrerir/dist/favicon-32.png +0 -0
  167. package/apps/odrerir/dist/favicon-512.png +0 -0
  168. package/apps/odrerir/dist/favicon.svg +53 -0
  169. package/apps/odrerir/dist/icon.svg +7 -0
  170. package/apps/odrerir/dist/index.html +837 -0
  171. package/apps/odrerir/dist/og-square.png +0 -0
  172. package/apps/odrerir/dist/og-story.png +0 -0
  173. package/apps/odrerir/dist/og.png +0 -0
  174. package/apps/odrerir/dist/safari-pinned-tab.svg +7 -0
  175. package/apps/odrerir/dist/site.webmanifest +16 -0
  176. package/apps/odrerir/dist/styles/cloth.css +112 -0
  177. package/apps/odrerir/dist/styles/livehall.css +278 -0
  178. package/apps/odrerir/electron/icon.png +0 -0
  179. package/apps/odrerir/electron/main.cjs +183 -0
  180. package/apps/odrerir/electron/ymir-odrerir.desktop.in +12 -0
  181. package/apps/odrerir/package-lock.json +4195 -0
  182. package/apps/odrerir/package.json +30 -0
  183. package/apps/odrerir/public/apple-touch-icon.png +0 -0
  184. package/apps/odrerir/public/favicon-192.png +0 -0
  185. package/apps/odrerir/public/favicon-32.png +0 -0
  186. package/apps/odrerir/public/favicon-512.png +0 -0
  187. package/apps/odrerir/public/favicon.svg +53 -0
  188. package/apps/odrerir/public/icon.svg +7 -0
  189. package/apps/odrerir/public/og-square.png +0 -0
  190. package/apps/odrerir/public/og-story.png +0 -0
  191. package/apps/odrerir/public/og.png +0 -0
  192. package/apps/odrerir/public/safari-pinned-tab.svg +7 -0
  193. package/apps/odrerir/public/site.webmanifest +16 -0
  194. package/apps/odrerir/scripts/extract-cloth.mjs +101 -0
  195. package/apps/odrerir/src/index.html +837 -0
  196. package/apps/odrerir/src/styles/cloth.css +112 -0
  197. package/apps/odrerir/src/styles/livehall.css +278 -0
  198. package/apps/sessrumnir/.github/ISSUE_TEMPLATE/bug_report.yml +99 -0
  199. package/apps/sessrumnir/.github/ISSUE_TEMPLATE/config.yml +8 -0
  200. package/apps/sessrumnir/.github/ISSUE_TEMPLATE/feature_request.yml +46 -0
  201. package/apps/sessrumnir/.github/PULL_REQUEST_TEMPLATE.md +56 -0
  202. package/apps/sessrumnir/.github/SUPPORT.md +18 -0
  203. package/apps/sessrumnir/.github/workflows/build.yml +133 -0
  204. package/apps/sessrumnir/AGENTS.md +540 -0
  205. package/apps/sessrumnir/CLA.md +63 -0
  206. package/apps/sessrumnir/CONTRIBUTING.md +233 -0
  207. package/apps/sessrumnir/LICENSE +200 -0
  208. package/apps/sessrumnir/NOTICE +33 -0
  209. package/apps/sessrumnir/README.md +329 -0
  210. package/apps/sessrumnir/bin/sessrumnir-web.sh +117 -0
  211. package/apps/sessrumnir/bin/sessrumnir.js +169 -0
  212. package/apps/sessrumnir/docs/CNAME +1 -0
  213. package/apps/sessrumnir/docs/favicon.ico +0 -0
  214. package/apps/sessrumnir/docs/icon-512.png +0 -0
  215. package/apps/sessrumnir/docs/index.html +441 -0
  216. package/apps/sessrumnir/docs/robots.txt +4 -0
  217. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_181929.png +0 -0
  218. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182005.png +0 -0
  219. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182020.png +0 -0
  220. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182039.png +0 -0
  221. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182117.png +0 -0
  222. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182225.png +0 -0
  223. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182248.png +0 -0
  224. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182322.png +0 -0
  225. package/apps/sessrumnir/docs/screenshots/Screenshot_20260824_182340.png +0 -0
  226. package/apps/sessrumnir/docs/sitemap.xml +9 -0
  227. package/apps/sessrumnir/electron.vite.config.ts +49 -0
  228. package/apps/sessrumnir/eslint.config.mjs +75 -0
  229. package/apps/sessrumnir/i18next.config.ts +33 -0
  230. package/apps/sessrumnir/install.sh +144 -0
  231. package/apps/sessrumnir/out/main/index.js +10881 -0
  232. package/apps/sessrumnir/out/preload/index.js +722 -0
  233. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-400-normal-C8QS47vb.woff2 +0 -0
  234. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-400-normal-D3EsxgFc.woff +0 -0
  235. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-500-normal-B7dJQtg-.woff +0 -0
  236. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-500-normal-BLlg2W5x.woff2 +0 -0
  237. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-600-normal-BcIsDXzC.woff2 +0 -0
  238. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-600-normal-CBymlcNF.woff +0 -0
  239. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-400-normal-Bgrpe4p1.woff +0 -0
  240. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-400-normal-BlcaxZtM.woff2 +0 -0
  241. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-500-normal-CdQuyvtc.woff +0 -0
  242. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-500-normal-pZw22qtS.woff2 +0 -0
  243. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-600-normal-Dr-wLyOm.woff +0 -0
  244. package/apps/sessrumnir/out/renderer/assets/cormorant-cyrillic-ext-600-normal-dLR2-a_v.woff2 +0 -0
  245. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-400-normal-BGH8Vunh.woff2 +0 -0
  246. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-400-normal-C3_-2Ua-.woff +0 -0
  247. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-500-normal-Dj3SQ6fR.woff +0 -0
  248. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-500-normal-EBdSCOD3.woff2 +0 -0
  249. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-600-normal-B254Xisw.woff2 +0 -0
  250. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-600-normal-DUW-TI76.woff +0 -0
  251. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-400-normal-DuQ88yz3.woff2 +0 -0
  252. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-400-normal-DuXFa1Dr.woff +0 -0
  253. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-500-normal-AH9qog1s.woff2 +0 -0
  254. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-500-normal-DAuUCO41.woff +0 -0
  255. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-600-normal-CD-dlDpD.woff +0 -0
  256. package/apps/sessrumnir/out/renderer/assets/cormorant-latin-ext-600-normal-D3T6BBXG.woff2 +0 -0
  257. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-400-normal-C-RiYxEf.woff2 +0 -0
  258. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-400-normal-DmUuA7Y2.woff +0 -0
  259. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-500-normal-DsPuwQHi.woff2 +0 -0
  260. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-500-normal-tGBW_mI7.woff +0 -0
  261. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-600-normal-Dar_cCT6.woff2 +0 -0
  262. package/apps/sessrumnir/out/renderer/assets/cormorant-vietnamese-600-normal-GIs8CF2x.woff +0 -0
  263. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-300-normal-Ba-HN6uq.woff +0 -0
  264. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-300-normal-ByB2hQUF.woff2 +0 -0
  265. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
  266. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
  267. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
  268. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
  269. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-300-normal-B8O3uHbr.woff +0 -0
  270. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-300-normal-BbtBtHoB.woff2 +0 -0
  271. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
  272. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
  273. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
  274. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
  275. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-300-normal-BPU54Tw3.woff +0 -0
  276. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-300-normal-BRS-C4KA.woff2 +0 -0
  277. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  278. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  279. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  280. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  281. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-300-normal-BEtQ2wm2.woff2 +0 -0
  282. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-300-normal-CQbCaAQ4.woff +0 -0
  283. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
  284. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
  285. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
  286. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
  287. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-300-normal-B6fSpYYV.woff +0 -0
  288. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-300-normal-CpdbWO_2.woff2 +0 -0
  289. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
  290. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
  291. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
  292. package/apps/sessrumnir/out/renderer/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
  293. package/apps/sessrumnir/out/renderer/assets/index-BxqsRq2x.css +4858 -0
  294. package/apps/sessrumnir/out/renderer/assets/index-TaD69rFk.js +99435 -0
  295. package/apps/sessrumnir/out/renderer/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  296. package/apps/sessrumnir/out/renderer/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  297. package/apps/sessrumnir/out/renderer/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  298. package/apps/sessrumnir/out/renderer/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  299. package/apps/sessrumnir/out/renderer/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  300. package/apps/sessrumnir/out/renderer/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  301. package/apps/sessrumnir/out/renderer/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  302. package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  303. package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  304. package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  305. package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  306. package/apps/sessrumnir/out/renderer/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  307. package/apps/sessrumnir/out/renderer/assets/newsreader-latin-ext-wght-italic-DFS986qL.woff2 +0 -0
  308. package/apps/sessrumnir/out/renderer/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  309. package/apps/sessrumnir/out/renderer/assets/newsreader-latin-wght-italic-Bxi8ein9.woff2 +0 -0
  310. package/apps/sessrumnir/out/renderer/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  311. package/apps/sessrumnir/out/renderer/assets/newsreader-vietnamese-wght-italic-xAqemagA.woff2 +0 -0
  312. package/apps/sessrumnir/out/renderer/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  313. package/apps/sessrumnir/out/renderer/assets/openmoji-color-9qo_2DLG.woff2 +0 -0
  314. package/apps/sessrumnir/out/renderer/assets/pi-logo-B6SVnhuS.svg +7 -0
  315. package/apps/sessrumnir/out/renderer/index.html +19 -0
  316. package/apps/sessrumnir/out/renderer/theme-boot.js +30 -0
  317. package/apps/sessrumnir/package-lock.json +10636 -0
  318. package/apps/sessrumnir/package.json +183 -0
  319. package/apps/sessrumnir/public/apple-touch-icon.png +0 -0
  320. package/apps/sessrumnir/public/icon.svg +7 -0
  321. package/apps/sessrumnir/resources/icons/generate_icons.py +38 -0
  322. package/apps/sessrumnir/resources/icons/icon-128.png +0 -0
  323. package/apps/sessrumnir/resources/icons/icon-16.png +0 -0
  324. package/apps/sessrumnir/resources/icons/icon-256.png +0 -0
  325. package/apps/sessrumnir/resources/icons/icon-32.png +0 -0
  326. package/apps/sessrumnir/resources/icons/icon-48.png +0 -0
  327. package/apps/sessrumnir/resources/icons/icon-512.png +0 -0
  328. package/apps/sessrumnir/resources/icons/icon-64.png +0 -0
  329. package/apps/sessrumnir/resources/icons/icon.icns +0 -0
  330. package/apps/sessrumnir/resources/icons/icon.ico +0 -0
  331. package/apps/sessrumnir/resources/icons/icon.png +0 -0
  332. package/apps/sessrumnir/resources/icons/icon.svg +7 -0
  333. package/apps/sessrumnir/resources/linux/after-install.sh +23 -0
  334. package/apps/sessrumnir/resources/linux/after-remove.sh +18 -0
  335. package/apps/sessrumnir/resources/locales/en/translation.json +1735 -0
  336. package/apps/sessrumnir/resources/permission-prompt-text.test.ts +111 -0
  337. package/apps/sessrumnir/resources/permission-prompt-text.ts +84 -0
  338. package/apps/sessrumnir/resources/permission-rules.test.ts +351 -0
  339. package/apps/sessrumnir/resources/permission-rules.ts +293 -0
  340. package/apps/sessrumnir/resources/pi-desktop-permissions.ts +62 -0
  341. package/apps/sessrumnir/resources/ymir-sessrumnir.desktop.in +12 -0
  342. package/apps/sessrumnir/scripts/check-semantic-colors.mjs +57 -0
  343. package/apps/sessrumnir/src/main/activity-stats.test.ts +240 -0
  344. package/apps/sessrumnir/src/main/activity-stats.ts +596 -0
  345. package/apps/sessrumnir/src/main/agent-detection.test.ts +25 -0
  346. package/apps/sessrumnir/src/main/agent-detection.ts +114 -0
  347. package/apps/sessrumnir/src/main/app-data-paths.test.ts +90 -0
  348. package/apps/sessrumnir/src/main/app-data-paths.ts +95 -0
  349. package/apps/sessrumnir/src/main/app-log.test.ts +114 -0
  350. package/apps/sessrumnir/src/main/app-log.ts +210 -0
  351. package/apps/sessrumnir/src/main/archived-sessions.test.ts +50 -0
  352. package/apps/sessrumnir/src/main/archived-sessions.ts +95 -0
  353. package/apps/sessrumnir/src/main/attachment-reader.test.ts +56 -0
  354. package/apps/sessrumnir/src/main/attachment-reader.ts +52 -0
  355. package/apps/sessrumnir/src/main/auto-tag.test.ts +38 -0
  356. package/apps/sessrumnir/src/main/auto-tag.ts +75 -0
  357. package/apps/sessrumnir/src/main/autostart-linux.test.ts +56 -0
  358. package/apps/sessrumnir/src/main/autostart-linux.ts +58 -0
  359. package/apps/sessrumnir/src/main/cmd-escape.test.ts +424 -0
  360. package/apps/sessrumnir/src/main/cmd-escape.ts +186 -0
  361. package/apps/sessrumnir/src/main/council-manager.test.ts +167 -0
  362. package/apps/sessrumnir/src/main/council-manager.ts +265 -0
  363. package/apps/sessrumnir/src/main/diagnostics-report.test.ts +140 -0
  364. package/apps/sessrumnir/src/main/diagnostics-report.ts +91 -0
  365. package/apps/sessrumnir/src/main/diagnostics.ts +111 -0
  366. package/apps/sessrumnir/src/main/editor-guard.test.ts +59 -0
  367. package/apps/sessrumnir/src/main/editor-guard.ts +50 -0
  368. package/apps/sessrumnir/src/main/extension-ui-ipc.test.ts +299 -0
  369. package/apps/sessrumnir/src/main/extension-ui-ipc.ts +117 -0
  370. package/apps/sessrumnir/src/main/file-service.test.ts +279 -0
  371. package/apps/sessrumnir/src/main/file-service.ts +652 -0
  372. package/apps/sessrumnir/src/main/fs-errors.ts +42 -0
  373. package/apps/sessrumnir/src/main/get-messages-trim.test.ts +77 -0
  374. package/apps/sessrumnir/src/main/get-messages-trim.ts +97 -0
  375. package/apps/sessrumnir/src/main/git-conveyor.test.ts +305 -0
  376. package/apps/sessrumnir/src/main/git-conveyor.ts +338 -0
  377. package/apps/sessrumnir/src/main/git-worktree.test.ts +101 -0
  378. package/apps/sessrumnir/src/main/git-worktree.ts +201 -0
  379. package/apps/sessrumnir/src/main/i18n.ts +31 -0
  380. package/apps/sessrumnir/src/main/index.ts +619 -0
  381. package/apps/sessrumnir/src/main/ipc/active-engine.ts +15 -0
  382. package/apps/sessrumnir/src/main/ipc/context.ts +58 -0
  383. package/apps/sessrumnir/src/main/ipc/council-handlers.ts +126 -0
  384. package/apps/sessrumnir/src/main/ipc/diagnostics-handlers.ts +8 -0
  385. package/apps/sessrumnir/src/main/ipc/file-handlers.ts +96 -0
  386. package/apps/sessrumnir/src/main/ipc/git-conveyor-handlers.ts +55 -0
  387. package/apps/sessrumnir/src/main/ipc/model-handlers.ts +33 -0
  388. package/apps/sessrumnir/src/main/ipc/models-config-handlers.ts +80 -0
  389. package/apps/sessrumnir/src/main/ipc/notes-handlers.ts +65 -0
  390. package/apps/sessrumnir/src/main/ipc/package-handlers.ts +330 -0
  391. package/apps/sessrumnir/src/main/ipc/permission-rules-handlers.ts +223 -0
  392. package/apps/sessrumnir/src/main/ipc/pi-handlers.ts +136 -0
  393. package/apps/sessrumnir/src/main/ipc/pi-start-options.ts +150 -0
  394. package/apps/sessrumnir/src/main/ipc/run-pi-cli.ts +53 -0
  395. package/apps/sessrumnir/src/main/ipc/session-handlers.ts +491 -0
  396. package/apps/sessrumnir/src/main/ipc/settings.ts +120 -0
  397. package/apps/sessrumnir/src/main/ipc/skills-mcp-handlers.ts +192 -0
  398. package/apps/sessrumnir/src/main/ipc/system-handlers.ts +131 -0
  399. package/apps/sessrumnir/src/main/ipc/tag-handlers.ts +69 -0
  400. package/apps/sessrumnir/src/main/ipc/terminal-handlers.ts +41 -0
  401. package/apps/sessrumnir/src/main/ipc/theme-handlers.ts +131 -0
  402. package/apps/sessrumnir/src/main/ipc/update-handlers.ts +61 -0
  403. package/apps/sessrumnir/src/main/ipc/validation.ts +45 -0
  404. package/apps/sessrumnir/src/main/ipc/workflow-handlers.ts +108 -0
  405. package/apps/sessrumnir/src/main/ipc/workspace-activity-wiring.ts +179 -0
  406. package/apps/sessrumnir/src/main/ipc/workspace-handlers.ts +133 -0
  407. package/apps/sessrumnir/src/main/ipc-handlers.ts +98 -0
  408. package/apps/sessrumnir/src/main/map-concurrent.test.ts +80 -0
  409. package/apps/sessrumnir/src/main/map-concurrent.ts +30 -0
  410. package/apps/sessrumnir/src/main/models-file.test.ts +114 -0
  411. package/apps/sessrumnir/src/main/models-file.ts +89 -0
  412. package/apps/sessrumnir/src/main/notes-manager.test.ts +64 -0
  413. package/apps/sessrumnir/src/main/notes-manager.ts +183 -0
  414. package/apps/sessrumnir/src/main/notify-decision.test.ts +39 -0
  415. package/apps/sessrumnir/src/main/notify-decision.ts +25 -0
  416. package/apps/sessrumnir/src/main/omp-fork-points.test.ts +119 -0
  417. package/apps/sessrumnir/src/main/omp-fork-points.ts +105 -0
  418. package/apps/sessrumnir/src/main/omp-plugin-list.test.ts +94 -0
  419. package/apps/sessrumnir/src/main/omp-plugin-list.ts +103 -0
  420. package/apps/sessrumnir/src/main/package-catalog.test.ts +157 -0
  421. package/apps/sessrumnir/src/main/package-catalog.ts +166 -0
  422. package/apps/sessrumnir/src/main/package-updates.test.ts +149 -0
  423. package/apps/sessrumnir/src/main/package-updates.ts +185 -0
  424. package/apps/sessrumnir/src/main/path-authorization.test.ts +64 -0
  425. package/apps/sessrumnir/src/main/path-authorization.ts +31 -0
  426. package/apps/sessrumnir/src/main/pi-binary-resolution.test.ts +582 -0
  427. package/apps/sessrumnir/src/main/pi-binary-resolution.ts +649 -0
  428. package/apps/sessrumnir/src/main/pi-event-router.test.ts +388 -0
  429. package/apps/sessrumnir/src/main/pi-event-router.ts +290 -0
  430. package/apps/sessrumnir/src/main/pi-paths.test.ts +134 -0
  431. package/apps/sessrumnir/src/main/pi-paths.ts +74 -0
  432. package/apps/sessrumnir/src/main/pi-rpc-manager.test.ts +467 -0
  433. package/apps/sessrumnir/src/main/pi-rpc-manager.ts +1319 -0
  434. package/apps/sessrumnir/src/main/process-tree.test.ts +94 -0
  435. package/apps/sessrumnir/src/main/renderer-origin.test.ts +33 -0
  436. package/apps/sessrumnir/src/main/renderer-origin.ts +35 -0
  437. package/apps/sessrumnir/src/main/session-lineage-reader.test.ts +317 -0
  438. package/apps/sessrumnir/src/main/session-lineage-reader.ts +111 -0
  439. package/apps/sessrumnir/src/main/session-metadata.test.ts +508 -0
  440. package/apps/sessrumnir/src/main/session-metadata.ts +526 -0
  441. package/apps/sessrumnir/src/main/session-name.test.ts +71 -0
  442. package/apps/sessrumnir/src/main/session-name.ts +69 -0
  443. package/apps/sessrumnir/src/main/session-paths.test.ts +110 -0
  444. package/apps/sessrumnir/src/main/session-paths.ts +88 -0
  445. package/apps/sessrumnir/src/main/session-tags.test.ts +61 -0
  446. package/apps/sessrumnir/src/main/session-tags.ts +253 -0
  447. package/apps/sessrumnir/src/main/session-trash.test.ts +66 -0
  448. package/apps/sessrumnir/src/main/session-trash.ts +65 -0
  449. package/apps/sessrumnir/src/main/settings-logic.ts +66 -0
  450. package/apps/sessrumnir/src/main/skills-discovery.test.ts +149 -0
  451. package/apps/sessrumnir/src/main/skills-discovery.ts +179 -0
  452. package/apps/sessrumnir/src/main/startup-launch.ts +63 -0
  453. package/apps/sessrumnir/src/main/terminal-service.ts +96 -0
  454. package/apps/sessrumnir/src/main/theme-store.test.ts +440 -0
  455. package/apps/sessrumnir/src/main/theme-store.ts +495 -0
  456. package/apps/sessrumnir/src/main/tray-decision.test.ts +46 -0
  457. package/apps/sessrumnir/src/main/tray-decision.ts +49 -0
  458. package/apps/sessrumnir/src/main/tray-manager.ts +220 -0
  459. package/apps/sessrumnir/src/main/tsconfig.json +20 -0
  460. package/apps/sessrumnir/src/main/window-background.test.ts +29 -0
  461. package/apps/sessrumnir/src/main/window-background.ts +16 -0
  462. package/apps/sessrumnir/src/main/workflow-discovery.test.ts +252 -0
  463. package/apps/sessrumnir/src/main/workflow-monitor.test.ts +371 -0
  464. package/apps/sessrumnir/src/main/workflow-monitor.ts +1020 -0
  465. package/apps/sessrumnir/src/main/workspace-activity.test.ts +227 -0
  466. package/apps/sessrumnir/src/main/workspace-activity.ts +215 -0
  467. package/apps/sessrumnir/src/main/workspace-manager.test.ts +680 -0
  468. package/apps/sessrumnir/src/main/workspace-manager.ts +1199 -0
  469. package/apps/sessrumnir/src/main/workspace-trust.test.ts +78 -0
  470. package/apps/sessrumnir/src/main/workspace-trust.ts +84 -0
  471. package/apps/sessrumnir/src/preload/index.ts +358 -0
  472. package/apps/sessrumnir/src/preload/tsconfig.json +20 -0
  473. package/apps/sessrumnir/src/renderer/index.html +18 -0
  474. package/apps/sessrumnir/src/renderer/public/theme-boot.js +30 -0
  475. package/apps/sessrumnir/src/renderer/src/app.tsx +194 -0
  476. package/apps/sessrumnir/src/renderer/src/assets/openmoji-color.woff2 +0 -0
  477. package/apps/sessrumnir/src/renderer/src/assets/pi-logo.svg +7 -0
  478. package/apps/sessrumnir/src/renderer/src/assets/ymir-mark.svg +55 -0
  479. package/apps/sessrumnir/src/renderer/src/assets.d.ts +7 -0
  480. package/apps/sessrumnir/src/renderer/src/components/chat-code-highlight.ts +239 -0
  481. package/apps/sessrumnir/src/renderer/src/components/chat-file-link.ts +140 -0
  482. package/apps/sessrumnir/src/renderer/src/components/chat-input.tsx +729 -0
  483. package/apps/sessrumnir/src/renderer/src/components/chat-panel-widths.test.ts +175 -0
  484. package/apps/sessrumnir/src/renderer/src/components/chat-panel-widths.ts +100 -0
  485. package/apps/sessrumnir/src/renderer/src/components/chat-panel.tsx +523 -0
  486. package/apps/sessrumnir/src/renderer/src/components/chat-project-picker.tsx +193 -0
  487. package/apps/sessrumnir/src/renderer/src/components/chat-search.tsx +251 -0
  488. package/apps/sessrumnir/src/renderer/src/components/code-editor-highlight.ts +85 -0
  489. package/apps/sessrumnir/src/renderer/src/components/code-editor-language.test.ts +19 -0
  490. package/apps/sessrumnir/src/renderer/src/components/code-editor-language.ts +88 -0
  491. package/apps/sessrumnir/src/renderer/src/components/code-editor.tsx +128 -0
  492. package/apps/sessrumnir/src/renderer/src/components/command-palette.tsx +315 -0
  493. package/apps/sessrumnir/src/renderer/src/components/command-results.tsx +80 -0
  494. package/apps/sessrumnir/src/renderer/src/components/composer-permission-menu.tsx +91 -0
  495. package/apps/sessrumnir/src/renderer/src/components/context-menu.tsx +457 -0
  496. package/apps/sessrumnir/src/renderer/src/components/copy-button.tsx +36 -0
  497. package/apps/sessrumnir/src/renderer/src/components/council-panels.tsx +193 -0
  498. package/apps/sessrumnir/src/renderer/src/components/custom-models-editor.tsx +330 -0
  499. package/apps/sessrumnir/src/renderer/src/components/diagnostics-panel.tsx +380 -0
  500. package/apps/sessrumnir/src/renderer/src/components/diff-viewer.tsx +318 -0
  501. package/apps/sessrumnir/src/renderer/src/components/ember-background.tsx +113 -0
  502. package/apps/sessrumnir/src/renderer/src/components/error-boundary.tsx +38 -0
  503. package/apps/sessrumnir/src/renderer/src/components/extension-ui-dialog-helpers.test.ts +43 -0
  504. package/apps/sessrumnir/src/renderer/src/components/extension-ui-dialog-helpers.ts +51 -0
  505. package/apps/sessrumnir/src/renderer/src/components/extension-ui-dialog.tsx +486 -0
  506. package/apps/sessrumnir/src/renderer/src/components/file-tree.tsx +784 -0
  507. package/apps/sessrumnir/src/renderer/src/components/git-conveyor-actions.tsx +246 -0
  508. package/apps/sessrumnir/src/renderer/src/components/home-screen.tsx +396 -0
  509. package/apps/sessrumnir/src/renderer/src/components/image-viewer.tsx +100 -0
  510. package/apps/sessrumnir/src/renderer/src/components/line-numbered-code.tsx +58 -0
  511. package/apps/sessrumnir/src/renderer/src/components/markdown-renderer.tsx +237 -0
  512. package/apps/sessrumnir/src/renderer/src/components/message-bubble.tsx +1006 -0
  513. package/apps/sessrumnir/src/renderer/src/components/mission-control.tsx +341 -0
  514. package/apps/sessrumnir/src/renderer/src/components/model-selector.tsx +219 -0
  515. package/apps/sessrumnir/src/renderer/src/components/note-picker.tsx +155 -0
  516. package/apps/sessrumnir/src/renderer/src/components/notes-panel.tsx +437 -0
  517. package/apps/sessrumnir/src/renderer/src/components/package-browser.tsx +604 -0
  518. package/apps/sessrumnir/src/renderer/src/components/permission-mode.test.ts +22 -0
  519. package/apps/sessrumnir/src/renderer/src/components/permission-mode.ts +49 -0
  520. package/apps/sessrumnir/src/renderer/src/components/permission-rules-editor-helpers.test.ts +44 -0
  521. package/apps/sessrumnir/src/renderer/src/components/permission-rules-editor-helpers.ts +35 -0
  522. package/apps/sessrumnir/src/renderer/src/components/permission-rules-editor.tsx +226 -0
  523. package/apps/sessrumnir/src/renderer/src/components/permission-selector.tsx +104 -0
  524. package/apps/sessrumnir/src/renderer/src/components/resize-handle.tsx +51 -0
  525. package/apps/sessrumnir/src/renderer/src/components/review-rail.tsx +194 -0
  526. package/apps/sessrumnir/src/renderer/src/components/session-menu-position.test.ts +22 -0
  527. package/apps/sessrumnir/src/renderer/src/components/session-menu-position.ts +34 -0
  528. package/apps/sessrumnir/src/renderer/src/components/session-panel.tsx +711 -0
  529. package/apps/sessrumnir/src/renderer/src/components/session-runtime-indicator.tsx +43 -0
  530. package/apps/sessrumnir/src/renderer/src/components/settings-panel.tsx +1360 -0
  531. package/apps/sessrumnir/src/renderer/src/components/sidebar-activity.test.ts +47 -0
  532. package/apps/sessrumnir/src/renderer/src/components/sidebar-activity.ts +76 -0
  533. package/apps/sessrumnir/src/renderer/src/components/sidebar-session-labels.test.ts +73 -0
  534. package/apps/sessrumnir/src/renderer/src/components/sidebar-session-labels.ts +47 -0
  535. package/apps/sessrumnir/src/renderer/src/components/sidebar.tsx +1045 -0
  536. package/apps/sessrumnir/src/renderer/src/components/skills-panel.tsx +159 -0
  537. package/apps/sessrumnir/src/renderer/src/components/stats-panel.tsx +368 -0
  538. package/apps/sessrumnir/src/renderer/src/components/status-bar.tsx +274 -0
  539. package/apps/sessrumnir/src/renderer/src/components/status-popover.tsx +481 -0
  540. package/apps/sessrumnir/src/renderer/src/components/streaming-bubble.tsx +128 -0
  541. package/apps/sessrumnir/src/renderer/src/components/subagent-progress.tsx +254 -0
  542. package/apps/sessrumnir/src/renderer/src/components/task-launcher.tsx +168 -0
  543. package/apps/sessrumnir/src/renderer/src/components/terminal.tsx +203 -0
  544. package/apps/sessrumnir/src/renderer/src/components/theme-editor-helpers.test.ts +35 -0
  545. package/apps/sessrumnir/src/renderer/src/components/theme-editor-helpers.ts +35 -0
  546. package/apps/sessrumnir/src/renderer/src/components/theme-editor.tsx +440 -0
  547. package/apps/sessrumnir/src/renderer/src/components/theme-gallery.tsx +373 -0
  548. package/apps/sessrumnir/src/renderer/src/components/thinking-level-selector.tsx +85 -0
  549. package/apps/sessrumnir/src/renderer/src/components/timeline.tsx +289 -0
  550. package/apps/sessrumnir/src/renderer/src/components/tool-call-icon.ts +32 -0
  551. package/apps/sessrumnir/src/renderer/src/components/workflow-navigator.tsx +901 -0
  552. package/apps/sessrumnir/src/renderer/src/components/workspace-tabs.tsx +241 -0
  553. package/apps/sessrumnir/src/renderer/src/global.d.ts +8 -0
  554. package/apps/sessrumnir/src/renderer/src/hooks/use-folder-drop.ts +101 -0
  555. package/apps/sessrumnir/src/renderer/src/hooks.test.ts +88 -0
  556. package/apps/sessrumnir/src/renderer/src/hooks.ts +574 -0
  557. package/apps/sessrumnir/src/renderer/src/i18n.test.ts +54 -0
  558. package/apps/sessrumnir/src/renderer/src/i18n.ts +89 -0
  559. package/apps/sessrumnir/src/renderer/src/index.css +425 -0
  560. package/apps/sessrumnir/src/renderer/src/main.tsx +42 -0
  561. package/apps/sessrumnir/src/renderer/src/message-grouping.test.ts +422 -0
  562. package/apps/sessrumnir/src/renderer/src/message-grouping.ts +410 -0
  563. package/apps/sessrumnir/src/renderer/src/message-parsing.test.ts +86 -0
  564. package/apps/sessrumnir/src/renderer/src/message-parsing.ts +166 -0
  565. package/apps/sessrumnir/src/renderer/src/store-external-prompts.test.ts +161 -0
  566. package/apps/sessrumnir/src/renderer/src/store-session-transitions.test.ts +2090 -0
  567. package/apps/sessrumnir/src/renderer/src/store-timeline.test.ts +52 -0
  568. package/apps/sessrumnir/src/renderer/src/store-turn-error.test.ts +136 -0
  569. package/apps/sessrumnir/src/renderer/src/store.ts +3726 -0
  570. package/apps/sessrumnir/src/renderer/src/subagent-detection.test.ts +55 -0
  571. package/apps/sessrumnir/src/renderer/src/theme/engine.test.ts +29 -0
  572. package/apps/sessrumnir/src/renderer/src/theme/engine.ts +20 -0
  573. package/apps/sessrumnir/src/renderer/src/themes/breeze-claudius.json +69 -0
  574. package/apps/sessrumnir/src/renderer/src/themes/breeze-dark.json +69 -0
  575. package/apps/sessrumnir/src/renderer/src/themes/breeze-light.json +69 -0
  576. package/apps/sessrumnir/src/renderer/src/themes/builtin-themes.test.ts +95 -0
  577. package/apps/sessrumnir/src/renderer/src/themes/dark.json +46 -0
  578. package/apps/sessrumnir/src/renderer/src/themes/fensalir.json +82 -0
  579. package/apps/sessrumnir/src/renderer/src/themes/gruvbox.json +69 -0
  580. package/apps/sessrumnir/src/renderer/src/themes/index.ts +60 -0
  581. package/apps/sessrumnir/src/renderer/src/themes/light.json +46 -0
  582. package/apps/sessrumnir/src/renderer/src/themes/nord.json +69 -0
  583. package/apps/sessrumnir/src/renderer/src/themes/sessrumnir.json +82 -0
  584. package/apps/sessrumnir/src/renderer/src/utils/debounced-buffer.test.ts +81 -0
  585. package/apps/sessrumnir/src/renderer/src/utils/debounced-buffer.ts +57 -0
  586. package/apps/sessrumnir/src/renderer/src/utils/format-relative-time.test.ts +62 -0
  587. package/apps/sessrumnir/src/renderer/src/utils/format-relative-time.ts +28 -0
  588. package/apps/sessrumnir/src/renderer/src/utils/heatmap-grid.test.ts +57 -0
  589. package/apps/sessrumnir/src/renderer/src/utils/heatmap-grid.ts +41 -0
  590. package/apps/sessrumnir/src/renderer/src/utils/ipc-error.test.ts +22 -0
  591. package/apps/sessrumnir/src/renderer/src/utils/ipc-error.ts +12 -0
  592. package/apps/sessrumnir/src/renderer/src/utils/model-search.test.ts +63 -0
  593. package/apps/sessrumnir/src/renderer/src/utils/model-search.ts +20 -0
  594. package/apps/sessrumnir/src/renderer/src/utils/planning-prompt.test.ts +31 -0
  595. package/apps/sessrumnir/src/renderer/src/utils/planning-prompt.ts +27 -0
  596. package/apps/sessrumnir/src/renderer/src/utils/preview-load-error.test.ts +15 -0
  597. package/apps/sessrumnir/src/renderer/src/utils/preview-load-error.ts +22 -0
  598. package/apps/sessrumnir/src/renderer/src/utils/process-status-label.test.ts +13 -0
  599. package/apps/sessrumnir/src/renderer/src/utils/process-status-label.ts +19 -0
  600. package/apps/sessrumnir/src/renderer/src/utils/quick-switcher.test.ts +68 -0
  601. package/apps/sessrumnir/src/renderer/src/utils/quick-switcher.ts +52 -0
  602. package/apps/sessrumnir/src/renderer/src/utils/rank-file-results.test.ts +46 -0
  603. package/apps/sessrumnir/src/renderer/src/utils/rank-file-results.ts +23 -0
  604. package/apps/sessrumnir/src/renderer/src/utils/relative-time.tsx +25 -0
  605. package/apps/sessrumnir/src/renderer/src/utils/session-title.test.ts +98 -0
  606. package/apps/sessrumnir/src/renderer/src/utils/session-title.ts +58 -0
  607. package/apps/sessrumnir/src/renderer/src/utils/stale-guard.test.ts +29 -0
  608. package/apps/sessrumnir/src/renderer/src/utils/stale-guard.ts +20 -0
  609. package/apps/sessrumnir/src/renderer/src/utils/theme.test.ts +174 -0
  610. package/apps/sessrumnir/src/renderer/src/utils/theme.ts +159 -0
  611. package/apps/sessrumnir/src/renderer/src/utils/workflow-runs.test.ts +130 -0
  612. package/apps/sessrumnir/src/renderer/src/utils/workflow-runs.ts +84 -0
  613. package/apps/sessrumnir/src/renderer/tsconfig.json +24 -0
  614. package/apps/sessrumnir/src/shared/agent-engine-label.test.ts +45 -0
  615. package/apps/sessrumnir/src/shared/agent-engine-label.ts +53 -0
  616. package/apps/sessrumnir/src/shared/app-settings.test.ts +25 -0
  617. package/apps/sessrumnir/src/shared/app-settings.ts +23 -0
  618. package/apps/sessrumnir/src/shared/bridge-http.ts +341 -0
  619. package/apps/sessrumnir/src/shared/bridge.ts +337 -0
  620. package/apps/sessrumnir/src/shared/council-config.test.ts +300 -0
  621. package/apps/sessrumnir/src/shared/council-config.ts +356 -0
  622. package/apps/sessrumnir/src/shared/default-settings.ts +39 -0
  623. package/apps/sessrumnir/src/shared/folder-drop.test.ts +118 -0
  624. package/apps/sessrumnir/src/shared/folder-drop.ts +74 -0
  625. package/apps/sessrumnir/src/shared/fork-point.test.ts +30 -0
  626. package/apps/sessrumnir/src/shared/fork-point.ts +24 -0
  627. package/apps/sessrumnir/src/shared/i18n/i18next.d.ts +10 -0
  628. package/apps/sessrumnir/src/shared/i18n/index.test.ts +51 -0
  629. package/apps/sessrumnir/src/shared/i18n/index.ts +50 -0
  630. package/apps/sessrumnir/src/shared/i18n/languages.ts +12 -0
  631. package/apps/sessrumnir/src/shared/i18n/locale-checks.ts +98 -0
  632. package/apps/sessrumnir/src/shared/i18n/locales.test.ts +92 -0
  633. package/apps/sessrumnir/src/shared/i18n/pseudo.test.ts +39 -0
  634. package/apps/sessrumnir/src/shared/i18n/pseudo.ts +44 -0
  635. package/apps/sessrumnir/src/shared/i18n/resolve.test.ts +43 -0
  636. package/apps/sessrumnir/src/shared/i18n/resolve.ts +41 -0
  637. package/apps/sessrumnir/src/shared/i18n/resources.ts +11 -0
  638. package/apps/sessrumnir/src/shared/ipc-contracts.ts +1539 -0
  639. package/apps/sessrumnir/src/shared/models-config.test.ts +124 -0
  640. package/apps/sessrumnir/src/shared/models-config.ts +167 -0
  641. package/apps/sessrumnir/src/shared/package-filter.ts +19 -0
  642. package/apps/sessrumnir/src/shared/package-spec.test.ts +51 -0
  643. package/apps/sessrumnir/src/shared/package-spec.ts +25 -0
  644. package/apps/sessrumnir/src/shared/path-compare.test.ts +38 -0
  645. package/apps/sessrumnir/src/shared/path-compare.ts +76 -0
  646. package/apps/sessrumnir/src/shared/permission-mode.ts +8 -0
  647. package/apps/sessrumnir/src/shared/pi-command.test.ts +165 -0
  648. package/apps/sessrumnir/src/shared/pi-command.ts +139 -0
  649. package/apps/sessrumnir/src/shared/product-name.ts +7 -0
  650. package/apps/sessrumnir/src/shared/session-lineage.test.ts +103 -0
  651. package/apps/sessrumnir/src/shared/session-lineage.ts +50 -0
  652. package/apps/sessrumnir/src/shared/session-preview.test.ts +93 -0
  653. package/apps/sessrumnir/src/shared/session-preview.ts +56 -0
  654. package/apps/sessrumnir/src/shared/sidebar-width.test.ts +58 -0
  655. package/apps/sessrumnir/src/shared/sidebar-width.ts +37 -0
  656. package/apps/sessrumnir/src/shared/theme/builtin-ids.ts +16 -0
  657. package/apps/sessrumnir/src/shared/theme/resolve.test.ts +66 -0
  658. package/apps/sessrumnir/src/shared/theme/resolve.ts +29 -0
  659. package/apps/sessrumnir/src/shared/theme/syntax-defaults.ts +24 -0
  660. package/apps/sessrumnir/src/shared/theme/theme-file.test.ts +88 -0
  661. package/apps/sessrumnir/src/shared/theme/theme-file.ts +132 -0
  662. package/apps/sessrumnir/src/shared/theme/tokens.test.ts +35 -0
  663. package/apps/sessrumnir/src/shared/theme/tokens.ts +86 -0
  664. package/apps/sessrumnir/src/shared/tsconfig.json +17 -0
  665. package/apps/sessrumnir/src/shared/untrusted-data.test.ts +32 -0
  666. package/apps/sessrumnir/src/shared/untrusted-data.ts +22 -0
  667. package/apps/sessrumnir/src/shared/version-compare.test.ts +33 -0
  668. package/apps/sessrumnir/src/shared/version-compare.ts +50 -0
  669. package/apps/sessrumnir/src/shared/workflow-control.ts +33 -0
  670. package/apps/sessrumnir/src/web-server.ts +315 -0
  671. package/apps/sessrumnir/tsconfig.json +26 -0
  672. package/apps/smidja/smidja_build.py +45 -0
  673. package/apps/smidja/smidja_build_review.py +76 -0
  674. package/apps/smidja/smidja_build_test.py +79 -0
  675. package/apps/smidja/smidja_document.py +76 -0
  676. package/apps/smidja/smidja_modules/agent_cc.py +15 -0
  677. package/apps/smidja/smidja_modules/agent_opencode.py +194 -0
  678. package/apps/smidja/smidja_modules/agent_pi.py +392 -0
  679. package/apps/smidja/smidja_modules/agents.py +993 -0
  680. package/apps/smidja/smidja_modules/changes.py +103 -0
  681. package/apps/smidja/smidja_modules/console.py +131 -0
  682. package/apps/smidja/smidja_modules/data_types.py +447 -0
  683. package/apps/smidja/smidja_modules/gates.py +108 -0
  684. package/apps/smidja/smidja_modules/git_helper.py +120 -0
  685. package/apps/smidja/smidja_modules/lm_local.py +144 -0
  686. package/apps/smidja/smidja_modules/permissions.py +194 -0
  687. package/apps/smidja/smidja_modules/prompts.py +21 -0
  688. package/apps/smidja/smidja_modules/quality.py +240 -0
  689. package/apps/smidja/smidja_modules/runner.py +155 -0
  690. package/apps/smidja/smidja_modules/session.py +50 -0
  691. package/apps/smidja/smidja_modules/stall_watch.py +149 -0
  692. package/apps/smidja/smidja_modules/tracer.py +271 -0
  693. package/apps/smidja/smidja_modules/utils.py +77 -0
  694. package/apps/smidja/smidja_orchestrate.py +162 -0
  695. package/apps/smidja/smidja_plan.py +45 -0
  696. package/apps/smidja/smidja_plan_build.py +55 -0
  697. package/apps/smidja/smidja_plan_build_test.py +86 -0
  698. package/apps/smidja/smidja_plan_build_test_quality.py +98 -0
  699. package/apps/smidja/smidja_prompt.py +44 -0
  700. package/apps/smidja/smidja_quality.py +49 -0
  701. package/apps/smidja/smidja_recon_iv.py +202 -0
  702. package/apps/smidja/smidja_scout.py +45 -0
  703. package/apps/smidja/smidja_simple_sdlc.py +183 -0
  704. package/apps/smidja/smidja_smidja_config/smidja.config.yaml +143 -0
  705. package/apps/smidja-factory/AGENTS.md +165 -0
  706. package/apps/smidja-factory/README.md +3 -0
  707. package/apps/smidja-factory/SKILL.md +18 -0
  708. package/apps/smidja-factory/apps/visualizer/.oxlintrc.json +18 -0
  709. package/apps/smidja-factory/apps/visualizer/bun.lock +269 -0
  710. package/apps/smidja-factory/apps/visualizer/desktop/icon.png +0 -0
  711. package/apps/smidja-factory/apps/visualizer/desktop/main.js +140 -0
  712. package/apps/smidja-factory/apps/visualizer/desktop/package-lock.json +871 -0
  713. package/apps/smidja-factory/apps/visualizer/desktop/package.json +18 -0
  714. package/apps/smidja-factory/apps/visualizer/desktop/preload.js +19 -0
  715. package/apps/smidja-factory/apps/visualizer/index.html +28 -0
  716. package/apps/smidja-factory/apps/visualizer/package.json +31 -0
  717. package/apps/smidja-factory/apps/visualizer/public/icon.svg +7 -0
  718. package/apps/smidja-factory/apps/visualizer/public/models/claude.png +0 -0
  719. package/apps/smidja-factory/apps/visualizer/public/models/gemini.png +0 -0
  720. package/apps/smidja-factory/apps/visualizer/public/models/kimi.png +0 -0
  721. package/apps/smidja-factory/apps/visualizer/public/models/openai.png +0 -0
  722. package/apps/smidja-factory/apps/visualizer/public/models/zai.png +0 -0
  723. package/apps/smidja-factory/apps/visualizer/server/chat.ts +425 -0
  724. package/apps/smidja-factory/apps/visualizer/server/db.ts +1050 -0
  725. package/apps/smidja-factory/apps/visualizer/server/index.ts +648 -0
  726. package/apps/smidja-factory/apps/visualizer/server/model-catalog.ts +90 -0
  727. package/apps/smidja-factory/apps/visualizer/server/roster-api.ts +75 -0
  728. package/apps/smidja-factory/apps/visualizer/server/roster_resolve.py +170 -0
  729. package/apps/smidja-factory/apps/visualizer/server/settings.ts +106 -0
  730. package/apps/smidja-factory/apps/visualizer/shared/types.ts +630 -0
  731. package/apps/smidja-factory/apps/visualizer/src/App.vue +379 -0
  732. package/apps/smidja-factory/apps/visualizer/src/components/ChatInput.vue +155 -0
  733. package/apps/smidja-factory/apps/visualizer/src/components/ChatThread.vue +219 -0
  734. package/apps/smidja-factory/apps/visualizer/src/components/ChatView.vue +335 -0
  735. package/apps/smidja-factory/apps/visualizer/src/components/DecisionsView.vue +177 -0
  736. package/apps/smidja-factory/apps/visualizer/src/components/DetailSection.vue +76 -0
  737. package/apps/smidja-factory/apps/visualizer/src/components/MemoryView.vue +397 -0
  738. package/apps/smidja-factory/apps/visualizer/src/components/PhaseDetail.vue +1354 -0
  739. package/apps/smidja-factory/apps/visualizer/src/components/PhaseDots.vue +55 -0
  740. package/apps/smidja-factory/apps/visualizer/src/components/SessionCard.vue +583 -0
  741. package/apps/smidja-factory/apps/visualizer/src/components/SessionMiniCard.vue +58 -0
  742. package/apps/smidja-factory/apps/visualizer/src/components/SessionPanel.vue +272 -0
  743. package/apps/smidja-factory/apps/visualizer/src/components/SessionStartForm.vue +152 -0
  744. package/apps/smidja-factory/apps/visualizer/src/components/SessionTrace.vue +1157 -0
  745. package/apps/smidja-factory/apps/visualizer/src/components/SessionsList.vue +96 -0
  746. package/apps/smidja-factory/apps/visualizer/src/components/SettingsView.vue +152 -0
  747. package/apps/smidja-factory/apps/visualizer/src/components/StatChip.vue +98 -0
  748. package/apps/smidja-factory/apps/visualizer/src/components/StatsView.vue +382 -0
  749. package/apps/smidja-factory/apps/visualizer/src/components/StatusChip.vue +73 -0
  750. package/apps/smidja-factory/apps/visualizer/src/components/ToolCallCard.vue +156 -0
  751. package/apps/smidja-factory/apps/visualizer/src/lib/api.ts +177 -0
  752. package/apps/smidja-factory/apps/visualizer/src/lib/chat-api.ts +95 -0
  753. package/apps/smidja-factory/apps/visualizer/src/lib/chat-store.ts +351 -0
  754. package/apps/smidja-factory/apps/visualizer/src/lib/events.ts +131 -0
  755. package/apps/smidja-factory/apps/visualizer/src/lib/format.ts +92 -0
  756. package/apps/smidja-factory/apps/visualizer/src/lib/highlight.ts +54 -0
  757. package/apps/smidja-factory/apps/visualizer/src/lib/markdown.ts +120 -0
  758. package/apps/smidja-factory/apps/visualizer/src/lib/models.ts +42 -0
  759. package/apps/smidja-factory/apps/visualizer/src/lib/router.ts +67 -0
  760. package/apps/smidja-factory/apps/visualizer/src/lib/types.ts +61 -0
  761. package/apps/smidja-factory/apps/visualizer/src/main.ts +13 -0
  762. package/apps/smidja-factory/apps/visualizer/src/style.css +592 -0
  763. package/apps/smidja-factory/apps/visualizer/tsconfig.json +30 -0
  764. package/apps/smidja-factory/apps/visualizer/vite.config.js +32 -0
  765. package/apps/smidja-factory/apps/visualizer/vite.config.ts +31 -0
  766. package/apps/smidja-factory/cookbooks/create_config.md +61 -0
  767. package/apps/smidja-factory/cookbooks/create_smidja.md +120 -0
  768. package/apps/smidja-factory/cookbooks/how_to_prompt_for_the_eng.md +110 -0
  769. package/apps/smidja-factory/cookbooks/install.md +56 -0
  770. package/apps/smidja-factory/cookbooks/run_smidja.md +122 -0
  771. package/apps/smidja-factory/cookbooks/smidja_overview.md +88 -0
  772. package/apps/smidja-factory/cookbooks/update_config.md +103 -0
  773. package/apps/smidja-factory/cookbooks/update_modules.md +100 -0
  774. package/apps/smidja-factory/cookbooks/update_smidja.md +90 -0
  775. package/apps/smidja-factory/docs/enhancement-plan.md +420 -0
  776. package/apps/smidja-factory/references/config.md +202 -0
  777. package/apps/smidja-factory/references/handoff.md +161 -0
  778. package/apps/smidja-factory/references/observability.md +166 -0
  779. package/apps/smidja-factory/scripts/install.py +113 -0
  780. package/apps/smidja-factory/scripts/make_config.py +35 -0
  781. package/apps/smidja-factory/scripts/make_smidja.py +119 -0
  782. package/apps/smidja-factory/skills/add-or-edit-ai-models/SKILL.md +151 -0
  783. package/apps/smidja-factory/skills/create-new-agent/SKILL.md +125 -0
  784. package/apps/smidja-factory/skills/create-new-teams/SKILL.md +151 -0
  785. package/apps/smidja-factory/skills/git-ops/README.md +25 -0
  786. package/apps/smidja-factory/skills/git-ops/SKILL.md +18 -0
  787. package/apps/smidja-factory/skills/git-ops/create_branch.sh +79 -0
  788. package/apps/smidja-factory/skills/git-ops/safe_commit.sh +82 -0
  789. package/apps/smidja-factory/skills/git-ops/sync_upstream.sh +94 -0
  790. package/apps/smidja-factory/skills/how-to-run-agent-teams/SKILL.md +117 -0
  791. package/apps/smidja-factory/skills/smidja-instructions/SKILL.md +168 -0
  792. package/apps/smidja-factory/skills/smidja-launcher/SKILL.md +155 -0
  793. package/apps/smidja-factory/skills/smidja-start/SKILL.md +266 -0
  794. package/apps/smidja-factory/skills/volundr/SKILL.md +232 -0
  795. package/apps/smidja-factory/skills/volundr/prompt/dispatch-prompt.md +91 -0
  796. package/apps/smidja-factory/skills/volundr/prompt/volundr-system.md +63 -0
  797. package/apps/smidja-factory/skills/volundr/scripts/volundr-observe.py +52 -0
  798. package/apps/smidja-factory/skills/volundr/scripts/volundr-recall.py +54 -0
  799. package/apps/smidja-factory/skills/volundr/scripts/volundr-status.py +51 -0
  800. package/apps/smidja-factory/skills/volundr/scripts/volundr-teach.py +47 -0
  801. package/apps/smidja-factory/templates/env.sample +28 -0
  802. package/apps/smidja-factory/templates/harness_engineering/subagents.ts +706 -0
  803. package/apps/smidja-factory/templates/harness_engineering/themeMap.ts +145 -0
  804. package/apps/smidja-factory/templates/justfile +89 -0
  805. package/apps/smidja-factory/templates/prompt_engineering/builder/system.md +13 -0
  806. package/apps/smidja-factory/templates/prompt_engineering/builder/user.md +34 -0
  807. package/apps/smidja-factory/templates/prompt_engineering/documenter/system.md +17 -0
  808. package/apps/smidja-factory/templates/prompt_engineering/documenter/user.md +48 -0
  809. package/apps/smidja-factory/templates/prompt_engineering/orchestrator/system.md +55 -0
  810. package/apps/smidja-factory/templates/prompt_engineering/orchestrator/user.md +39 -0
  811. package/apps/smidja-factory/templates/prompt_engineering/planner/system.md +21 -0
  812. package/apps/smidja-factory/templates/prompt_engineering/planner/user.md +45 -0
  813. package/apps/smidja-factory/templates/prompt_engineering/recon_orchestrator/system.md +51 -0
  814. package/apps/smidja-factory/templates/prompt_engineering/recon_orchestrator/user.md +26 -0
  815. package/apps/smidja-factory/templates/prompt_engineering/reviewer/system.md +16 -0
  816. package/apps/smidja-factory/templates/prompt_engineering/reviewer/user.md +44 -0
  817. package/apps/smidja-factory/templates/prompt_engineering/scout/system.md +32 -0
  818. package/apps/smidja-factory/templates/prompt_engineering/scout/user.md +34 -0
  819. package/apps/smidja-factory/templates/smidja/smidja_build.py +45 -0
  820. package/apps/smidja-factory/templates/smidja/smidja_build_review.py +76 -0
  821. package/apps/smidja-factory/templates/smidja/smidja_build_test.py +79 -0
  822. package/apps/smidja-factory/templates/smidja/smidja_document.py +76 -0
  823. package/apps/smidja-factory/templates/smidja/smidja_modules/agent_cc.py +15 -0
  824. package/apps/smidja-factory/templates/smidja/smidja_modules/agent_opencode.py +194 -0
  825. package/apps/smidja-factory/templates/smidja/smidja_modules/agent_pi.py +392 -0
  826. package/apps/smidja-factory/templates/smidja/smidja_modules/agents.py +993 -0
  827. package/apps/smidja-factory/templates/smidja/smidja_modules/changes.py +103 -0
  828. package/apps/smidja-factory/templates/smidja/smidja_modules/console.py +131 -0
  829. package/apps/smidja-factory/templates/smidja/smidja_modules/data_types.py +447 -0
  830. package/apps/smidja-factory/templates/smidja/smidja_modules/gates.py +108 -0
  831. package/apps/smidja-factory/templates/smidja/smidja_modules/git_helper.py +120 -0
  832. package/apps/smidja-factory/templates/smidja/smidja_modules/lm_local.py +144 -0
  833. package/apps/smidja-factory/templates/smidja/smidja_modules/permissions.py +194 -0
  834. package/apps/smidja-factory/templates/smidja/smidja_modules/prompts.py +21 -0
  835. package/apps/smidja-factory/templates/smidja/smidja_modules/quality.py +240 -0
  836. package/apps/smidja-factory/templates/smidja/smidja_modules/runner.py +155 -0
  837. package/apps/smidja-factory/templates/smidja/smidja_modules/session.py +50 -0
  838. package/apps/smidja-factory/templates/smidja/smidja_modules/stall_watch.py +149 -0
  839. package/apps/smidja-factory/templates/smidja/smidja_modules/tracer.py +271 -0
  840. package/apps/smidja-factory/templates/smidja/smidja_modules/utils.py +77 -0
  841. package/apps/smidja-factory/templates/smidja/smidja_orchestrate.py +162 -0
  842. package/apps/smidja-factory/templates/smidja/smidja_plan.py +45 -0
  843. package/apps/smidja-factory/templates/smidja/smidja_plan_build.py +55 -0
  844. package/apps/smidja-factory/templates/smidja/smidja_plan_build_test.py +86 -0
  845. package/apps/smidja-factory/templates/smidja/smidja_plan_build_test_quality.py +98 -0
  846. package/apps/smidja-factory/templates/smidja/smidja_prompt.py +44 -0
  847. package/apps/smidja-factory/templates/smidja/smidja_quality.py +49 -0
  848. package/apps/smidja-factory/templates/smidja/smidja_recon_iv.py +202 -0
  849. package/apps/smidja-factory/templates/smidja/smidja_scout.py +45 -0
  850. package/apps/smidja-factory/templates/smidja/smidja_simple_sdlc.py +183 -0
  851. package/apps/smidja-factory/templates/smidja.config.yaml +143 -0
  852. package/bin/app-build.sh +36 -0
  853. package/bin/electron-lib.sh +25 -0
  854. package/bin/sessrumnir.sh +1 -1
  855. package/bin/ymir-install.sh +7 -0
  856. package/package.json +15 -7
  857. package/scripts/electron.sh +6 -2
  858. package/.agents/bus/messages.json +0 -1
  859. package/.agents/config/agents.machine.example.yaml +0 -16
  860. package/.pi/mcp.json +0 -16
  861. package/assets/reference/state/.branch-eligible-owner +0 -4
  862. package/assets/reference/state/.branch-mirror-cursor +0 -1
  863. package/assets/reference/state/.branch-outcomes-cursor +0 -1
  864. package/assets/reference/state/.branch-session +0 -1
  865. package/assets/reference/state/.count-default_wF_p5 +0 -1
  866. package/assets/reference/state/.count-default_wF_p6 +0 -1
  867. package/assets/reference/state/.count-default_wR_p2 +0 -1
  868. package/assets/reference/state/.count-default_wS_p2 +0 -1
  869. package/assets/reference/state/.count-firstmate_fm-server-knowledge +0 -1
  870. package/assets/reference/state/.hash-default_wF_p5 +0 -1
  871. package/assets/reference/state/.hash-default_wF_p6 +0 -1
  872. package/assets/reference/state/.hash-default_wR_p2 +0 -1
  873. package/assets/reference/state/.hash-default_wS_p2 +0 -1
  874. package/assets/reference/state/.hash-firstmate_fm-server-knowledge +0 -1
  875. package/assets/reference/state/.heartbeat-streak +0 -1
  876. package/assets/reference/state/.inactive-outcome-reconcile +0 -2
  877. package/assets/reference/state/.lock +0 -1
  878. package/assets/reference/state/.pi-branch-extension-loaded +0 -1
  879. package/assets/reference/state/.pi-turnend-extension-loaded +0 -2
  880. package/assets/reference/state/.pi-watch-extension-loaded +0 -2
  881. package/assets/reference/state/.seen-server-knowledge_turn-ended +0 -1
  882. package/assets/reference/state/.session-start-agents-baseline +0 -2
  883. package/assets/reference/state/.session-start-complete +0 -1
  884. package/assets/reference/state/.stale-default_wF_p5 +0 -1
  885. package/assets/reference/state/.stale-default_wR_p2 +0 -1
  886. package/assets/reference/state/.stale-firstmate_fm-server-knowledge +0 -1
  887. package/assets/reference/state/.stale-since-default_wF_p5 +0 -1
  888. package/assets/reference/state/.stale-since-default_wR_p2 +0 -1
  889. package/assets/reference/state/.stale-since-firstmate_fm-server-knowledge +0 -1
  890. package/assets/reference/state/.startup-network.delivered +0 -1
  891. package/assets/reference/state/.startup-network.report +0 -1
  892. package/assets/reference/state/.startup-network.status +0 -10
  893. package/assets/reference/state/.startup-network.timings +0 -6
  894. package/assets/reference/state/.trace-context-effective +0 -1
  895. package/assets/reference/state/.wake-queue +0 -0
  896. package/assets/reference/state/.wake-queue.seq +0 -1
  897. package/assets/reference/state/.wake-rows.consume.BcqXSq +0 -0
  898. package/assets/reference/state/.wake-rows.consume.NDZZei +0 -0
  899. package/assets/reference/state/.wake-rows.consume.VGkhYm +0 -0
  900. package/assets/reference/state/.wake-rows.consume.tR2rTy +0 -0
  901. package/assets/reference/state/.watch-arm-output.3581p6 +0 -0
  902. package/assets/reference/state/.watch-arm-output.3ciDNP +0 -0
  903. package/assets/reference/state/.watch-arm-output.SksR6k +0 -0
  904. package/assets/reference/state/.watch-cycle-exits.log +0 -22
  905. package/assets/reference/state/.watch-deliveries.log +0 -19
  906. package/assets/reference/state/.watch-triage.log +0 -38
  907. package/assets/reference/state/.watch.lock/fm-home +0 -1
  908. package/assets/reference/state/.watch.lock/pid +0 -1
  909. package/assets/reference/state/.watch.lock/pid-identity +0 -1
  910. package/assets/reference/state/.watch.lock/watcher-path +0 -1
  911. package/assets/reference/state/.watch.lock.owner.qqbxmS/fm-home +0 -1
  912. package/assets/reference/state/.watch.lock.owner.qqbxmS/pid +0 -1
  913. package/assets/reference/state/.watch.lock.owner.qqbxmS/pid-identity +0 -1
  914. package/assets/reference/state/.watch.lock.owner.qqbxmS/watcher-path +0 -1
  915. package/assets/reference/state/.watcher-down +0 -1
  916. package/assets/reference/state/branch-outcomes.jsonl +0 -1
  917. package/assets/reference/state/branch-session/2026-09-04T16-49-38-671Z_01a06d53-6b6f-7619-930d-e6dfd9a4a29e.jsonl +0 -211
  918. package/assets/reference/state/home-summary.json +0 -42
  919. package/assets/reference/state/server-knowledge.busy-gen +0 -1
  920. package/assets/reference/state/server-knowledge.busy-state +0 -1
  921. package/assets/reference/state/server-knowledge.herdr-presentation +0 -12
  922. package/assets/reference/state/server-knowledge.meta +0 -18
  923. package/assets/reference/state/server-knowledge.pi-ext.ts +0 -26
  924. package/assets/reference/state/server-knowledge.turn-ended +0 -0
  925. /package/{assets/reference/state/.last-check → apps/hlidskjalf/src/app/.gitkeep} +0 -0
  926. /package/{assets/reference/state/.last-heartbeat → apps/hlidskjalf/src/components/.gitkeep} +0 -0
  927. /package/{assets/reference/state/.last-watcher-beat → apps/hlidskjalf/src/services/.gitkeep} +0 -0
  928. /package/{assets/reference/state/.main-eligible-rows.tmp.p2HMKo → apps/smidja/smidja_modules/__init__.py} +0 -0
  929. /package/{assets/reference/state/.main-eligible-rows.tmp.Exxm82 → apps/smidja-factory/templates/smidja/smidja_modules/__init__.py} +0 -0
@@ -0,0 +1,1539 @@
1
+ /**
2
+ * IPC channel constants and typed contracts for secure main↔renderer communication.
3
+ *
4
+ * Every channel has a strictly typed request/response shape.
5
+ * The preload bridge validates payloads against these contracts.
6
+ */
7
+ import type { PermissionRule } from '../../resources/permission-rules'
8
+
9
+ // ─── IPC Channel Names ──────────────────────────────────────────────────────
10
+
11
+ export const IPC_CHANNELS = {
12
+ /** The live fleet, read from herdr's panes - the same source the control plane uses. */
13
+ FLEET_LIST: 'fleet:list',
14
+ // Pi process lifecycle
15
+ PI_START: 'pi:start',
16
+ PI_STOP: 'pi:stop',
17
+ PI_RESTART: 'pi:restart',
18
+ PI_STATUS: 'pi:status',
19
+ PI_DETECT_INSTALLATIONS: 'pi:detect-installations',
20
+
21
+ // Pi commands
22
+ PI_PROMPT: 'pi:prompt',
23
+ PI_STEER: 'pi:steer',
24
+ PI_FOLLOW_UP: 'pi:follow-up',
25
+ PI_ABORT: 'pi:abort',
26
+ PI_BASH: 'pi:bash',
27
+ PI_ABORT_BASH: 'pi:abort-bash',
28
+
29
+ // Session management
30
+ SESSION_NEW: 'session:new',
31
+ SESSION_LAUNCH_TASK: 'session:launch-task',
32
+ SESSION_CLOSE_RUNTIME: 'session:close-runtime',
33
+ SESSION_SWITCH: 'session:switch',
34
+ SESSION_LIST_RUNTIMES: 'session:list-runtimes',
35
+ SESSION_FORK: 'session:fork',
36
+ SESSION_CLONE: 'session:clone',
37
+ SESSION_LIST: 'session:list',
38
+ SESSION_LIST_ALL: 'session:list-all',
39
+ SESSION_GET_STATE: 'session:get-state',
40
+ SESSION_GET_MESSAGES: 'session:get-messages',
41
+ SESSION_GET_STATS: 'session:get-stats',
42
+ SESSION_SET_NAME: 'session:set-name',
43
+ SESSION_EXPORT_HTML: 'session:export-html',
44
+ SESSION_GET_FORK_MESSAGES: 'session:get-fork-messages',
45
+ SESSION_DELETE: 'session:delete',
46
+ SESSION_ARCHIVE: 'session:archive',
47
+ SESSION_UNARCHIVE: 'session:unarchive',
48
+ SESSION_LIST_ARCHIVED: 'session:list-archived',
49
+ SESSION_GET_LINEAGE: 'session:get-lineage',
50
+ SESSION_COMPACT: 'session:compact',
51
+
52
+ // Model management
53
+ MODEL_SET: 'model:set',
54
+ MODEL_CYCLE: 'model:cycle',
55
+ MODEL_LIST_AVAILABLE: 'model:list-available',
56
+ THINKING_SET_LEVEL: 'thinking:set-level',
57
+ THINKING_CYCLE_LEVEL: 'thinking:cycle-level',
58
+
59
+ // Settings
60
+ SETTINGS_GET_ALL: 'settings:get-all',
61
+ SETTINGS_SAVE: 'settings:save',
62
+ I18N_GET_ENVIRONMENT: 'i18n:get-environment',
63
+
64
+ // Permission rules
65
+ PERMISSION_RULES_GET: 'permission-rules:get',
66
+ PERMISSION_RULES_SET: 'permission-rules:set',
67
+ PERMISSION_RULES_IMPORT: 'permission-rules:import',
68
+ PERMISSION_RULES_EXPORT: 'permission-rules:export',
69
+ PERMISSION_RULES_WORKSPACE_STATUS: 'permission-rules:workspace-status',
70
+ PERMISSION_RULES_REMOVE_WORKSPACE: 'permission-rules:remove-workspace',
71
+ PERMISSION_RULES_SET_WORKSPACE_TRUST: 'permission-rules:set-workspace-trust',
72
+
73
+ // UI
74
+ UI_SELECT_RESPONSE: 'ui:select-response',
75
+ UI_CONFIRM_RESPONSE: 'ui:confirm-response',
76
+ UI_INPUT_RESPONSE: 'ui:input-response',
77
+ UI_EDITOR_RESPONSE: 'ui:editor-response',
78
+ UI_PENDING_FLUSH: 'ui:pending-flush',
79
+ UI_PENDING_GET: 'ui:pending-get',
80
+ UI_EDITOR_DIRTY_SET: 'ui:editor-dirty-set',
81
+
82
+ // System
83
+ SYSTEM_OPEN_DIALOG: 'system:open-dialog',
84
+ SYSTEM_GET_PATH: 'system:get-path',
85
+ SYSTEM_PATH_KIND: 'system:path-kind',
86
+ SYSTEM_OPEN_EXTERNAL: 'system:open-external',
87
+ SYSTEM_HALL_URL: 'system:hall-url',
88
+ SYSTEM_GET_VERSION: 'system:get-version',
89
+ UPDATE_CHECK: 'update:check',
90
+
91
+ // Activity
92
+ ACTIVITY_GET_STATS: 'activity:get-stats',
93
+
94
+ // Workflow run monitoring
95
+ WORKFLOW_LIST: 'workflow:list',
96
+ WORKFLOW_GET_RUN: 'workflow:get-run',
97
+ WORKFLOW_CONTROL: 'workflow:control',
98
+ WORKFLOW_SET_PERSISTENCE: 'workflow:set-persistence',
99
+
100
+ // Diagnostics
101
+ DIAGNOSTICS_GET: 'diagnostics:get',
102
+
103
+ // Workspaces
104
+ WORKSPACE_LIST: 'workspace:list',
105
+ WORKSPACE_CREATE: 'workspace:create',
106
+ WORKSPACE_REMOVE: 'workspace:remove',
107
+ WORKSPACE_RENAME: 'workspace:rename',
108
+ WORKSPACE_SET_ACTIVE: 'workspace:set-active',
109
+ WORKSPACE_GET_ACTIVE: 'workspace:get-active',
110
+ WORKSPACE_CHANGE_PATH: 'workspace:change-path',
111
+ WORKSPACE_PATH_EXISTS: 'workspace:path-exists',
112
+ WORKSPACE_START_PI: 'workspace:start-pi',
113
+ WORKSPACE_STOP_PI: 'workspace:stop-pi',
114
+ WORKSPACE_CREATE_TAB: 'workspace:create-tab',
115
+ WORKSPACE_ACTIVITY_GET: 'workspace:activity',
116
+ WORKSPACE_TAKE_PENDING_ACTIVATION: 'workspace:take-pending-activation',
117
+
118
+ // Packages
119
+ PACKAGE_LIST_INSTALLED: 'package:list-installed',
120
+ PACKAGE_INSTALL: 'package:install',
121
+ PACKAGE_REMOVE: 'package:remove',
122
+ PACKAGE_UPDATE: 'package:update',
123
+ PACKAGE_UPDATE_ALL: 'package:update-all',
124
+ PACKAGE_CHECK_UPDATES: 'package:check-updates',
125
+ PACKAGE_CATALOG_FETCH: 'package:catalog-fetch',
126
+
127
+ // Skills
128
+ SKILLS_LIST: 'skills:list',
129
+ COMMANDS_LIST: 'commands:list',
130
+ MCP_SERVERS_LIST: 'mcp:servers-list',
131
+
132
+ // Models config
133
+ MODELS_READ: 'models:read',
134
+ MODELS_WRITE: 'models:write',
135
+
136
+ // Council planning
137
+ COUNCIL_DETECT: 'council:detect',
138
+ COUNCIL_RUN_CONSULTANTS: 'council:run-consultants',
139
+ COUNCIL_ARBITER: 'council:arbiter',
140
+
141
+ // File operations
142
+ FILE_TREE: 'file:tree',
143
+ FILE_SEARCH: 'file:search',
144
+ FILE_SEARCH_CONTENT: 'file:search-content',
145
+ FILE_READ: 'file:read',
146
+ FILE_READ_ATTACHMENT: 'file:read-attachment',
147
+ FILE_WRITE: 'file:write',
148
+ FILE_DIFF: 'file:diff',
149
+ FILE_STAGED_DIFF: 'file:staged-diff',
150
+ GIT_STATUS: 'git:status',
151
+ GIT_BRANCH: 'git:branch',
152
+ GIT_CONVEYOR_STATUS: 'git:conveyor-status',
153
+ GIT_CONVEYOR_COMMIT: 'git:conveyor-commit',
154
+ GIT_CONVEYOR_PUSH: 'git:conveyor-push',
155
+ GIT_CONVEYOR_CREATE_PR: 'git:conveyor-create-pr',
156
+
157
+ // Terminal
158
+ TERMINAL_START: 'terminal:start',
159
+ TERMINAL_INPUT: 'terminal:input',
160
+ TERMINAL_RESIZE: 'terminal:resize',
161
+ TERMINAL_STOP: 'terminal:stop',
162
+
163
+ // Session tags
164
+ TAG_GET: 'tag:get',
165
+ TAG_SET: 'tag:set',
166
+ TAG_ADD: 'tag:add',
167
+ TAG_REMOVE: 'tag:remove',
168
+ TAG_GET_ALL: 'tag:get-all',
169
+ TAG_GET_ALL_USED: 'tag:get-all-used',
170
+ TAG_AUTO_GET_ALL: 'tag:auto-get-all',
171
+ TAG_AUTO_ENSURE: 'tag:auto-ensure',
172
+ TAG_AUTO_REMOVE: 'tag:auto-remove',
173
+
174
+ // Notes (reusable prompts / commands)
175
+ NOTES_LIST: 'notes:list',
176
+ NOTES_CREATE: 'notes:create',
177
+ NOTES_UPDATE: 'notes:update',
178
+ NOTES_REMOVE: 'notes:remove',
179
+
180
+ // Themes (user-created theme storage)
181
+ THEMES_LIST: 'themes:list',
182
+ THEMES_SAVE: 'themes:save',
183
+ THEMES_DELETE: 'themes:delete',
184
+ THEMES_INSTALL_URL: 'themes:install-from-url',
185
+ THEMES_EXPORT: 'themes:export',
186
+ THEMES_IMPORT: 'themes:import',
187
+ THEMES_GALLERY_LIST: 'themes:gallery-list',
188
+ THEMES_GALLERY_IMAGE: 'themes:gallery-image',
189
+ THEMES_SET_WINDOW_BACKGROUND: 'themes:set-window-background',
190
+
191
+ // Events (main → renderer)
192
+ EVENT_PI: 'event:pi',
193
+ EVENT_PENDING_PROMPTS: 'event:pending-prompts',
194
+ EVENT_WORKSPACE_ACTIVITY: 'event:workspace-activity',
195
+ EVENT_SESSION_RUNTIME: 'event:session-runtime',
196
+ EVENT_ACTIVATE_WORKSPACE: 'event:activate-workspace',
197
+ EVENT_FILE_CHANGE: 'event:file-change',
198
+ EVENT_TERMINAL_DATA: 'event:terminal-data',
199
+ EVENT_TERMINAL_EXIT: 'event:terminal-exit',
200
+ EVENT_COUNCIL_PROGRESS: 'event:council-progress',
201
+ } as const
202
+
203
+ // ─── Pi Process Types ───────────────────────────────────────────────────────
204
+
205
+ export type PiProcessStatus = 'stopped' | 'starting' | 'running' | 'error'
206
+
207
+ /**
208
+ * Where a 'starting' runtime is in its startup: 'spawning' until the first
209
+ * stdout byte proves the process is alive, 'waiting-on-engine' once the
210
+ * silence deadline passed with output flowing but readiness still pending —
211
+ * typically an extension startup hook waiting on a local model server.
212
+ */
213
+ export type PiStartupPhase = 'spawning' | 'waiting-on-engine'
214
+
215
+ export interface PiStatus {
216
+ status: PiProcessStatus
217
+ pid: number | null
218
+ error: string | null
219
+ /**
220
+ * Engine identity of the live child, so the UI can name what is actually
221
+ * running. Optional because a snapshot may predate the field; consumers
222
+ * fall back to Pi, which is what an unlabelled process has always been.
223
+ */
224
+ engine?: AgentEngineKind
225
+ /** Present only while status is 'starting'. */
226
+ startupPhase?: PiStartupPhase
227
+ }
228
+
229
+ export type SessionRuntimeActivity = 'working' | 'needs-approval' | 'completed' | 'failed'
230
+
231
+ /** Live runtime for one Pi session. Multiple runtimes may share one workspace cwd. */
232
+ export interface SessionRuntimeInfo extends PiStatus {
233
+ runtimeId: string
234
+ workspaceId: string
235
+ sessionPath: string | null
236
+ sessionId: string | null
237
+ activity: SessionRuntimeActivity | null
238
+ active: boolean
239
+ /** Main emitted marker telling the renderer to remove this closed tab. */
240
+ closed?: boolean
241
+ }
242
+
243
+ export interface SessionRuntimeCloseResult {
244
+ runtimeId: string
245
+ workspaceId: string
246
+ sessionPath: string | null
247
+ /** Active replacement chosen atomically with the close, if one exists. */
248
+ replacementSessionPath?: string | null
249
+ /** Proven header-only. Necessary for the auto-delete, never sufficient. */
250
+ empty: boolean
251
+ /**
252
+ * True only when this app created the session file during this run: a tab
253
+ * opened with no session that let the agent write a fresh JSONL. A tab that
254
+ * adopted an existing file — opened from the list, forked, or resumed with
255
+ * `--continue` — is false, because that file is the user's conversation and
256
+ * must survive being closed no matter how it reads on disk.
257
+ */
258
+ appCreated: boolean
259
+ deleted: boolean
260
+ }
261
+
262
+ export interface SessionLaunchTaskOptions {
263
+ workspaceId: string
264
+ prompt: string
265
+ isolated?: boolean
266
+ }
267
+
268
+ export interface GitConveyorStatus {
269
+ branch: string | null
270
+ head: string
271
+ lastCommitMessage: string | null
272
+ dirtyFiles: number
273
+ ahead: number
274
+ behind: number
275
+ hasUpstream: boolean
276
+ /** Remote branch used by the explicit push target, when configured. */
277
+ pushRemote: string | null
278
+ /** Branch configured as this branch's upstream, when one exists. */
279
+ upstreamBranch: string | null
280
+ /** Default base branch discovered from the upstream remote, when available. */
281
+ baseBranch: string | null
282
+ remoteUrl: string | null
283
+ }
284
+
285
+ export interface GitConveyorCommitOptions {
286
+ message: string
287
+ }
288
+
289
+ export interface GitConveyorPullRequestOptions {
290
+ title: string
291
+ body: string
292
+ /** Optional explicit base branch; otherwise the upstream remote HEAD is used. */
293
+ base?: string
294
+ draft?: boolean
295
+ }
296
+
297
+ export interface GitConveyorPullRequestResult {
298
+ url: string | null
299
+ output: string
300
+ }
301
+
302
+ export interface PiStartOptions {
303
+ cwd?: string
304
+ model?: string
305
+ provider?: string
306
+ sessionPath?: string
307
+ noSession?: boolean
308
+ // When true (and neither sessionPath, forkSessionPath nor noSession is set),
309
+ // Pi is launched with --continue so it resumes the most recent session for
310
+ // the cwd instead of creating a fresh one.
311
+ continueSession?: boolean
312
+ // Start a new session by forking this existing Pi session file. The new
313
+ // session is created in the supplied cwd.
314
+ forkSessionPath?: string
315
+ /**
316
+ * Engine this one start must spawn, overriding the configured default. Each
317
+ * engine keeps its sessions in its own store, so a session can only be
318
+ * resumed by the engine that wrote it. Absent means "use the configured
319
+ * engine", which is what a brand-new session does.
320
+ */
321
+ engine?: AgentEngineKind
322
+ args?: string[]
323
+ env?: Record<string, string>
324
+ }
325
+
326
+ // ─── Terminal Types ─────────────────────────────────────────────────────────
327
+
328
+ export interface TerminalStartOptions {
329
+ cwd?: string
330
+ cols?: number
331
+ rows?: number
332
+ }
333
+
334
+ export interface TerminalStartResult {
335
+ pid: number
336
+ shell: string
337
+ cwd: string
338
+ }
339
+
340
+ export interface TerminalExitEvent {
341
+ exitCode: number
342
+ signal?: number
343
+ }
344
+
345
+ // ─── Pi RPC Event Types (subset used by renderer) ───────────────────────────
346
+
347
+ export interface PiAgentStartEvent {
348
+ type: 'agent_start'
349
+ }
350
+
351
+ export interface PiAgentEndEvent {
352
+ type: 'agent_end'
353
+ messages: unknown[]
354
+ }
355
+
356
+ export interface PiMessageUpdateEvent {
357
+ type: 'message_update'
358
+ message: Record<string, unknown>
359
+ assistantMessageEvent: {
360
+ type: string
361
+ contentIndex?: number
362
+ delta?: string
363
+ partial?: Record<string, unknown>
364
+ content?: string
365
+ thinking?: string
366
+ toolCall?: Record<string, unknown>
367
+ reason?: string
368
+ }
369
+ }
370
+
371
+ export interface PiToolExecutionStartEvent {
372
+ type: 'tool_execution_start'
373
+ toolCallId: string
374
+ toolName: string
375
+ args: Record<string, unknown>
376
+ }
377
+
378
+ export interface PiToolExecutionUpdateEvent {
379
+ type: 'tool_execution_update'
380
+ toolCallId: string
381
+ toolName: string
382
+ args: Record<string, unknown>
383
+ partialResult: {
384
+ content: Array<{ type: string; text?: string }>
385
+ details: Record<string, unknown>
386
+ }
387
+ }
388
+
389
+ export interface PiToolExecutionEndEvent {
390
+ type: 'tool_execution_end'
391
+ toolCallId: string
392
+ toolName: string
393
+ result: {
394
+ content: Array<{ type: string; text?: string }>
395
+ details: Record<string, unknown>
396
+ }
397
+ isError: boolean
398
+ }
399
+
400
+ export interface PiTurnStartEvent {
401
+ type: 'turn_start'
402
+ }
403
+
404
+ export interface PiTurnEndEvent {
405
+ type: 'turn_end'
406
+ message: Record<string, unknown>
407
+ toolResults: unknown[]
408
+ }
409
+
410
+ export interface PiQueueUpdateEvent {
411
+ type: 'queue_update'
412
+ steering: string[]
413
+ followUp: string[]
414
+ }
415
+
416
+ export interface PiCompactionStartEvent {
417
+ type: 'compaction_start'
418
+ reason: string
419
+ }
420
+
421
+ export interface PiCompactionEndEvent {
422
+ type: 'compaction_end'
423
+ reason: string
424
+ result: unknown
425
+ aborted: boolean
426
+ willRetry: boolean
427
+ errorMessage?: string
428
+ }
429
+
430
+ export interface PiAutoRetryStartEvent {
431
+ type: 'auto_retry_start'
432
+ attempt: number
433
+ maxAttempts: number
434
+ delayMs: number
435
+ errorMessage: string
436
+ }
437
+
438
+ export interface PiAutoRetryEndEvent {
439
+ type: 'auto_retry_end'
440
+ success: boolean
441
+ attempt: number
442
+ finalError?: string
443
+ }
444
+
445
+ export interface PiExtensionErrorEvent {
446
+ type: 'extension_error'
447
+ extensionPath: string
448
+ event: string
449
+ error: string
450
+ }
451
+
452
+ export interface PiResponseEvent {
453
+ type: 'response'
454
+ command: string
455
+ id?: string
456
+ success: boolean
457
+ error?: string
458
+ data?: unknown
459
+ }
460
+
461
+ // Extension UI events
462
+ export interface PiExtensionUiRequest {
463
+ type: 'extension_ui_request'
464
+ id: string
465
+ method: 'select' | 'confirm' | 'input' | 'editor' | 'notify' | 'setStatus' | 'setWidget' | 'setTitle' | 'set_editor_text' | 'open_url' | 'cancel'
466
+ title?: string
467
+ message?: string
468
+ options?: string[]
469
+ placeholder?: string
470
+ prefill?: string
471
+ notifyType?: 'info' | 'warning' | 'error'
472
+ statusKey?: string
473
+ statusText?: string
474
+ widgetKey?: string
475
+ widgetLines?: string[]
476
+ widgetPlacement?: string
477
+ timeout?: number
478
+ url?: string
479
+ launchUrl?: string
480
+ instructions?: string
481
+ targetId?: string
482
+ }
483
+
484
+ /**
485
+ * Blocking extension-UI prompts held in the main process, keyed by workspace
486
+ * id. Zero entries are omitted, so an empty object means nothing is waiting.
487
+ */
488
+ export type PendingPromptCounts = Record<string, number>
489
+
490
+ /**
491
+ * Per-workspace background activity derived in the main process from every
492
+ * workspace's Pi events (the renderer only receives streamed events for the
493
+ * active workspace, so it cannot derive this itself).
494
+ */
495
+ export type WorkspaceActivityState = 'working' | 'needs-approval' | 'completed' | 'failed'
496
+
497
+ export interface WorkspaceActivity {
498
+ state: WorkspaceActivityState
499
+ /** Epoch ms when the workspace entered this state. */
500
+ since: number
501
+ }
502
+
503
+ /** Keyed by workspace id; idle workspaces are omitted. */
504
+ export type WorkspaceActivityMap = Record<string, WorkspaceActivity>
505
+
506
+ /** Target carried by a desktop-notification click. */
507
+ export interface WorkspaceActivationIntent {
508
+ workspaceId: string
509
+ sessionPath?: string
510
+ runtimeId?: string
511
+ }
512
+
513
+ // ─── Workflow monitoring ────────────────────────────────────────────────────
514
+
515
+ export type WorkflowRunStatus = 'pending' | 'running' | 'paused' | 'completed' | 'failed' | 'aborted' | 'unknown'
516
+ export type WorkflowAgentStatus = 'queued' | 'running' | 'done' | 'error' | 'skipped'
517
+
518
+ export interface WorkflowAgentSummary {
519
+ id: number
520
+ callId?: string
521
+ label: string
522
+ phase?: string
523
+ status: WorkflowAgentStatus
524
+ error?: string
525
+ errorCode?: string
526
+ recoverable?: boolean
527
+ hasHistory: boolean
528
+ resultPreview?: string
529
+ tokens?: number
530
+ model?: string
531
+ startedAt?: string
532
+ endedAt?: string
533
+ tokenUsage?: {
534
+ input: number
535
+ output: number
536
+ total: number
537
+ cost?: number
538
+ cacheRead?: number
539
+ cacheWrite?: number
540
+ }
541
+ }
542
+
543
+ /**
544
+ * Control action dispatched to the run's owning workspace Pi process. `stop`
545
+ * maps to the extension's `/workflows stop <id>` (marks the run aborted),
546
+ * `resume` to `/workflows resume <id>` (paused/failed/pending only).
547
+ */
548
+ export type WorkflowControlAction = 'stop' | 'resume'
549
+
550
+ export type WorkflowControlReason =
551
+ | 'no-pi'
552
+ | 'pi-not-running'
553
+ | 'extension-missing'
554
+ | 'status-not-permitted'
555
+ | 'dispatch-failed'
556
+ | 'timeout'
557
+
558
+ /** Result of a workflow control dispatch (never a fake local status change). */
559
+ export interface WorkflowControlResult {
560
+ action: WorkflowControlAction
561
+ runId: string
562
+ ok: boolean
563
+ reason?: WorkflowControlReason
564
+ /** True only when the extension command was actually handed to Pi. */
565
+ dispatched?: boolean
566
+ }
567
+
568
+ /** Safe, renderer-sized projection of a dynamic-workflow persisted run. */
569
+ export interface WorkflowRunSummary {
570
+ workspaceId: string
571
+ workspaceName: string
572
+ cwd: string
573
+ runId: string
574
+ workflowName: string
575
+ sessionId?: string
576
+ status: WorkflowRunStatus
577
+ pauseReason?: string
578
+ resetHint?: string
579
+ phases: string[]
580
+ currentPhase?: string
581
+ agents: WorkflowAgentSummary[]
582
+ startedAt: string
583
+ updatedAt: string
584
+ durationMs?: number
585
+ tokenUsage?: {
586
+ input: number
587
+ output: number
588
+ total: number
589
+ cost?: number
590
+ cacheRead?: number
591
+ cacheWrite?: number
592
+ }
593
+ }
594
+
595
+ export interface WorkflowHistoryEntry {
596
+ id?: string
597
+ timestamp?: string
598
+ role: string
599
+ kind: string
600
+ text: string
601
+ toolName?: string
602
+ path?: string
603
+ diff?: string
604
+ isError?: boolean
605
+ }
606
+
607
+ export interface WorkflowAgentDetail extends WorkflowAgentSummary {
608
+ prompt?: string
609
+ resultText?: string
610
+ history: WorkflowHistoryEntry[]
611
+ transcriptSource: 'persisted-session' | 'run-history' | 'none'
612
+ transcriptComplete: boolean
613
+ }
614
+
615
+ /** Lazy-loaded detail for one run; large fields never travel in list polling. */
616
+ export interface WorkflowRunDetail extends WorkflowRunSummary {
617
+ script?: string
618
+ argsText?: string
619
+ resultText?: string
620
+ logs: string[]
621
+ agents: WorkflowAgentDetail[]
622
+ }
623
+
624
+ export interface PiMessageStartEvent {
625
+ type: 'message_start'
626
+ message: Record<string, unknown>
627
+ }
628
+
629
+ export interface PiMessageEndEvent {
630
+ type: 'message_end'
631
+ message: Record<string, unknown>
632
+ }
633
+
634
+ export interface PiStatusChangeEvent {
635
+ type: 'status_change'
636
+ status: PiProcessStatus
637
+ pid: number | null
638
+ error: string | null
639
+ engine?: AgentEngineKind
640
+ startupPhase?: PiStartupPhase
641
+ }
642
+
643
+ // Emitted by Pi when the session title changes — e.g. an auto-title extension,
644
+ // the `/name` command, or our own rename. `name` is the new title (null/empty
645
+ // when cleared).
646
+ export interface PiSessionInfoChangedEvent {
647
+ type: 'session_info_changed'
648
+ name?: string | null
649
+ }
650
+
651
+ /** OMP's RPC spelling for a live session title update. */
652
+ export interface PiSessionInfoUpdateEvent {
653
+ type: 'session_info_update'
654
+ title?: string | null
655
+ sessionId?: string
656
+ }
657
+
658
+ /** OMP emits this when its slash-command catalog changes. */
659
+ export interface PiAvailableCommandsUpdateEvent {
660
+ type: 'available_commands_update'
661
+ commands: unknown[]
662
+ }
663
+
664
+ /** Output from a local-only OMP slash command. */
665
+ export interface PiCommandOutputEvent {
666
+ type: 'command_output'
667
+ text: string
668
+ }
669
+
670
+ /** Completion signal for an accepted prompt that did not invoke the agent. */
671
+ export interface PiPromptResultEvent {
672
+ type: 'prompt_result'
673
+ id?: string
674
+ agentInvoked: boolean
675
+ }
676
+
677
+ /** OMP config changes that should cause the renderer to re-read get_state. */
678
+ export interface PiConfigUpdateEvent {
679
+ type: 'config_update'
680
+ model?: unknown
681
+ thinkingLevel?: string
682
+ }
683
+
684
+ export type PiRpcEvent =
685
+ | PiAgentStartEvent
686
+ | PiAgentEndEvent
687
+ | PiMessageStartEvent
688
+ | PiMessageUpdateEvent
689
+ | PiMessageEndEvent
690
+ | PiToolExecutionStartEvent
691
+ | PiToolExecutionUpdateEvent
692
+ | PiToolExecutionEndEvent
693
+ | PiTurnStartEvent
694
+ | PiTurnEndEvent
695
+ | PiQueueUpdateEvent
696
+ | PiCompactionStartEvent
697
+ | PiCompactionEndEvent
698
+ | PiAutoRetryStartEvent
699
+ | PiAutoRetryEndEvent
700
+ | PiExtensionErrorEvent
701
+ | PiResponseEvent
702
+ | PiExtensionUiRequest
703
+ | PiStatusChangeEvent
704
+ | PiSessionInfoChangedEvent
705
+ | PiSessionInfoUpdateEvent
706
+ | PiAvailableCommandsUpdateEvent
707
+ | PiCommandOutputEvent
708
+ | PiPromptResultEvent
709
+ | PiConfigUpdateEvent
710
+
711
+ // ─── Model Types ────────────────────────────────────────────────────────────
712
+
713
+ export interface ModelInfo {
714
+ id: string
715
+ name: string
716
+ api: string
717
+ provider: string
718
+ baseUrl: string
719
+ reasoning: boolean
720
+ input: string[]
721
+ contextWindow: number
722
+ maxTokens: number
723
+ cost: {
724
+ input: number
725
+ output: number
726
+ cacheRead: number
727
+ cacheWrite: number
728
+ }
729
+ /** OMP exposes the effort values supported by the active model. */
730
+ thinking?: {
731
+ mode?: string
732
+ efforts?: string[]
733
+ }
734
+ }
735
+
736
+ // ─── Session Types ──────────────────────────────────────────────────────────
737
+
738
+ export interface SessionState {
739
+ model: ModelInfo | null
740
+ thinkingLevel: string
741
+ isStreaming: boolean
742
+ isCompacting: boolean
743
+ steeringMode: string
744
+ followUpMode: string
745
+ sessionFile: string | null
746
+ sessionId: string
747
+ sessionName: string | null
748
+ autoCompactionEnabled: boolean
749
+ messageCount: number
750
+ pendingMessageCount: number
751
+ }
752
+
753
+ export interface SessionStats {
754
+ sessionFile: string | null
755
+ sessionId: string
756
+ userMessages: number
757
+ assistantMessages: number
758
+ toolCalls: number
759
+ toolResults: number
760
+ totalMessages: number
761
+ tokens: {
762
+ input: number
763
+ output: number
764
+ cacheRead: number
765
+ cacheWrite: number
766
+ total: number
767
+ }
768
+ cost: number
769
+ contextUsage: {
770
+ tokens: number | null
771
+ contextWindow: number
772
+ percent: number | null
773
+ } | null
774
+ }
775
+
776
+ export interface SessionListItem {
777
+ path: string
778
+ name: string | null
779
+ /** Preview of the session's first user message, or null if it has none. */
780
+ preview: string | null
781
+ /** `empty` is provably header-only; `unknown` must remain recoverable. */
782
+ contentState?: 'empty' | 'non-empty' | 'unknown'
783
+ /** Filename stem used by GUI registries (tags/archive), e.g. timestamp_uuid. */
784
+ sessionId: string
785
+ /** Pi's header UUID, used to correlate workflow runs with this session. */
786
+ piSessionId?: string
787
+ /**
788
+ * Engine that owns this session, taken from the store the file was indexed
789
+ * from. Optional because a row the index could not classify must stay
790
+ * listable; consumers show no engine tag rather than guessing one.
791
+ */
792
+ engine?: AgentEngineKind
793
+ lastModified: number
794
+ messageCount: number
795
+ projectPath: string
796
+ projectName: string
797
+ }
798
+
799
+ // Used by the heatmap grid helper (buildWeeks / intensityLevel).
800
+ export interface ActivityDay {
801
+ date: string // local calendar day, YYYY-MM-DD
802
+ count: number // activity count on that day
803
+ }
804
+
805
+ // ─── Activity stats (persisted, survives session deletion) ────────────────────
806
+
807
+ export interface ActivityStatsDay {
808
+ date: string // local calendar day, YYYY-MM-DD
809
+ messages: number // all `type === 'message'` records that day
810
+ tokens: number // assistant input + output tokens that day (all models)
811
+ tokensByModel: Record<string, number> // model id -> input + output that day
812
+ }
813
+
814
+ export interface ActivityModelUsage {
815
+ model: string // stable model id (e.g. "claude-opus-4-8", "ornith-1.0-35b@q6_k")
816
+ name: string | null // latest display name from models.json; null → fall back to id
817
+ input: number
818
+ output: number
819
+ }
820
+
821
+ export interface ActivityRangeStats {
822
+ sessions: number // distinct sessions with activity in the range
823
+ messages: number
824
+ totalTokens: number // input + output across all models
825
+ activeDays: number
826
+ currentStreak: number // consecutive active days ending today (capped by range)
827
+ longestStreak: number
828
+ peakHour: number | null // busiest local hour 0..23, or null if no activity
829
+ models: ActivityModelUsage[] // descending by input + output
830
+ }
831
+
832
+ // Range keys are trailing-day counts: 365 ("1y"), 180 ("6mo"), 90 ("3mo"), 30, 7.
833
+ export type ActivityRangeKey = '365' | '180' | '90' | '30' | '7'
834
+
835
+ export interface ActivityStatsResult {
836
+ days: ActivityStatsDay[] // ascending, length === WINDOW_DAYS, zero-filled
837
+ ranges: Record<ActivityRangeKey, ActivityRangeStats>
838
+ }
839
+
840
+ export interface AutoTagSessionRef {
841
+ sessionId: string
842
+ path: string
843
+ }
844
+
845
+ export interface SessionDeleteResult {
846
+ ok: boolean
847
+ method: 'trash' | 'unlink'
848
+ error?: string
849
+ /**
850
+ * Session promoted to active while the deleted session's runtime was closed,
851
+ * if one existed. The renderer opens it instead of creating a new session,
852
+ * which would spawn a third runtime and steal activation from this one.
853
+ */
854
+ replacementSessionPath?: string | null
855
+ }
856
+
857
+ export type ArchivedSessionsMap = Record<string, number>
858
+
859
+ // File extensions Pi accepts as inline images (matches Pi's RPC image support).
860
+ export const SUPPORTED_IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif', 'webp'] as const
861
+
862
+ /** A single image attachment in the shape Pi's RPC `prompt` command expects. */
863
+ export interface PromptImage {
864
+ type: 'image'
865
+ mimeType: string
866
+ /** Base64-encoded image bytes (no data: URI prefix). */
867
+ data: string
868
+ }
869
+
870
+ /**
871
+ * Result of reading a user-selected attachment. Images are returned as a
872
+ * Pi-ready `PromptImage`; everything else is read as UTF-8 text to inline.
873
+ */
874
+ export type AttachmentReadResult =
875
+ | { kind: 'image'; name: string; image: PromptImage }
876
+ | { kind: 'text'; name: string; content: string }
877
+
878
+ /** Options for the native open dialog. Defaults to picking a directory. */
879
+ export interface OpenDialogOptions {
880
+ title?: string
881
+ mode?: 'file' | 'directory' | 'either'
882
+ filters?: Array<{ name: string; extensions: string[] }>
883
+ }
884
+
885
+ /** Result of SYSTEM_PATH_KIND (drag-drop folder open). */
886
+ export interface PathKindResult {
887
+ exists: boolean
888
+ isDirectory: boolean
889
+ }
890
+
891
+ export type { SessionLineageRecord } from './session-lineage'
892
+ export type { ModelsConfig, ProviderConfig, CustomModel } from './models-config'
893
+ export type {
894
+ CouncilConfig,
895
+ CouncilAgentId,
896
+ ConsensusMode,
897
+ ConsultantResult,
898
+ ConsultantStatus,
899
+ } from './council-config'
900
+
901
+ import type { CouncilAgentId as CouncilAgentIdType, ConsultantResult as ConsultantResultType } from './council-config'
902
+
903
+ /** Result of COUNCIL_DETECT. */
904
+ export interface CouncilDetectResult {
905
+ agents: Array<{ id: CouncilAgentIdType; found: boolean }>
906
+ }
907
+
908
+ /**
909
+ * Request payload for COUNCIL_RUN_CONSULTANTS. The working directory is NOT
910
+ * part of the payload: the main process resolves it from the active workspace,
911
+ * so consultants always run against the real project tree.
912
+ */
913
+ export interface CouncilRunRequest {
914
+ request: string
915
+ members: CouncilAgentIdType[]
916
+ timeoutSeconds: number
917
+ consensusMode: 'arbiter' | 'debate'
918
+ }
919
+
920
+ /** Result of COUNCIL_RUN_CONSULTANTS. */
921
+ export interface CouncilRunResult {
922
+ results: ConsultantResultType[]
923
+ }
924
+
925
+ /**
926
+ * Request payload for COUNCIL_ARBITER. Pi merges (`merge`) or revises (`revise`)
927
+ * the consensus plan in an isolated read-only subprocess. As with
928
+ * COUNCIL_RUN_CONSULTANTS, the working directory is resolved from the active
929
+ * workspace in the main process, never from the renderer.
930
+ */
931
+ export type CouncilArbiterRequest =
932
+ | { kind: 'merge'; request: string; results: ConsultantResultType[]; timeoutSeconds: number }
933
+ | { kind: 'revise'; request: string; plan: string; feedback: string; timeoutSeconds: number }
934
+
935
+ /** Result of COUNCIL_ARBITER: the merged or revised consensus plan text. */
936
+ export interface CouncilArbiterResult {
937
+ plan: string
938
+ }
939
+
940
+ /**
941
+ * Streamed live during a council run (main → renderer on EVENT_COUNCIL_PROGRESS).
942
+ * `chunk` is human-readable text appended to the consultant's live output:
943
+ * raw stdout for Codex, parsed text deltas for Claude.
944
+ */
945
+ export interface CouncilProgressEvent {
946
+ id: CouncilAgentIdType
947
+ chunk: string
948
+ }
949
+
950
+ import type { ModelsConfig as ModelsConfigType } from './models-config'
951
+ import type { CouncilConfig } from './council-config'
952
+ /** Result of the MODELS_READ IPC call. */
953
+ /**
954
+ * Where the custom-models config was read from. Main resolves the engine and
955
+ * file; the editor shows exactly this so its labels never name a file the save
956
+ * will not touch.
957
+ */
958
+ export interface ModelsFileInfo {
959
+ engine: AgentEngineKind
960
+ /** Absolute path of the file read (and written on save). */
961
+ file: string
962
+ /** Basename, for labels ("Save models.yml"). */
963
+ name: string
964
+ }
965
+
966
+ /** Why the models file could not be used. Display text is built from this. */
967
+ export type ModelsReadFailure =
968
+ | { kind: 'unreadable'; detail: string }
969
+ | { kind: 'invalid-syntax'; format: 'json' | 'yaml'; detail: string }
970
+ | { kind: 'missing-providers' }
971
+
972
+ export type ModelsReadResult =
973
+ | { config: ModelsConfigType; location: ModelsFileInfo }
974
+ | { error: string; failure: ModelsReadFailure; raw: string; location: ModelsFileInfo }
975
+
976
+ // ─── Agent Message Types ────────────────────────────────────────────────────
977
+
978
+ export interface AgentTextContent {
979
+ type: 'text'
980
+ text: string
981
+ }
982
+
983
+ export interface AgentThinkingContent {
984
+ type: 'thinking'
985
+ thinking: string
986
+ }
987
+
988
+ export interface AgentToolCallContent {
989
+ type: 'toolCall'
990
+ id: string
991
+ name: string
992
+ arguments: Record<string, unknown>
993
+ }
994
+
995
+ export type AgentContentBlock = AgentTextContent | AgentThinkingContent | AgentToolCallContent
996
+
997
+ export interface AgentUserMessage {
998
+ role: 'user'
999
+ content: string | AgentContentBlock[]
1000
+ timestamp: number
1001
+ attachments?: unknown[]
1002
+ id?: string
1003
+ parentId?: string
1004
+ }
1005
+
1006
+ export interface AgentAssistantMessage {
1007
+ role: 'assistant'
1008
+ content: AgentContentBlock[]
1009
+ api: string
1010
+ provider: string
1011
+ model: string
1012
+ usage: {
1013
+ input: number
1014
+ output: number
1015
+ cacheRead: number
1016
+ cacheWrite: number
1017
+ cost: {
1018
+ input: number
1019
+ output: number
1020
+ cacheRead: number
1021
+ cacheWrite: number
1022
+ total: number
1023
+ }
1024
+ }
1025
+ stopReason: string
1026
+ timestamp: number
1027
+ id?: string
1028
+ parentId?: string
1029
+ }
1030
+
1031
+ export interface AgentToolResultMessage {
1032
+ role: 'toolResult'
1033
+ toolCallId: string
1034
+ toolName: string
1035
+ content: Array<{ type: string; text?: string }>
1036
+ isError: boolean
1037
+ timestamp: number
1038
+ id?: string
1039
+ parentId?: string
1040
+ }
1041
+
1042
+ export type AgentMessage = AgentUserMessage | AgentAssistantMessage | AgentToolResultMessage
1043
+
1044
+ // ─── Settings Types ─────────────────────────────────────────────────────────
1045
+
1046
+ export type PermissionMode = 'plan-readonly' | 'ask-edits' | 'ask-commands' | 'trusted'
1047
+
1048
+ export type { PermissionRule, PermissionRuleAction, PermissionRulesFile } from '../../resources/permission-rules'
1049
+
1050
+ export type PermissionRulesScope = 'global' | 'workspace'
1051
+
1052
+ export type PermissionRulesGetResult =
1053
+ | { ok: true; rules: PermissionRule[]; exists: boolean }
1054
+ | { ok: false; error: string }
1055
+
1056
+ export type PermissionRulesSetResult = { ok: true } | { ok: false; error: string }
1057
+
1058
+ export type PermissionRulesRemoveResult = { ok: true } | { ok: false; error: string }
1059
+
1060
+ export type PermissionRulesImportResult =
1061
+ | { ok: true; rules: PermissionRule[] }
1062
+ | { ok: false; canceled?: boolean; error?: string }
1063
+
1064
+ export type PermissionRulesExportResult =
1065
+ | { ok: true }
1066
+ | { ok: false; canceled?: boolean; error?: string }
1067
+
1068
+ export interface PermissionRulesWorkspaceStatus {
1069
+ hasWorkspaceRules: boolean
1070
+ workspacePath: string | null
1071
+ acknowledged: boolean
1072
+ // Whether the user has trusted this workspace (so its allow rules apply).
1073
+ trusted: boolean
1074
+ // Whether the workspace rules file actually contains any allow rules — the
1075
+ // only case where trust changes behavior.
1076
+ hasAllowRules: boolean
1077
+ }
1078
+
1079
+ /** A concrete engine. `auto` is a preference, never something that is running. */
1080
+ export type AgentEngineKind = 'pi' | 'omp'
1081
+
1082
+ export type AgentEngine = 'auto' | AgentEngineKind
1083
+
1084
+ export interface AgentInstallation {
1085
+ kind: AgentEngineKind
1086
+ path: string
1087
+ source: string
1088
+ }
1089
+
1090
+ export interface AgentInstallationsResult {
1091
+ installations: AgentInstallation[]
1092
+ }
1093
+
1094
+ /**
1095
+ * How a detection request treats the main process's installation cache. Main
1096
+ * caches results, so a user-initiated Rescan has to ask for a fresh disk walk
1097
+ * or it silently returns the same list it already showed.
1098
+ */
1099
+ export interface AgentDetectionOptions {
1100
+ force?: boolean
1101
+ }
1102
+
1103
+ export interface AppSettings {
1104
+ piExecutablePath: string
1105
+ /** Explicit engine identity; auto preserves legacy Pi/OMP detection. */
1106
+ piEngine: AgentEngine
1107
+ defaultArgs: string[]
1108
+ theme: string // 'system' or a theme id (built-in or user theme)
1109
+ // Themes 'system' switches between when the OS prefers light or dark. Each
1110
+ // must be a theme of the matching kind; otherwise the built-in default for
1111
+ // that slot is used.
1112
+ systemLightTheme: string
1113
+ systemDarkTheme: string
1114
+ defaultModel: string | null
1115
+ defaultProvider: string | null
1116
+ defaultCwd: string | null
1117
+ // UI font size in px (chat, panels, sidebar). Applied to the document root.
1118
+ fontSize: number
1119
+ // Terminal (xterm) font size in px — independent of the UI font size.
1120
+ terminalFontSize: number
1121
+ // Code editor (CodeMirror) font size in px — independent of the UI font size.
1122
+ codeEditorFontSize: number
1123
+ showThinking: boolean
1124
+ autoScroll: boolean
1125
+ permissionMode: PermissionMode
1126
+ // Workspace paths whose "this workspace has its own permission rules"
1127
+ // notice has been acknowledged. Not exposed in the Settings UI.
1128
+ permissionRulesAckWorkspaces: string[]
1129
+ // Resume the most recent session for the workspace on launch (via Pi's
1130
+ // --continue) instead of starting a fresh session.
1131
+ resumeLastSession: boolean
1132
+ // Project paths whose session group is collapsed in the Sessions panel.
1133
+ // Persisted so the collapsed/expanded layout survives navigation and restarts.
1134
+ collapsedSessionGroups: string[]
1135
+ /** Sidebar width in pixels; clamped by `clampSidebarWidth` on read. */
1136
+ sidebarWidth: number
1137
+ // Show the Home/launcher screen on launch (Pi starts lazily on first action)
1138
+ // instead of booting straight into Chat. When false, boot into Chat (empty
1139
+ // chat is the Codex-style center prompt with project picker).
1140
+ openToHomeOnLaunch: boolean
1141
+ // Launch Sessrúmnir automatically when the user logs in to their computer.
1142
+ // Applied at the OS level: login items on macOS/Windows, a freedesktop
1143
+ // autostart entry on Linux. Only effective in packaged builds.
1144
+ runOnStartup: boolean
1145
+ // Hide the window to the system tray when closed instead of quitting, keeping
1146
+ // the app running in the background. Windows/Linux only; on macOS the window
1147
+ // close already keeps the app alive in the Dock (native equivalent).
1148
+ minimizeToTrayOnClose: boolean
1149
+ // Internal: whether the one-time "still running in the tray" hint has been
1150
+ // shown. Not exposed in the Settings UI.
1151
+ hasSeenTrayHint: boolean
1152
+ // Show OS desktop notifications when a turn finishes, fails, or waits for
1153
+ // approval in a workspace the user is not currently looking at.
1154
+ desktopNotifications: boolean
1155
+ // Interface language: 'system' (follow the OS language list) or a bundled
1156
+ // language code. Unknown values reset to 'system' on load.
1157
+ language: string
1158
+ // Multi-agent council planning configuration.
1159
+ council: CouncilConfig
1160
+ }
1161
+
1162
+ /** What the renderer needs to resolve the `language` setting like main does. */
1163
+ export interface I18nEnvironment {
1164
+ systemLanguages: string[]
1165
+ pseudoLanguageEnabled: boolean
1166
+ }
1167
+
1168
+ // ─── Update Check Types ─────────────────────────────────────────────────────
1169
+
1170
+ /** Result of checking GitHub releases for a newer version. */
1171
+ export interface UpdateCheckResult {
1172
+ updateAvailable: boolean
1173
+ currentVersion: string
1174
+ latestVersion: string
1175
+ // Release page URL to open for downloading; empty when the check failed.
1176
+ url: string
1177
+ // Release name/title, when available.
1178
+ name?: string
1179
+ }
1180
+
1181
+ // ─── Workspace Types ────────────────────────────────────────────────────────
1182
+
1183
+ export type WorkspaceKind = 'folder' | 'worktree'
1184
+
1185
+ /** Options for creating an isolated tab from the active Git workspace. */
1186
+ export interface WorkspaceTabOptions {
1187
+ name?: string
1188
+ sourceWorkspaceId?: string
1189
+ /** Optional Pi session to fork into the new worktree. */
1190
+ forkSessionPath?: string
1191
+ /** Original task text used to reuse the same worktree on a later launch. */
1192
+ taskPrompt?: string
1193
+ /** Skip the default runtime when another action will launch a task there. */
1194
+ startPi?: boolean
1195
+ }
1196
+
1197
+ /** Result of closing a workspace tab. Dirty worktrees are preserved. */
1198
+ export interface WorkspaceRemoveResult {
1199
+ worktreeRemoved?: boolean
1200
+ preservedWorktreePath?: string
1201
+ }
1202
+
1203
+ export interface Workspace {
1204
+ id: string
1205
+ name: string
1206
+ path: string
1207
+ createdAt: number
1208
+ lastActiveAt: number
1209
+ color: string
1210
+ /** Optional for backward compatibility with older workspaces.json files. */
1211
+ kind?: WorkspaceKind
1212
+ /** Main repository root for managed worktrees. */
1213
+ repoRoot?: string
1214
+ /** Branch checked out by a managed worktree. */
1215
+ branch?: string
1216
+ /** Commit used as the worktree base. */
1217
+ baseRef?: string
1218
+ /** The source tab had local changes that were intentionally not copied. */
1219
+ sourceWasDirty?: boolean
1220
+ /** False for an existing user worktree adopted by the app; never delete it on close. */
1221
+ managed?: boolean
1222
+ /** Original task text when the app created or adopted this worktree. */
1223
+ taskPrompt?: string
1224
+ }
1225
+
1226
+ // ─── Notes Types ────────────────────────────────────────────────────────────
1227
+
1228
+ /**
1229
+ * Scope of a note. Either the literal `'global'` (available everywhere) or a
1230
+ * workspace id (only surfaced when that workspace is active). Stored as a
1231
+ * single field so all notes live in one store and the UI merges by scope.
1232
+ */
1233
+ export type NoteScope = 'global' | string
1234
+
1235
+ /** A reusable prompt or agent command the user has saved. */
1236
+ export interface Note {
1237
+ id: string
1238
+ title: string
1239
+ body: string
1240
+ tags: string[]
1241
+ scope: NoteScope
1242
+ createdAt: number
1243
+ updatedAt: number
1244
+ }
1245
+
1246
+ /** Fields supplied when creating a note. */
1247
+ export interface NoteInput {
1248
+ title: string
1249
+ body: string
1250
+ tags: string[]
1251
+ scope: NoteScope
1252
+ }
1253
+
1254
+ /** Mutable fields when updating a note. */
1255
+ export type NoteUpdate = Partial<NoteInput>
1256
+
1257
+ // ─── Theme Types ────────────────────────────────────────────────────────────
1258
+
1259
+ import type { ThemeFile } from './theme/theme-file'
1260
+
1261
+ /** A user-created theme as stored on disk, keyed by its file-derived id. */
1262
+ export interface UserThemeRecord {
1263
+ id: string
1264
+ file: ThemeFile
1265
+ }
1266
+
1267
+ /** Result of listing user themes; `warnings` reports files that failed validation. */
1268
+ export interface ThemesListResult {
1269
+ themes: UserThemeRecord[]
1270
+ warnings: string[]
1271
+ }
1272
+
1273
+ /**
1274
+ * Result of an operation that produces (or fails to produce) a saved theme:
1275
+ * installing from a URL, or importing from a file. `canceled` distinguishes a
1276
+ * user-initiated dialog cancellation from a genuine error.
1277
+ */
1278
+ export type ThemeImportResult =
1279
+ | { ok: true; theme: UserThemeRecord }
1280
+ | { ok: false; error: string }
1281
+ | { ok: false; canceled: true }
1282
+
1283
+ export type ThemeExportResult =
1284
+ | { ok: true }
1285
+ | { ok: false; error: string }
1286
+ | { ok: false; canceled: true }
1287
+
1288
+ export interface GalleryTheme {
1289
+ name: string
1290
+ kind: 'dark' | 'light'
1291
+ url: string
1292
+ author?: string
1293
+ description?: string
1294
+ // Full validated theme content embedded in the gallery index, used to
1295
+ // render a live preview card without fetching each theme file. Absent when
1296
+ // the index predates embedding; the card then renders without a preview.
1297
+ theme?: ThemeFile
1298
+ // Optional author-provided screenshot URL (pinned to the gallery repo). The
1299
+ // renderer fetches it lazily via THEMES_GALLERY_IMAGE, which returns a data
1300
+ // URI (the renderer CSP forbids remote images).
1301
+ screenshotUrl?: string
1302
+ }
1303
+
1304
+ export type ThemeGalleryResult =
1305
+ | { ok: true; themes: GalleryTheme[] }
1306
+ | { ok: false; error: string }
1307
+
1308
+ export type ThemeGalleryImageResult =
1309
+ | { ok: true; dataUri: string }
1310
+ | { ok: false; error: string }
1311
+
1312
+ // ─── Package Types ──────────────────────────────────────────────────────────
1313
+
1314
+ export interface InstalledPackage {
1315
+ name: string
1316
+ source: string
1317
+ type: 'extension' | 'skill' | 'prompt' | 'theme' | 'package'
1318
+ version: string | null
1319
+ path: string
1320
+ }
1321
+
1322
+ /** An installed package with a newer registry version; `source` matches its InstalledPackage. */
1323
+ export interface PackageUpdate {
1324
+ source: string
1325
+ installedVersion: string
1326
+ latestVersion: string
1327
+ }
1328
+
1329
+ export interface CatalogPackage {
1330
+ name: string
1331
+ description: string
1332
+ author: string
1333
+ type: string
1334
+ downloads: number
1335
+ downloadsDisplay: string
1336
+ updatedAt: string
1337
+ npmUrl: string | null
1338
+ repoUrl: string | null
1339
+ installCommand: string
1340
+ }
1341
+
1342
+ // ─── Skill Types ────────────────────────────────────────────────────────────
1343
+
1344
+ export interface InstalledSkill {
1345
+ name: string
1346
+ description: string
1347
+ path: string
1348
+ source: 'global' | 'project' | 'package' | 'cli'
1349
+ enabled: boolean
1350
+ }
1351
+
1352
+ /**
1353
+ * Path prefix marking a skill known only from the running engine's command
1354
+ * catalog (plugin/marketplace skills without a SKILL.md file the GUI can
1355
+ * read). The skills panel shows the description instead of file content.
1356
+ */
1357
+ export const RPC_SKILL_PATH_PREFIX = 'rpc:'
1358
+
1359
+ /** True when the skill has no SKILL.md on disk (catalog-only entry). */
1360
+ export function isRpcSkillPath(path: string): boolean {
1361
+ return path.startsWith(RPC_SKILL_PATH_PREFIX)
1362
+ }
1363
+
1364
+ // ─── App Log Types ──────────────────────────────────────────────────────────
1365
+
1366
+ /**
1367
+ * One entry in the main-process application log. Persisted as JSONL in the GUI
1368
+ * data dir and mirrored in a bounded in-memory ring for the diagnostics view.
1369
+ */
1370
+ export interface AppLogEntry {
1371
+ /** Epoch ms when the entry was recorded. */
1372
+ ts: number
1373
+ level: 'info' | 'warn' | 'error'
1374
+ /** Short subsystem tag, e.g. 'pi', 'git', 'settings'. */
1375
+ scope: string
1376
+ message: string
1377
+ /** Optional stringified error / extra context. */
1378
+ detail?: string
1379
+ }
1380
+
1381
+ // ─── Diagnostics Types ──────────────────────────────────────────────────────
1382
+
1383
+ export interface DiagnosticsWorkspaceInfo {
1384
+ id: string
1385
+ name: string
1386
+ path: string
1387
+ pathExists: boolean
1388
+ trusted: boolean
1389
+ piStatus: PiProcessStatus
1390
+ }
1391
+
1392
+ /**
1393
+ * How a provider's apiKey field resolves: a literal secret, an environment
1394
+ * variable that is present/absent, a shell command (never evaluated here), or
1395
+ * nothing configured.
1396
+ */
1397
+ export type ProviderKeyState = 'literal' | 'env-set' | 'env-missing' | 'shell' | 'none'
1398
+
1399
+ export interface DiagnosticsProviderInfo {
1400
+ name: string
1401
+ modelCount: number
1402
+ keyState: ProviderKeyState
1403
+ /** The environment variable name when keyState is env-set / env-missing. */
1404
+ envVar?: string
1405
+ }
1406
+
1407
+ /** Where a resolved Pi path came from, for logging and error messaging. */
1408
+ export type PiResolutionSource =
1409
+ | 'override'
1410
+ | 'npm-prefix'
1411
+ | 'path'
1412
+ | 'version-manager'
1413
+ | 'common-location'
1414
+ | 'omp'
1415
+ | 'fallback'
1416
+
1417
+ /** Everything the Diagnostics view shows, assembled in one main-side pass. */
1418
+ export interface DiagnosticsReport {
1419
+ generatedAt: number
1420
+ app: {
1421
+ version: string
1422
+ electron: string
1423
+ chrome: string
1424
+ node: string
1425
+ platform: string
1426
+ }
1427
+ piBinary: {
1428
+ found: boolean
1429
+ script: string
1430
+ source: PiResolutionSource
1431
+ useNode: boolean
1432
+ nodeBinary: string
1433
+ nodeFound: boolean
1434
+ needsShell: boolean
1435
+ rejectedOverride: string | null
1436
+ failureReason: string | null
1437
+ /** Entries on the merged (login-shell-aware) PATH used to find Pi. */
1438
+ pathEntryCount: number
1439
+ }
1440
+ /** `pi --version` output (first line), or null when it could not run. */
1441
+ piVersion: string | null
1442
+ workspaces: DiagnosticsWorkspaceInfo[]
1443
+ /** Null when models.json is missing or unreadable — see providersError. */
1444
+ providers: DiagnosticsProviderInfo[] | null
1445
+ providersError: string | null
1446
+ permissions: {
1447
+ mode: PermissionMode
1448
+ /** Rule count in the global file; null when the file is invalid. */
1449
+ globalRuleCount: number | null
1450
+ globalRulesError: string | null
1451
+ workspace: PermissionRulesWorkspaceStatus
1452
+ }
1453
+ storage: {
1454
+ guiDataDir: string
1455
+ settingsPath: string
1456
+ sessionsRoot: string
1457
+ sessionsRootExists: boolean
1458
+ }
1459
+ recentErrors: AppLogEntry[]
1460
+ }
1461
+
1462
+ // ─── File Types ────────────────────────────────────────────────────────────
1463
+
1464
+ export interface FileTreeNode {
1465
+ name: string
1466
+ path: string
1467
+ relativePath: string
1468
+ type: 'file' | 'directory'
1469
+ children?: FileTreeNode[]
1470
+ gitStatus?: GitFileStatus
1471
+ }
1472
+
1473
+ export interface GitFileStatus {
1474
+ index: string
1475
+ worktree: string
1476
+ isStaged: boolean
1477
+ }
1478
+
1479
+ export interface FileSearchResult {
1480
+ path: string
1481
+ relativePath: string
1482
+ name: string
1483
+ matchType: 'filename' | 'content'
1484
+ line?: number
1485
+ snippet?: string
1486
+ }
1487
+
1488
+ /**
1489
+ * Emitted (main → renderer, debounced) when files change on disk in the
1490
+ * active workspace. The renderer should refresh the file tree and git status
1491
+ * wholesale; `changeType`/`relativePath` describe the most recent change in
1492
+ * the debounce window and are informational, not an exhaustive change list.
1493
+ */
1494
+ export interface FileChangeEvent {
1495
+ changeType: 'add' | 'change' | 'unlink' | 'addDir' | 'unlinkDir'
1496
+ relativePath: string
1497
+ }
1498
+
1499
+ export interface DiffHunk {
1500
+ oldStart: number
1501
+ oldLines: number
1502
+ newStart: number
1503
+ newLines: number
1504
+ content: string
1505
+ changes: DiffChange[]
1506
+ }
1507
+
1508
+ export interface DiffChange {
1509
+ type: 'add' | 'remove' | 'normal'
1510
+ content: string
1511
+ oldLine?: number
1512
+ newLine?: number
1513
+ }
1514
+
1515
+ export interface DiffFile {
1516
+ oldPath: string
1517
+ newPath: string
1518
+ hunks: DiffHunk[]
1519
+ isBinary: boolean
1520
+ isNew: boolean
1521
+ isDeleted: boolean
1522
+ }
1523
+
1524
+ // ─── Timeline Event Types ───────────────────────────────────────────────────
1525
+
1526
+ export type TimelineEventKind = 'agent-run'
1527
+
1528
+ export interface TimelineEvent {
1529
+ id: string
1530
+ type: 'user_message' | 'assistant_message' | 'tool_start' | 'tool_end' | 'thinking' | 'compaction' | 'retry' | 'queue' | 'system' | 'error'
1531
+ /** Stable identity for events that logic pairs up; `title` is display text. */
1532
+ kind?: TimelineEventKind
1533
+ timestamp: number
1534
+ duration?: number
1535
+ title: string
1536
+ detail?: string
1537
+ status?: 'running' | 'success' | 'error' | 'cancelled'
1538
+ metadata?: Record<string, unknown>
1539
+ }