@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
@@ -0,0 +1,77 @@
1
+ import { type Ref, watch } from "vue";
2
+
3
+ const BOTTOM_EPSILON_PX = 4;
4
+
5
+ function distanceFromBottom(el: HTMLElement): number {
6
+ return el.scrollHeight - el.scrollTop - el.clientHeight;
7
+ }
8
+
9
+ function scrollToBottom(el: HTMLElement): void {
10
+ el.scrollTop = el.scrollHeight;
11
+ }
12
+
13
+ /**
14
+ * Keeps a scrolling container on its newest content while it follows. The
15
+ * view follows from the start. An upward scroll that leaves it more than a few
16
+ * pixels from the bottom stops the following, whatever caused it (wheel, keys,
17
+ * scrollbar, find in page, text selection). A scroll that reaches the bottom,
18
+ * or a call to `follow`, starts it again. This holds because the scrolls made
19
+ * here only go down, and a scroll the browser makes when content shrinks
20
+ * still ends at the bottom. A resize of the container or of anything inside
21
+ * it re-pins the bottom, so growth that changes no reactive data (docks,
22
+ * images, wrapping, cards that open) is followed too.
23
+ */
24
+ export function useFollowScroll(scrollEl: Ref<HTMLElement | null>): {
25
+ /** Jumps to the bottom and follows from there. */
26
+ follow: () => void;
27
+ } {
28
+ let following = true;
29
+
30
+ function follow(): void {
31
+ following = true;
32
+ if (scrollEl.value !== null) scrollToBottom(scrollEl.value);
33
+ }
34
+
35
+ function attach(el: HTMLElement): () => void {
36
+ let lastTop = el.scrollTop;
37
+
38
+ const onScroll = (): void => {
39
+ const top = el.scrollTop;
40
+ const movedUp = top < lastTop;
41
+ lastTop = top;
42
+ if (distanceFromBottom(el) <= BOTTOM_EPSILON_PX) following = true;
43
+ else if (movedUp) following = false;
44
+ };
45
+
46
+ const resizes = new ResizeObserver(() => {
47
+ if (following) scrollToBottom(el);
48
+ });
49
+ const observeContent = (): void => {
50
+ resizes.disconnect();
51
+ resizes.observe(el);
52
+ for (const child of el.children) resizes.observe(child);
53
+ };
54
+ const children = new MutationObserver(observeContent);
55
+ observeContent();
56
+ children.observe(el, { childList: true });
57
+
58
+ el.addEventListener("scroll", onScroll, { passive: true });
59
+
60
+ return () => {
61
+ resizes.disconnect();
62
+ children.disconnect();
63
+ el.removeEventListener("scroll", onScroll);
64
+ };
65
+ }
66
+
67
+ watch(
68
+ scrollEl,
69
+ (el, _previous, onCleanup) => {
70
+ if (el === null) return;
71
+ onCleanup(attach(el));
72
+ },
73
+ { immediate: true, flush: "post" },
74
+ );
75
+
76
+ return { follow };
77
+ }
@@ -0,0 +1,15 @@
1
+ import type { ApprovalMode, ProviderName } from "../types/protocol";
2
+
3
+ export const MODES_BY_PROVIDER: Record<ProviderName, readonly ApprovalMode[]> =
4
+ {
5
+ claude: ["normal", "auto", "acceptEdits", "plan"],
6
+ codex: ["normal", "acceptEdits", "plan"],
7
+ };
8
+
9
+ /** The mode as the provider has it: one it lacks reads as Ask first. */
10
+ export function modeFor(
11
+ provider: ProviderName,
12
+ mode: ApprovalMode,
13
+ ): ApprovalMode {
14
+ return MODES_BY_PROVIDER[provider].includes(mode) ? mode : "normal";
15
+ }
@@ -14,7 +14,6 @@ export const CLIENT_MESSAGE_TYPES = {
14
14
  QUEUE_CLEAR: "queue_clear",
15
15
  REVOKE_RULE: "revoke_rule",
16
16
  SET_CONVERSATION_MODE: "set_conversation_mode",
17
- LEAVE_CONVERSATION: "leave_conversation",
18
17
  STOP_AUTOFIX: "stop_autofix",
19
18
  RETRY_TURN: "retry_turn",
20
19
  CHANGE_SET_ACTION: "change_set_action",
@@ -4,7 +4,7 @@ const DEFAULT_REQUEST_TIMEOUT_MINUTES = 5;
4
4
 
5
5
  export const DEFAULT_SETTINGS: AppSettings = {
6
6
  provider: "claude",
7
- mode: "normal",
7
+ defaultModes: { claude: "auto", codex: "normal" },
8
8
  thinking: "medium",
9
9
  generationMode: "safe",
10
10
  allowLocalSkills: false,
@@ -5,9 +5,8 @@
5
5
  */
6
6
 
7
7
  export type ProviderName = "claude" | "codex";
8
- export type ApprovalMode = "normal" | "acceptEdits" | "plan";
8
+ export type ApprovalMode = "normal" | "auto" | "acceptEdits" | "plan";
9
9
  export type Scope = "safe" | "vibe";
10
- export type FullAutoDuration = "turn" | "30m" | "chat";
11
10
 
12
11
  export type ToolOutcome = "done" | "failed" | "denied" | "blocked" | "stopped";
13
12
 
@@ -17,6 +16,8 @@ export type AllowedBy =
17
16
  | "approved"
18
17
  | "rule"
19
18
  | "full_auto"
19
+ | "auto_approved"
20
+ | "auto_denied"
20
21
  | "blocked"
21
22
  | "denied"
22
23
  | "expired";
@@ -172,22 +173,23 @@ export interface ModelFallbackNotice {
172
173
  timestampMs: number;
173
174
  }
174
175
 
176
+ export interface AutoUnavailableNotice {
177
+ kind: "auto_unavailable";
178
+ model: string;
179
+ timestampMs: number;
180
+ }
181
+
175
182
  export type Notice =
176
183
  | AutoFixNotice
177
184
  | PermissionExpiredNotice
178
185
  | QuestionSkippedNotice
179
186
  | FullAutoEndedNotice
180
- | ModelFallbackNotice;
181
-
182
- export interface FullAutoState {
183
- duration: FullAutoDuration;
184
- untilMs?: number;
185
- }
187
+ | ModelFallbackNotice
188
+ | AutoUnavailableNotice;
186
189
 
187
190
  export interface ConversationModeState {
188
191
  mode: ApprovalMode;
189
192
  generationMode: Scope;
190
- fullAuto: FullAutoState | null;
191
193
  }
192
194
 
193
195
  export interface QuestionAnswerRecord {
@@ -3,16 +3,21 @@ import type { ApprovalMode, ProviderName, Scope } from "./protocol";
3
3
  export type ThinkingLevel = "off" | "low" | "medium" | "high";
4
4
  export type { ProviderName };
5
5
 
6
+ /** The unavailability reasons the panel words itself (sidecar `PROVIDER_UNAVAILABLE_CODES`). */
7
+ export type ProviderUnavailableCode = "codex_not_signed_in";
8
+
6
9
  export interface ProviderAvailability {
7
10
  available: boolean;
8
- /** Why the provider cannot be picked; absent when it is available. */
11
+ /** Why the provider cannot be picked, in English; absent when it is available. */
9
12
  reason?: string;
13
+ /** Names the reason when the panel has its own wording for it. */
14
+ code?: ProviderUnavailableCode;
10
15
  }
11
16
 
12
17
  export interface AppSettings {
13
18
  provider: ProviderName;
14
19
  /** The default approval mode of new chats. */
15
- mode: ApprovalMode;
20
+ defaultModes: Record<ProviderName, ApprovalMode>;
16
21
  thinking: ThinkingLevel;
17
22
  /** The default scope of new chats. */
18
23
  generationMode: Scope;
@@ -90,6 +90,7 @@ const DESTRUCTIVE_TITLE_KEYS: Record<string, string> = {
90
90
  BuilderRemoveField: "dms_ai.panel.approvals.destructive.remove_field",
91
91
  BuilderDeleteCategory: "dms_ai.panel.approvals.destructive.delete_category",
92
92
  BuilderRemoveQuery: "dms_ai.panel.approvals.destructive.remove_query",
93
+ BuilderMapResources: "dms_ai.panel.approvals.destructive.map_resources",
93
94
  };
94
95
 
95
96
  function destructiveTitle(
@@ -27,6 +27,8 @@ export const DECISION_STYLES: Record<AllowedBy, DecisionStyle> = {
27
27
  approved: { icon: "i-ph-check-circle", iconClass: "text-success" },
28
28
  rule: { icon: "i-ph-key", iconClass: "text-secondary" },
29
29
  full_auto: { icon: "i-ph-lightning", iconClass: "text-secondary" },
30
+ auto_approved: { icon: "i-ph-seal-check", iconClass: "text-success" },
31
+ auto_denied: { icon: "i-ph-prohibit", iconClass: "text-warning" },
30
32
  blocked: { icon: "i-ph-shield-warning", iconClass: "text-warning" },
31
33
  denied: { icon: "i-ph-prohibit", iconClass: "text-error" },
32
34
  expired: { icon: "i-ph-hourglass-simple", iconClass: "text-warning" },
@@ -2,7 +2,7 @@ import type { Tone } from "#dms-core/app/types/tone";
2
2
 
3
3
  type AgentId = "claude" | "codex";
4
4
  export type ScopeId = "safe" | "vibe";
5
- export type ApprovalMode = "normal" | "acceptEdits" | "plan";
5
+ export type ApprovalMode = "normal" | "auto" | "acceptEdits" | "plan";
6
6
  type AssistantState = "ready" | "working" | "waiting";
7
7
  export type TypecheckOutcome = "passed" | "failed" | "skipped";
8
8
  export type ChangeSetState = "applied" | "undone";
@@ -16,6 +16,8 @@ export type AllowedBy =
16
16
  | "approved"
17
17
  | "rule"
18
18
  | "full_auto"
19
+ | "auto_approved"
20
+ | "auto_denied"
19
21
  | "blocked"
20
22
  | "denied"
21
23
  | "expired";
@@ -263,13 +263,15 @@
263
263
  "approved": "Approved by you",
264
264
  "rule": "Allowed by a rule",
265
265
  "full_auto": "Full auto",
266
+ "auto_approved": "Allowed by Auto review",
267
+ "auto_denied": "Blocked by Auto review",
266
268
  "blocked": "Blocked · safe mode",
267
269
  "denied": "Denied by you",
268
270
  "expired": "Expired"
269
271
  },
270
272
  "allowed_metric": {
271
273
  "deletions_asked": "Deletions asked",
272
- "deletions_note": "Deletions always ask, even in Full auto"
274
+ "deletions_note": "Deletions always ask, in every mode"
273
275
  },
274
276
  "result": {
275
277
  "done": "Done",
@@ -421,6 +423,7 @@
421
423
  "label": "Coding agent",
422
424
  "description": "Runs on this machine, in the project folder. Your code only goes to the provider you pick; a failing agent never falls back to the other.",
423
425
  "unavailable": "Not set up on this machine",
426
+ "codex_not_signed_in": "Sign in with ChatGPT below to run Codex on your ChatGPT plan.",
424
427
  "claude": {
425
428
  "label": "Claude Code",
426
429
  "description": "Anthropic · model chosen by Claude Code"
@@ -469,29 +472,36 @@
469
472
  "label": "Claude model",
470
473
  "description": "The model Claude Code runs on. Thinking sets its reasoning effort."
471
474
  },
475
+ "default_mode_claude": {
476
+ "label": "Default mode on Claude Code",
477
+ "description": "What Claude Code may do without asking you first. Auto review is the recommended default."
478
+ },
479
+ "default_mode_codex": {
480
+ "label": "Default mode on Codex",
481
+ "description": "What Codex may do without asking you first. Codex has no Auto review."
482
+ },
472
483
  "mode": {
473
- "label": "Approval mode",
474
- "description": "What the assistant may do without asking you first.",
475
484
  "normal": {
476
485
  "label": "Ask first",
477
- "description": "Asks before any change outside the Builder."
486
+ "description": "Asks before any change outside the Builder and before every command, read-only ones included."
487
+ },
488
+ "auto": {
489
+ "label": "Auto review",
490
+ "description": "A safety check approves routine file edits and web access. Shell commands, dependency files, git hooks and deletions still ask. Asks first on models or plans without it."
478
491
  },
479
492
  "acceptEdits": {
480
493
  "label": "Accept edits",
481
- "description": "Applies file edits, asks for the rest."
494
+ "description": "Applies file edits, except dependency and git hook files. Asks for the rest, every command included.",
495
+ "description_codex": "With Codex, works as Ask first: asks before every file edit, dependency and git hook files included, and before any command that writes."
482
496
  },
483
497
  "plan": {
484
498
  "label": "Plan only",
485
499
  "description": "Reads and proposes. Changes nothing."
486
- },
487
- "auto": {
488
- "label": "Full auto",
489
- "description": "Not available as a default. Turn it on per chat, for a limited time."
490
500
  }
491
501
  },
492
502
  "always_ask": {
493
503
  "label": "Always ask for",
494
- "description": "These ask in every mode, including Full auto."
504
+ "description": "These ask in every mode."
495
505
  },
496
506
  "always_ask_deletions": {
497
507
  "label": "Deleting pages, tables, fields or queries",
@@ -617,7 +627,7 @@
617
627
  "normal": "Ask first",
618
628
  "acceptEdits": "Accept edits",
619
629
  "plan": "Plan only",
620
- "auto": "Full auto"
630
+ "auto": "Auto review"
621
631
  },
622
632
  "facts": {
623
633
  "state": "Status",
@@ -263,13 +263,15 @@
263
263
  "approved": "Autorisée par vous",
264
264
  "rule": "Autorisée par une règle",
265
265
  "full_auto": "Automatique complet",
266
+ "auto_approved": "Autorisé par la revue automatique",
267
+ "auto_denied": "Bloqué par la revue automatique",
266
268
  "blocked": "Bloquée · mode sûr",
267
269
  "denied": "Refusée par vous",
268
270
  "expired": "Expirée"
269
271
  },
270
272
  "allowed_metric": {
271
273
  "deletions_asked": "Suppressions demandées",
272
- "deletions_note": "Les suppressions demandent toujours, même en automatique complet"
274
+ "deletions_note": "Les suppressions demandent toujours, dans tous les modes"
273
275
  },
274
276
  "result": {
275
277
  "done": "Terminée",
@@ -421,6 +423,7 @@
421
423
  "label": "Agent de code",
422
424
  "description": "Tourne sur cette machine, dans le dossier du projet. Votre code ne part que chez le fournisseur choisi ; un agent en panne ne bascule jamais sur l'autre.",
423
425
  "unavailable": "Non configuré sur cette machine",
426
+ "codex_not_signed_in": "Connectez-vous avec ChatGPT ci-dessous pour utiliser Codex avec votre forfait ChatGPT.",
424
427
  "claude": {
425
428
  "label": "Claude Code",
426
429
  "description": "Anthropic · modèle choisi par Claude Code"
@@ -469,29 +472,36 @@
469
472
  "label": "Modèle Claude",
470
473
  "description": "Le modèle sur lequel tourne Claude Code. La réflexion règle son niveau d'effort."
471
474
  },
475
+ "default_mode_claude": {
476
+ "label": "Mode par défaut avec Claude Code",
477
+ "description": "Ce que Claude Code peut faire sans vous demander d'abord. La revue automatique est le choix recommandé."
478
+ },
479
+ "default_mode_codex": {
480
+ "label": "Mode par défaut avec Codex",
481
+ "description": "Ce que Codex peut faire sans vous demander d'abord. Codex n'a pas de revue automatique."
482
+ },
472
483
  "mode": {
473
- "label": "Mode de validation",
474
- "description": "Ce que l'assistant peut faire sans vous demander d'abord.",
475
484
  "normal": {
476
485
  "label": "Demander d'abord",
477
- "description": "Demande avant toute modification en dehors du Builder."
486
+ "description": "Demande avant toute modification en dehors du Builder et avant chaque commande, même en lecture seule."
487
+ },
488
+ "auto": {
489
+ "label": "Revue automatique",
490
+ "description": "Un contrôle de sécurité approuve les modifications de fichiers courantes et l'accès au web. Les commandes shell, les fichiers de dépendances, les hooks git et les suppressions demandent encore votre accord. Sur un modèle ou une offre qui ne la permet pas, l'assistant demande avant d'agir."
478
491
  },
479
492
  "acceptEdits": {
480
493
  "label": "Accepter les modifications",
481
- "description": "Applique les modifications de fichiers, demande pour le reste."
494
+ "description": "Applique les modifications de fichiers, sauf les fichiers de dépendances et les hooks git. Demande pour le reste, chaque commande comprise.",
495
+ "description_codex": "Avec Codex, fonctionne comme Demander d'abord : demande avant chaque modification de fichier, fichiers de dépendances et hooks git compris, et avant toute commande qui écrit."
482
496
  },
483
497
  "plan": {
484
498
  "label": "Plan seulement",
485
499
  "description": "Lit et propose. Ne modifie rien."
486
- },
487
- "auto": {
488
- "label": "Automatique complet",
489
- "description": "Indisponible par défaut. Activez-le par conversation, pour une durée limitée."
490
500
  }
491
501
  },
492
502
  "always_ask": {
493
503
  "label": "Toujours demander pour",
494
- "description": "Ces opérations demandent dans tous les modes, automatique complet compris."
504
+ "description": "Ces opérations demandent dans tous les modes."
495
505
  },
496
506
  "always_ask_deletions": {
497
507
  "label": "Supprimer des pages, tables, champs ou requêtes",
@@ -617,7 +627,7 @@
617
627
  "normal": "Demander d'abord",
618
628
  "acceptEdits": "Accepter les modifications",
619
629
  "plan": "Plan seulement",
620
- "auto": "Automatique complet"
630
+ "auto": "Revue automatique"
621
631
  },
622
632
  "facts": {
623
633
  "state": "État",
@@ -7,9 +7,9 @@
7
7
  },
8
8
  "mode": {
9
9
  "normal": "Ask first",
10
+ "auto": "Auto review",
10
11
  "acceptEdits": "Accept edits",
11
- "plan": "Plan only",
12
- "auto": "Full auto"
12
+ "plan": "Plan only"
13
13
  },
14
14
  "scope": {
15
15
  "safe": "Safe mode",
@@ -143,6 +143,8 @@
143
143
  "expired_text": "“{summary}” was not answered in time, so it was denied at {time} and the assistant was told why.",
144
144
  "question_skipped": "You let the assistant decide “{header}”.",
145
145
  "full_auto_ended": "Full auto ended at {time}. The assistant asks first again.",
146
+ "auto_unavailable_title": "Auto review isn't available here.",
147
+ "auto_unavailable_text": "{model}, this plan or a setting doesn't allow it. This chat asks first instead.",
146
148
  "model_fallback_title": "Switched to {model}.",
147
149
  "model_fallback_text": "The requested model, {requested}, was refused (unknown, or no access on this plan). This answer comes from {model}, the default model."
148
150
  },
@@ -156,6 +158,7 @@
156
158
  "stop_not_delivered": "The assistant could not be reached to stop the run. Reconnect to see where it stands.",
157
159
  "agent_cant_run": "{agent} can't run.",
158
160
  "agent_no_fallback": "Your messages are not sent to any other agent.",
161
+ "codex_not_signed_in": "Sign in with ChatGPT in Assistant › Settings to run Codex on your ChatGPT plan.",
159
162
  "open_settings": "Open settings"
160
163
  },
161
164
  "plan": {
@@ -234,7 +237,8 @@
234
237
  "delete_table": "Delete the table {target}",
235
238
  "remove_field": "Remove the field {target}",
236
239
  "delete_category": "Delete the category {target}",
237
- "remove_query": "Remove the query {target}"
240
+ "remove_query": "Remove the query {target}",
241
+ "map_resources": "Map the tables and remove the pages {target}"
238
242
  },
239
243
  "consequence_deletes_data": "Removes the code and its data",
240
244
  "consequence_removes_code": "Removes the code · undoable"
@@ -290,12 +294,12 @@
290
294
  },
291
295
  "mode_menu": "Approval mode · this chat",
292
296
  "mode_desc": {
293
- "normal": "Asks before any edit, command or web request.",
294
- "acceptEdits": "Applies file edits, asks for commands and web requests.",
297
+ "normal": "Asks before any edit, web request or command, read-only commands included.",
298
+ "acceptEdits": "Applies file edits, except dependency and git hook files. Asks before every command and web request.",
299
+ "acceptEdits_codex": "With Codex, works as Ask first: asks before every file edit, dependency and git hook files included, and before any command that writes.",
295
300
  "plan": "Reads and proposes a plan. Changes nothing.",
296
- "auto": "Runs everything without asking, except deletions."
301
+ "auto": "A safety check approves routine file edits and web access. Shell commands, dependency files, git hooks and deletions still ask."
297
302
  },
298
- "full_auto_item": "Full auto…",
299
303
  "default_mode": "Default for new chats",
300
304
  "hint_send": "send",
301
305
  "hint_queue": "queue",
@@ -306,20 +310,6 @@
306
310
  "usage_new": "new chat",
307
311
  "usage_offline": "offline"
308
312
  },
309
- "full_auto": {
310
- "title": "Turn on Full auto?",
311
- "description": "The assistant will edit files and run commands in this chat without asking. Deletions and dependency changes still ask. Every change stays in the change set and can be undone.",
312
- "turn_off_after": "Turn off after",
313
- "duration_turn": "This turn",
314
- "duration_30m": "30 minutes",
315
- "duration_chat": "Closing the chat",
316
- "confirm": "Turn on Full auto",
317
- "banner_turn": "this turn only",
318
- "banner_30m": "for 30 minutes",
319
- "banner_chat": "until the chat closes",
320
- "banner_until": "ends in {time}",
321
- "turn_off": "Turn off"
322
- },
323
313
  "drawer": {
324
314
  "title": "Conversations",
325
315
  "new": "New",
@@ -7,9 +7,9 @@
7
7
  },
8
8
  "mode": {
9
9
  "normal": "Demander d'abord",
10
+ "auto": "Revue automatique",
10
11
  "acceptEdits": "Accepter les modifications",
11
- "plan": "Plan seulement",
12
- "auto": "Automatique complet"
12
+ "plan": "Plan seulement"
13
13
  },
14
14
  "scope": {
15
15
  "safe": "Mode sûr",
@@ -143,6 +143,8 @@
143
143
  "expired_text": "« {summary} » est restée sans réponse : elle a été refusée à {time} et l'assistant en a été informé.",
144
144
  "question_skipped": "Vous avez laissé l'assistant décider pour « {header} ».",
145
145
  "full_auto_ended": "Le mode automatique complet a pris fin à {time}. L'assistant redemande avant d'agir.",
146
+ "auto_unavailable_title": "La revue automatique n'est pas disponible ici.",
147
+ "auto_unavailable_text": "{model}, votre offre ou un réglage ne la permet pas. Dans cette conversation, l'assistant demande avant d'agir.",
146
148
  "model_fallback_title": "Passage à {model}.",
147
149
  "model_fallback_text": "Le modèle demandé, {requested}, a été refusé (inconnu, ou sans accès avec cet abonnement). Cette réponse vient de {model}, le modèle par défaut."
148
150
  },
@@ -156,6 +158,7 @@
156
158
  "stop_not_delivered": "L'assistant n'a pas pu être joint pour arrêter le tour. Reconnectez-vous pour voir où il en est.",
157
159
  "agent_cant_run": "{agent} ne peut pas démarrer.",
158
160
  "agent_no_fallback": "Vos messages ne sont envoyés à aucun autre agent.",
161
+ "codex_not_signed_in": "Connectez-vous avec ChatGPT dans Assistant › Réglages pour utiliser Codex avec votre forfait ChatGPT.",
159
162
  "open_settings": "Ouvrir les paramètres"
160
163
  },
161
164
  "plan": {
@@ -234,7 +237,8 @@
234
237
  "delete_table": "Supprimer la table {target}",
235
238
  "remove_field": "Retirer le champ {target}",
236
239
  "delete_category": "Supprimer la catégorie {target}",
237
- "remove_query": "Retirer la requête {target}"
240
+ "remove_query": "Retirer la requête {target}",
241
+ "map_resources": "Mapper les tables et retirer les pages {target}"
238
242
  },
239
243
  "consequence_deletes_data": "Retire le code et ses données",
240
244
  "consequence_removes_code": "Retire le code · annulable"
@@ -290,12 +294,12 @@
290
294
  },
291
295
  "mode_menu": "Mode d'approbation · cette conversation",
292
296
  "mode_desc": {
293
- "normal": "Demande avant toute modification, commande ou requête web.",
294
- "acceptEdits": "Applique les modifications de fichiers, demande pour les commandes et les requêtes web.",
297
+ "normal": "Demande avant toute modification, requête web ou commande, même en lecture seule.",
298
+ "acceptEdits": "Applique les modifications de fichiers, sauf les fichiers de dépendances et les hooks git. Demande avant chaque commande et requête web.",
299
+ "acceptEdits_codex": "Avec Codex, fonctionne comme Demander d'abord : demande avant chaque modification de fichier, fichiers de dépendances et hooks git compris, et avant toute commande qui écrit.",
295
300
  "plan": "Lit et propose un plan. Ne modifie rien.",
296
- "auto": "Exécute tout sans demander, sauf les suppressions."
301
+ "auto": "Un contrôle de sécurité approuve les modifications de fichiers courantes et l'accès au web. Les commandes shell, les fichiers de dépendances, les hooks git et les suppressions demandent encore votre accord."
297
302
  },
298
- "full_auto_item": "Automatique complet…",
299
303
  "default_mode": "Par défaut pour les nouvelles conversations",
300
304
  "hint_send": "envoyer",
301
305
  "hint_queue": "mettre en file",
@@ -306,20 +310,6 @@
306
310
  "usage_new": "nouvelle conversation",
307
311
  "usage_offline": "hors ligne"
308
312
  },
309
- "full_auto": {
310
- "title": "Activer le mode automatique complet ?",
311
- "description": "L'assistant modifiera des fichiers et exécutera des commandes dans cette conversation sans demander. Les suppressions et les changements de dépendances demandent toujours. Chaque modification reste dans le lot de modifications et peut être annulée.",
312
- "turn_off_after": "Désactiver après",
313
- "duration_turn": "Ce tour",
314
- "duration_30m": "30 minutes",
315
- "duration_chat": "Fermeture de la conversation",
316
- "confirm": "Activer le mode automatique complet",
317
- "banner_turn": "ce tour seulement",
318
- "banner_30m": "pendant 30 minutes",
319
- "banner_chat": "jusqu'à la fermeture de la conversation",
320
- "banner_until": "se termine dans {time}",
321
- "turn_off": "Désactiver"
322
- },
323
313
  "drawer": {
324
314
  "title": "Conversations",
325
315
  "new": "Nouvelle",
@@ -49,6 +49,8 @@
49
49
  "approved": "Approved by you",
50
50
  "rule": "Allowed by a rule",
51
51
  "full_auto": "Full auto",
52
+ "auto_approved": "Allowed by Auto review",
53
+ "auto_denied": "Blocked by Auto review",
52
54
  "blocked": "Blocked · safe mode",
53
55
  "denied": "Denied by you",
54
56
  "expired": "Expired, not answered"
@@ -49,6 +49,8 @@
49
49
  "approved": "Autorisé par vous",
50
50
  "rule": "Autorisé par une règle",
51
51
  "full_auto": "Automatique complet",
52
+ "auto_approved": "Autorisé par la revue automatique",
53
+ "auto_denied": "Bloqué par la revue automatique",
52
54
  "blocked": "Bloqué · mode sûr",
53
55
  "denied": "Refusé par vous",
54
56
  "expired": "Expiré, sans réponse"
@@ -6,7 +6,7 @@
6
6
  "license": "Apache-2.0",
7
7
  "packageManager": "pnpm@10.6.5",
8
8
  "engines": {
9
- "@antelopejs/dms-frontend": ">=0.9.1 <0.10.0"
9
+ "@antelopejs/dms-frontend": ">=0.10.0 <0.11.0"
10
10
  },
11
11
  "scripts": {
12
12
  "build": "pnpm --dir \"${DMS_FRONTEND_WORKSPACE:?Set DMS_FRONTEND_WORKSPACE to the generated Inertia workspace}\" build",