@antelopejs/dms-ai 0.9.0 → 0.9.2

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 (293) hide show
  1. package/README.md +32 -34
  2. package/dist/constants/http.d.ts +1 -0
  3. package/dist/constants/http.js +1 -0
  4. package/dist/constants/http.js.map +1 -1
  5. package/dist/database/catalog.js +21 -3
  6. package/dist/database/catalog.js.map +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/lifecycle/sidecar-owner.js.map +1 -1
  9. package/dist/lifecycle/skill-sources.js +19 -146
  10. package/dist/lifecycle/skill-sources.js.map +1 -1
  11. package/dist/lifecycle/spawn-sidecar.js +2 -2
  12. package/dist/lifecycle/spawn-sidecar.js.map +1 -1
  13. package/dist/lifecycle/terminate-process.d.ts +1 -0
  14. package/dist/lifecycle/terminate-process.js +8 -4
  15. package/dist/lifecycle/terminate-process.js.map +1 -1
  16. package/dist/logging/log-buffer.js +22 -14
  17. package/dist/logging/log-buffer.js.map +1 -1
  18. package/dist/pages/settings/availability.js +41 -5
  19. package/dist/pages/settings/availability.js.map +1 -1
  20. package/dist/pages/settings/options.d.ts +2 -1
  21. package/dist/pages/settings/options.js +29 -8
  22. package/dist/pages/settings/options.js.map +1 -1
  23. package/dist/pages/settings/sections.js +15 -4
  24. package/dist/pages/settings/sections.js.map +1 -1
  25. package/dist/pages-registry.js +2 -6
  26. package/dist/pages-registry.js.map +1 -1
  27. package/dist/routes/activity.js +4 -3
  28. package/dist/routes/activity.js.map +1 -1
  29. package/dist/routes/banner.d.ts +2 -1
  30. package/dist/routes/banner.js +4 -1
  31. package/dist/routes/banner.js.map +1 -1
  32. package/dist/routes/builder.d.ts +5 -5
  33. package/dist/routes/builder.js +62 -44
  34. package/dist/routes/builder.js.map +1 -1
  35. package/dist/routes/changes.js +8 -7
  36. package/dist/routes/changes.js.map +1 -1
  37. package/dist/routes/codex-account.js +11 -5
  38. package/dist/routes/codex-account.js.map +1 -1
  39. package/dist/routes/content-json.d.ts +6 -0
  40. package/dist/routes/content-json.js +12 -0
  41. package/dist/routes/content-json.js.map +1 -0
  42. package/dist/routes/metrics.js +8 -8
  43. package/dist/routes/metrics.js.map +1 -1
  44. package/dist/routes/settings.js +4 -3
  45. package/dist/routes/settings.js.map +1 -1
  46. package/dist/routes/sidecar-answers.d.ts +10 -0
  47. package/dist/routes/sidecar-answers.js +90 -0
  48. package/dist/routes/sidecar-answers.js.map +1 -0
  49. package/dist/routes/sidecar-results.d.ts +2 -1
  50. package/dist/routes/sidecar-results.js +8 -2
  51. package/dist/routes/sidecar-results.js.map +1 -1
  52. package/dist/routes/skills.d.ts +2 -2
  53. package/dist/routes/skills.js +3 -2
  54. package/dist/routes/skills.js.map +1 -1
  55. package/dist/routes/status.js +23 -4
  56. package/dist/routes/status.js.map +1 -1
  57. package/dist/sidecar/answer-schemas.d.ts +8 -0
  58. package/dist/sidecar/answer-schemas.js +60 -0
  59. package/dist/sidecar/answer-schemas.js.map +1 -0
  60. package/dist/sidecar/http-client.d.ts +4 -2
  61. package/dist/sidecar/http-client.js +5 -2
  62. package/dist/sidecar/http-client.js.map +1 -1
  63. package/dist/sidecar/index.d.ts +1 -0
  64. package/dist/sidecar/index.js +1 -0
  65. package/dist/sidecar/index.js.map +1 -1
  66. package/dist/sidecar/settings-values.d.ts +3 -0
  67. package/dist/sidecar/settings-values.js +33 -1
  68. package/dist/sidecar/settings-values.js.map +1 -1
  69. package/dist/types/status.d.ts +2 -2
  70. package/dist/vocabulary/enumerations.js +2 -0
  71. package/dist/vocabulary/enumerations.js.map +1 -1
  72. package/frontend-vue/app/chat/components/ChatView.vue +16 -49
  73. package/frontend-vue/app/chat/components/Composer.vue +23 -39
  74. package/frontend-vue/app/chat/components/NoticeCard.vue +9 -0
  75. package/frontend-vue/app/chat/components/ProviderNotice.vue +14 -3
  76. package/frontend-vue/app/chat/composables/conversation-events.ts +0 -3
  77. package/frontend-vue/app/chat/composables/useConversationMode.ts +8 -11
  78. package/frontend-vue/app/chat/composables/useFollowScroll.ts +77 -0
  79. package/frontend-vue/app/chat/constants/modes.ts +15 -0
  80. package/frontend-vue/app/chat/constants/protocol.ts +0 -1
  81. package/frontend-vue/app/chat/constants/settings.ts +1 -1
  82. package/frontend-vue/app/chat/types/protocol.ts +11 -9
  83. package/frontend-vue/app/chat/types/settings.ts +7 -2
  84. package/frontend-vue/app/chat/utils/permission-view.ts +1 -0
  85. package/frontend-vue/app/views/constants.ts +2 -0
  86. package/frontend-vue/app/views/types.ts +3 -1
  87. package/frontend-vue/i18n/locales/dms-ai-pages-en-GB.json +21 -11
  88. package/frontend-vue/i18n/locales/dms-ai-pages-fr-FR.json +21 -11
  89. package/frontend-vue/i18n/locales/dms-ai-panel-en-GB.json +11 -21
  90. package/frontend-vue/i18n/locales/dms-ai-panel-fr-FR.json +11 -21
  91. package/frontend-vue/i18n/locales/dms-ai-views-en-GB.json +2 -0
  92. package/frontend-vue/i18n/locales/dms-ai-views-fr-FR.json +2 -0
  93. package/frontend-vue/package.json +1 -1
  94. package/frontend-vue/tests/chat/chat-scroll.test.ts +251 -0
  95. package/frontend-vue/tests/chat/conversation-events.test.ts +1 -3
  96. package/frontend-vue/tests/chat/provider-notice.test.ts +33 -0
  97. package/frontend-vue/tests/chat-panel.test.ts +2 -4
  98. package/frontend-vue/tests/panel-modes.test.ts +146 -0
  99. package/frontend-vue/tests/panel-questions.test.ts +1 -19
  100. package/frontend-vue/tests/panel-states.test.ts +12 -16
  101. package/frontend-vue/tests/support/fake-layout.ts +119 -0
  102. package/frontend-vue/tests/support/panel-harness.ts +14 -6
  103. package/frontend-vue/tests/support/setup-layout.ts +3 -0
  104. package/frontend-vue/tests/support/stubs.ts +2 -0
  105. package/frontend-vue/vitest.config.ts +1 -0
  106. package/package.json +16 -10
  107. package/sidecar/dist/agent/always-ask-files.d.ts +2 -0
  108. package/sidecar/dist/agent/always-ask-files.js +34 -0
  109. package/sidecar/dist/agent/always-ask-files.js.map +1 -0
  110. package/sidecar/dist/agent/conversation-modes.d.ts +3 -12
  111. package/sidecar/dist/agent/conversation-modes.js +16 -69
  112. package/sidecar/dist/agent/conversation-modes.js.map +1 -1
  113. package/sidecar/dist/agent/effective-mode.d.ts +2 -5
  114. package/sidecar/dist/agent/effective-mode.js +1 -15
  115. package/sidecar/dist/agent/effective-mode.js.map +1 -1
  116. package/sidecar/dist/agent/permission-bus.d.ts +1 -2
  117. package/sidecar/dist/agent/permission-bus.js +1 -3
  118. package/sidecar/dist/agent/permission-bus.js.map +1 -1
  119. package/sidecar/dist/agent/permission-preview.d.ts +6 -0
  120. package/sidecar/dist/agent/permission-preview.js +35 -10
  121. package/sidecar/dist/agent/permission-preview.js.map +1 -1
  122. package/sidecar/dist/agent/permission-rules.js +2 -2
  123. package/sidecar/dist/agent/permission-rules.js.map +1 -1
  124. package/sidecar/dist/agent/project-secrets.d.ts +7 -0
  125. package/sidecar/dist/agent/project-secrets.js +61 -0
  126. package/sidecar/dist/agent/project-secrets.js.map +1 -0
  127. package/sidecar/dist/agent/provider.d.ts +5 -4
  128. package/sidecar/dist/agent/runner.d.ts +3 -2
  129. package/sidecar/dist/agent/runner.js +9 -3
  130. package/sidecar/dist/agent/runner.js.map +1 -1
  131. package/sidecar/dist/agent/session.d.ts +3 -3
  132. package/sidecar/dist/agent/session.js.map +1 -1
  133. package/sidecar/dist/agent/tool-kinds.d.ts +7 -1
  134. package/sidecar/dist/agent/tool-kinds.js +24 -5
  135. package/sidecar/dist/agent/tool-kinds.js.map +1 -1
  136. package/sidecar/dist/agent/typecheck.js +14 -1
  137. package/sidecar/dist/agent/typecheck.js.map +1 -1
  138. package/sidecar/dist/audit/activity-query.js +2 -0
  139. package/sidecar/dist/audit/activity-query.js.map +1 -1
  140. package/sidecar/dist/audit/activity.js +1 -0
  141. package/sidecar/dist/audit/activity.js.map +1 -1
  142. package/sidecar/dist/audit/call-audit.js.map +1 -1
  143. package/sidecar/dist/builder/builder-client.d.ts +3 -1
  144. package/sidecar/dist/builder/builder-client.js +13 -1
  145. package/sidecar/dist/builder/builder-client.js.map +1 -1
  146. package/sidecar/dist/constants/audit.d.ts +1 -3
  147. package/sidecar/dist/constants/audit.js +2 -1
  148. package/sidecar/dist/constants/audit.js.map +1 -1
  149. package/sidecar/dist/constants/builder.d.ts +3 -0
  150. package/sidecar/dist/constants/builder.js +3 -0
  151. package/sidecar/dist/constants/builder.js.map +1 -1
  152. package/sidecar/dist/constants/claude.d.ts +6 -0
  153. package/sidecar/dist/constants/claude.js +6 -0
  154. package/sidecar/dist/constants/claude.js.map +1 -1
  155. package/sidecar/dist/constants/codex.d.ts +4 -0
  156. package/sidecar/dist/constants/codex.js +4 -0
  157. package/sidecar/dist/constants/codex.js.map +1 -1
  158. package/sidecar/dist/constants/permissions.d.ts +2 -0
  159. package/sidecar/dist/constants/permissions.js +23 -0
  160. package/sidecar/dist/constants/permissions.js.map +1 -1
  161. package/sidecar/dist/constants/project-secrets.d.ts +5 -0
  162. package/sidecar/dist/constants/project-secrets.js +20 -0
  163. package/sidecar/dist/constants/project-secrets.js.map +1 -0
  164. package/sidecar/dist/constants/providers.d.ts +2 -0
  165. package/sidecar/dist/constants/providers.js +1 -0
  166. package/sidecar/dist/constants/providers.js.map +1 -1
  167. package/sidecar/dist/constants/settings.d.ts +1 -2
  168. package/sidecar/dist/constants/settings.js +2 -9
  169. package/sidecar/dist/constants/settings.js.map +1 -1
  170. package/sidecar/dist/constants/tool-kinds.d.ts +67 -2
  171. package/sidecar/dist/constants/tool-kinds.js +111 -34
  172. package/sidecar/dist/constants/tool-kinds.js.map +1 -1
  173. package/sidecar/dist/index.js.map +1 -1
  174. package/sidecar/dist/mcp/http-binding.js +1 -1
  175. package/sidecar/dist/mcp/http-binding.js.map +1 -1
  176. package/sidecar/dist/mcp/tools/builder-compose.d.ts +4 -4
  177. package/sidecar/dist/mcp/tools/builder-compose.js +4 -3
  178. package/sidecar/dist/mcp/tools/builder-compose.js.map +1 -1
  179. package/sidecar/dist/mcp/tools/builder-expr.d.ts +5 -2
  180. package/sidecar/dist/mcp/tools/builder-expr.js +8 -11
  181. package/sidecar/dist/mcp/tools/builder-expr.js.map +1 -1
  182. package/sidecar/dist/mcp/tools/builder-gate.js +3 -1
  183. package/sidecar/dist/mcp/tools/builder-gate.js.map +1 -1
  184. package/sidecar/dist/mcp/tools/builder-project.d.ts +2 -1
  185. package/sidecar/dist/mcp/tools/builder-project.js +94 -16
  186. package/sidecar/dist/mcp/tools/builder-project.js.map +1 -1
  187. package/sidecar/dist/mcp/tools/builder-queries.d.ts +6 -6
  188. package/sidecar/dist/mcp/tools/builder-queries.js +9 -10
  189. package/sidecar/dist/mcp/tools/builder-queries.js.map +1 -1
  190. package/sidecar/dist/mcp/tools/builder-table-view.js +10 -8
  191. package/sidecar/dist/mcp/tools/builder-table-view.js.map +1 -1
  192. package/sidecar/dist/mcp/tools/builder.d.ts +14 -14
  193. package/sidecar/dist/mcp/tools/builder.js +17 -12
  194. package/sidecar/dist/mcp/tools/builder.js.map +1 -1
  195. package/sidecar/dist/protocol/events.d.ts +97 -63
  196. package/sidecar/dist/protocol/events.js +14 -8
  197. package/sidecar/dist/protocol/events.js.map +1 -1
  198. package/sidecar/dist/protocol/messages.d.ts +54 -49
  199. package/sidecar/dist/protocol/messages.js +8 -13
  200. package/sidecar/dist/protocol/messages.js.map +1 -1
  201. package/sidecar/dist/providers/claude/config.d.ts +3 -3
  202. package/sidecar/dist/providers/claude/config.js +4 -2
  203. package/sidecar/dist/providers/claude/config.js.map +1 -1
  204. package/sidecar/dist/providers/claude/provider.js +20 -26
  205. package/sidecar/dist/providers/claude/provider.js.map +1 -1
  206. package/sidecar/dist/providers/claude/safe-mode.d.ts +5 -5
  207. package/sidecar/dist/providers/claude/safe-mode.js +49 -30
  208. package/sidecar/dist/providers/claude/safe-mode.js.map +1 -1
  209. package/sidecar/dist/providers/claude/sdk-loader.js +2 -5
  210. package/sidecar/dist/providers/claude/sdk-loader.js.map +1 -1
  211. package/sidecar/dist/providers/claude/secret-files.d.ts +2 -0
  212. package/sidecar/dist/providers/claude/secret-files.js +50 -0
  213. package/sidecar/dist/providers/claude/secret-files.js.map +1 -0
  214. package/sidecar/dist/providers/claude/session-stream.d.ts +4 -9
  215. package/sidecar/dist/providers/claude/session-stream.js +22 -0
  216. package/sidecar/dist/providers/claude/session-stream.js.map +1 -1
  217. package/sidecar/dist/providers/claude/tool-guard.d.ts +14 -0
  218. package/sidecar/dist/providers/claude/tool-guard.js +112 -0
  219. package/sidecar/dist/providers/claude/tool-guard.js.map +1 -0
  220. package/sidecar/dist/providers/codex/adapter.d.ts +10 -0
  221. package/sidecar/dist/providers/codex/adapter.js +20 -5
  222. package/sidecar/dist/providers/codex/adapter.js.map +1 -1
  223. package/sidecar/dist/providers/codex/client.d.ts +3 -1
  224. package/sidecar/dist/providers/codex/client.js +26 -14
  225. package/sidecar/dist/providers/codex/client.js.map +1 -1
  226. package/sidecar/dist/providers/codex/config.d.ts +6 -17
  227. package/sidecar/dist/providers/codex/config.js +9 -56
  228. package/sidecar/dist/providers/codex/config.js.map +1 -1
  229. package/sidecar/dist/providers/codex/mcp-elicitation.d.ts +21 -0
  230. package/sidecar/dist/providers/codex/mcp-elicitation.js +66 -0
  231. package/sidecar/dist/providers/codex/mcp-elicitation.js.map +1 -0
  232. package/sidecar/dist/providers/codex/module.js +1 -1
  233. package/sidecar/dist/providers/codex/module.js.map +1 -1
  234. package/sidecar/dist/providers/codex/patch-directories.d.ts +6 -0
  235. package/sidecar/dist/providers/codex/patch-directories.js +53 -0
  236. package/sidecar/dist/providers/codex/patch-directories.js.map +1 -0
  237. package/sidecar/dist/providers/codex/permission-profiles.d.ts +11 -0
  238. package/sidecar/dist/providers/codex/permission-profiles.js +37 -0
  239. package/sidecar/dist/providers/codex/permission-profiles.js.map +1 -0
  240. package/sidecar/dist/providers/codex/permissions.d.ts +13 -4
  241. package/sidecar/dist/providers/codex/permissions.js +28 -2
  242. package/sidecar/dist/providers/codex/permissions.js.map +1 -1
  243. package/sidecar/dist/providers/codex/process.d.ts +1 -0
  244. package/sidecar/dist/providers/codex/process.js +3 -1
  245. package/sidecar/dist/providers/codex/process.js.map +1 -1
  246. package/sidecar/dist/providers/codex/protocol/common.d.ts +16 -4
  247. package/sidecar/dist/providers/codex/protocol/index.d.ts +2 -2
  248. package/sidecar/dist/providers/codex/protocol/index.js +1 -1
  249. package/sidecar/dist/providers/codex/protocol/index.js.map +1 -1
  250. package/sidecar/dist/providers/codex/protocol/v2.d.ts +23 -32
  251. package/sidecar/dist/providers/codex/provider.js +16 -15
  252. package/sidecar/dist/providers/codex/provider.js.map +1 -1
  253. package/sidecar/dist/providers/codex/secret-file-globs.d.ts +2 -0
  254. package/sidecar/dist/providers/codex/secret-file-globs.js +45 -0
  255. package/sidecar/dist/providers/codex/secret-file-globs.js.map +1 -0
  256. package/sidecar/dist/providers/codex/skills.d.ts +36 -3
  257. package/sidecar/dist/providers/codex/skills.js +16 -0
  258. package/sidecar/dist/providers/codex/skills.js.map +1 -1
  259. package/sidecar/dist/providers/types.d.ts +3 -1
  260. package/sidecar/dist/providers/types.js +2 -2
  261. package/sidecar/dist/providers/types.js.map +1 -1
  262. package/sidecar/dist/server/http-routes.js +1 -1
  263. package/sidecar/dist/server/http-routes.js.map +1 -1
  264. package/sidecar/dist/server/permission-events.d.ts +1 -1
  265. package/sidecar/dist/server/permission-events.js +5 -8
  266. package/sidecar/dist/server/permission-events.js.map +1 -1
  267. package/sidecar/dist/server/routing.js +0 -5
  268. package/sidecar/dist/server/routing.js.map +1 -1
  269. package/sidecar/dist/server/tool-calls.d.ts +0 -2
  270. package/sidecar/dist/server/tool-calls.js +20 -20
  271. package/sidecar/dist/server/tool-calls.js.map +1 -1
  272. package/sidecar/dist/server/turns.js +9 -1
  273. package/sidecar/dist/server/turns.js.map +1 -1
  274. package/sidecar/dist/server/ws.js +4 -15
  275. package/sidecar/dist/server/ws.js.map +1 -1
  276. package/sidecar/dist/skills/skill-usage.js +2 -2
  277. package/sidecar/dist/skills/skill-usage.js.map +1 -1
  278. package/sidecar/dist/state/change-sets.js.map +1 -1
  279. package/sidecar/dist/state/settings-store.d.ts +13 -5
  280. package/sidecar/dist/state/settings-store.js +33 -8
  281. package/sidecar/dist/state/settings-store.js.map +1 -1
  282. package/sidecar/dist/state/settings-types.d.ts +15 -2
  283. package/sidecar/dist/state/settings-types.js +14 -1
  284. package/sidecar/dist/state/settings-types.js.map +1 -1
  285. package/sidecar/dist/state/store.js +1 -4
  286. package/sidecar/dist/state/store.js.map +1 -1
  287. package/sidecar/dist/state/types.d.ts +7 -6
  288. package/sidecar/dist/state/types.js.map +1 -1
  289. package/sidecar/package.json +2 -1
  290. package/skills/dms-ai/SKILL.md +2 -1
  291. package/skills/dms-external-database/SKILL.md +5 -2
  292. package/frontend-vue/app/chat/components/FullAutoBanner.vue +0 -76
  293. package/frontend-vue/app/chat/components/FullAutoDialog.vue +0 -103
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./answer-schemas"), exports);
17
18
  __exportStar(require("./http-client"), exports);
18
19
  __exportStar(require("./json-body"), exports);
19
20
  __exportStar(require("./query"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sidecar/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,8CAA4B;AAC5B,0CAAwB;AACxB,oDAAkC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sidecar/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,gDAA8B;AAC9B,8CAA4B;AAC5B,0CAAwB;AACxB,oDAAkC"}
@@ -4,3 +4,6 @@ export declare function withNumbersAs(settings: SettingsBody, convert: (value: J
4
4
  [x: string]: JsonBody;
5
5
  };
6
6
  export declare function asFormValues(settings: SettingsBody): SettingsBody;
7
+ export declare function nestDefaultModes(update: SettingsBody): {
8
+ [x: string]: JsonBody;
9
+ };
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.withNumbersAs = withNumbersAs;
4
4
  exports.asFormValues = asFormValues;
5
+ exports.nestDefaultModes = nestDefaultModes;
5
6
  const NUMERIC_SETTINGS = [
6
7
  "requestTimeoutMinutes",
7
8
  "checkpointRetentionDays",
@@ -15,7 +16,38 @@ function withNumbersAs(settings, convert) {
15
16
  }
16
17
  return converted;
17
18
  }
19
+ const DEFAULT_MODE_FIELDS = {
20
+ claude: "defaultModeClaude",
21
+ codex: "defaultModeCodex",
22
+ };
23
+ const DEFAULT_MODES_KEY = "defaultModes";
24
+ function isRecord(value) {
25
+ return typeof value === "object" && value !== null && !Array.isArray(value);
26
+ }
27
+ function flattenDefaultModes(settings) {
28
+ const { [DEFAULT_MODES_KEY]: modes, ...flat } = settings;
29
+ if (!isRecord(modes))
30
+ return flat;
31
+ for (const [provider, field] of Object.entries(DEFAULT_MODE_FIELDS)) {
32
+ const mode = Object.hasOwn(modes, provider) ? modes[provider] : undefined;
33
+ if (mode !== undefined)
34
+ flat[field] = mode;
35
+ }
36
+ return flat;
37
+ }
18
38
  function asFormValues(settings) {
19
- return withNumbersAs(settings, String);
39
+ return withNumbersAs(flattenDefaultModes(settings), String);
40
+ }
41
+ function nestDefaultModes(update) {
42
+ const nested = { ...update };
43
+ const modes = {};
44
+ for (const [provider, field] of Object.entries(DEFAULT_MODE_FIELDS)) {
45
+ if (Object.hasOwn(nested, field))
46
+ modes[provider] = nested[field];
47
+ delete nested[field];
48
+ }
49
+ if (Object.keys(modes).length > 0)
50
+ nested[DEFAULT_MODES_KEY] = modes;
51
+ return nested;
20
52
  }
21
53
  //# sourceMappingURL=settings-values.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-values.js","sourceRoot":"","sources":["../../src/sidecar/settings-values.ts"],"names":[],"mappings":";;AAWA,sCAWC;AAGD,oCAEC;AArBD,MAAM,gBAAgB,GAAG;IACvB,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAEX,SAAgB,aAAa,CAC3B,QAAsB,EACtB,OAAsC;IAEtC,MAAM,SAAS,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAGD,SAAgB,YAAY,CAAC,QAAsB;IACjD,OAAO,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"settings-values.js","sourceRoot":"","sources":["../../src/sidecar/settings-values.ts"],"names":[],"mappings":";;AAWA,sCAWC;AAwBD,oCAEC;AAED,4CASC;AArDD,MAAM,gBAAgB,GAAG;IACvB,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAEX,SAAgB,aAAa,CAC3B,QAAsB,EACtB,OAAsC;IAEtC,MAAM,SAAS,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,mBAAmB,GAAG;IAC1B,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE,kBAAkB;CACjB,CAAC;AAEX,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEzC,SAAS,QAAQ,CAAC,KAA2B;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAsB;IACjD,MAAM,EAAE,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IACzD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAGD,SAAgB,YAAY,CAAC,QAAsB;IACjD,OAAO,aAAa,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAoB;IACnD,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;YAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC;IACrE,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,4 +1,4 @@
1
- export interface AssistantStatus {
1
+ export type AssistantStatus = {
2
2
  status: string;
3
3
  provider?: string;
4
4
  builderAvailable?: boolean;
@@ -13,4 +13,4 @@ export interface AssistantStatus {
13
13
  isRunning: boolean;
14
14
  hasGivenUp: boolean;
15
15
  disabled: boolean;
16
- }
16
+ };
@@ -7,6 +7,8 @@ exports.ALLOWED_BY = {
7
7
  approved: { icon: "i-ph-check-circle", tone: "success" },
8
8
  rule: { icon: "i-ph-key", tone: "info" },
9
9
  full_auto: { icon: "i-ph-lightning", tone: "warning" },
10
+ auto_approved: { icon: "i-ph-seal-check", tone: "success" },
11
+ auto_denied: { icon: "i-ph-prohibit", tone: "warning" },
10
12
  blocked: { icon: "i-ph-shield-warning", tone: "warning" },
11
13
  denied: { icon: "i-ph-prohibit", tone: "error" },
12
14
  expired: { icon: "i-ph-timer", tone: "neutral" },
@@ -1 +1 @@
1
- {"version":3,"file":"enumerations.js","sourceRoot":"","sources":["../../src/vocabulary/enumerations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"enumerations.js","sourceRoot":"","sources":["../../src/vocabulary/enumerations.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,7 @@ import {
26
26
  } from "../composables/useConversationId";
27
27
  import { useConversationList } from "../composables/useConversationList";
28
28
  import { useConversationMode } from "../composables/useConversationMode";
29
+ import { useFollowScroll } from "../composables/useFollowScroll";
29
30
  import { usePermissionQueue } from "../composables/usePermissionQueue";
30
31
  import { useQuestionQueue } from "../composables/useQuestionQueue";
31
32
  import { useQueueActions } from "../composables/useQueueActions";
@@ -55,7 +56,6 @@ import ChatEmpty from "./ChatEmpty.vue";
55
56
  import Composer from "./Composer.vue";
56
57
  import ConnectionBanner from "./ConnectionBanner.vue";
57
58
  import ConversationDrawer from "./ConversationDrawer.vue";
58
- import FullAutoBanner from "./FullAutoBanner.vue";
59
59
  import MessageList from "./MessageList.vue";
60
60
  import PanelHeader, { type PanelStatusKind } from "./PanelHeader.vue";
61
61
  import QuestionDock from "./QuestionDock.vue";
@@ -94,7 +94,6 @@ const { t } = useChatI18n();
94
94
 
95
95
  const HISTORY_KEY = "j";
96
96
  const ESCAPE_KEY = "Escape";
97
- const SCROLL_STICKY_THRESHOLD_PX = 80;
98
97
  const NAVIGATION_TARGETS: Record<string, string> = {
99
98
  changes: CHANGES_PAGE_PATH,
100
99
  activity: ACTIVITY_PAGE_PATH,
@@ -145,6 +144,7 @@ const nowMs = useRunClock(computed(() => true));
145
144
  const composerRef = ref<FocusableComposer | null>(null);
146
145
  const approvalDockRef = ref<FocusableDock | null>(null);
147
146
  const scrollEl = ref<HTMLElement | null>(null);
147
+ const { follow } = useFollowScroll(scrollEl);
148
148
 
149
149
  const isConnected = channel.isConnected;
150
150
  const isRunning = conversation.isRunning;
@@ -216,19 +216,10 @@ const isEmpty = computed(
216
216
  () => conversation.messages.value.length === 0 && !isRunning.value,
217
217
  );
218
218
 
219
- // Sent on the tab's stream itself: the chat's own channel is already closed
220
- // when the panel unmounts it.
221
- function leave(conversationId: string): void {
222
- props.transport.send({
223
- type: CLIENT_MESSAGE_TYPES.LEAVE_CONVERSATION,
224
- conversationId,
225
- });
226
- }
227
-
228
219
  function switchConversation(id: string): void {
220
+ follow();
229
221
  isDrawerOpen.value = false;
230
222
  if (id === activeId.value) return;
231
- leave(activeId.value);
232
223
  activeId.value = id;
233
224
  persistConversationId(id);
234
225
  conversation.reset();
@@ -265,12 +256,19 @@ function reviewChangeSet(changeSetId: string): void {
265
256
  navigate(`${CHANGES_PAGE_PATH}?${query.toString()}`);
266
257
  }
267
258
 
259
+ function sendUserMessage(
260
+ ...args: Parameters<typeof conversation.sendUserMessage>
261
+ ): void {
262
+ follow();
263
+ conversation.sendUserMessage(...args);
264
+ }
265
+
268
266
  function submit(
269
267
  content: string,
270
268
  attachments: PendingAttachment[],
271
269
  includePage: boolean,
272
270
  ): void {
273
- conversation.sendUserMessage(
271
+ sendUserMessage(
274
272
  content,
275
273
  attachments,
276
274
  includePage ? {} : { includePageContext: false },
@@ -294,9 +292,7 @@ function stopAutoFix(): void {
294
292
  }
295
293
 
296
294
  function askAgain(summary: string): void {
297
- conversation.sendUserMessage(
298
- t("dms_ai.panel.approvals.ask_again_message", { summary }),
299
- );
295
+ sendUserMessage(t("dms_ai.panel.approvals.ask_again_message", { summary }));
300
296
  }
301
297
 
302
298
  function askAgainExpired(request: ExpiredRequest): void {
@@ -313,7 +309,7 @@ function runPlan(): void {
313
309
  permissions.respond(planRequest.requestId, { decision: "allow_once" });
314
310
  return;
315
311
  }
316
- conversation.sendUserMessage(t("dms_ai.panel.plan.go_ahead"));
312
+ sendUserMessage(t("dms_ai.panel.plan.go_ahead"));
317
313
  }
318
314
 
319
315
  function setDraft(text: string): void {
@@ -341,7 +337,7 @@ function startConversation(intent: StartConversationIntent): void {
341
337
  if (next !== undefined || sends)
342
338
  whenConnected(() => {
343
339
  if (next !== undefined) mode.setMode(next);
344
- if (sends) conversation.sendUserMessage(prompt);
340
+ if (sends) sendUserMessage(prompt);
345
341
  });
346
342
  if (sends) return;
347
343
  if (prompt) void nextTick(() => setDraft(prompt));
@@ -407,26 +403,6 @@ function refreshListAfterTurn(msg: unknown): void {
407
403
 
408
404
  channel.onMessage(refreshListAfterTurn);
409
405
 
410
- function isNearBottom(el: HTMLElement): boolean {
411
- return (
412
- el.scrollHeight - el.scrollTop - el.clientHeight <=
413
- SCROLL_STICKY_THRESHOLD_PX
414
- );
415
- }
416
-
417
- function scrollToBottom(): void {
418
- const el = scrollEl.value;
419
- if (el !== null) el.scrollTop = el.scrollHeight;
420
- }
421
-
422
- watch(
423
- () => [conversation.messages.value, isRunning.value],
424
- () => {
425
- const el = scrollEl.value;
426
- if (el === null || isNearBottom(el)) void nextTick(scrollToBottom);
427
- },
428
- );
429
-
430
406
  // The DMS mounts the panel open on a reload, often before the tab's stream
431
407
  // is up: the list (and the chat's title) is asked for again once it is.
432
408
  watch(isConnected, (connected) => {
@@ -436,14 +412,10 @@ watch(isConnected, (connected) => {
436
412
  onMounted(() => {
437
413
  document.addEventListener("keydown", onDocumentKeydown);
438
414
  list.refresh();
439
- void nextTick(scrollToBottom);
440
415
  });
441
416
 
442
- // The DMS unmounts the panel's content when the panel closes: the chat is
443
- // left then, which ends a Full auto granted until the chat closes.
444
417
  onBeforeUnmount(() => {
445
418
  document.removeEventListener("keydown", onDocumentKeydown);
446
- leave(activeId.value);
447
419
  });
448
420
  </script>
449
421
 
@@ -466,12 +438,6 @@ onBeforeUnmount(() => {
466
438
  :is-reviving="isReviving"
467
439
  @reconnect="channel.reconnect"
468
440
  />
469
- <FullAutoBanner
470
- v-if="mode.current.value.fullAuto"
471
- :full-auto="mode.current.value.fullAuto"
472
- :now-ms="nowMs"
473
- @turn-off="mode.stopFullAuto"
474
- />
475
441
 
476
442
  <section
477
443
  ref="scrollEl"
@@ -511,6 +477,7 @@ onBeforeUnmount(() => {
511
477
  v-if="providerProblem"
512
478
  :agent-name="agentName"
513
479
  :reason="settings.providers[settings.provider]?.reason ?? ''"
480
+ :code="settings.providers[settings.provider]?.code"
514
481
  @open-settings="navigate(SETTINGS_PAGE_PATH)"
515
482
  />
516
483
  </section>
@@ -553,6 +520,7 @@ onBeforeUnmount(() => {
553
520
  :is-disabled="!isConnected || providerProblem"
554
521
  :is-running="isRunning"
555
522
  :mode="mode.current.value"
523
+ :provider="settings.provider"
556
524
  :builder-available="settings.builderAvailable"
557
525
  :page="page"
558
526
  :usage-label="usageLabel"
@@ -561,7 +529,6 @@ onBeforeUnmount(() => {
561
529
  @stop="stopTurn"
562
530
  @set-scope="mode.setScope"
563
531
  @set-mode="mode.setMode"
564
- @start-full-auto="mode.startFullAuto"
565
532
  @open-settings="navigate(SETTINGS_PAGE_PATH)"
566
533
  />
567
534
  </div>
@@ -4,13 +4,14 @@ import {
4
4
  NEWLINE_HOTKEY_MODIFIER,
5
5
  SEND_HOTKEY,
6
6
  } from "../constants/conversation";
7
+ import { MODES_BY_PROVIDER } from "../constants/modes";
7
8
  import { useChatI18n } from "../composables/useChatI18n";
8
9
  import { useComposerAttachments } from "../composables/useComposerAttachments";
9
10
  import type { CurrentPage } from "../types/conversation";
10
11
  import type {
11
12
  ApprovalMode,
12
13
  ConversationModeState,
13
- FullAutoDuration,
14
+ ProviderName,
14
15
  Scope,
15
16
  } from "../types/protocol";
16
17
  import {
@@ -20,12 +21,12 @@ import {
20
21
  } from "../utils/attachments";
21
22
  import { shortcutLabel } from "../utils/platform";
22
23
  import { pageChipLabel } from "../utils/suggestions";
23
- import FullAutoDialog from "./FullAutoDialog.vue";
24
24
 
25
25
  interface Props {
26
26
  isDisabled: boolean;
27
27
  isRunning: boolean;
28
28
  mode: ConversationModeState;
29
+ provider: ProviderName;
29
30
  builderAvailable: boolean;
30
31
  page: CurrentPage | null;
31
32
  /** "9.6k tokens · this chat", "new chat", "offline". */
@@ -42,7 +43,6 @@ interface Emits {
42
43
  stop: [];
43
44
  setScope: [scope: Scope];
44
45
  setMode: [mode: ApprovalMode];
45
- startFullAuto: [duration: FullAutoDuration];
46
46
  openSettings: [];
47
47
  }
48
48
 
@@ -50,6 +50,8 @@ interface ModeLook {
50
50
  icon: string;
51
51
  labelKey: string;
52
52
  descriptionKey: string;
53
+ /** Where Codex behaves differently from Claude Code in this mode. */
54
+ codexDescriptionKey?: string;
53
55
  }
54
56
 
55
57
  const props = defineProps<Props>();
@@ -58,17 +60,22 @@ const { t } = useChatI18n();
58
60
 
59
61
  const MAX_HEIGHT_PX = 160;
60
62
  const SCOPES: readonly Scope[] = ["safe", "vibe"];
61
- const MODES: readonly ApprovalMode[] = ["normal", "acceptEdits", "plan"];
62
63
  const MODE_LOOKS: Record<ApprovalMode, ModeLook> = {
63
64
  normal: {
64
65
  icon: "i-ph-hand-palm",
65
66
  labelKey: "dms_ai.common.mode.normal",
66
67
  descriptionKey: "dms_ai.panel.composer.mode_desc.normal",
67
68
  },
69
+ auto: {
70
+ icon: "i-ph-seal-check",
71
+ labelKey: "dms_ai.common.mode.auto",
72
+ descriptionKey: "dms_ai.panel.composer.mode_desc.auto",
73
+ },
68
74
  acceptEdits: {
69
75
  icon: "i-ph-pencil-simple-line",
70
76
  labelKey: "dms_ai.common.mode.acceptEdits",
71
77
  descriptionKey: "dms_ai.panel.composer.mode_desc.acceptEdits",
78
+ codexDescriptionKey: "dms_ai.panel.composer.mode_desc.acceptEdits_codex",
72
79
  },
73
80
  plan: {
74
81
  icon: "i-ph-list-checks",
@@ -85,7 +92,6 @@ const historyKbd = shortcutLabel(HISTORY_KEY);
85
92
 
86
93
  const draft = ref("");
87
94
  const isPageIncluded = ref(true);
88
- const isFullAutoOpen = ref(false);
89
95
  const isFocused = ref(false);
90
96
  const textareaRef = ref<HTMLTextAreaElement | null>(null);
91
97
  const fileInputRef = ref<HTMLInputElement | null>(null);
@@ -100,7 +106,6 @@ const isSendDisabled = computed(
100
106
  const modeLook = computed(
101
107
  () => MODE_LOOKS[props.mode.mode] ?? MODE_LOOKS.normal,
102
108
  );
103
- const isFullAuto = computed(() => props.mode.fullAuto !== null);
104
109
 
105
110
  watch(
106
111
  () => props.page?.path,
@@ -123,27 +128,22 @@ const scopeItems = computed(() =>
123
128
  })),
124
129
  );
125
130
 
131
+ function modeDescriptionKey(look: ModeLook): string {
132
+ return props.provider === "codex"
133
+ ? (look.codexDescriptionKey ?? look.descriptionKey)
134
+ : look.descriptionKey;
135
+ }
136
+
126
137
  const modeItems = computed(() => [
127
138
  [{ type: "label" as const, label: t("dms_ai.panel.composer.mode_menu") }],
128
- MODES.map((mode) => ({
139
+ MODES_BY_PROVIDER[props.provider].map((mode) => ({
129
140
  label: t(MODE_LOOKS[mode].labelKey),
130
- description: t(MODE_LOOKS[mode].descriptionKey),
141
+ description: t(modeDescriptionKey(MODE_LOOKS[mode])),
131
142
  icon: MODE_LOOKS[mode].icon,
132
143
  type: "checkbox" as const,
133
- checked: !isFullAuto.value && props.mode.mode === mode,
144
+ checked: props.mode.mode === mode,
134
145
  onSelect: (): void => emit("setMode", mode),
135
146
  })),
136
- [
137
- {
138
- label: t("dms_ai.panel.composer.full_auto_item"),
139
- description: t("dms_ai.panel.composer.mode_desc.auto"),
140
- icon: "i-ph-lightning",
141
- color: "error" as const,
142
- onSelect: (): void => {
143
- isFullAutoOpen.value = true;
144
- },
145
- },
146
- ],
147
147
  [
148
148
  {
149
149
  label: t("dms_ai.panel.composer.default_mode"),
@@ -310,15 +310,9 @@ defineExpose({
310
310
  :items="modeItems"
311
311
  :content="{ side: 'top', align: 'start' }"
312
312
  >
313
- <button
314
- type="button"
315
- class="cb-mode-btn"
316
- :class="{ 'is-danger': isFullAuto }"
317
- >
318
- <UIcon :name="isFullAuto ? 'i-ph-lightning' : modeLook.icon" />
319
- {{
320
- isFullAuto ? t("dms_ai.common.mode.auto") : t(modeLook.labelKey)
321
- }}
313
+ <button type="button" class="cb-mode-btn">
314
+ <UIcon :name="modeLook.icon" />
315
+ {{ t(modeLook.labelKey) }}
322
316
  <UIcon name="i-ph-caret-down" />
323
317
  </button>
324
318
  </UDropdownMenu>
@@ -388,10 +382,6 @@ defineExpose({
388
382
  </span>
389
383
  <span class="cb-composer__usage">{{ usageLabel }}</span>
390
384
  </div>
391
- <FullAutoDialog
392
- v-model:open="isFullAutoOpen"
393
- @confirm="(duration) => emit('startFullAuto', duration)"
394
- />
395
385
  </form>
396
386
  </template>
397
387
 
@@ -556,12 +546,6 @@ defineExpose({
556
546
  color: var(--ui-success);
557
547
  }
558
548
 
559
- .cb-mode-btn.is-danger {
560
- border-color: var(--dms-error-line);
561
- background: var(--dms-error-tint);
562
- color: var(--ui-error);
563
- }
564
-
565
549
  .cb-composer__file {
566
550
  display: none;
567
551
  }
@@ -31,6 +31,7 @@ const LOOKS: Record<Notice["kind"], NoticeLook> = {
31
31
  question_skipped: { tone: "neutral", icon: "i-ph-arrow-bend-down-right" },
32
32
  full_auto_ended: { tone: "neutral", icon: "i-ph-lightning-slash" },
33
33
  model_fallback: { tone: "warning", icon: "i-ph-swap" },
34
+ auto_unavailable: { tone: "warning", icon: "i-ph-seal-warning" },
34
35
  };
35
36
 
36
37
  const showErrors = ref(false);
@@ -132,6 +133,14 @@ const expiredTool = computed<string>(() => {
132
133
  })
133
134
  }}
134
135
  </template>
136
+ <template v-else-if="notice.kind === 'auto_unavailable'">
137
+ <b>{{ t("dms_ai.panel.notice.auto_unavailable_title") }}</b>
138
+ {{
139
+ t("dms_ai.panel.notice.auto_unavailable_text", {
140
+ model: notice.model,
141
+ })
142
+ }}
143
+ </template>
135
144
  <template v-else>
136
145
  {{ t("dms_ai.panel.notice.full_auto_ended", { time }) }}
137
146
  </template>
@@ -1,19 +1,30 @@
1
1
  <script setup lang="ts">
2
+ import { computed } from "vue";
2
3
  import { useChatI18n } from "../composables/useChatI18n";
4
+ import type { ProviderUnavailableCode } from "../types/settings";
3
5
 
4
6
  interface Props {
5
7
  agentName: string;
6
- /** Why the provider cannot run, as the sidecar reported it. */
8
+ /** Why the provider cannot run, as the sidecar reported it, in English. */
7
9
  reason: string;
10
+ /** Set when the panel words the reason itself. */
11
+ code?: ProviderUnavailableCode;
8
12
  }
9
13
 
14
+ const REASON_KEYS: Record<ProviderUnavailableCode, string> = {
15
+ codex_not_signed_in: "dms_ai.panel.errors.codex_not_signed_in",
16
+ };
17
+
10
18
  interface Emits {
11
19
  openSettings: [];
12
20
  }
13
21
 
14
- defineProps<Props>();
22
+ const props = defineProps<Props>();
15
23
  const emit = defineEmits<Emits>();
16
24
  const { t } = useChatI18n();
25
+ const reasonText = computed(() =>
26
+ props.code === undefined ? props.reason : t(REASON_KEYS[props.code]),
27
+ );
17
28
  </script>
18
29
 
19
30
  <template>
@@ -24,7 +35,7 @@ const { t } = useChatI18n();
24
35
  <b>
25
36
  {{ t("dms_ai.panel.errors.agent_cant_run", { agent: agentName }) }}
26
37
  </b>
27
- {{ reason }}
38
+ {{ reasonText }}
28
39
  {{ t("dms_ai.panel.errors.agent_no_fallback") }}
29
40
  <div class="cb-provider__row">
30
41
  <UButton
@@ -10,7 +10,6 @@ import type {
10
10
  BlockPreview,
11
11
  ChangeSetSummary,
12
12
  ConversationModeState,
13
- FullAutoState,
14
13
  Notice,
15
14
  QueuedItemWire,
16
15
  SnapshotMessage,
@@ -65,7 +64,6 @@ interface RunProgressEvent {
65
64
  interface SnapshotModeWire {
66
65
  mode?: ConversationModeState["mode"];
67
66
  generationMode?: ConversationModeState["generationMode"];
68
- fullAuto?: FullAutoState | null;
69
67
  }
70
68
 
71
69
  interface SnapshotEvent {
@@ -263,7 +261,6 @@ function toModeState(wire: SnapshotModeWire | undefined) {
263
261
  return {
264
262
  mode: wire.mode,
265
263
  generationMode: wire.generationMode,
266
- fullAuto: wire.fullAuto ?? null,
267
264
  };
268
265
  }
269
266
 
@@ -1,9 +1,9 @@
1
1
  import { computed, type ComputedRef, type Ref } from "vue";
2
+ import { modeFor } from "../constants/modes";
2
3
  import { CLIENT_MESSAGE_TYPES } from "../constants/protocol";
3
4
  import type {
4
5
  ApprovalMode,
5
6
  ConversationModeState,
6
- FullAutoDuration,
7
7
  Scope,
8
8
  } from "../types/protocol";
9
9
  import type { AppSettings } from "../types/settings";
@@ -17,12 +17,10 @@ export interface UseConversationModeOptions {
17
17
  }
18
18
 
19
19
  export interface UseConversationModeResult {
20
- /** The chat's mode, its scope and Full auto, defaults until the sidecar says. */
20
+ /** The chat's mode and its scope, defaults until the sidecar says. */
21
21
  current: ComputedRef<ConversationModeState>;
22
22
  setMode: (mode: ApprovalMode) => void;
23
23
  setScope: (scope: Scope) => void;
24
- startFullAuto: (duration: FullAutoDuration) => void;
25
- stopFullAuto: () => void;
26
24
  }
27
25
 
28
26
  function effectiveScope(scope: Scope, builderAvailable: boolean): Scope {
@@ -30,9 +28,10 @@ function effectiveScope(scope: Scope, builderAvailable: boolean): Scope {
30
28
  }
31
29
 
32
30
  /**
33
- * The active chat's approval mode, scope and Full auto: what the sidecar says,
34
- * or the defaults for new chats from the settings until it has. Changes apply
35
- * at once here and are sent for the sidecar to confirm.
31
+ * The active chat's approval mode and scope: what the sidecar says,
32
+ * or the current provider's default from the settings until it has. A mode the
33
+ * provider does not have reads as Ask first. Changes apply at once here and
34
+ * are sent for the sidecar to confirm.
36
35
  */
37
36
  export function useConversationMode(
38
37
  options: UseConversationModeOptions,
@@ -40,12 +39,12 @@ export function useConversationMode(
40
39
  const current = computed<ConversationModeState>(() => {
41
40
  const { settings, mode } = options;
42
41
  const base: ConversationModeState = mode.value ?? {
43
- mode: settings.value.mode,
42
+ mode: settings.value.defaultModes[settings.value.provider],
44
43
  generationMode: settings.value.generationMode,
45
- fullAuto: null,
46
44
  };
47
45
  return {
48
46
  ...base,
47
+ mode: modeFor(settings.value.provider, base.mode),
49
48
  generationMode: effectiveScope(
50
49
  base.generationMode,
51
50
  settings.value.builderAvailable,
@@ -67,7 +66,5 @@ export function useConversationMode(
67
66
  current,
68
67
  setMode: (mode) => change({ mode }),
69
68
  setScope: (generationMode) => change({ generationMode }),
70
- startFullAuto: (duration) => change({ fullAuto: { duration } }),
71
- stopFullAuto: () => change({ fullAuto: null }),
72
69
  };
73
70
  }