agim-cli 1.2.74 → 1.2.75
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.
- package/CHANGELOG.md +20 -0
- package/dist/web/public/assets/{a2a-BbtW9q1L.js → a2a-CWXsu7Oz.js} +2 -2
- package/dist/web/public/assets/{a2a-BbtW9q1L.js.map → a2a-CWXsu7Oz.js.map} +1 -1
- package/dist/web/public/assets/{activity-CJmQLZ6_.js → activity-CQ_aoBSr.js} +2 -2
- package/dist/web/public/assets/{activity-CJmQLZ6_.js.map → activity-CQ_aoBSr.js.map} +1 -1
- package/dist/web/public/assets/{admins-BJP9koxS.js → admins-eP0x1_cs.js} +2 -2
- package/dist/web/public/assets/{admins-BJP9koxS.js.map → admins-eP0x1_cs.js.map} +1 -1
- package/dist/web/public/assets/{agents-DC0XFC6e.js → agents-CS9zwgxI.js} +2 -2
- package/dist/web/public/assets/{agents-DC0XFC6e.js.map → agents-CS9zwgxI.js.map} +1 -1
- package/dist/web/public/assets/{approvals-DiPkpPN4.js → approvals-ngCeTrqa.js} +2 -2
- package/dist/web/public/assets/{approvals-DiPkpPN4.js.map → approvals-ngCeTrqa.js.map} +1 -1
- package/dist/web/public/assets/{asks-CG9chQgT.js → asks-CIJyUfTW.js} +2 -2
- package/dist/web/public/assets/{asks-CG9chQgT.js.map → asks-CIJyUfTW.js.map} +1 -1
- package/dist/web/public/assets/{audit-B40mxlW1.js → audit-ATQxEzuW.js} +2 -2
- package/dist/web/public/assets/{audit-B40mxlW1.js.map → audit-ATQxEzuW.js.map} +1 -1
- package/dist/web/public/assets/{bell-BC8Jqt9f.js → bell-aelaDeaH.js} +2 -2
- package/dist/web/public/assets/{bell-BC8Jqt9f.js.map → bell-aelaDeaH.js.map} +1 -1
- package/dist/web/public/assets/{bgjobs-ClrQ2jzx.js → bgjobs-Dte-HLN1.js} +2 -2
- package/dist/web/public/assets/{bgjobs-ClrQ2jzx.js.map → bgjobs-Dte-HLN1.js.map} +1 -1
- package/dist/web/public/assets/{brain-BBx7RF2j.js → brain-9-qx3BG8.js} +2 -2
- package/dist/web/public/assets/{brain-BBx7RF2j.js.map → brain-9-qx3BG8.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-TihsRkSy.js → briefcase-B7t6pp3X.js} +2 -2
- package/dist/web/public/assets/{briefcase-TihsRkSy.js.map → briefcase-B7t6pp3X.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-DTLZLXDP.js → chevron-right-Bz8nTKHc.js} +2 -2
- package/dist/web/public/assets/{chevron-right-DTLZLXDP.js.map → chevron-right-Bz8nTKHc.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-EHM2OMD5.js → circle-check-BMeq4ILK.js} +2 -2
- package/dist/web/public/assets/{circle-check-EHM2OMD5.js.map → circle-check-BMeq4ILK.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-DJXNAZ3u.js → circle-check-big-BboRrbmc.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-DJXNAZ3u.js.map → circle-check-big-BboRrbmc.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-DsaHSb_C.js → circle-x-D_Y7XPyr.js} +2 -2
- package/dist/web/public/assets/{circle-x-DsaHSb_C.js.map → circle-x-D_Y7XPyr.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-DezSK6wB.js → confirm-dialog-K2ZSoNw3.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-DezSK6wB.js.map → confirm-dialog-K2ZSoNw3.js.map} +1 -1
- package/dist/web/public/assets/{data-table-DdSnbgyt.js → data-table-DAxlDpJz.js} +2 -2
- package/dist/web/public/assets/{data-table-DdSnbgyt.js.map → data-table-DAxlDpJz.js.map} +1 -1
- package/dist/web/public/assets/{dialog-45x-p0sR.js → dialog-DVgp7mMc.js} +2 -2
- package/dist/web/public/assets/{dialog-45x-p0sR.js.map → dialog-DVgp7mMc.js.map} +1 -1
- package/dist/web/public/assets/{download-BL4jeu4M.js → download-ylGDouA1.js} +2 -2
- package/dist/web/public/assets/{download-BL4jeu4M.js.map → download-ylGDouA1.js.map} +1 -1
- package/dist/web/public/assets/{email-BGUO-gme.js → email-TTd5YGoQ.js} +2 -2
- package/dist/web/public/assets/{email-BGUO-gme.js.map → email-TTd5YGoQ.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-n-LfHo6N.js → empty-state-Dl99CYKJ.js} +2 -2
- package/dist/web/public/assets/{empty-state-n-LfHo6N.js.map → empty-state-Dl99CYKJ.js.map} +1 -1
- package/dist/web/public/assets/{external-link-CZd6ma6Y.js → external-link-CHOJij7R.js} +2 -2
- package/dist/web/public/assets/{external-link-CZd6ma6Y.js.map → external-link-CHOJij7R.js.map} +1 -1
- package/dist/web/public/assets/{eye-LsErAgqh.js → eye-BgiwYmz5.js} +2 -2
- package/dist/web/public/assets/{eye-LsErAgqh.js.map → eye-BgiwYmz5.js.map} +1 -1
- package/dist/web/public/assets/{facts-CxZ3L_7a.js → facts-BC2xi2cn.js} +2 -2
- package/dist/web/public/assets/{facts-CxZ3L_7a.js.map → facts-BC2xi2cn.js.map} +1 -1
- package/dist/web/public/assets/{goals-BjzgqVnW.js → goals-Cdv7CH0b.js} +2 -2
- package/dist/web/public/assets/{goals-BjzgqVnW.js.map → goals-Cdv7CH0b.js.map} +1 -1
- package/dist/web/public/assets/{health-BYX5IK98.js → health-CODeqKI3.js} +2 -2
- package/dist/web/public/assets/{health-BYX5IK98.js.map → health-CODeqKI3.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-D_xUK9r0.js → heart-pulse-CaKtJESB.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-D_xUK9r0.js.map → heart-pulse-CaKtJESB.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-DnSegIYS.js → heartbeat-DGznBjhs.js} +2 -2
- package/dist/web/public/assets/{heartbeat-DnSegIYS.js.map → heartbeat-DGznBjhs.js.map} +1 -1
- package/dist/web/public/assets/{hot-C5TxCTVL.js → hot-CNKZjFmQ.js} +2 -2
- package/dist/web/public/assets/{hot-C5TxCTVL.js.map → hot-CNKZjFmQ.js.map} +1 -1
- package/dist/web/public/assets/{index-CbWhcThC.js → index-SwfCEbMh.js} +3 -3
- package/dist/web/public/assets/{index-CbWhcThC.js.map → index-SwfCEbMh.js.map} +1 -1
- package/dist/web/public/assets/{installed-D_Hjs7uj.js → installed-DqE0CqJD.js} +2 -2
- package/dist/web/public/assets/{installed-D_Hjs7uj.js.map → installed-DqE0CqJD.js.map} +1 -1
- package/dist/web/public/assets/{jobs-DWtjJIAD.js → jobs-BlVHvUJL.js} +2 -2
- package/dist/web/public/assets/{jobs-DWtjJIAD.js.map → jobs-BlVHvUJL.js.map} +1 -1
- package/dist/web/public/assets/{layout-BLK9XuQB.js → layout-BiUaeLWY.js} +2 -2
- package/dist/web/public/assets/{layout-BLK9XuQB.js.map → layout-BiUaeLWY.js.map} +1 -1
- package/dist/web/public/assets/{layout-CvvZcaiO.js → layout-CIDMPUGA.js} +2 -2
- package/dist/web/public/assets/{layout-CvvZcaiO.js.map → layout-CIDMPUGA.js.map} +1 -1
- package/dist/web/public/assets/{layout-CTyy2kgf.js → layout-CdoRXtfJ.js} +2 -2
- package/dist/web/public/assets/{layout-CTyy2kgf.js.map → layout-CdoRXtfJ.js.map} +1 -1
- package/dist/web/public/assets/{layout-D1-LnIA_.js → layout-CrgrlI3C.js} +2 -2
- package/dist/web/public/assets/{layout-D1-LnIA_.js.map → layout-CrgrlI3C.js.map} +1 -1
- package/dist/web/public/assets/{layout-54-PzplU.js → layout-DQcPGciJ.js} +2 -2
- package/dist/web/public/assets/{layout-54-PzplU.js.map → layout-DQcPGciJ.js.map} +1 -1
- package/dist/web/public/assets/{llm-D59Tv6ne.js → llm-C9WnjLdH.js} +2 -2
- package/dist/web/public/assets/{llm-D59Tv6ne.js.map → llm-C9WnjLdH.js.map} +1 -1
- package/dist/web/public/assets/{loader-circle-U64eR4W2.js → loader-circle-BYuiEgu1.js} +2 -2
- package/dist/web/public/assets/{loader-circle-U64eR4W2.js.map → loader-circle-BYuiEgu1.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-D08YlPs3.js → map-pin-CSu279sg.js} +2 -2
- package/dist/web/public/assets/{map-pin-D08YlPs3.js.map → map-pin-CSu279sg.js.map} +1 -1
- package/dist/web/public/assets/{mcp-Br9fBIWu.js → mcp-DhEhDagh.js} +2 -2
- package/dist/web/public/assets/{mcp-Br9fBIWu.js.map → mcp-DhEhDagh.js.map} +1 -1
- package/dist/web/public/assets/{memos-nZKV3SLq.js → memos-CmWcQsqu.js} +2 -2
- package/dist/web/public/assets/{memos-nZKV3SLq.js.map → memos-CmWcQsqu.js.map} +1 -1
- package/dist/web/public/assets/{messengers-C8ss4WVx.js → messengers-Dzgy15aJ.js} +2 -2
- package/dist/web/public/assets/{messengers-C8ss4WVx.js.map → messengers-Dzgy15aJ.js.map} +1 -1
- package/dist/web/public/assets/{native-agent-BiiYK91m.js → native-agent-oxVczUVP.js} +2 -2
- package/dist/web/public/assets/{native-agent-BiiYK91m.js.map → native-agent-oxVczUVP.js.map} +1 -1
- package/dist/web/public/assets/{network-D9rhTHz5.js → network-VKawx_Mf.js} +2 -2
- package/dist/web/public/assets/{network-D9rhTHz5.js.map → network-VKawx_Mf.js.map} +1 -1
- package/dist/web/public/assets/{outbox-BS_gla4W.js → outbox-tCNMec-W.js} +2 -2
- package/dist/web/public/assets/{outbox-BS_gla4W.js.map → outbox-tCNMec-W.js.map} +1 -1
- package/dist/web/public/assets/{pagination-CSuYj-hv.js → pagination-CoFiNhmI.js} +2 -2
- package/dist/web/public/assets/{pagination-CSuYj-hv.js.map → pagination-CoFiNhmI.js.map} +1 -1
- package/dist/web/public/assets/{persona-BByKd8Zd.js → persona-BPM9r0mz.js} +2 -2
- package/dist/web/public/assets/{persona-BByKd8Zd.js.map → persona-BPM9r0mz.js.map} +1 -1
- package/dist/web/public/assets/{play-B_11jKz_.js → play-AQXMreBP.js} +2 -2
- package/dist/web/public/assets/{play-B_11jKz_.js.map → play-AQXMreBP.js.map} +1 -1
- package/dist/web/public/assets/{plus-BxhCliGV.js → plus-Dxn0-UrW.js} +2 -2
- package/dist/web/public/assets/{plus-BxhCliGV.js.map → plus-Dxn0-UrW.js.map} +1 -1
- package/dist/web/public/assets/{policy-CHbUM0MU.js → policy-B3OVFhEU.js} +2 -2
- package/dist/web/public/assets/{policy-CHbUM0MU.js.map → policy-B3OVFhEU.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-BKw5Agez.js → refresh-ccw-BCY32ruL.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-BKw5Agez.js.map → refresh-ccw-BCY32ruL.js.map} +1 -1
- package/dist/web/public/assets/{reminders-_MsAKlS7.js → reminders-CE8FDfs4.js} +2 -2
- package/dist/web/public/assets/{reminders-_MsAKlS7.js.map → reminders-CE8FDfs4.js.map} +1 -1
- package/dist/web/public/assets/{save-DznSJZGN.js → save-DL2CVfM9.js} +2 -2
- package/dist/web/public/assets/{save-DznSJZGN.js.map → save-DL2CVfM9.js.map} +1 -1
- package/dist/web/public/assets/{schedules-CiRZXonB.js → schedules-QI2R8JnP.js} +2 -2
- package/dist/web/public/assets/{schedules-CiRZXonB.js.map → schedules-QI2R8JnP.js.map} +1 -1
- package/dist/web/public/assets/{search-CXr_r7L8.js → search-eX2P2oxa.js} +2 -2
- package/dist/web/public/assets/{search-CXr_r7L8.js.map → search-eX2P2oxa.js.map} +1 -1
- package/dist/web/public/assets/{security-CjySIq-k.js → security-DnuDl-Ua.js} +2 -2
- package/dist/web/public/assets/{security-CjySIq-k.js.map → security-DnuDl-Ua.js.map} +1 -1
- package/dist/web/public/assets/{service-LXlgJooI.js → service-NBv0B47N.js} +2 -2
- package/dist/web/public/assets/{service-LXlgJooI.js.map → service-NBv0B47N.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-BsPU9NHK.js → status-badge-BgYMOzvd.js} +2 -2
- package/dist/web/public/assets/{status-badge-BsPU9NHK.js.map → status-badge-BgYMOzvd.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-DM8tJkC7.js → subtasks-Dc7MIwsy.js} +2 -2
- package/dist/web/public/assets/{subtasks-DM8tJkC7.js.map → subtasks-Dc7MIwsy.js.map} +1 -1
- package/dist/web/public/assets/{table-CQbO75bn.js → table-CwXBhLOR.js} +2 -2
- package/dist/web/public/assets/{table-CQbO75bn.js.map → table-CwXBhLOR.js.map} +1 -1
- package/dist/web/public/assets/{topn-CaCYQ1NI.js → topn-2VUdLMlv.js} +2 -2
- package/dist/web/public/assets/{topn-CaCYQ1NI.js.map → topn-2VUdLMlv.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-CdgBbY1Z.js → trash-2-Dx3VvXKw.js} +2 -2
- package/dist/web/public/assets/{trash-2-CdgBbY1Z.js.map → trash-2-Dx3VvXKw.js.map} +1 -1
- package/dist/web/public/assets/{use-background-tasks-DUDxcbbl.js → use-background-tasks-DloEt5di.js} +2 -2
- package/dist/web/public/assets/{use-background-tasks-DUDxcbbl.js.map → use-background-tasks-DloEt5di.js.map} +1 -1
- package/dist/web/public/assets/{use-llm-admin-Bpy7nDu-.js → use-llm-admin-C1P5gnfI.js} +2 -2
- package/dist/web/public/assets/{use-llm-admin-Bpy7nDu-.js.map → use-llm-admin-C1P5gnfI.js.map} +1 -1
- package/dist/web/public/assets/{use-memory-B00AYXi0.js → use-memory-DvKK1Ss3.js} +2 -2
- package/dist/web/public/assets/{use-memory-B00AYXi0.js.map → use-memory-DvKK1Ss3.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-7ETfQyEP.js → use-observability-3xbug_pm.js} +2 -2
- package/dist/web/public/assets/{use-observability-7ETfQyEP.js.map → use-observability-3xbug_pm.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-tzqyzhw3.js → use-settings-DB1Hur3n.js} +2 -2
- package/dist/web/public/assets/{use-settings-tzqyzhw3.js.map → use-settings-DB1Hur3n.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-B5gbK4s5.js → use-workspace-CKh9LYh0.js} +2 -2
- package/dist/web/public/assets/{use-workspace-B5gbK4s5.js.map → use-workspace-CKh9LYh0.js.map} +1 -1
- package/dist/web/public/assets/{useQuery-wnQifGeZ.js → useQuery-DhsW2X2S.js} +2 -2
- package/dist/web/public/assets/{useQuery-wnQifGeZ.js.map → useQuery-DhsW2X2S.js.map} +1 -1
- package/dist/web/public/assets/vector-BqCkB0IG.js +2 -0
- package/dist/web/public/assets/vector-BqCkB0IG.js.map +1 -0
- package/dist/web/public/assets/{viewer-C0f5b5eT.js → viewer-Dk0E_ROf.js} +2 -2
- package/dist/web/public/assets/{viewer-C0f5b5eT.js.map → viewer-Dk0E_ROf.js.map} +1 -1
- package/dist/web/public/assets/{workspace-CGE46-O2.js → workspace-BvcEO_Bp.js} +2 -2
- package/dist/web/public/assets/{workspace-CGE46-O2.js.map → workspace-BvcEO_Bp.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-CqDIcIXo.js → workspaces-NE7wQUjq.js} +2 -2
- package/dist/web/public/assets/{workspaces-CqDIcIXo.js.map → workspaces-NE7wQUjq.js.map} +1 -1
- package/dist/web/public/assets/{x-DBZPbfu3.js → x-C8V9ODI5.js} +2 -2
- package/dist/web/public/assets/{x-DBZPbfu3.js.map → x-C8V9ODI5.js.map} +1 -1
- package/dist/web/public/index.html +1 -1
- package/package.json +1 -1
- package/dist/web/public/assets/vector-or1-MfRX.js +0 -2
- package/dist/web/public/assets/vector-or1-MfRX.js.map +0 -1
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
} catch (e) { /* private-mode storage exceptions: noop */ }
|
|
36
36
|
})()
|
|
37
37
|
</script>
|
|
38
|
-
<script type="module" crossorigin src="/assets/index-
|
|
38
|
+
<script type="module" crossorigin src="/assets/index-SwfCEbMh.js"></script>
|
|
39
39
|
<link rel="modulepreload" crossorigin href="/assets/react-C9F3QeMB.js">
|
|
40
40
|
<link rel="stylesheet" crossorigin href="/assets/index-BS4QrJNL.css">
|
|
41
41
|
</head>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agim-cli",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.75",
|
|
4
4
|
"description": "Agim (阿吉姆) — universal messenger-to-agent bridge. Connect WeChat / Feishu / DingTalk / Email to Claude Code / Codex / OpenCode, or any custom agent via ACP. Installs the `agim` command.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{aa as R,q as O,ab as K,ad as V,U as e,B as k,c as x,S as q,l as Q,m as G,j as X,k as U,I as y,a3 as i,E as j,L as Z,ac as J,s as Y}from"./index-CbWhcThC.js";import{e as v}from"./react-C9F3QeMB.js";import{d as $,n as ee}from"./use-settings-tzqyzhw3.js";import{u as te}from"./useQuery-wnQifGeZ.js";import{m as se}from"./use-memory-B00AYXi0.js";import{L as N}from"./loader-circle-U64eR4W2.js";import{S as ae}from"./save-DznSJZGN.js";import{a as re,E as oe}from"./eye-LsErAgqh.js";import{C as ne}from"./confirm-dialog-DezSK6wB.js";import{E as ie}from"./empty-state-n-LfHo6N.js";import{C as F}from"./circle-x-DsaHSb_C.js";import{R as ce}from"./refresh-ccw-BKw5Agez.js";import{P}from"./play-B_11jKz_.js";import{D as le}from"./download-BL4jeu4M.js";import{T as de}from"./trash-2-CdgBbY1Z.js";import{C as me}from"./circle-check-big-DJXNAZ3u.js";import"./dialog-45x-p0sR.js";import"./x-DBZPbfu3.js";const z={all:["memory","vector"],status:t=>["memory","vector","status",t??null]};function ue(t={}){return te({queryKey:z.status(t.user_key),queryFn:()=>O.getMemoryVectorStatus(t),refetchInterval:3e3,refetchIntervalInBackground:!1})}function L(t){return()=>{t.invalidateQueries({queryKey:z.all}),t.invalidateQueries({queryKey:se.all})}}function xe(){const t=K(),s=L(t);return R({mutationFn:o=>O.backfillMemoryVector({user_key:o?.user_key},o?.max_rows?{max_rows:o.max_rows}:void 0),onSuccess:s})}function he(){const t=K();return R({mutationFn:()=>O.downloadMemoryVector(),onSuccess:L(t)})}function fe(){const t=K();return R({mutationFn:s=>O.clearMemoryVector({user_key:s?.user_key}),onSuccess:L(t)})}function D(){return R({mutationFn:()=>O.testMemoryVector()})}const f={backend:"off",localModel:"Xenova/bge-base-zh-v1.5",openaiBaseUrl:"https://api.openai.com/v1",openaiModel:"text-embedding-3-small",openaiApiKey:"",batchSize:"32",hybridWeight:"0.5"};function pe(t){const s=(t.IMHUB_MEMORY_VECTOR_BACKEND||"").toLowerCase();return{backend:s==="local"||s==="openai"?s:"off",localModel:t.IMHUB_MEMORY_VECTOR_LOCAL_MODEL||"",openaiBaseUrl:t.IMHUB_MEMORY_VECTOR_OPENAI_BASE_URL||"",openaiModel:t.IMHUB_MEMORY_VECTOR_OPENAI_MODEL||"",openaiApiKey:"",batchSize:t.IMHUB_MEMORY_VECTOR_BATCH_SIZE||"",hybridWeight:t.IMHUB_MEMORY_VECTOR_HYBRID_WEIGHT||""}}function ve({onSaved:t}){const{t:s}=V(["memory","common"]),o=$({reveal:!1}),c=v.useMemo(()=>o.data?.env??{},[o.data?.env]),[r,h]=v.useState(f),[M,_]=v.useState(!1),u=v.useRef(f);v.useEffect(()=>{if(!o.data)return;const a=pe(c);h(a),u.current=a},[c,o.data]);const g=ee(),E=D(),w=v.useMemo(()=>{const a=u.current;return Object.keys(r).some(d=>r[d]!==a[d])},[r]);function m(a,d){h(l=>({...l,[a]:d}))}function S(){if(r.backend==="openai"){if(!r.openaiBaseUrl.trim())return s("vector.form.errors.baseUrlRequired");try{new URL(r.openaiBaseUrl.trim())}catch{return s("vector.form.errors.baseUrlInvalid")}if(!r.openaiModel.trim())return s("vector.form.errors.openaiModelRequired");if(!!!c.IMHUB_MEMORY_VECTOR_OPENAI_API_KEY&&!r.openaiApiKey.trim())return s("vector.form.errors.apiKeyRequired")}if(r.backend==="local"&&!r.localModel.trim())return s("vector.form.errors.localModelRequired");if(r.batchSize.trim()){const a=Number(r.batchSize);if(!Number.isFinite(a)||a<1||a>1024)return s("vector.form.errors.batchSizeRange")}if(r.hybridWeight.trim()){const a=Number(r.hybridWeight);if(!Number.isFinite(a)||a<0||a>1)return s("vector.form.errors.hybridWeightRange")}return null}function A(){const a=u.current,d={},l=(C,T,W)=>{T!==W&&(d[C]=T.trim()===""?null:T.trim())};return l("IMHUB_MEMORY_VECTOR_BACKEND",r.backend,a.backend),l("IMHUB_MEMORY_VECTOR_LOCAL_MODEL",r.localModel,a.localModel),l("IMHUB_MEMORY_VECTOR_OPENAI_BASE_URL",r.openaiBaseUrl,a.openaiBaseUrl),l("IMHUB_MEMORY_VECTOR_OPENAI_MODEL",r.openaiModel,a.openaiModel),l("IMHUB_MEMORY_VECTOR_BATCH_SIZE",r.batchSize,a.batchSize),l("IMHUB_MEMORY_VECTOR_HYBRID_WEIGHT",r.hybridWeight,a.hybridWeight),r.openaiApiKey.trim()&&(d.IMHUB_MEMORY_VECTOR_OPENAI_API_KEY=r.openaiApiKey.trim()),d}async function B(){const a=S();if(a){i.error(a);return}const d=A();if(Object.keys(d).length===0){i.info(s("vector.form.nothingChanged"));return}try{await g.mutateAsync({updates:d}),i.success(s("vector.form.savedToast"));try{const l=await E.mutateAsync();l.ok?i.success(s("vector.actions.testOk")):i.error(s("vector.actions.testFail",{detail:l.error??""}))}catch(l){const{message:C}=j(l,s);i.error(s("vector.actions.testFail",{detail:C}))}t?.()}catch(l){const{message:C}=j(l,s);i.error(C)}}function I(){h(u.current)}const b=g.isPending||E.isPending,n=!!c.IMHUB_MEMORY_VECTOR_OPENAI_API_KEY;return e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("h2",{className:"text-sm font-medium",children:s("vector.form.title")}),w&&e.jsx(k,{variant:"info",children:s("vector.form.dirty")}),e.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[w&&e.jsx(x,{type:"button",variant:"secondary",size:"sm",onClick:I,disabled:b,children:s("vector.form.discard")}),e.jsxs(x,{type:"button",size:"sm",onClick:()=>void B(),disabled:!w||b,children:[b?e.jsx(N,{className:"h-4 w-4 animate-spin"}):e.jsx(ae,{className:"h-4 w-4"}),s("vector.form.saveAndTest")]})]})]}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:s("vector.form.hint")}),o.isLoading?e.jsx("div",{className:"mt-3 h-32 w-full rounded-md bg-surface-2 animate-pulse"}):e.jsxs("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:[e.jsx(p,{label:s("vector.form.backend"),help:s("vector.form.backendHelp"),children:e.jsxs(q,{value:r.backend,onValueChange:a=>m("backend",a),children:[e.jsx(Q,{children:e.jsx(G,{})}),e.jsxs(X,{children:[e.jsx(U,{value:"off",children:s("vector.form.backendOff")}),e.jsx(U,{value:"local",children:s("vector.form.backendLocal")}),e.jsx(U,{value:"openai",children:s("vector.form.backendOpenai")})]})]})}),r.backend==="local"&&e.jsx(p,{label:s("vector.form.localModel"),help:s("vector.form.localModelHelp"),children:e.jsx(y,{value:r.localModel,placeholder:f.localModel,onChange:a=>m("localModel",a.target.value),className:"font-mono text-xs"})}),r.backend==="openai"&&e.jsxs(e.Fragment,{children:[e.jsx(p,{label:s("vector.form.openaiBaseUrl"),help:s("vector.form.openaiBaseUrlHelp"),children:e.jsx(y,{value:r.openaiBaseUrl,placeholder:f.openaiBaseUrl,onChange:a=>m("openaiBaseUrl",a.target.value),className:"font-mono text-xs"})}),e.jsx(p,{label:s("vector.form.openaiModel"),help:s("vector.form.openaiModelHelp"),children:e.jsx(y,{value:r.openaiModel,placeholder:f.openaiModel,onChange:a=>m("openaiModel",a.target.value),className:"font-mono text-xs"})}),e.jsx(p,{label:s("vector.form.openaiApiKey"),help:s(n?"vector.form.apiKeyKeepHint":"vector.form.apiKeyNewHint"),children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(y,{type:M?"text":"password",value:r.openaiApiKey,placeholder:n?c.IMHUB_MEMORY_VECTOR_OPENAI_API_KEY||"••••":"sk-…",onChange:a=>m("openaiApiKey",a.target.value),className:"font-mono text-xs",autoComplete:"off"}),e.jsx(x,{type:"button",variant:"ghost",size:"icon",onClick:()=>_(a=>!a),"aria-label":s("vector.form.toggleApiKey"),children:M?e.jsx(re,{className:"h-4 w-4"}):e.jsx(oe,{className:"h-4 w-4"})})]})})]}),r.backend!=="off"&&e.jsxs(e.Fragment,{children:[e.jsx(p,{label:s("vector.form.batchSize"),help:s("vector.form.batchSizeHelp"),children:e.jsx(y,{type:"number",min:1,max:1024,step:1,value:r.batchSize,placeholder:f.batchSize,onChange:a=>m("batchSize",a.target.value),className:"font-mono text-xs"})}),e.jsx(p,{label:s("vector.form.hybridWeight"),help:s("vector.form.hybridWeightHelp"),children:e.jsx(y,{type:"number",min:0,max:1,step:.05,value:r.hybridWeight,placeholder:f.hybridWeight,onChange:a=>m("hybridWeight",a.target.value),className:"font-mono text-xs"})})]})]})]})}function p({label:t,help:s,children:o}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(Z,{className:"text-xs text-text-dim",children:t}),o,s&&e.jsx("p",{className:"text-[11px] text-text-muted",children:s})]})}function Ve(){const{t}=V(["memory","common"]),[s]=J(),o=s.get("user")??"",c=ue(o?{user_key:o}:{}),r=c.data?.status,h=c.data?.coverage,M=c.data?.jobs??[],_=D(),u=he(),g=xe(),E=fe(),[w,m]=v.useState(!1);async function S(){try{const n=await _.mutateAsync();n.ok?i.success(t("vector.actions.testOk")):i.error(t("vector.actions.testFail",{detail:n.error??""}))}catch(n){const{message:a}=j(n,t);i.error(a)}}async function A(){try{const n=await u.mutateAsync();i.success(n.alreadyReady?t("vector.actions.downloadAlreadyReady"):t("vector.actions.downloadStarted"))}catch(n){const{message:a}=j(n,t);i.error(a)}}async function B(){try{await g.mutateAsync(o?{user_key:o}:void 0),i.success(t("vector.actions.backfillStarted"))}catch(n){const{message:a}=j(n,t);i.error(a)}}async function I(){try{const n=await E.mutateAsync(o?{user_key:o}:void 0);i.success(t("vector.actions.clearStarted",{count:n.cleared}))}catch(n){const{message:a}=j(n,t);throw i.error(a),n}}if(c.isLoading)return e.jsx("div",{className:"h-48 w-full rounded-md bg-surface-2 animate-pulse"});if(!r)return e.jsx(ie,{icon:e.jsx(F,{}),title:t("common:states.error"),description:c.error?.message??""});const b=o?t("vector.coverage.scope_user",{userKey:o}):t("vector.coverage.scope_global");return e.jsxs("div",{className:"mx-auto flex max-w-5xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:t("vector.title")}),e.jsxs(x,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>c.refetch(),disabled:c.isFetching,"aria-label":t("actions.refresh",{ns:"common"}),children:[c.isFetching?e.jsx(N,{className:"h-4 w-4 animate-spin"}):e.jsx(ce,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:t("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:t("vector.subtitle")})]}),e.jsx(ve,{onSaved:()=>void c.refetch()}),e.jsxs("div",{className:"grid gap-3 md:grid-cols-2",children:[e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[e.jsx("span",{className:"font-medium",children:t("vector.backendLabel")}),e.jsx(k,{variant:"secondary",children:r.backend}),e.jsx(k,{variant:r.ready?"success":"warning",children:r.ready?t("vector.readyTrue"):t("vector.readyFalse")}),r.downloaded&&e.jsx(k,{variant:"info",children:t("vector.downloadedTrue")})]}),e.jsxs("dl",{className:"mt-3 grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 text-sm",children:[e.jsx("dt",{className:"text-text-dim",children:t("vector.modelLabel")}),e.jsx("dd",{className:"font-mono text-text",children:r.modelId||"—"}),e.jsx("dt",{className:"text-text-dim",children:t("vector.dimsLabel")}),e.jsx("dd",{className:"tabular-nums text-text",children:r.dims||"—"}),r.lastError&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:t("vector.lastError")}),e.jsx("dd",{className:"text-danger text-xs break-all",children:r.lastError})]})]})]}),e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsx("div",{className:"text-sm font-medium",children:t("vector.coverage.title")}),e.jsx("div",{className:"mt-1 text-xs text-text-dim",children:b}),e.jsxs("div",{className:"mt-3 grid grid-cols-3 gap-2",children:[e.jsx(H,{label:t("vector.coverage.total"),value:h?.total??0,tone:"info"}),e.jsx(H,{label:t("vector.coverage.withEmbedding"),value:h?.withEmbedding??0,tone:"success"}),e.jsx(H,{label:t("vector.coverage.withDifferentModel"),value:h?.withDifferentModel??0,tone:"warning"})]})]})]}),e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsx("div",{className:"text-sm font-medium",children:t("vector.actions.title")}),e.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[e.jsxs(x,{variant:"secondary",size:"sm",onClick:()=>void S(),disabled:_.isPending,children:[_.isPending?e.jsx(N,{className:"h-4 w-4 animate-spin"}):e.jsx(P,{className:"h-4 w-4"}),t("vector.actions.test")]}),r.backend==="local"&&e.jsxs(x,{variant:"secondary",size:"sm",onClick:()=>void A(),disabled:u.isPending,children:[u.isPending?e.jsx(N,{className:"h-4 w-4 animate-spin"}):e.jsx(le,{className:"h-4 w-4"}),t("vector.actions.download")]}),e.jsxs(x,{variant:"default",size:"sm",onClick:()=>void B(),disabled:g.isPending||!r.ready,children:[g.isPending?e.jsx(N,{className:"h-4 w-4 animate-spin"}):e.jsx(P,{className:"h-4 w-4"}),t("vector.actions.backfill")]}),e.jsxs(x,{variant:"destructive",size:"sm",onClick:()=>m(!0),disabled:E.isPending,children:[e.jsx(de,{className:"h-4 w-4"}),t("vector.actions.clear")]})]})]}),e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsx("div",{className:"text-sm font-medium",children:t("vector.jobs.title")}),M.length===0?e.jsx("div",{className:"mt-2 text-sm text-text-muted",children:t("vector.jobs.empty")}):e.jsx("ul",{className:"mt-2 flex flex-col gap-1.5 text-sm",children:M.map(n=>e.jsx("li",{children:e.jsx(be,{job:n})},n.id))})]}),e.jsx(ne,{open:w,onOpenChange:m,title:t("vector.actions.confirmClear"),description:t("vector.actions.confirmClearDesc",{scope:b}),intent:"danger",confirmLabel:t("vector.actions.clear"),onConfirm:I})]})}const ge={info:"border-info/30 text-info",success:"border-success/30 text-success",warning:"border-warning/30 text-warning",danger:"border-danger/30 text-danger"};function H({label:t,value:s,tone:o}){return e.jsxs("div",{className:Y("rounded-md border bg-bg px-2 py-2",ge[o]),children:[e.jsx("div",{className:"text-[10px] uppercase tracking-wide text-text-dim",children:t}),e.jsx("div",{className:"text-xl font-semibold tabular-nums",children:s})]})}function be({job:t}){const{t:s}=V("memory"),o=t.phase==="done"?"text-success":t.phase==="failed"?"text-danger":"text-info";return e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[e.jsx(k,{variant:"outline",children:t.kind}),e.jsxs("span",{className:Y("font-medium",o),children:[t.phase==="running"&&e.jsx(N,{className:"inline h-3 w-3 animate-spin"}),t.phase==="done"&&e.jsx(me,{className:"inline h-3 w-3"}),t.phase==="failed"&&e.jsx(F,{className:"inline h-3 w-3"})," ",s(`vector.jobs.phase.${t.phase}`)]}),e.jsx("span",{className:"text-text-dim",children:t.message}),e.jsx("span",{className:"ml-auto text-text-muted tabular-nums",children:ye(t.finishedAt??t.startedAt)})]})}function ye(t){try{const s=new Date(t);return Number.isNaN(s.getTime())?String(t):s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return String(t)}}export{Ve as default};
|
|
2
|
-
//# sourceMappingURL=vector-or1-MfRX.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vector-or1-MfRX.js","sources":["../../src/hooks/use-vector.ts","../../src/routes/memory/vector-backend-form.tsx","../../src/routes/memory/vector.tsx"],"sourcesContent":["/**\n * useVector — react-query wrappers for the embedding/vector backend.\n *\n * useVectorStatus({ user_key }) — status + coverage + jobs\n * (polls every 3s; jobs\n * are async)\n * useTriggerVectorBackfill()\n * useTriggerVectorDownload()\n * useTriggerVectorClear() — DESTRUCTIVE; route gates\n * with ConfirmDialog\n * useTriggerVectorTest()\n *\n * Status polling stops backgrounded (refetchIntervalInBackground:\n * false) so an idle tab on a phone doesn't drain battery.\n */\n\nimport { useQueryClient, useQuery, useMutation } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport { memoryKeys } from './use-memory'\nimport type {\n VectorActionResponse,\n VectorClearResponse,\n VectorStatus,\n VectorTestResponse,\n} from '@/types/api'\n\nexport const vectorKeys = {\n all: ['memory', 'vector'] as const,\n status: (user_key?: string) => ['memory', 'vector', 'status', user_key ?? null] as const,\n}\n\nexport function useVectorStatus(query: { user_key?: string } = {}) {\n return useQuery<VectorStatus>({\n queryKey: vectorKeys.status(query.user_key),\n queryFn: () => api.getMemoryVectorStatus(query),\n refetchInterval: 3000,\n refetchIntervalInBackground: false,\n })\n}\n\nfunction invalidateAfter(qc: ReturnType<typeof useQueryClient>): () => void {\n return () => {\n qc.invalidateQueries({ queryKey: vectorKeys.all })\n qc.invalidateQueries({ queryKey: memoryKeys.all })\n }\n}\n\nexport function useTriggerVectorBackfill() {\n const qc = useQueryClient()\n const invalidate = invalidateAfter(qc)\n return useMutation<\n VectorActionResponse,\n Error,\n { user_key?: string; max_rows?: number } | undefined\n >({\n mutationFn: (vars) => api.backfillMemoryVector(\n { user_key: vars?.user_key },\n vars?.max_rows ? { max_rows: vars.max_rows } : undefined,\n ),\n onSuccess: invalidate,\n })\n}\n\nexport function useTriggerVectorDownload() {\n const qc = useQueryClient()\n return useMutation<VectorActionResponse, Error, void>({\n mutationFn: () => api.downloadMemoryVector(),\n onSuccess: invalidateAfter(qc),\n })\n}\n\nexport function useTriggerVectorClear() {\n const qc = useQueryClient()\n return useMutation<VectorClearResponse, Error, { user_key?: string } | undefined>({\n mutationFn: (vars) => api.clearMemoryVector({ user_key: vars?.user_key }),\n onSuccess: invalidateAfter(qc),\n })\n}\n\nexport function useTriggerVectorTest() {\n return useMutation<VectorTestResponse, Error, void>({\n mutationFn: () => api.testMemoryVector(),\n })\n}\n","/**\n * VectorBackendForm — inline, form-based editor for the seven\n * IMHUB_MEMORY_VECTOR_* keys that drive the embedding backend.\n *\n * Replaces the older \"Edit in env\" link path: operators no longer\n * have to know which env var maps to which knob, and the on-the-wire\n * format (numbers, OpenAI URL shape) is enforced by the widget.\n *\n * Save flow: PUT /api/env (backend-side allowlist filters to just\n * these keys), then auto-trigger a single `vector/test` so the user\n * sees in toast whether the new config produces an embedding.\n *\n * API key: the GET /api/env response returns secrets masked (e.g.\n * \"sk-1***...abcd\"). The widget shows the mask as placeholder and\n * leaves the input empty by default — typing a value sends it as a\n * real update, leaving it empty sends nothing for that key (the\n * server already rejects masked echoes as \"no change\").\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Eye, EyeOff, Loader2, Save } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useEnv, useUpdateEnv } from '@/hooks/use-settings'\nimport { useTriggerVectorTest } from '@/hooks/use-vector'\nimport { describeError } from '@/lib/api/errors'\n\ntype BackendName = 'off' | 'local' | 'openai'\n\ninterface FormState {\n backend: BackendName\n localModel: string\n openaiBaseUrl: string\n openaiModel: string\n openaiApiKey: string // empty = \"keep existing\"\n batchSize: string\n hybridWeight: string\n}\n\nconst DEFAULTS: FormState = {\n backend: 'off',\n localModel: 'Xenova/bge-base-zh-v1.5',\n openaiBaseUrl: 'https://api.openai.com/v1',\n openaiModel: 'text-embedding-3-small',\n openaiApiKey: '',\n batchSize: '32',\n hybridWeight: '0.5',\n}\n\nfunction readFormFromEnv(env: Record<string, string>): FormState {\n const raw = (env.IMHUB_MEMORY_VECTOR_BACKEND || '').toLowerCase()\n const backend: BackendName = raw === 'local' || raw === 'openai' ? raw : 'off'\n return {\n backend,\n localModel: env.IMHUB_MEMORY_VECTOR_LOCAL_MODEL || '',\n openaiBaseUrl: env.IMHUB_MEMORY_VECTOR_OPENAI_BASE_URL || '',\n openaiModel: env.IMHUB_MEMORY_VECTOR_OPENAI_MODEL || '',\n openaiApiKey: '',\n batchSize: env.IMHUB_MEMORY_VECTOR_BATCH_SIZE || '',\n hybridWeight: env.IMHUB_MEMORY_VECTOR_HYBRID_WEIGHT || '',\n }\n}\n\nexport interface VectorBackendFormProps {\n /** Called after a successful save + test cycle so the parent page can\n * refresh status + coverage. */\n onSaved?: () => void\n}\n\nexport function VectorBackendForm({ onSaved }: VectorBackendFormProps): JSX.Element {\n const { t } = useTranslation(['memory', 'common'])\n\n // Pull masked env (we never need real key on the client; the masked\n // value is shown as placeholder so the operator can tell a value is\n // configured without revealing it).\n const envQuery = useEnv({ reveal: false })\n const env = useMemo(() => envQuery.data?.env ?? {}, [envQuery.data?.env])\n\n const [form, setForm] = useState<FormState>(DEFAULTS)\n const [showApiKey, setShowApiKey] = useState(false)\n const initialRef = useRef<FormState>(DEFAULTS)\n\n // Reset from server only when the underlying env object identity\n // changes (after refetch). useEffect avoids stomping on local edits\n // mid-typing.\n useEffect(() => {\n if (!envQuery.data) return\n const next = readFormFromEnv(env)\n setForm(next)\n initialRef.current = next\n }, [env, envQuery.data])\n\n const updateEnv = useUpdateEnv()\n const test = useTriggerVectorTest()\n\n const dirty = useMemo(() => {\n const initial = initialRef.current\n return (Object.keys(form) as Array<keyof FormState>).some((k) => form[k] !== initial[k])\n }, [form])\n\n function set<K extends keyof FormState>(k: K, v: FormState[K]): void {\n setForm((prev) => ({ ...prev, [k]: v }))\n }\n\n function validate(): string | null {\n if (form.backend === 'openai') {\n if (!form.openaiBaseUrl.trim()) return t('vector.form.errors.baseUrlRequired')\n try { new URL(form.openaiBaseUrl.trim()) } catch { return t('vector.form.errors.baseUrlInvalid') }\n if (!form.openaiModel.trim()) return t('vector.form.errors.openaiModelRequired')\n const hasExistingKey = !!env.IMHUB_MEMORY_VECTOR_OPENAI_API_KEY\n if (!hasExistingKey && !form.openaiApiKey.trim()) {\n return t('vector.form.errors.apiKeyRequired')\n }\n }\n if (form.backend === 'local' && !form.localModel.trim()) {\n return t('vector.form.errors.localModelRequired')\n }\n if (form.batchSize.trim()) {\n const n = Number(form.batchSize)\n if (!Number.isFinite(n) || n < 1 || n > 1024) return t('vector.form.errors.batchSizeRange')\n }\n if (form.hybridWeight.trim()) {\n const n = Number(form.hybridWeight)\n if (!Number.isFinite(n) || n < 0 || n > 1) return t('vector.form.errors.hybridWeightRange')\n }\n return null\n }\n\n function buildUpdates(): Record<string, string | null> {\n const initial = initialRef.current\n const out: Record<string, string | null> = {}\n const diff = (key: string, current: string, prev: string): void => {\n if (current === prev) return\n out[key] = current.trim() === '' ? null : current.trim()\n }\n diff('IMHUB_MEMORY_VECTOR_BACKEND', form.backend, initial.backend)\n diff('IMHUB_MEMORY_VECTOR_LOCAL_MODEL', form.localModel, initial.localModel)\n diff('IMHUB_MEMORY_VECTOR_OPENAI_BASE_URL', form.openaiBaseUrl, initial.openaiBaseUrl)\n diff('IMHUB_MEMORY_VECTOR_OPENAI_MODEL', form.openaiModel, initial.openaiModel)\n diff('IMHUB_MEMORY_VECTOR_BATCH_SIZE', form.batchSize, initial.batchSize)\n diff('IMHUB_MEMORY_VECTOR_HYBRID_WEIGHT', form.hybridWeight, initial.hybridWeight)\n // API key: only send if the user actually typed a non-empty new value.\n // Empty input = keep current (which is the whole point of the placeholder UX).\n if (form.openaiApiKey.trim()) {\n out.IMHUB_MEMORY_VECTOR_OPENAI_API_KEY = form.openaiApiKey.trim()\n }\n return out\n }\n\n async function onSave(): Promise<void> {\n const err = validate()\n if (err) {\n toast.error(err)\n return\n }\n const updates = buildUpdates()\n if (Object.keys(updates).length === 0) {\n toast.info(t('vector.form.nothingChanged'))\n return\n }\n try {\n await updateEnv.mutateAsync({ updates })\n toast.success(t('vector.form.savedToast'))\n // Auto-test against the freshly applied config. We don't await\n // the parent's refresh — the toast is the source of truth for the\n // operator; the status card behind it picks up dims / lastError\n // on its next 3s poll anyway.\n try {\n const r = await test.mutateAsync()\n if (r.ok) toast.success(t('vector.actions.testOk'))\n else toast.error(t('vector.actions.testFail', { detail: r.error ?? '' }))\n } catch (terr) {\n const { message } = describeError(terr, t)\n toast.error(t('vector.actions.testFail', { detail: message }))\n }\n onSaved?.()\n } catch (serr) {\n const { message } = describeError(serr, t)\n toast.error(message)\n }\n }\n\n function onDiscard(): void {\n setForm(initialRef.current)\n }\n\n const busy = updateEnv.isPending || test.isPending\n const hasExistingKey = !!env.IMHUB_MEMORY_VECTOR_OPENAI_API_KEY\n\n return (\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"text-sm font-medium\">{t('vector.form.title')}</h2>\n {dirty && <Badge variant=\"info\">{t('vector.form.dirty')}</Badge>}\n <div className=\"ml-auto flex items-center gap-2\">\n {dirty && (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={onDiscard}\n disabled={busy}\n >\n {t('vector.form.discard')}\n </Button>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={!dirty || busy}\n >\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {t('vector.form.saveAndTest')}\n </Button>\n </div>\n </div>\n <p className=\"mt-1 text-xs text-text-dim\">{t('vector.form.hint')}</p>\n\n {envQuery.isLoading ? (\n <div className=\"mt-3 h-32 w-full rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {/* Backend selector — full row on mobile, half on desktop */}\n <Field label={t('vector.form.backend')} help={t('vector.form.backendHelp')}>\n <Select value={form.backend} onValueChange={(v) => set('backend', v as BackendName)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"off\">{t('vector.form.backendOff')}</SelectItem>\n <SelectItem value=\"local\">{t('vector.form.backendLocal')}</SelectItem>\n <SelectItem value=\"openai\">{t('vector.form.backendOpenai')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n\n {/* Local-only field */}\n {form.backend === 'local' && (\n <Field label={t('vector.form.localModel')} help={t('vector.form.localModelHelp')}>\n <Input\n value={form.localModel}\n placeholder={DEFAULTS.localModel}\n onChange={(e) => set('localModel', e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n )}\n\n {/* OpenAI-only fields */}\n {form.backend === 'openai' && (\n <>\n <Field label={t('vector.form.openaiBaseUrl')} help={t('vector.form.openaiBaseUrlHelp')}>\n <Input\n value={form.openaiBaseUrl}\n placeholder={DEFAULTS.openaiBaseUrl}\n onChange={(e) => set('openaiBaseUrl', e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field label={t('vector.form.openaiModel')} help={t('vector.form.openaiModelHelp')}>\n <Input\n value={form.openaiModel}\n placeholder={DEFAULTS.openaiModel}\n onChange={(e) => set('openaiModel', e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('vector.form.openaiApiKey')}\n help={hasExistingKey ? t('vector.form.apiKeyKeepHint') : t('vector.form.apiKeyNewHint')}\n >\n <div className=\"flex items-center gap-1\">\n <Input\n type={showApiKey ? 'text' : 'password'}\n value={form.openaiApiKey}\n placeholder={hasExistingKey\n ? (env.IMHUB_MEMORY_VECTOR_OPENAI_API_KEY || '••••')\n : 'sk-…'}\n onChange={(e) => set('openaiApiKey', e.target.value)}\n className=\"font-mono text-xs\"\n autoComplete=\"off\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setShowApiKey((v) => !v)}\n aria-label={t('vector.form.toggleApiKey')}\n >\n {showApiKey ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </Button>\n </div>\n </Field>\n </>\n )}\n\n {/* Shared numeric knobs (hidden when off so they don't visually\n suggest the operator can tune anything without picking a\n backend first). */}\n {form.backend !== 'off' && (\n <>\n <Field label={t('vector.form.batchSize')} help={t('vector.form.batchSizeHelp')}>\n <Input\n type=\"number\"\n min={1}\n max={1024}\n step={1}\n value={form.batchSize}\n placeholder={DEFAULTS.batchSize}\n onChange={(e) => set('batchSize', e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field label={t('vector.form.hybridWeight')} help={t('vector.form.hybridWeightHelp')}>\n <Input\n type=\"number\"\n min={0}\n max={1}\n step={0.05}\n value={form.hybridWeight}\n placeholder={DEFAULTS.hybridWeight}\n onChange={(e) => set('hybridWeight', e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n </>\n )}\n </div>\n )}\n </div>\n )\n}\n\nfunction Field({\n label,\n help,\n children,\n}: {\n label: string\n help?: string\n children: React.ReactNode\n}): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label className=\"text-xs text-text-dim\">{label}</Label>\n {children}\n {help && <p className=\"text-[11px] text-text-muted\">{help}</p>}\n </div>\n )\n}\n","/**\n * /memory/vector — backend status + maintenance actions.\n *\n * Status (left): backend name + ready badge + model + dims + last\n * error. Coverage (right): three KPI tiles (total / embedded /\n * mismatched). Actions (bottom): test, download, backfill, clear\n * (destructive — ConfirmDialog). Recent-job strip pulls from the\n * shared in-memory tracker via the status endpoint.\n *\n * The clear action picks up the ?user= filter from the layout, so\n * clearing scoped to a single user is a one-click operation.\n */\n\nimport { useState } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { CheckCircle, Download, Loader2, Play, RefreshCcw, Trash2, XCircle } from 'lucide-react'\n\nimport { VectorBackendForm } from './vector-backend-form'\n\nimport { ConfirmDialog } from '@/components/common/confirm-dialog'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n useVectorStatus,\n useTriggerVectorBackfill,\n useTriggerVectorClear,\n useTriggerVectorDownload,\n useTriggerVectorTest,\n} from '@/hooks/use-vector'\nimport { describeError } from '@/lib/api/errors'\nimport type { VectorJob } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nexport default function MemoryVectorRoute(): JSX.Element {\n const { t } = useTranslation(['memory', 'common'])\n const [params] = useSearchParams()\n const userKey = params.get('user') ?? ''\n\n const statusQuery = useVectorStatus(userKey ? { user_key: userKey } : {})\n const status = statusQuery.data?.status\n const coverage = statusQuery.data?.coverage\n const jobs = statusQuery.data?.jobs ?? []\n\n const test = useTriggerVectorTest()\n const download = useTriggerVectorDownload()\n const backfill = useTriggerVectorBackfill()\n const clear = useTriggerVectorClear()\n const [confirmClear, setConfirmClear] = useState(false)\n\n async function onTest(): Promise<void> {\n try {\n const r = await test.mutateAsync()\n if (r.ok) toast.success(t('vector.actions.testOk'))\n else toast.error(t('vector.actions.testFail', { detail: r.error ?? '' }))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n }\n }\n\n async function onDownload(): Promise<void> {\n try {\n const r = await download.mutateAsync()\n toast.success(r.alreadyReady ? t('vector.actions.downloadAlreadyReady') : t('vector.actions.downloadStarted'))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n }\n }\n\n async function onBackfill(): Promise<void> {\n try {\n await backfill.mutateAsync(userKey ? { user_key: userKey } : undefined)\n toast.success(t('vector.actions.backfillStarted'))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n }\n }\n\n async function onConfirmClear(): Promise<void> {\n try {\n const r = await clear.mutateAsync(userKey ? { user_key: userKey } : undefined)\n toast.success(t('vector.actions.clearStarted', { count: r.cleared }))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n throw err\n }\n }\n\n if (statusQuery.isLoading) {\n return <div className=\"h-48 w-full rounded-md bg-surface-2 animate-pulse\" />\n }\n if (!status) {\n return (\n <EmptyState\n icon={<XCircle />}\n title={t('common:states.error')}\n description={statusQuery.error?.message ?? ''}\n />\n )\n }\n\n const coverageScope = userKey\n ? t('vector.coverage.scope_user', { userKey })\n : t('vector.coverage.scope_global')\n\n return (\n <div className=\"mx-auto flex max-w-5xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('vector.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => statusQuery.refetch()}\n disabled={statusQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {statusQuery.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('vector.subtitle')}</p>\n </header>\n\n {/* Backend configuration — inline form replaces the older\n \"Edit in env\" link. Saving runs PUT /api/env + an auto\n vector test against the freshly applied config. */}\n <VectorBackendForm onSaved={() => void statusQuery.refetch()} />\n\n {/* Status + Coverage */}\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n <span className=\"font-medium\">{t('vector.backendLabel')}</span>\n <Badge variant=\"secondary\">{status.backend}</Badge>\n <Badge variant={status.ready ? 'success' : 'warning'}>\n {status.ready ? t('vector.readyTrue') : t('vector.readyFalse')}\n </Badge>\n {status.downloaded && <Badge variant=\"info\">{t('vector.downloadedTrue')}</Badge>}\n </div>\n <dl className=\"mt-3 grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 text-sm\">\n <dt className=\"text-text-dim\">{t('vector.modelLabel')}</dt>\n <dd className=\"font-mono text-text\">{status.modelId || '—'}</dd>\n <dt className=\"text-text-dim\">{t('vector.dimsLabel')}</dt>\n <dd className=\"tabular-nums text-text\">{status.dims || '—'}</dd>\n {status.lastError && (\n <>\n <dt className=\"text-text-dim\">{t('vector.lastError')}</dt>\n <dd className=\"text-danger text-xs break-all\">{status.lastError}</dd>\n </>\n )}\n </dl>\n </div>\n\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"text-sm font-medium\">{t('vector.coverage.title')}</div>\n <div className=\"mt-1 text-xs text-text-dim\">{coverageScope}</div>\n <div className=\"mt-3 grid grid-cols-3 gap-2\">\n <CoverageTile label={t('vector.coverage.total')} value={coverage?.total ?? 0} tone=\"info\" />\n <CoverageTile label={t('vector.coverage.withEmbedding')} value={coverage?.withEmbedding ?? 0} tone=\"success\" />\n <CoverageTile label={t('vector.coverage.withDifferentModel')} value={coverage?.withDifferentModel ?? 0} tone=\"warning\" />\n </div>\n </div>\n </div>\n\n {/* Maintenance actions */}\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"text-sm font-medium\">{t('vector.actions.title')}</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => void onTest()}\n disabled={test.isPending}\n >\n {test.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Play className=\"h-4 w-4\" />}\n {t('vector.actions.test')}\n </Button>\n {status.backend === 'local' && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => void onDownload()}\n disabled={download.isPending}\n >\n {download.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Download className=\"h-4 w-4\" />}\n {t('vector.actions.download')}\n </Button>\n )}\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={() => void onBackfill()}\n disabled={backfill.isPending || !status.ready}\n >\n {backfill.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Play className=\"h-4 w-4\" />}\n {t('vector.actions.backfill')}\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => setConfirmClear(true)}\n disabled={clear.isPending}\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('vector.actions.clear')}\n </Button>\n </div>\n </div>\n\n {/* Jobs strip */}\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"text-sm font-medium\">{t('vector.jobs.title')}</div>\n {jobs.length === 0 ? (\n <div className=\"mt-2 text-sm text-text-muted\">{t('vector.jobs.empty')}</div>\n ) : (\n <ul className=\"mt-2 flex flex-col gap-1.5 text-sm\">\n {jobs.map((j) => <li key={j.id}><JobRow job={j} /></li>)}\n </ul>\n )}\n </div>\n\n <ConfirmDialog\n open={confirmClear}\n onOpenChange={setConfirmClear}\n title={t('vector.actions.confirmClear')}\n description={t('vector.actions.confirmClearDesc', { scope: coverageScope })}\n intent=\"danger\"\n confirmLabel={t('vector.actions.clear')}\n onConfirm={onConfirmClear}\n />\n </div>\n )\n}\n\ninterface CoverageTileProps {\n label: string\n value: number\n tone: 'info' | 'success' | 'warning' | 'danger'\n}\n\nconst TONE_STYLES: Record<CoverageTileProps['tone'], string> = {\n info: 'border-info/30 text-info',\n success: 'border-success/30 text-success',\n warning: 'border-warning/30 text-warning',\n danger: 'border-danger/30 text-danger',\n}\n\nfunction CoverageTile({ label, value, tone }: CoverageTileProps): JSX.Element {\n return (\n <div className={cn('rounded-md border bg-bg px-2 py-2', TONE_STYLES[tone])}>\n <div className=\"text-[10px] uppercase tracking-wide text-text-dim\">{label}</div>\n <div className=\"text-xl font-semibold tabular-nums\">{value}</div>\n </div>\n )\n}\n\nfunction JobRow({ job }: { job: VectorJob }): JSX.Element {\n const { t } = useTranslation('memory')\n const phaseClass =\n job.phase === 'done' ? 'text-success' :\n job.phase === 'failed' ? 'text-danger' :\n 'text-info'\n return (\n <div className=\"flex flex-wrap items-center gap-2 text-xs\">\n <Badge variant=\"outline\">{job.kind}</Badge>\n <span className={cn('font-medium', phaseClass)}>\n {job.phase === 'running' && <Loader2 className=\"inline h-3 w-3 animate-spin\" />}\n {job.phase === 'done' && <CheckCircle className=\"inline h-3 w-3\" />}\n {job.phase === 'failed' && <XCircle className=\"inline h-3 w-3\" />}\n {' '}\n {t(`vector.jobs.phase.${job.phase}`)}\n </span>\n <span className=\"text-text-dim\">{job.message}</span>\n <span className=\"ml-auto text-text-muted tabular-nums\">{formatEpoch(job.finishedAt ?? job.startedAt)}</span>\n </div>\n )\n}\n\nfunction formatEpoch(ms: number): string {\n try {\n const d = new Date(ms)\n if (Number.isNaN(d.getTime())) return String(ms)\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return String(ms)\n }\n}\n"],"names":["vectorKeys","user_key","useVectorStatus","query","useQuery","api","invalidateAfter","qc","memoryKeys","useTriggerVectorBackfill","useQueryClient","invalidate","useMutation","vars","useTriggerVectorDownload","useTriggerVectorClear","useTriggerVectorTest","DEFAULTS","readFormFromEnv","env","raw","VectorBackendForm","onSaved","t","useTranslation","envQuery","useEnv","useMemo","form","setForm","useState","showApiKey","setShowApiKey","initialRef","useRef","useEffect","next","updateEnv","useUpdateEnv","test","dirty","initial","k","set","v","prev","validate","n","buildUpdates","out","diff","key","current","onSave","err","toast","updates","r","terr","message","describeError","serr","onDiscard","busy","hasExistingKey","jsxs","jsx","Badge","Button","Loader2","Save","Field","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","e","Fragment","EyeOff","Eye","label","help","children","Label","MemoryVectorRoute","params","useSearchParams","userKey","statusQuery","status","coverage","jobs","download","backfill","clear","confirmClear","setConfirmClear","onTest","onDownload","onBackfill","onConfirmClear","EmptyState","XCircle","coverageScope","RefreshCcw","CoverageTile","Play","Download","Trash2","j","JobRow","ConfirmDialog","TONE_STYLES","value","tone","cn","job","phaseClass","CheckCircle","formatEpoch","ms","d"],"mappings":"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"}
|