feat: add session authorization mode configuration (#446)
Add approvals.mode configuration to allow users to enable/disable session operation authorization. Mode can be 'off' (no auth) or 'manual' (require auth). Changes trigger automatic gateway restart for config to take effect. - Add ApprovalConfig type with mode: 'off' | 'manual' - Add approvals section to settings store - Add session authorization toggle in SessionSettings UI - Add approvals to PLATFORM_SECTIONS for auto-restart - Add i18n support for all 8 languages Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,28 +1,46 @@
|
||||
<script setup lang="ts">
|
||||
import { NInputNumber, NSelect, NSwitch, useMessage } from 'naive-ui'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { useSettingsStore } from '@/stores/hermes/settings'
|
||||
import { useSessionBrowserPrefsStore } from '@/stores/hermes/session-browser-prefs'
|
||||
import SettingRow from './SettingRow.vue'
|
||||
import { NInputNumber, NSelect, NSwitch, useMessage } from "naive-ui";
|
||||
import { useI18n } from "vue-i18n";
|
||||
import { useSettingsStore } from "@/stores/hermes/settings";
|
||||
import { useSessionBrowserPrefsStore } from "@/stores/hermes/session-browser-prefs";
|
||||
import SettingRow from "./SettingRow.vue";
|
||||
|
||||
const settingsStore = useSettingsStore()
|
||||
const sessionBrowserPrefsStore = useSessionBrowserPrefsStore()
|
||||
const message = useMessage()
|
||||
const { t } = useI18n()
|
||||
const settingsStore = useSettingsStore();
|
||||
const sessionBrowserPrefsStore = useSessionBrowserPrefsStore();
|
||||
const message = useMessage();
|
||||
const { t } = useI18n();
|
||||
|
||||
async function save(values: Record<string, any>) {
|
||||
try {
|
||||
await settingsStore.saveSection('session_reset', values)
|
||||
message.success(t('settings.saved'))
|
||||
await settingsStore.saveSection("session_reset", values);
|
||||
message.success(t("settings.saved"));
|
||||
} catch (err: any) {
|
||||
message.error(t('settings.saveFailed'))
|
||||
message.error(t("settings.saveFailed"));
|
||||
}
|
||||
}
|
||||
|
||||
async function toggleRequireAuth(value: boolean) {
|
||||
try {
|
||||
await settingsStore.saveSection("approvals", { mode: value ? "manual" : "off" });
|
||||
message.success(t("settings.saved"));
|
||||
} catch (err: any) {
|
||||
message.error(t("settings.saveFailed"));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<section class="settings-section">
|
||||
<SettingRow :label="t('settings.session.mode')" :hint="t('settings.session.modeHint')">
|
||||
<SettingRow
|
||||
:label="t('settings.session.requireAuth')"
|
||||
:hint="t('settings.session.requireAuthHint')"
|
||||
>
|
||||
<NSwitch :value="settingsStore.approvals.mode === 'manual'" @update:value="toggleRequireAuth" />
|
||||
</SettingRow>
|
||||
<SettingRow
|
||||
:label="t('settings.session.mode')"
|
||||
:hint="t('settings.session.modeHint')"
|
||||
>
|
||||
<NSelect
|
||||
:value="settingsStore.sessionReset.mode || 'both'"
|
||||
:options="[
|
||||
@@ -30,37 +48,53 @@ async function save(values: Record<string, any>) {
|
||||
{ label: t('settings.session.modeIdle'), value: 'idle' },
|
||||
{ label: t('settings.session.modeHourly'), value: 'hourly' },
|
||||
]"
|
||||
size="small" class="input-md"
|
||||
@update:value="v => save({ mode: v })"
|
||||
size="small"
|
||||
class="input-md"
|
||||
@update:value="(v) => save({ mode: v })"
|
||||
/>
|
||||
</SettingRow>
|
||||
<SettingRow :label="t('settings.session.idleMinutes')" :hint="t('settings.session.idleMinutesHint')">
|
||||
<SettingRow
|
||||
:label="t('settings.session.idleMinutes')"
|
||||
:hint="t('settings.session.idleMinutesHint')"
|
||||
>
|
||||
<NInputNumber
|
||||
:value="settingsStore.sessionReset.idle_minutes"
|
||||
:min="10" :max="10080" :step="30"
|
||||
size="small" class="input-sm"
|
||||
@update:value="v => v != null && save({ idle_minutes: v })"
|
||||
:min="10"
|
||||
:max="10080"
|
||||
:step="30"
|
||||
size="small"
|
||||
class="input-sm"
|
||||
@update:value="(v) => v != null && save({ idle_minutes: v })"
|
||||
/>
|
||||
</SettingRow>
|
||||
<SettingRow :label="t('settings.session.atHour')" :hint="t('settings.session.atHourHint')">
|
||||
<SettingRow
|
||||
:label="t('settings.session.atHour')"
|
||||
:hint="t('settings.session.atHourHint')"
|
||||
>
|
||||
<NInputNumber
|
||||
:value="settingsStore.sessionReset.at_hour"
|
||||
:min="0" :max="23" :step="1"
|
||||
size="small" class="input-sm"
|
||||
@update:value="v => v != null && save({ at_hour: v })"
|
||||
:min="0"
|
||||
:max="23"
|
||||
:step="1"
|
||||
size="small"
|
||||
class="input-sm"
|
||||
@update:value="(v) => v != null && save({ at_hour: v })"
|
||||
/>
|
||||
</SettingRow>
|
||||
<SettingRow :label="t('settings.session.liveMonitorHumanOnly')" :hint="t('settings.session.liveMonitorHumanOnlyHint')">
|
||||
<SettingRow
|
||||
:label="t('settings.session.liveMonitorHumanOnly')"
|
||||
:hint="t('settings.session.liveMonitorHumanOnlyHint')"
|
||||
>
|
||||
<NSwitch
|
||||
:value="sessionBrowserPrefsStore.humanOnly"
|
||||
@update:value="value => sessionBrowserPrefsStore.setHumanOnly(value)"
|
||||
@update:value="(value) => sessionBrowserPrefsStore.setHumanOnly(value)"
|
||||
/>
|
||||
</SettingRow>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss">
|
||||
@use '@/styles/variables' as *;
|
||||
@use "@/styles/variables" as *;
|
||||
|
||||
.settings-section {
|
||||
margin-top: 16px;
|
||||
|
||||
Reference in New Issue
Block a user