@slycode/slycode 0.2.21 → 0.2.23

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 (271) hide show
  1. package/dist/bridge/api.d.ts +2 -1
  2. package/dist/bridge/api.js +114 -1
  3. package/dist/bridge/api.js.map +1 -1
  4. package/dist/bridge/git-utils.d.ts +9 -0
  5. package/dist/bridge/git-utils.js +49 -0
  6. package/dist/bridge/git-utils.js.map +1 -0
  7. package/dist/bridge/index.js +8 -2
  8. package/dist/bridge/index.js.map +1 -1
  9. package/dist/bridge/provider-utils.d.ts +10 -0
  10. package/dist/bridge/provider-utils.js +5 -1
  11. package/dist/bridge/provider-utils.js.map +1 -1
  12. package/dist/bridge/response-store.d.ts +46 -0
  13. package/dist/bridge/response-store.js +95 -0
  14. package/dist/bridge/response-store.js.map +1 -0
  15. package/dist/bridge/session-manager.d.ts +33 -1
  16. package/dist/bridge/session-manager.js +191 -2
  17. package/dist/bridge/session-manager.js.map +1 -1
  18. package/dist/bridge/types.d.ts +41 -0
  19. package/dist/data/scaffold-templates/tutorial-project/documentation/kanban.json +1 -1
  20. package/dist/messaging/bridge-client.d.ts +7 -3
  21. package/dist/messaging/bridge-client.js +26 -5
  22. package/dist/messaging/bridge-client.js.map +1 -1
  23. package/dist/messaging/index.js +149 -30
  24. package/dist/messaging/index.js.map +1 -1
  25. package/dist/messaging/state.d.ts +3 -0
  26. package/dist/messaging/state.js +13 -0
  27. package/dist/messaging/state.js.map +1 -1
  28. package/dist/messaging/types.d.ts +3 -0
  29. package/dist/scripts/kanban.js +448 -2
  30. package/dist/store/actions/checkpoint.md +1 -1
  31. package/dist/store/actions/context.md +1 -1
  32. package/dist/store/actions/create-card.md +1 -1
  33. package/dist/store/actions/deep-design.md +13 -3
  34. package/dist/store/actions/design-requirements.md +11 -1
  35. package/dist/store/actions/explore.md +1 -1
  36. package/dist/store/actions/onboard.md +2 -4
  37. package/dist/store/actions/summarize.md +1 -1
  38. package/dist/store/skills/kanban/SKILL.md +77 -3
  39. package/dist/web/.next/BUILD_ID +1 -1
  40. package/dist/web/.next/app-path-routes-manifest.json +1 -0
  41. package/dist/web/.next/build-manifest.json +2 -2
  42. package/dist/web/.next/prerender-manifest.json +3 -3
  43. package/dist/web/.next/routes-manifest.json +6 -0
  44. package/dist/web/.next/server/app/_global-error.html +2 -2
  45. package/dist/web/.next/server/app/_global-error.rsc +1 -1
  46. package/dist/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  47. package/dist/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  48. package/dist/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  49. package/dist/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  50. package/dist/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  51. package/dist/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  52. package/dist/web/.next/server/app/_not-found.html +1 -1
  53. package/dist/web/.next/server/app/_not-found.rsc +10 -10
  54. package/dist/web/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
  55. package/dist/web/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  56. package/dist/web/.next/server/app/_not-found.segments/_index.segment.rsc +5 -5
  57. package/dist/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  58. package/dist/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  59. package/dist/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  60. package/dist/web/.next/server/app/api/areas/route.js +1 -1
  61. package/dist/web/.next/server/app/api/areas/route.js.nft.json +1 -1
  62. package/dist/web/.next/server/app/api/bridge/[...path]/route.js +1 -1
  63. package/dist/web/.next/server/app/api/bridge/[...path]/route.js.nft.json +1 -1
  64. package/dist/web/.next/server/app/api/changelog/route/app-paths-manifest.json +3 -0
  65. package/dist/web/.next/server/app/api/changelog/route/build-manifest.json +11 -0
  66. package/dist/web/.next/server/app/api/changelog/route/server-reference-manifest.json +4 -0
  67. package/dist/web/.next/server/app/api/changelog/route.js +7 -0
  68. package/dist/web/.next/server/app/api/changelog/route.js.map +5 -0
  69. package/dist/web/.next/server/app/api/changelog/route.js.nft.json +1 -0
  70. package/dist/web/.next/server/app/api/changelog/route_client-reference-manifest.js +2 -0
  71. package/dist/web/.next/server/app/api/cli-assets/assistant/route.js +1 -1
  72. package/dist/web/.next/server/app/api/cli-assets/assistant/route.js.nft.json +1 -1
  73. package/dist/web/.next/server/app/api/cli-assets/fix/route.js +1 -1
  74. package/dist/web/.next/server/app/api/cli-assets/fix/route.js.nft.json +1 -1
  75. package/dist/web/.next/server/app/api/cli-assets/import/route.js +1 -1
  76. package/dist/web/.next/server/app/api/cli-assets/import/route.js.nft.json +1 -1
  77. package/dist/web/.next/server/app/api/cli-assets/route.js +2 -2
  78. package/dist/web/.next/server/app/api/cli-assets/route.js.nft.json +1 -1
  79. package/dist/web/.next/server/app/api/cli-assets/store/preview/route.js +1 -1
  80. package/dist/web/.next/server/app/api/cli-assets/store/preview/route.js.nft.json +1 -1
  81. package/dist/web/.next/server/app/api/cli-assets/store/route.js +2 -2
  82. package/dist/web/.next/server/app/api/cli-assets/store/route.js.nft.json +1 -1
  83. package/dist/web/.next/server/app/api/cli-assets/sync/route.js +1 -1
  84. package/dist/web/.next/server/app/api/cli-assets/sync/route.js.nft.json +1 -1
  85. package/dist/web/.next/server/app/api/cli-assets/updates/route.js +2 -2
  86. package/dist/web/.next/server/app/api/cli-assets/updates/route.js.nft.json +1 -1
  87. package/dist/web/.next/server/app/api/dashboard/route.js +2 -2
  88. package/dist/web/.next/server/app/api/dashboard/route.js.nft.json +1 -1
  89. package/dist/web/.next/server/app/api/events/route.js +1 -1
  90. package/dist/web/.next/server/app/api/events/route.js.nft.json +1 -1
  91. package/dist/web/.next/server/app/api/file/route.js +1 -1
  92. package/dist/web/.next/server/app/api/file/route.js.nft.json +1 -1
  93. package/dist/web/.next/server/app/api/git-status/route.js +1 -1
  94. package/dist/web/.next/server/app/api/git-status/route.js.nft.json +1 -1
  95. package/dist/web/.next/server/app/api/kanban/route.js +1 -1
  96. package/dist/web/.next/server/app/api/kanban/route.js.nft.json +1 -1
  97. package/dist/web/.next/server/app/api/kanban/stream/route.js +1 -1
  98. package/dist/web/.next/server/app/api/kanban/stream/route.js.nft.json +1 -1
  99. package/dist/web/.next/server/app/api/projects/[id]/route.js +2 -2
  100. package/dist/web/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
  101. package/dist/web/.next/server/app/api/projects/analyze/route.js +1 -1
  102. package/dist/web/.next/server/app/api/projects/analyze/route.js.nft.json +1 -1
  103. package/dist/web/.next/server/app/api/projects/reorder/route.js +2 -2
  104. package/dist/web/.next/server/app/api/projects/reorder/route.js.nft.json +1 -1
  105. package/dist/web/.next/server/app/api/projects/route.js +2 -2
  106. package/dist/web/.next/server/app/api/projects/route.js.nft.json +1 -1
  107. package/dist/web/.next/server/app/api/providers/route.js +1 -1
  108. package/dist/web/.next/server/app/api/providers/route.js.nft.json +1 -1
  109. package/dist/web/.next/server/app/api/scheduler/route.js +1 -1
  110. package/dist/web/.next/server/app/api/scheduler/route.js.nft.json +1 -1
  111. package/dist/web/.next/server/app/api/search/route.js +1 -1
  112. package/dist/web/.next/server/app/api/search/route.js.nft.json +1 -1
  113. package/dist/web/.next/server/app/api/settings/route.js +1 -1
  114. package/dist/web/.next/server/app/api/settings/route.js.nft.json +1 -1
  115. package/dist/web/.next/server/app/api/sly-actions/invalidate/route.js +1 -1
  116. package/dist/web/.next/server/app/api/sly-actions/invalidate/route.js.nft.json +1 -1
  117. package/dist/web/.next/server/app/api/sly-actions/route.js +1 -1
  118. package/dist/web/.next/server/app/api/sly-actions/route.js.nft.json +1 -1
  119. package/dist/web/.next/server/app/api/sly-actions/stream/route.js +1 -1
  120. package/dist/web/.next/server/app/api/sly-actions/stream/route.js.nft.json +1 -1
  121. package/dist/web/.next/server/app/api/system-stats/route.js +1 -1
  122. package/dist/web/.next/server/app/api/system-stats/route.js.nft.json +1 -1
  123. package/dist/web/.next/server/app/api/terminal-classes/route.js +1 -1
  124. package/dist/web/.next/server/app/api/terminal-classes/route.js.nft.json +1 -1
  125. package/dist/web/.next/server/app/api/transcribe/route.js +5 -5
  126. package/dist/web/.next/server/app/api/transcribe/route.js.nft.json +1 -1
  127. package/dist/web/.next/server/app/api/version-check/route.js +1 -1
  128. package/dist/web/.next/server/app/api/version-check/route.js.nft.json +1 -1
  129. package/dist/web/.next/server/app/page.js +1 -1
  130. package/dist/web/.next/server/app/page.js.nft.json +1 -1
  131. package/dist/web/.next/server/app/page_client-reference-manifest.js +1 -1
  132. package/dist/web/.next/server/app/project/[id]/page.js +2 -2
  133. package/dist/web/.next/server/app/project/[id]/page.js.nft.json +1 -1
  134. package/dist/web/.next/server/app/project/[id]/page_client-reference-manifest.js +1 -1
  135. package/dist/web/.next/server/app-paths-manifest.json +1 -0
  136. package/dist/web/.next/server/chunks/{[externals]__c6831f39._.js → [externals]__78e522ea._.js} +2 -2
  137. package/dist/web/.next/server/chunks/{[root-of-the-server]__1ec21ccc._.js → [root-of-the-server]__029203cd._.js} +3 -3
  138. package/dist/web/.next/server/chunks/{[root-of-the-server]__4297cb97._.js → [root-of-the-server]__0d6d4443._.js} +1 -1
  139. package/dist/web/.next/server/chunks/[root-of-the-server]__172ad0b1._.js +18 -0
  140. package/dist/web/.next/server/chunks/[root-of-the-server]__1c5f4ef9._.js +3 -0
  141. package/dist/web/.next/server/chunks/[root-of-the-server]__1cab11f0._.js +3 -0
  142. package/dist/web/.next/server/chunks/{[root-of-the-server]__0f69c28a._.js → [root-of-the-server]__1eb3f172._.js} +2 -2
  143. package/dist/web/.next/server/chunks/[root-of-the-server]__22cba275._.js +3 -0
  144. package/dist/web/.next/server/chunks/[root-of-the-server]__2543e413._.js +3 -0
  145. package/dist/web/.next/server/chunks/[root-of-the-server]__2c42a835._.js +3 -0
  146. package/dist/web/.next/server/chunks/[root-of-the-server]__2ed0ff47._.js +3 -0
  147. package/dist/web/.next/server/chunks/[root-of-the-server]__35454eea._.js +27 -0
  148. package/dist/web/.next/server/chunks/[root-of-the-server]__35768b56._.js +3 -0
  149. package/dist/web/.next/server/chunks/[root-of-the-server]__3880228a._.js +3 -0
  150. package/dist/web/.next/server/chunks/[root-of-the-server]__42322d88._.js +3 -0
  151. package/dist/web/.next/server/chunks/{[root-of-the-server]__d0f4efec._.js → [root-of-the-server]__5152eeff._.js} +3 -3
  152. package/dist/web/.next/server/chunks/[root-of-the-server]__527c7f57._.js +3 -0
  153. package/dist/web/.next/server/chunks/[root-of-the-server]__5c5dac4b._.js +3 -0
  154. package/dist/web/.next/server/chunks/[root-of-the-server]__5cb130f2._.js +3 -0
  155. package/dist/web/.next/server/chunks/[root-of-the-server]__68927e75._.js +3 -0
  156. package/dist/web/.next/server/chunks/[root-of-the-server]__719517c7._.js +3 -0
  157. package/dist/web/.next/server/chunks/[root-of-the-server]__73cf49c2._.js +3 -0
  158. package/dist/web/.next/server/chunks/{[root-of-the-server]__f5dae2ad._.js → [root-of-the-server]__7af4ab09._.js} +1 -1
  159. package/dist/web/.next/server/chunks/{[root-of-the-server]__4244617a._.js → [root-of-the-server]__7e6860e0._.js} +3 -3
  160. package/dist/web/.next/server/chunks/[root-of-the-server]__88bf5e22._.js +3 -0
  161. package/dist/web/.next/server/chunks/{[root-of-the-server]__f97e93fa._.js → [root-of-the-server]__8b4259cb._.js} +3 -3
  162. package/dist/web/.next/server/chunks/[root-of-the-server]__92f81907._.js +3 -0
  163. package/dist/web/.next/server/chunks/[root-of-the-server]__967603e9._.js +3 -0
  164. package/dist/web/.next/server/chunks/[root-of-the-server]__9e4bd28f._.js +3 -0
  165. package/dist/web/.next/server/chunks/[root-of-the-server]__a259539f._.js +3 -0
  166. package/dist/web/.next/server/chunks/[root-of-the-server]__ba1d2e56._.js +3 -0
  167. package/dist/web/.next/server/chunks/[root-of-the-server]__c942d872._.js +3 -0
  168. package/dist/web/.next/server/chunks/[root-of-the-server]__d7893622._.js +3 -0
  169. package/dist/web/.next/server/chunks/{[root-of-the-server]__3b9d3e43._.js → [root-of-the-server]__d843611b._.js} +6 -6
  170. package/dist/web/.next/server/chunks/[root-of-the-server]__f4d2627f._.js +3 -0
  171. package/dist/web/.next/server/chunks/[root-of-the-server]__f597835d._.js +3 -0
  172. package/dist/web/.next/server/chunks/{[root-of-the-server]__cf14e306._.js → [root-of-the-server]__fe8b9abd._.js} +1 -1
  173. package/dist/web/.next/server/chunks/_next-internal_server_app_api_changelog_route_actions_d6e239bf.js +3 -0
  174. package/dist/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_18324462.js +1 -1
  175. package/dist/web/.next/server/chunks/src_677020aa._.js +1 -1
  176. package/dist/web/.next/server/chunks/src_lib_scheduler_ts_03988e3e._.js +1 -1
  177. package/dist/web/.next/server/chunks/src_lib_scheduler_ts_7120457c._.js +1 -1
  178. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__1f5fc489._.js +4 -3
  179. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__43d93717._.js +3 -0
  180. package/dist/web/.next/server/chunks/ssr/{[root-of-the-server]__077f472c._.js → [root-of-the-server]__6183d28c._.js} +1 -1
  181. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__90f82e6d._.js +3 -0
  182. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__bcbe4bf2._.js +4 -3
  183. package/dist/web/.next/server/chunks/ssr/src_components_Dashboard_tsx_efc4dc27._.js +1 -1
  184. package/dist/web/.next/server/chunks/ssr/src_components_c4135402._.js +1 -1
  185. package/dist/web/.next/server/chunks/ssr/src_contexts_VoiceContext_tsx_cfba7292._.js +1 -1
  186. package/dist/web/.next/server/chunks/ssr/src_lib_registry_ts_2fc87c9c._.js +1 -1
  187. package/dist/web/.next/server/pages/404.html +1 -1
  188. package/dist/web/.next/server/pages/500.html +2 -2
  189. package/dist/web/.next/server/server-reference-manifest.js +1 -1
  190. package/dist/web/.next/server/server-reference-manifest.json +1 -1
  191. package/dist/web/.next/static/chunks/293449b828207656.css +1 -0
  192. package/dist/web/.next/static/chunks/{f55f3c8c1a52f80c.js → 3859477038c381ad.js} +1 -1
  193. package/dist/web/.next/static/chunks/3a5721af09d1c753.js +5 -0
  194. package/dist/web/.next/static/chunks/{8fb2a99c64580de7.js → 98311243e9a5a0ec.js} +1 -1
  195. package/dist/web/.next/static/chunks/{b8e0c1aeea4a14bc.js → a47f36b030917d1f.js} +1 -1
  196. package/dist/web/.next/static/chunks/d60c422421920130.js +5 -0
  197. package/dist/web/.next/static/chunks/{4049cceee6a49323.js → fa78afe3ceed998b.js} +1 -1
  198. package/dist/web/src/app/api/changelog/route.ts +45 -0
  199. package/dist/web/src/app/api/kanban/route.ts +52 -12
  200. package/dist/web/src/app/api/projects/analyze/route.ts +12 -2
  201. package/dist/web/src/app/api/projects/route.ts +1 -11
  202. package/dist/web/src/app/api/providers/route.ts +4 -0
  203. package/dist/web/src/components/ActivityFeed.tsx +3 -0
  204. package/dist/web/src/components/BranchTab.tsx +115 -0
  205. package/dist/web/src/components/ChangelogModal.tsx +234 -0
  206. package/dist/web/src/components/ClaudeTerminalPanel.tsx +124 -70
  207. package/dist/web/src/components/Dashboard.tsx +11 -0
  208. package/dist/web/src/components/GlobalClaudePanel.tsx +6 -0
  209. package/dist/web/src/components/ProjectKanban.tsx +38 -8
  210. package/dist/web/src/components/VersionUpdateToast.tsx +6 -4
  211. package/dist/web/src/components/VoiceControlBar.tsx +1 -1
  212. package/dist/web/src/lib/paths.ts +14 -0
  213. package/dist/web/src/lib/scheduler.ts +2 -1
  214. package/dist/web/src/lib/types.ts +24 -0
  215. package/dist/web/tsconfig.tsbuildinfo +1 -1
  216. package/package.json +1 -1
  217. package/templates/changelog.json +242 -0
  218. package/templates/kanban-seed.json +1 -1
  219. package/templates/store/actions/checkpoint.md +1 -1
  220. package/templates/store/actions/context.md +1 -1
  221. package/templates/store/actions/create-card.md +1 -1
  222. package/templates/store/actions/deep-design.md +13 -3
  223. package/templates/store/actions/design-requirements.md +11 -1
  224. package/templates/store/actions/explore.md +1 -1
  225. package/templates/store/actions/onboard.md +2 -4
  226. package/templates/store/actions/summarize.md +1 -1
  227. package/templates/store/skills/kanban/SKILL.md +77 -3
  228. package/templates/tutorial-project/documentation/kanban.json +1 -1
  229. package/templates/updates/actions/checkpoint.md +1 -1
  230. package/templates/updates/actions/context.md +1 -1
  231. package/templates/updates/actions/create-card.md +1 -1
  232. package/templates/updates/actions/deep-design.md +13 -3
  233. package/templates/updates/actions/design-requirements.md +11 -1
  234. package/templates/updates/actions/explore.md +1 -1
  235. package/templates/updates/actions/onboard.md +2 -4
  236. package/templates/updates/actions/summarize.md +1 -1
  237. package/templates/updates/skills/kanban/SKILL.md +77 -3
  238. package/dist/web/.next/server/chunks/[root-of-the-server]__09aec55a._.js +0 -3
  239. package/dist/web/.next/server/chunks/[root-of-the-server]__12f6cd6f._.js +0 -3
  240. package/dist/web/.next/server/chunks/[root-of-the-server]__15fc9266._.js +0 -18
  241. package/dist/web/.next/server/chunks/[root-of-the-server]__198f01e0._.js +0 -3
  242. package/dist/web/.next/server/chunks/[root-of-the-server]__279e9bf3._.js +0 -3
  243. package/dist/web/.next/server/chunks/[root-of-the-server]__2b639eab._.js +0 -3
  244. package/dist/web/.next/server/chunks/[root-of-the-server]__2d1f0ed9._.js +0 -3
  245. package/dist/web/.next/server/chunks/[root-of-the-server]__3f239285._.js +0 -3
  246. package/dist/web/.next/server/chunks/[root-of-the-server]__47dd878e._.js +0 -3
  247. package/dist/web/.next/server/chunks/[root-of-the-server]__5b8c9374._.js +0 -3
  248. package/dist/web/.next/server/chunks/[root-of-the-server]__5e08b942._.js +0 -3
  249. package/dist/web/.next/server/chunks/[root-of-the-server]__6ffce934._.js +0 -3
  250. package/dist/web/.next/server/chunks/[root-of-the-server]__71bb3374._.js +0 -3
  251. package/dist/web/.next/server/chunks/[root-of-the-server]__7603305e._.js +0 -3
  252. package/dist/web/.next/server/chunks/[root-of-the-server]__7c476ad6._.js +0 -3
  253. package/dist/web/.next/server/chunks/[root-of-the-server]__846ca56f._.js +0 -3
  254. package/dist/web/.next/server/chunks/[root-of-the-server]__98d88050._.js +0 -3
  255. package/dist/web/.next/server/chunks/[root-of-the-server]__b273cc05._.js +0 -3
  256. package/dist/web/.next/server/chunks/[root-of-the-server]__b90bbd70._.js +0 -3
  257. package/dist/web/.next/server/chunks/[root-of-the-server]__d5272169._.js +0 -3
  258. package/dist/web/.next/server/chunks/[root-of-the-server]__d56e68cb._.js +0 -3
  259. package/dist/web/.next/server/chunks/[root-of-the-server]__d6362272._.js +0 -3
  260. package/dist/web/.next/server/chunks/[root-of-the-server]__de1277ee._.js +0 -27
  261. package/dist/web/.next/server/chunks/[root-of-the-server]__e88a19d2._.js +0 -3
  262. package/dist/web/.next/server/chunks/[root-of-the-server]__f3e501b6._.js +0 -3
  263. package/dist/web/.next/server/chunks/[root-of-the-server]__f59af2bc._.js +0 -3
  264. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__9ac6ea25._.js +0 -3
  265. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__dfe2728c._.js +0 -3
  266. package/dist/web/.next/static/chunks/3d5195b57fc05540.js +0 -4
  267. package/dist/web/.next/static/chunks/59fb302a5bfd2dc0.js +0 -4
  268. package/dist/web/.next/static/chunks/747f5e5f9dcf2621.css +0 -1
  269. /package/dist/web/.next/static/{0sPAbk-Qw-InZ0rdHjHnC → aN-jqftQVvSm0qVskLybH}/_buildManifest.js +0 -0
  270. /package/dist/web/.next/static/{0sPAbk-Qw-InZ0rdHjHnC → aN-jqftQVvSm0qVskLybH}/_clientMiddlewareManifest.json +0 -0
  271. /package/dist/web/.next/static/{0sPAbk-Qw-InZ0rdHjHnC → aN-jqftQVvSm0qVskLybH}/_ssgManifest.js +0 -0
@@ -190,6 +190,17 @@ export class BridgeClient {
190
190
  throw err;
191
191
  }
192
192
  }
193
+ async getGitStatus(cwd) {
194
+ try {
195
+ const res = await fetch(`${this.baseUrl}/git-status?cwd=${encodeURIComponent(cwd)}`);
196
+ if (!res.ok)
197
+ return null;
198
+ return await res.json();
199
+ }
200
+ catch {
201
+ return null;
202
+ }
203
+ }
193
204
  async checkInstructionFile(provider, cwd) {
194
205
  try {
195
206
  const res = await fetch(`${this.baseUrl}/check-instruction-file?provider=${provider}&cwd=${encodeURIComponent(cwd)}`);
@@ -201,7 +212,7 @@ export class BridgeClient {
201
212
  return { needed: false };
202
213
  }
203
214
  }
204
- async ensureSession(sessionName, cwd, provider = 'claude', prompt, createInstructionFile) {
215
+ async ensureSession(sessionName, cwd, provider = 'claude', prompt, createInstructionFile, model) {
205
216
  // Check if session exists and is alive (running or detached)
206
217
  const existing = await this.getSession(sessionName);
207
218
  if (existing && (existing.status === 'running' || existing.status === 'detached')) {
@@ -217,18 +228,19 @@ export class BridgeClient {
217
228
  provider,
218
229
  skipPermissions: true,
219
230
  createInstructionFile,
231
+ model: model || undefined,
220
232
  });
221
233
  debugLog(`[ensureSession] Session created: resumed=${session.resumed}, hasPrompt=${!!prompt}`);
222
234
  return { session };
223
235
  }
224
- async sendMessage(sessionName, cwd, message, provider = 'claude', createInstructionFile) {
236
+ async sendMessage(sessionName, cwd, message, provider = 'claude', createInstructionFile, model) {
225
237
  // Check if session is already active
226
238
  const existing = await this.getSession(sessionName);
227
239
  const isActive = existing && (existing.status === 'running' || existing.status === 'detached');
228
240
  if (!isActive) {
229
241
  // New or stopped session — pass message as initial prompt
230
242
  debugLog(`[sendMessage] Session ${sessionName} not active (status: ${existing?.status ?? 'not found'}), creating/resuming`);
231
- const result = await this.ensureSession(sessionName, cwd, provider, message, createInstructionFile);
243
+ const result = await this.ensureSession(sessionName, cwd, provider, message, createInstructionFile, model);
232
244
  return { permissionMismatch: result.permissionMismatch };
233
245
  }
234
246
  // Permission mismatch detection for existing sessions
@@ -242,15 +254,23 @@ export class BridgeClient {
242
254
  throw new Error(`Failed to send input to session ${sessionName}`);
243
255
  }
244
256
  // Wait briefly, then send carriage return to submit
245
- await new Promise(resolve => setTimeout(resolve, 600));
257
+ const submitDelay = parseInt(process.env.PROMPT_SUBMIT_DELAY_MS || '600', 10);
258
+ await new Promise(resolve => setTimeout(resolve, submitDelay));
246
259
  const crSent = await this.sendInput(sessionName, '\r');
247
260
  if (!crSent) {
248
261
  debugLog(`[sendMessage] FAILED to send CR to ${sessionName} — message typed but not submitted`);
249
262
  }
263
+ // Double-submit: send a second Enter to catch swallowed keystrokes
264
+ if (process.env.PROMPT_DOUBLE_SUBMIT === 'true') {
265
+ const doubleDelay = parseInt(process.env.PROMPT_DOUBLE_SUBMIT_DELAY_MS || '300', 10);
266
+ await new Promise(resolve => setTimeout(resolve, doubleDelay));
267
+ const cr2Sent = await this.sendInput(sessionName, '\r');
268
+ debugLog(`[sendMessage] Double-submit: cr2=${cr2Sent}`);
269
+ }
250
270
  debugLog(`[sendMessage] Done: text=${textSent}, cr=${crSent}`);
251
271
  return {};
252
272
  }
253
- async restartSession(sessionName, cwd, provider, prompt) {
273
+ async restartSession(sessionName, cwd, provider, prompt, model) {
254
274
  // Kill existing session (DELETE with ?action=stop actually terminates the PTY)
255
275
  try {
256
276
  const res = await fetch(`${this.baseUrl}/sessions/${encodeURIComponent(sessionName)}?action=stop`, {
@@ -272,6 +292,7 @@ export class BridgeClient {
272
292
  prompt,
273
293
  provider,
274
294
  skipPermissions: true,
295
+ model: model || undefined,
275
296
  });
276
297
  }
277
298
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-client.js","sourceRoot":"","sources":["../src/bridge-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge-client.js","sourceRoot":"","sources":["../src/bridge-client.ts"],"names":[],"mappings":"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"}
@@ -25,12 +25,25 @@ function getProviderDefault(stage) {
25
25
  const data = JSON.parse(fs.readFileSync(path.join(root, 'data', 'providers.json'), 'utf-8'));
26
26
  const defaults = data.defaults;
27
27
  if (stage && defaults.stages[stage]?.provider) {
28
- return defaults.stages[stage].provider;
28
+ return { provider: defaults.stages[stage].provider, model: defaults.stages[stage].model };
29
29
  }
30
- return defaults.global?.provider || 'claude';
30
+ return { provider: defaults.global?.provider || 'claude', model: defaults.global?.model };
31
31
  }
32
32
  catch {
33
- return 'claude';
33
+ return { provider: 'claude' };
34
+ }
35
+ }
36
+ function getProvidersPath() {
37
+ const root = process.env.SLYCODE_HOME || path.resolve(__dirname, '..', '..');
38
+ return path.join(root, 'data', 'providers.json');
39
+ }
40
+ async function getProviderModels(providerId) {
41
+ try {
42
+ const data = JSON.parse(fs.readFileSync(getProvidersPath(), 'utf-8'));
43
+ return data.providers[providerId]?.model?.available || [];
44
+ }
45
+ catch {
46
+ return [];
34
47
  }
35
48
  }
36
49
  function updateGlobalProviderDefault(provider) {
@@ -192,13 +205,16 @@ async function logConfigStatus(channel, voiceConfig, bridgeUrl) {
192
205
  console.log(` Bridge URL: ${bridgeUrl}`);
193
206
  }
194
207
  // --- Breadcrumb Helpers ---
195
- function getBreadcrumb(target, state, kanban) {
208
+ async function getBreadcrumb(target, state, kanban, bridge) {
209
+ let crumb;
196
210
  switch (target.type) {
197
211
  case 'global':
198
- return '📍 Global Terminal';
212
+ crumb = '📍 Global Terminal';
213
+ break;
199
214
  case 'project': {
200
215
  const project = state.getSelectedProject();
201
- return `📍 ${project?.name || target.projectId} · Project Terminal`;
216
+ crumb = `📍 ${project?.name || target.projectId} · Project Terminal`;
217
+ break;
202
218
  }
203
219
  case 'card': {
204
220
  const project = state.getSelectedProject();
@@ -208,9 +224,23 @@ function getBreadcrumb(target, state, kanban) {
208
224
  const stage = cardInfo?.stage || target.stage || '?';
209
225
  const title = cardInfo?.card.title || target.cardId || '?';
210
226
  const truncTitle = title.length > 55 ? title.slice(0, 52) + '...' : title;
211
- return `📍 ${project?.name || target.projectId} · ${stage} · ${truncTitle}`;
227
+ crumb = `📍 ${project?.name || target.projectId} · ${stage} · ${truncTitle}`;
228
+ break;
212
229
  }
213
230
  }
231
+ // Append git branch info if available
232
+ try {
233
+ const cwd = state.getSessionCwd();
234
+ const git = await bridge.getGitStatus(cwd);
235
+ if (git?.branch) {
236
+ const uncommittedSuffix = git.uncommitted > 0 ? ` (${git.uncommitted} uncommitted)` : '';
237
+ crumb += `\nBranch: ${git.branch}${uncommittedSuffix}`;
238
+ }
239
+ }
240
+ catch {
241
+ // Silent — branch info is best-effort
242
+ }
243
+ return crumb;
214
244
  }
215
245
  function truncate(text, max) {
216
246
  return text.length > max ? text.slice(0, max - 3) + '...' : text;
@@ -226,7 +256,7 @@ function latestDate(...dates) {
226
256
  // --- /switch Rendering ---
227
257
  async function renderSwitchView(channel, state, bridge, kanban) {
228
258
  const target = state.getTarget();
229
- const breadcrumb = getBreadcrumb(target, state, kanban);
259
+ const breadcrumb = await getBreadcrumb(target, state, kanban, bridge);
230
260
  if (target.type === 'global') {
231
261
  // Global level: show projects list
232
262
  const projects = state.getProjects();
@@ -296,12 +326,16 @@ async function renderLaneDrilldown(channel, state, bridge, kanban, stage, offset
296
326
  async function handleSessionLifecycle(channel, state, bridge, kanban, actionFilter) {
297
327
  const target = ensureStage(state.getTarget(), kanban, state);
298
328
  const sessionName = state.getSessionName();
299
- const breadcrumb = getBreadcrumb(target, state, kanban);
300
- // Build provider line
329
+ const breadcrumb = await getBreadcrumb(target, state, kanban, bridge);
330
+ // Build provider line with model
301
331
  const currentProvider = state.getSelectedProvider();
302
332
  const providerLabel = PROVIDER_LABELS[currentProvider] || currentProvider;
303
333
  const explicit = await hasExplicitSession(bridge, state);
304
- const providerLine = `Provider: ${providerLabel}${explicit ? '' : ' (default)'}`;
334
+ const currentModel = state.getSelectedModel();
335
+ const modelLabel = currentModel
336
+ ? (await getProviderModels(currentProvider)).find(m => m.id === currentModel)?.label || currentModel
337
+ : null;
338
+ const providerLine = `Provider: ${providerLabel}${modelLabel ? ` · ${modelLabel}` : ''}${explicit ? '' : ' (default)'}`;
305
339
  let session;
306
340
  try {
307
341
  session = await bridge.getSession(sessionName);
@@ -402,7 +436,7 @@ async function executeQuickCommand(commandKey, channel, state, bridge, kanban, a
402
436
  if (!proceed)
403
437
  return;
404
438
  // New or stopped session — pass prompt to session creation
405
- await bridge.ensureSession(sessionName, cwd, provider, formatted);
439
+ await bridge.ensureSession(sessionName, cwd, provider, formatted, undefined, state.getSelectedModel() || undefined);
406
440
  }
407
441
  await channel.sendText(`Sent: ${cmd.label}`);
408
442
  bridge.watchActivity(sessionName, channel).catch(() => { });
@@ -449,6 +483,7 @@ async function checkInstructionFilePreFlight(channel, state, bridge, sessionName
449
483
  targetFile: check.targetFile,
450
484
  copySource: check.copySource,
451
485
  originalMessage,
486
+ model: state.getSelectedModel() || undefined,
452
487
  });
453
488
  await channel.sendInlineKeyboard(`⚠️ ${check.targetFile} is missing in this project.\n\nCreate from ${check.copySource}?`, [[
454
489
  { label: '✅ Yes, create it', callbackData: 'ifc_yes' },
@@ -467,6 +502,7 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
467
502
  '/switch - Navigate terminals (global, project, card)\n' +
468
503
  '/search - Search cards (or quick access to active/recent)\n' +
469
504
  '/provider - Select AI provider (Claude/Gemini/Codex)\n' +
505
+ '/model - Select model for current provider\n' +
470
506
  '/sly - Sly Actions for active session\n' +
471
507
  '/global - Switch to global terminal\n' +
472
508
  '/project - Switch to project terminal (from card)\n' +
@@ -591,7 +627,7 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
591
627
  const target = ensureStage(state.getTarget(), kanban, state);
592
628
  const terminalClass = actionFilter.getTerminalClass(target);
593
629
  const cardType = getCardType(target, kanban);
594
- const breadcrumb = getBreadcrumb(target, state, kanban);
630
+ const breadcrumb = await getBreadcrumb(target, state, kanban, bridge);
595
631
  const commands = actionFilter.filterActions(terminalClass, undefined, cardType);
596
632
  console.log(`[SLY] target: ${JSON.stringify(target)}, class: ${terminalClass}, cardType: ${cardType}, actions: ${Object.keys(commands).join(', ')}`);
597
633
  const buttons = actionsToButtons(commands);
@@ -604,7 +640,7 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
604
640
  // --- /global ---
605
641
  channel.onCommand('global', async () => {
606
642
  state.selectGlobal();
607
- state.setSelectedProvider(getProviderDefault());
643
+ state.setSelectedProvider(getProviderDefault().provider);
608
644
  updateKeyboard(channel, state);
609
645
  await handleSessionLifecycle(channel, state, bridge, kanban, actionFilter);
610
646
  });
@@ -614,7 +650,7 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
614
650
  if (target.projectId) {
615
651
  state.selectProject(target.projectId);
616
652
  const projProvider = await resolveProjectProviderFromBridge(bridge, target.projectId);
617
- state.setSelectedProvider(projProvider || getProviderDefault());
653
+ state.setSelectedProvider(projProvider || getProviderDefault().provider);
618
654
  updateKeyboard(channel, state);
619
655
  await handleSessionLifecycle(channel, state, bridge, kanban, actionFilter);
620
656
  }
@@ -622,17 +658,37 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
622
658
  await channel.sendText('No project selected. Use /switch first.');
623
659
  }
624
660
  });
625
- // --- /model ---
661
+ // --- /provider ---
626
662
  channel.onCommand('provider', async () => {
627
663
  const current = state.getSelectedProvider();
628
664
  const currentLabel = PROVIDER_LABELS[current] || current;
629
- const others = ALL_PROVIDERS.filter(p => p !== current);
630
- const buttons = others.map(p => [{
631
- label: PROVIDER_LABELS[p],
665
+ const buttons = ALL_PROVIDERS.map(p => [{
666
+ label: (p === current ? '● ' : '') + PROVIDER_LABELS[p],
632
667
  callbackData: `cfg_${p}`,
633
668
  }]);
634
669
  await channel.sendInlineKeyboard(`Provider: *${currentLabel}*`, buttons);
635
670
  });
671
+ // --- /model ---
672
+ channel.onCommand('model', async () => {
673
+ const provider = state.getSelectedProvider();
674
+ const currentModel = state.getSelectedModel();
675
+ const models = await getProviderModels(provider);
676
+ if (!models.length) {
677
+ await channel.sendText(`No models configured for ${PROVIDER_LABELS[provider] || provider}`);
678
+ return;
679
+ }
680
+ const currentLabel = currentModel
681
+ ? models.find(m => m.id === currentModel)?.label || currentModel
682
+ : 'Default';
683
+ const buttons = [
684
+ [{ label: '🔄 Default', callbackData: 'mdl_' }],
685
+ ...models.filter(m => m.id !== currentModel).map(m => [{
686
+ label: m.label,
687
+ callbackData: `mdl_${m.id}`,
688
+ }]),
689
+ ];
690
+ await channel.sendInlineKeyboard(`Model: *${currentLabel}* (${PROVIDER_LABELS[provider] || provider})`, buttons);
691
+ });
636
692
  // --- /status ---
637
693
  channel.onCommand('status', async () => {
638
694
  const target = state.getTarget();
@@ -686,7 +742,23 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
686
742
  catch { }
687
743
  }
688
744
  }
689
- status += `\nProvider: ${PROVIDER_LABELS[provider] || provider}${providerSuffix}`;
745
+ // Git branch info
746
+ try {
747
+ const cwd = state.getSessionCwd();
748
+ const git = await bridge.getGitStatus(cwd);
749
+ if (git?.branch) {
750
+ const uncommittedSuffix = git.uncommitted > 0 ? ` (${git.uncommitted} uncommitted)` : '';
751
+ status += `Branch: ${git.branch}${uncommittedSuffix}\n`;
752
+ }
753
+ }
754
+ catch {
755
+ // Silent — branch info is best-effort
756
+ }
757
+ const currentModel = state.getSelectedModel();
758
+ const modelLabel = currentModel
759
+ ? (await getProviderModels(provider)).find(m => m.id === currentModel)?.label || currentModel
760
+ : null;
761
+ status += `\nProvider: ${PROVIDER_LABELS[provider] || provider}${modelLabel ? ` · ${modelLabel}` : ''}${providerSuffix}`;
690
762
  status += `\nMode: ${mode}`;
691
763
  if (tone)
692
764
  status += `\nTone: ${tone}`;
@@ -829,11 +901,41 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
829
901
  // If the current target was using an inherited default (no bridge session),
830
902
  // also update the global default in providers.json
831
903
  const explicit = await hasExplicitSession(bridge, state);
832
- state.setSelectedProvider(provider);
904
+ state.setSelectedProvider(provider); // Also resets model to ''
833
905
  if (!explicit) {
834
906
  updateGlobalProviderDefault(provider);
835
907
  }
836
- await channel.sendText(`Provider set to: ${PROVIDER_LABELS[provider]}`);
908
+ // Pre-fill model from stage default if applicable
909
+ const target = state.getTarget();
910
+ const stageDefault = getProviderDefault(target.stage);
911
+ if (stageDefault.model && stageDefault.provider === provider) {
912
+ state.setSelectedModel(stageDefault.model);
913
+ }
914
+ // Show model options if available
915
+ const models = await getProviderModels(provider);
916
+ if (models.length > 0) {
917
+ const buttons = [
918
+ [{ label: '🔄 Default', callbackData: 'mdl_' }],
919
+ ...models.map(m => [{ label: m.label, callbackData: `mdl_${m.id}` }]),
920
+ ];
921
+ await channel.sendInlineKeyboard(`Provider set to: *${PROVIDER_LABELS[provider]}*\nSelect model:`, buttons);
922
+ }
923
+ else {
924
+ await channel.sendText(`Provider set to: ${PROVIDER_LABELS[provider]}`);
925
+ }
926
+ });
927
+ // --- Model Selection Callbacks (mdl_ prefix) ---
928
+ channel.onCallback('mdl_', async (data) => {
929
+ const modelId = data.replace('mdl_', ''); // '' for Default
930
+ state.setSelectedModel(modelId);
931
+ if (modelId) {
932
+ const models = await getProviderModels(state.getSelectedProvider());
933
+ const label = models.find(m => m.id === modelId)?.label || modelId;
934
+ await channel.sendText(`Model set to: ${label}`);
935
+ }
936
+ else {
937
+ await channel.sendText('Model set to: Default');
938
+ }
837
939
  });
838
940
  // --- Instruction File Confirm Callbacks (ifc_ prefix) ---
839
941
  channel.onCallback('ifc_', async (data) => {
@@ -847,7 +949,7 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
847
949
  }
848
950
  try {
849
951
  await channel.sendTyping();
850
- const result = await bridge.sendMessage(pending.sessionName, pending.cwd, pending.originalMessage, pending.provider, approved);
952
+ const result = await bridge.sendMessage(pending.sessionName, pending.cwd, pending.originalMessage, pending.provider, approved, pending.model || undefined);
851
953
  if (result.permissionMismatch) {
852
954
  await channel.sendInlineKeyboard('⚠️ This session was started without skip-permissions, which is required for messaging.\n\nRestart the session with permissions skipped?', [[
853
955
  { label: 'Restart session', callbackData: 'perm_restart' },
@@ -874,7 +976,7 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
874
976
  await channel.sendText('⚠️ Terminal is open in the web UI. Disconnecting and restarting...');
875
977
  }
876
978
  await channel.sendTyping();
877
- await bridge.restartSession(sessionName, cwd, provider);
979
+ await bridge.restartSession(sessionName, cwd, provider, undefined, state.getSelectedModel() || undefined);
878
980
  await channel.sendText('Session restarted with skip-permissions. Send your message again.');
879
981
  }
880
982
  catch (err) {
@@ -889,7 +991,7 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
889
991
  channel.onCallback('sw_', async (data) => {
890
992
  if (data === 'sw_global') {
891
993
  state.selectGlobal();
892
- state.setSelectedProvider(getProviderDefault());
994
+ state.setSelectedProvider(getProviderDefault().provider);
893
995
  currentDrilldownStage = null;
894
996
  updateKeyboard(channel, state);
895
997
  await handleSessionLifecycle(channel, state, bridge, kanban, actionFilter);
@@ -911,7 +1013,7 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
911
1013
  state.selectProject(projectId);
912
1014
  // Resolve provider: bridge session > global default
913
1015
  const projBridgeProvider = await resolveProjectProviderFromBridge(bridge, projectId);
914
- state.setSelectedProvider(projBridgeProvider || getProviderDefault());
1016
+ state.setSelectedProvider(projBridgeProvider || getProviderDefault().provider);
915
1017
  currentDrilldownStage = null;
916
1018
  kanban.updateProjects(state.getProjects());
917
1019
  updateKeyboard(channel, state);
@@ -946,7 +1048,24 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
946
1048
  state.selectCard(projectId, cardId, cardStage);
947
1049
  // Resolve provider: bridge session > stage default > global default
948
1050
  const bridgeProvider = await resolveProviderFromBridge(bridge, projectId, cardId);
949
- state.setSelectedProvider(bridgeProvider || getProviderDefault(cardStage));
1051
+ const stageDefault = getProviderDefault(cardStage);
1052
+ state.setSelectedProvider(bridgeProvider || stageDefault.provider);
1053
+ // Resolve model: bridge session > stage default > Default
1054
+ const sessionName = state.getSessionName();
1055
+ try {
1056
+ const session = await bridge.getSession(sessionName);
1057
+ if (session?.model) {
1058
+ state.setSelectedModel(session.model);
1059
+ }
1060
+ else if (stageDefault.model && (stageDefault.provider === state.getSelectedProvider())) {
1061
+ state.setSelectedModel(stageDefault.model);
1062
+ }
1063
+ }
1064
+ catch {
1065
+ if (stageDefault.model && (stageDefault.provider === state.getSelectedProvider())) {
1066
+ state.setSelectedModel(stageDefault.model);
1067
+ }
1068
+ }
950
1069
  currentDrilldownStage = null;
951
1070
  updateKeyboard(channel, state);
952
1071
  await handleSessionLifecycle(channel, state, bridge, kanban, actionFilter);
@@ -1004,7 +1123,7 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
1004
1123
  if (!proceed)
1005
1124
  return;
1006
1125
  await channel.sendTyping();
1007
- const result = await bridge.sendMessage(sessionName, cwd, formatted, provider);
1126
+ const result = await bridge.sendMessage(sessionName, cwd, formatted, provider, undefined, state.getSelectedModel() || undefined);
1008
1127
  if (result.permissionMismatch) {
1009
1128
  await channel.sendInlineKeyboard('⚠️ This session was started without skip-permissions, which is required for messaging.\n\nRestart the session with permissions skipped?', [[
1010
1129
  { label: 'Restart session', callbackData: 'perm_restart' },
@@ -1046,7 +1165,7 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
1046
1165
  if (!proceed)
1047
1166
  return;
1048
1167
  await channel.sendTyping();
1049
- const result = await bridge.sendMessage(sessionName, cwd, formatted, provider);
1168
+ const result = await bridge.sendMessage(sessionName, cwd, formatted, provider, undefined, state.getSelectedModel() || undefined);
1050
1169
  if (result.permissionMismatch) {
1051
1170
  await channel.sendInlineKeyboard('⚠️ This session was started without skip-permissions, which is required for messaging.\n\nRestart the session with permissions skipped?', [[
1052
1171
  { label: 'Restart session', callbackData: 'perm_restart' },
@@ -1088,7 +1207,7 @@ function setupChannel(channel, bridge, state, kanban, actionFilter, voiceConfig)
1088
1207
  const proceed = await checkInstructionFilePreFlight(channel, state, bridge, sessionName, cwd, provider, message);
1089
1208
  if (!proceed)
1090
1209
  return;
1091
- const result = await bridge.sendMessage(sessionName, cwd, message, provider);
1210
+ const result = await bridge.sendMessage(sessionName, cwd, message, provider, undefined, state.getSelectedModel() || undefined);
1092
1211
  if (result.permissionMismatch) {
1093
1212
  await channel.sendInlineKeyboard('⚠️ This session was started without skip-permissions, which is required for messaging.\n\nRestart the session with permissions skipped?', [[
1094
1213
  { label: 'Restart session', callbackData: 'perm_restart' },