feat(fc2b): ml / allowlist / aliases Pinia stores

Thin wrappers over the FC-2b API: ml (settings GET/PATCH, backfill +
recompute triggers), allowlist (list, threshold patch, remove with
optimistic local update), aliases (list, remove with optimistic update).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-15 07:56:45 -04:00
parent 2a21ede912
commit 6cf82970a1
3 changed files with 95 additions and 0 deletions
+26
View File
@@ -0,0 +1,26 @@
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { useApi } from '../composables/useApi.js'
export const useAliasesStore = defineStore('aliases', () => {
const api = useApi()
const rows = ref([])
const loading = ref(false)
async function load() {
loading.value = true
try { rows.value = await api.get('/api/aliases') }
finally { loading.value = false }
}
async function remove(aliasString, aliasCategory) {
await api.delete(
`/api/aliases/${encodeURIComponent(aliasString)}/${encodeURIComponent(aliasCategory)}`
)
rows.value = rows.value.filter(
r => !(r.alias_string === aliasString && r.alias_category === aliasCategory)
)
}
return { rows, loading, load, remove }
})
+30
View File
@@ -0,0 +1,30 @@
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { useApi } from '../composables/useApi.js'
export const useAllowlistStore = defineStore('allowlist', () => {
const api = useApi()
const rows = ref([])
const loading = ref(false)
async function load() {
loading.value = true
try { rows.value = await api.get('/api/allowlist') }
finally { loading.value = false }
}
async function updateThreshold(tagId, minConfidence) {
await api.patch(`/api/tags/${tagId}/allowlist`, {
body: { min_confidence: minConfidence }
})
const r = rows.value.find(x => x.tag_id === tagId)
if (r) r.min_confidence = minConfidence
}
async function remove(tagId) {
await api.delete(`/api/tags/${tagId}/allowlist`)
rows.value = rows.value.filter(x => x.tag_id !== tagId)
}
return { rows, loading, load, updateThreshold, remove }
})
+39
View File
@@ -0,0 +1,39 @@
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { useApi } from '../composables/useApi.js'
export const useMLStore = defineStore('ml', () => {
const api = useApi()
const settings = ref(null)
const loading = ref(false)
const error = ref(null)
async function loadSettings() {
loading.value = true
error.value = null
try {
settings.value = await api.get('/api/ml/settings')
} catch (e) {
error.value = e.message
} finally {
loading.value = false
}
}
async function patchSettings(patch) {
settings.value = await api.patch('/api/ml/settings', { body: patch })
}
async function triggerBackfill() {
await api.post('/api/ml/backfill')
}
async function triggerRecomputeCentroids() {
await api.post('/api/ml/recompute-centroids')
}
return {
settings, loading, error,
loadSettings, patchSettings, triggerBackfill, triggerRecomputeCentroids
}
})