agim-cli 1.4.8 → 1.4.9
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/dist/core/memory-distiller.d.ts +10 -4
- package/dist/core/memory-distiller.d.ts.map +1 -1
- package/dist/core/memory-distiller.js +23 -9
- package/dist/core/memory-distiller.js.map +1 -1
- package/dist/web/public/assets/{a2a-Dnc-MHI-.js → a2a-CZxwvgvh.js} +2 -2
- package/dist/web/public/assets/{a2a-Dnc-MHI-.js.map → a2a-CZxwvgvh.js.map} +1 -1
- package/dist/web/public/assets/{activity-CKQwfSVC.js → activity-BnlFGipw.js} +2 -2
- package/dist/web/public/assets/{activity-CKQwfSVC.js.map → activity-BnlFGipw.js.map} +1 -1
- package/dist/web/public/assets/{admins-C7MdDEF0.js → admins-CH84Rw1d.js} +2 -2
- package/dist/web/public/assets/{admins-C7MdDEF0.js.map → admins-CH84Rw1d.js.map} +1 -1
- package/dist/web/public/assets/{agents-Be4IUCYz.js → agents-CFB4Uj6b.js} +2 -2
- package/dist/web/public/assets/{agents-Be4IUCYz.js.map → agents-CFB4Uj6b.js.map} +1 -1
- package/dist/web/public/assets/{approvals-KCd1BSvN.js → approvals-DnzjbDR6.js} +2 -2
- package/dist/web/public/assets/{approvals-KCd1BSvN.js.map → approvals-DnzjbDR6.js.map} +1 -1
- package/dist/web/public/assets/{arrow-down-NRUr_gzg.js → arrow-down-DxlRHrs8.js} +2 -2
- package/dist/web/public/assets/{arrow-down-NRUr_gzg.js.map → arrow-down-DxlRHrs8.js.map} +1 -1
- package/dist/web/public/assets/{arrow-up-4KyqPaSd.js → arrow-up-CAiQ2jy-.js} +2 -2
- package/dist/web/public/assets/{arrow-up-4KyqPaSd.js.map → arrow-up-CAiQ2jy-.js.map} +1 -1
- package/dist/web/public/assets/{asks-nKwuDJpD.js → asks-DyUQopay.js} +2 -2
- package/dist/web/public/assets/{asks-nKwuDJpD.js.map → asks-DyUQopay.js.map} +1 -1
- package/dist/web/public/assets/{audit-Bf4Yv1or.js → audit-BVHTMS82.js} +2 -2
- package/dist/web/public/assets/{audit-Bf4Yv1or.js.map → audit-BVHTMS82.js.map} +1 -1
- package/dist/web/public/assets/{bell--lSOhH-X.js → bell-D7iS7ctN.js} +2 -2
- package/dist/web/public/assets/{bell--lSOhH-X.js.map → bell-D7iS7ctN.js.map} +1 -1
- package/dist/web/public/assets/{bgjobs-Daya2BMh.js → bgjobs-BYCQhd_1.js} +2 -2
- package/dist/web/public/assets/{bgjobs-Daya2BMh.js.map → bgjobs-BYCQhd_1.js.map} +1 -1
- package/dist/web/public/assets/{brain-DF90t0yo.js → brain-CCF25Egu.js} +2 -2
- package/dist/web/public/assets/{brain-DF90t0yo.js.map → brain-CCF25Egu.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-aRM_fCrr.js → briefcase-BMLMD8nM.js} +2 -2
- package/dist/web/public/assets/{briefcase-aRM_fCrr.js.map → briefcase-BMLMD8nM.js.map} +1 -1
- package/dist/web/public/assets/{chat-BhnNXkIJ.js → chat-DPkKy5y_.js} +2 -2
- package/dist/web/public/assets/{chat-BhnNXkIJ.js.map → chat-DPkKy5y_.js.map} +1 -1
- package/dist/web/public/assets/{chevron-left-DK-fhgiL.js → chevron-left-BDO3vw8G.js} +2 -2
- package/dist/web/public/assets/{chevron-left-DK-fhgiL.js.map → chevron-left-BDO3vw8G.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-BGhMfCcE.js → chevron-right-5ZUC2opg.js} +2 -2
- package/dist/web/public/assets/{chevron-right-BGhMfCcE.js.map → chevron-right-5ZUC2opg.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-BWBI4Qhk.js → circle-check-COhM5JsK.js} +2 -2
- package/dist/web/public/assets/{circle-check-BWBI4Qhk.js.map → circle-check-COhM5JsK.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-BppjBT7j.js → circle-check-big-DHAHqUlS.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-BppjBT7j.js.map → circle-check-big-DHAHqUlS.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-BZ3UUhcm.js → circle-x-7VaoZ7dY.js} +2 -2
- package/dist/web/public/assets/{circle-x-BZ3UUhcm.js.map → circle-x-7VaoZ7dY.js.map} +1 -1
- package/dist/web/public/assets/{clock-ChP0IxI4.js → clock-ZPVXnd6V.js} +2 -2
- package/dist/web/public/assets/{clock-ChP0IxI4.js.map → clock-ZPVXnd6V.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-DrP5Lfwx.js → confirm-dialog-CgpJL9oN.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-DrP5Lfwx.js.map → confirm-dialog-CgpJL9oN.js.map} +1 -1
- package/dist/web/public/assets/{copy-CR2c0pyG.js → copy-BaZl52tH.js} +2 -2
- package/dist/web/public/assets/{copy-CR2c0pyG.js.map → copy-BaZl52tH.js.map} +1 -1
- package/dist/web/public/assets/{data-table-DElP7TJm.js → data-table-BLYG79TX.js} +2 -2
- package/dist/web/public/assets/{data-table-DElP7TJm.js.map → data-table-BLYG79TX.js.map} +1 -1
- package/dist/web/public/assets/distill-D9p8O8Jf.js +7 -0
- package/dist/web/public/assets/distill-D9p8O8Jf.js.map +1 -0
- package/dist/web/public/assets/{download-DO4Kw3Fi.js → download-bzCepctg.js} +2 -2
- package/dist/web/public/assets/{download-DO4Kw3Fi.js.map → download-bzCepctg.js.map} +1 -1
- package/dist/web/public/assets/{email-Dkqwudqq.js → email-Douv-rZ5.js} +2 -2
- package/dist/web/public/assets/{email-Dkqwudqq.js.map → email-Douv-rZ5.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-DGH3i5i2.js → empty-state-96qpPTNg.js} +2 -2
- package/dist/web/public/assets/{empty-state-DGH3i5i2.js.map → empty-state-96qpPTNg.js.map} +1 -1
- package/dist/web/public/assets/{external-link-B6aOBfUG.js → external-link-J4nIlCem.js} +2 -2
- package/dist/web/public/assets/{external-link-B6aOBfUG.js.map → external-link-J4nIlCem.js.map} +1 -1
- package/dist/web/public/assets/{eye-BMxHZFil.js → eye-BvsBLK42.js} +2 -2
- package/dist/web/public/assets/{eye-BMxHZFil.js.map → eye-BvsBLK42.js.map} +1 -1
- package/dist/web/public/assets/{facts-B9PlO3xo.js → facts-DMucDXYd.js} +2 -2
- package/dist/web/public/assets/{facts-B9PlO3xo.js.map → facts-DMucDXYd.js.map} +1 -1
- package/dist/web/public/assets/{goals-DX_RjDAM.js → goals-B9ETHgL0.js} +2 -2
- package/dist/web/public/assets/{goals-DX_RjDAM.js.map → goals-B9ETHgL0.js.map} +1 -1
- package/dist/web/public/assets/{health-BAcwcy02.js → health-DLzZ7KHc.js} +2 -2
- package/dist/web/public/assets/{health-BAcwcy02.js.map → health-DLzZ7KHc.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-Cl-tJTJY.js → heart-pulse-CVEeD2sz.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-Cl-tJTJY.js.map → heart-pulse-CVEeD2sz.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-BF_rPcKb.js → heartbeat-B1BEBHge.js} +2 -2
- package/dist/web/public/assets/{heartbeat-BF_rPcKb.js.map → heartbeat-B1BEBHge.js.map} +1 -1
- package/dist/web/public/assets/{hot-XOCA1xAY.js → hot-Yc7iad0D.js} +2 -2
- package/dist/web/public/assets/{hot-XOCA1xAY.js.map → hot-Yc7iad0D.js.map} +1 -1
- package/dist/web/public/assets/{index-CzlhMSb2.js → index-DY2Zglku.js} +3 -3
- package/dist/web/public/assets/{index-CzlhMSb2.js.map → index-DY2Zglku.js.map} +1 -1
- package/dist/web/public/assets/{injection-ecvQ-6Ya.js → injection-Ca-9gbo0.js} +2 -2
- package/dist/web/public/assets/{injection-ecvQ-6Ya.js.map → injection-Ca-9gbo0.js.map} +1 -1
- package/dist/web/public/assets/{installed-D8VzYRBe.js → installed-Zz34apdi.js} +2 -2
- package/dist/web/public/assets/{installed-D8VzYRBe.js.map → installed-Zz34apdi.js.map} +1 -1
- package/dist/web/public/assets/{jobs-CpuY6G8D.js → jobs-CtVRpl0r.js} +2 -2
- package/dist/web/public/assets/{jobs-CpuY6G8D.js.map → jobs-CtVRpl0r.js.map} +1 -1
- package/dist/web/public/assets/{layout-DdbuRh8P.js → layout-BTCLgkgN.js} +2 -2
- package/dist/web/public/assets/{layout-DdbuRh8P.js.map → layout-BTCLgkgN.js.map} +1 -1
- package/dist/web/public/assets/{layout-Pxfmfh_2.js → layout-CtDc2i7w.js} +2 -2
- package/dist/web/public/assets/{layout-Pxfmfh_2.js.map → layout-CtDc2i7w.js.map} +1 -1
- package/dist/web/public/assets/{layout--XsfZzpI.js → layout-Cxch59sI.js} +2 -2
- package/dist/web/public/assets/{layout--XsfZzpI.js.map → layout-Cxch59sI.js.map} +1 -1
- package/dist/web/public/assets/{layout-BROGs5wv.js → layout-DnANw2Q2.js} +2 -2
- package/dist/web/public/assets/{layout-BROGs5wv.js.map → layout-DnANw2Q2.js.map} +1 -1
- package/dist/web/public/assets/{layout-BezPqRLV.js → layout-yIZG87fq.js} +2 -2
- package/dist/web/public/assets/{layout-BezPqRLV.js.map → layout-yIZG87fq.js.map} +1 -1
- package/dist/web/public/assets/{llm-IXFv_MMM.js → llm-CMMa85Ig.js} +2 -2
- package/dist/web/public/assets/{llm-IXFv_MMM.js.map → llm-CMMa85Ig.js.map} +1 -1
- package/dist/web/public/assets/{loader-circle-AgQ2XO06.js → loader-circle-D8L1w9c1.js} +2 -2
- package/dist/web/public/assets/{loader-circle-AgQ2XO06.js.map → loader-circle-D8L1w9c1.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-C6sGB9SZ.js → map-pin--GMunU9n.js} +2 -2
- package/dist/web/public/assets/{map-pin-C6sGB9SZ.js.map → map-pin--GMunU9n.js.map} +1 -1
- package/dist/web/public/assets/{mcp-jqsjSumH.js → mcp-DhnXhO9B.js} +2 -2
- package/dist/web/public/assets/{mcp-jqsjSumH.js.map → mcp-DhnXhO9B.js.map} +1 -1
- package/dist/web/public/assets/{memos-C38YN2Rf.js → memos-DQZc7llR.js} +2 -2
- package/dist/web/public/assets/{memos-C38YN2Rf.js.map → memos-DQZc7llR.js.map} +1 -1
- package/dist/web/public/assets/{messengers-l74nqYZF.js → messengers-DwSmauLs.js} +2 -2
- package/dist/web/public/assets/{messengers-l74nqYZF.js.map → messengers-DwSmauLs.js.map} +1 -1
- package/dist/web/public/assets/{mobile-CHhYS0Tw.js → mobile-CUZ359rQ.js} +2 -2
- package/dist/web/public/assets/{mobile-CHhYS0Tw.js.map → mobile-CUZ359rQ.js.map} +1 -1
- package/dist/web/public/assets/{network-CIrcKaZn.js → network-BBdRdrH_.js} +2 -2
- package/dist/web/public/assets/{network-CIrcKaZn.js.map → network-BBdRdrH_.js.map} +1 -1
- package/dist/web/public/assets/{outbox-O1lzMZPk.js → outbox-CmN0U35l.js} +2 -2
- package/dist/web/public/assets/{outbox-O1lzMZPk.js.map → outbox-CmN0U35l.js.map} +1 -1
- package/dist/web/public/assets/{pagination-CXBUSf6r.js → pagination-DcsgDXXM.js} +2 -2
- package/dist/web/public/assets/{pagination-CXBUSf6r.js.map → pagination-DcsgDXXM.js.map} +1 -1
- package/dist/web/public/assets/{persona-CI4tkm_n.js → persona-ig2ac4mY.js} +2 -2
- package/dist/web/public/assets/{persona-CI4tkm_n.js.map → persona-ig2ac4mY.js.map} +1 -1
- package/dist/web/public/assets/{plans-D8RZ9aXq.js → plans-Bzbk8eUr.js} +2 -2
- package/dist/web/public/assets/{plans-D8RZ9aXq.js.map → plans-Bzbk8eUr.js.map} +1 -1
- package/dist/web/public/assets/{play-DQ3P_XWl.js → play-Di1jqulh.js} +2 -2
- package/dist/web/public/assets/{play-DQ3P_XWl.js.map → play-Di1jqulh.js.map} +1 -1
- package/dist/web/public/assets/{plus-Zai0UXKL.js → plus-C2zyJ1mF.js} +2 -2
- package/dist/web/public/assets/{plus-Zai0UXKL.js.map → plus-C2zyJ1mF.js.map} +1 -1
- package/dist/web/public/assets/{policy-BodrOHl5.js → policy-yD1c2Pcn.js} +2 -2
- package/dist/web/public/assets/{policy-BodrOHl5.js.map → policy-yD1c2Pcn.js.map} +1 -1
- package/dist/web/public/assets/{qr-code-zcjicWRK.js → qr-code-C-ACsKv_.js} +2 -2
- package/dist/web/public/assets/{qr-code-zcjicWRK.js.map → qr-code-C-ACsKv_.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-CM-Cjwud.js → refresh-ccw-7HdadG5V.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-CM-Cjwud.js.map → refresh-ccw-7HdadG5V.js.map} +1 -1
- package/dist/web/public/assets/{reminders-BR6noe6I.js → reminders-BDeiVYTC.js} +2 -2
- package/dist/web/public/assets/{reminders-BR6noe6I.js.map → reminders-BDeiVYTC.js.map} +1 -1
- package/dist/web/public/assets/{save-xBMgs6Bd.js → save-BYFmz9gD.js} +2 -2
- package/dist/web/public/assets/{save-xBMgs6Bd.js.map → save-BYFmz9gD.js.map} +1 -1
- package/dist/web/public/assets/{schedules-Brp1Fomd.js → schedules-BddzBrxI.js} +2 -2
- package/dist/web/public/assets/{schedules-Brp1Fomd.js.map → schedules-BddzBrxI.js.map} +1 -1
- package/dist/web/public/assets/{search-nk8nyLFI.js → search-B8PlbtLg.js} +2 -2
- package/dist/web/public/assets/{search-nk8nyLFI.js.map → search-B8PlbtLg.js.map} +1 -1
- package/dist/web/public/assets/{search-CIc8bWW1.js → search-DxkvV-8p.js} +2 -2
- package/dist/web/public/assets/{search-CIc8bWW1.js.map → search-DxkvV-8p.js.map} +1 -1
- package/dist/web/public/assets/{security-DWxWfpuX.js → security-DpOGp3nS.js} +2 -2
- package/dist/web/public/assets/{security-DWxWfpuX.js.map → security-DpOGp3nS.js.map} +1 -1
- package/dist/web/public/assets/{service-Bo9rkfQX.js → service-BsY8CaNG.js} +2 -2
- package/dist/web/public/assets/{service-Bo9rkfQX.js.map → service-BsY8CaNG.js.map} +1 -1
- package/dist/web/public/assets/{shield-alert-bg0_ILjD.js → shield-alert-DXGk9Rak.js} +2 -2
- package/dist/web/public/assets/{shield-alert-bg0_ILjD.js.map → shield-alert-DXGk9Rak.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-Bw4TDDCb.js → status-badge-D0nbFSom.js} +2 -2
- package/dist/web/public/assets/{status-badge-Bw4TDDCb.js.map → status-badge-D0nbFSom.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-D58R9C_Z.js → subtasks-DFiAXvDp.js} +2 -2
- package/dist/web/public/assets/{subtasks-D58R9C_Z.js.map → subtasks-DFiAXvDp.js.map} +1 -1
- package/dist/web/public/assets/{table-D4S5FCk_.js → table-_WsrnZ_T.js} +2 -2
- package/dist/web/public/assets/{table-D4S5FCk_.js.map → table-_WsrnZ_T.js.map} +1 -1
- package/dist/web/public/assets/{topn-DDxDNIZf.js → topn-C2PHE4tX.js} +2 -2
- package/dist/web/public/assets/{topn-DDxDNIZf.js.map → topn-C2PHE4tX.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-CB7X8tay.js → trash-2-1Km439fW.js} +2 -2
- package/dist/web/public/assets/{trash-2-CB7X8tay.js.map → trash-2-1Km439fW.js.map} +1 -1
- package/dist/web/public/assets/{use-agim-skills-BV2IJPlc.js → use-agim-skills-COSqZrdH.js} +2 -2
- package/dist/web/public/assets/{use-agim-skills-BV2IJPlc.js.map → use-agim-skills-COSqZrdH.js.map} +1 -1
- package/dist/web/public/assets/{use-background-tasks-Dk9S55ip.js → use-background-tasks-wCL7jn68.js} +2 -2
- package/dist/web/public/assets/{use-background-tasks-Dk9S55ip.js.map → use-background-tasks-wCL7jn68.js.map} +1 -1
- package/dist/web/public/assets/{use-memory-DncmZXGJ.js → use-memory-B9oRyQC8.js} +2 -2
- package/dist/web/public/assets/{use-memory-DncmZXGJ.js.map → use-memory-B9oRyQC8.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-CcDO7PdN.js → use-observability-DGkN80qa.js} +2 -2
- package/dist/web/public/assets/{use-observability-CcDO7PdN.js.map → use-observability-DGkN80qa.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-DZhfMpNR.js → use-settings-Co-iafXD.js} +2 -2
- package/dist/web/public/assets/{use-settings-DZhfMpNR.js.map → use-settings-Co-iafXD.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-ywkrT7Aj.js → use-workspace-BDXP5XO1.js} +2 -2
- package/dist/web/public/assets/{use-workspace-ywkrT7Aj.js.map → use-workspace-BDXP5XO1.js.map} +1 -1
- package/dist/web/public/assets/{vector-B3h4iyfn.js → vector-BfIEx8xX.js} +2 -2
- package/dist/web/public/assets/{vector-B3h4iyfn.js.map → vector-BfIEx8xX.js.map} +1 -1
- package/dist/web/public/assets/{viewer-Bz3wL-99.js → viewer-BPMZkT05.js} +2 -2
- package/dist/web/public/assets/{viewer-Bz3wL-99.js.map → viewer-BPMZkT05.js.map} +1 -1
- package/dist/web/public/assets/{workspace-BvrXvliN.js → workspace-BbCchiHE.js} +2 -2
- package/dist/web/public/assets/{workspace-BvrXvliN.js.map → workspace-BbCchiHE.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-0H6Dzz6N.js → workspaces-5HE7pjdA.js} +2 -2
- package/dist/web/public/assets/{workspaces-0H6Dzz6N.js.map → workspaces-5HE7pjdA.js.map} +1 -1
- package/dist/web/public/index.html +1 -1
- package/dist/web/server.js +3 -1
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/public/assets/distill-DxSq7g_8.js +0 -7
- package/dist/web/public/assets/distill-DxSq7g_8.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agim-cli",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.9",
|
|
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,7 +0,0 @@
|
|
|
1
|
-
import{o as q,u as P,a6 as J,a7 as K,j as e,l as O,B,S as I,g as _,h as L,i as E,k as u,a8 as W,m as g,n as U,L as Z,I as $,c as ee}from"./index-CzlhMSb2.js";import{r as h}from"./react-DlP5eolq.js";import{u as se,a as te,b as le}from"./use-settings-DZhfMpNR.js";import{L as R}from"./loader-circle-AgQ2XO06.js";import{S as ne}from"./save-xBMgs6Bd.js";import{i as ae,j as ie}from"./use-memory-DncmZXGJ.js";import{R as re}from"./refresh-ccw-CM-Cjwud.js";import{P as oe}from"./play-DQ3P_XWl.js";/**
|
|
2
|
-
* @license lucide-react v0.469.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const de=q("AlarmClockCheck",[["circle",{cx:"12",cy:"13",r:"8",key:"3y4lt7"}],["path",{d:"M5 3 2 6",key:"18tl5t"}],["path",{d:"m22 6-3-3",key:"1opdir"}],["path",{d:"M6.38 18.7 4 21",key:"17xu3x"}],["path",{d:"M17.64 18.67 20 21",key:"kv2oe2"}],["path",{d:"m9 13 2 2 4-4",key:"6343dt"}]]),S={intervalMs:"300000",floorMin:"30",batchMax:"20",maxPending:"200"};function ce(n){const s=(n??"1").trim().toLowerCase();return s!=="0"&&s!=="false"&&s!=="no"&&s!=="off"}function me(n){const s=(n||"auto").toLowerCase();return s==="agent"||s==="llm"?s:"auto"}function ue({onSaved:n}){const{t:s}=P(["memory","common"]),a=se({reveal:!1}),r=h.useMemo(()=>a.data?.env??{},[a.data?.env]),p=te(),m=J(),d=p.data?.agents??[],x=m.data?.backends??[],v=m.data?.roles?.distill??"",k=h.useMemo(()=>()=>({source:me(r.IMHUB_MEMORY_DISTILL_SOURCE),agent:r.IMHUB_MEMORY_DISTILL_AGENT||"",llmBackend:v,enabled:ce(r.IMHUB_MEMORY_DISTILL_ENABLED),intervalMs:r.IMHUB_MEMORY_DISTILL_INTERVAL_MS||"",floorMin:r.IMHUB_MEMORY_DISTILL_FLOOR_MIN||"",batchMax:r.IMHUB_MEMORY_DISTILL_BATCH_MAX||"",maxPending:r.IMHUB_MEMORY_DISTILL_MAX_PENDING||""}),[r,v]),[l,T]=h.useState(k),j=h.useRef(l);h.useEffect(()=>{if(!a.data)return;const t=k();T(t),j.current=t},[a.data,k]);const A=le(),H=K(),w=h.useMemo(()=>{const t=j.current;return Object.keys(l).some(i=>l[i]!==t[i])},[l]);function c(t,i){T(o=>({...o,[t]:i}))}function N(t,i,o){if(!t.trim())return null;const f=Number(t);return!Number.isFinite(f)||f<i?s("distill.form.errors.numRange",{field:o,min:i}):null}function Y(){return l.source==="agent"&&!l.agent.trim()?s("distill.form.errors.agentRequired"):l.source==="llm"&&!l.llmBackend.trim()?s("distill.form.errors.llmRequired"):N(l.intervalMs,1e4,s("distill.form.intervalMs"))??N(l.floorMin,0,s("distill.form.floorMin"))??N(l.batchMax,1,s("distill.form.batchMax"))??N(l.maxPending,1,s("distill.form.maxPending"))}function F(){const t=j.current,i={},o=(f,M,X)=>{M!==X&&(i[f]=M.trim()===""?null:M.trim())};return l.source!==t.source&&(i.IMHUB_MEMORY_DISTILL_SOURCE=l.source==="auto"?null:l.source),l.enabled!==t.enabled&&(i.IMHUB_MEMORY_DISTILL_ENABLED=l.enabled?"1":"0"),l.source==="agent"?o("IMHUB_MEMORY_DISTILL_AGENT",l.agent,t.agent):t.agent&&(i.IMHUB_MEMORY_DISTILL_AGENT=null),o("IMHUB_MEMORY_DISTILL_INTERVAL_MS",l.intervalMs,t.intervalMs),o("IMHUB_MEMORY_DISTILL_FLOOR_MIN",l.floorMin,t.floorMin),o("IMHUB_MEMORY_DISTILL_BATCH_MAX",l.batchMax,t.batchMax),o("IMHUB_MEMORY_DISTILL_MAX_PENDING",l.maxPending,t.maxPending),i}async function V(){const t=Y();if(t){g.error(t);return}const i=F(),o=l.source==="llm"&&l.llmBackend.trim()!==""&&l.llmBackend!==j.current.llmBackend;if(Object.keys(i).length===0&&!o){g.info(s("distill.form.nothingChanged"));return}try{Object.keys(i).length>0&&await A.mutateAsync({updates:i}),o&&await H.mutateAsync({distill:l.llmBackend.trim()}),g.success(s("distill.form.savedToast")),n?.()}catch(f){const{message:M}=U(f,s);g.error(M)}}function G(){T(j.current)}const C=A.isPending||H.isPending,z=x.length===0,Q=d.length===0;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("distill.form.title")}),w&&e.jsx(O,{variant:"info",children:s("distill.form.dirty")}),e.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[w&&e.jsx(B,{type:"button",variant:"secondary",size:"sm",onClick:G,disabled:C,children:s("distill.form.discard")}),e.jsxs(B,{type:"button",size:"sm",onClick:()=>void V(),disabled:!w||C,children:[C?e.jsx(R,{className:"h-4 w-4 animate-spin"}):e.jsx(ne,{className:"h-4 w-4"}),s("distill.form.save")]})]})]}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:s("distill.form.hint")}),a.isLoading?e.jsx("div",{className:"mt-3 h-32 w-full rounded-md bg-surface-2 animate-pulse"}):e.jsxs("div",{className:"mt-3 flex flex-col gap-4",children:[e.jsxs("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2",children:[e.jsx(b,{label:s("distill.form.source"),help:s("distill.form.sourceHelp"),children:e.jsxs(I,{value:l.source,onValueChange:t=>c("source",t),children:[e.jsx(_,{children:e.jsx(L,{})}),e.jsxs(E,{children:[e.jsx(u,{value:"auto",children:s("distill.form.sourceAuto")}),e.jsx(u,{value:"agent",children:s("distill.form.sourceAgent")}),e.jsx(u,{value:"llm",children:s("distill.form.sourceLlm")})]})]})}),l.source==="auto"&&e.jsx("div",{className:"flex items-end",children:e.jsx("p",{className:"text-[11px] text-text-muted",children:s("distill.form.autoNote")})}),l.source==="agent"&&e.jsx(b,{label:s("distill.form.agent"),help:s("distill.form.agentHelp"),children:Q?e.jsx("p",{className:"text-[11px] text-warning",children:s("distill.form.noAgents")}):e.jsxs(I,{value:l.agent,onValueChange:t=>c("agent",t),children:[e.jsx(_,{children:e.jsx(L,{placeholder:s("distill.form.agentPlaceholder")})}),e.jsx(E,{children:d.map(t=>e.jsx(u,{value:t,children:W(t)},t))})]})}),l.source==="llm"&&e.jsx(b,{label:s("distill.form.llmBackend"),help:s("distill.form.llmBackendHelp"),children:z?e.jsx("p",{className:"text-[11px] text-warning",children:s("distill.form.noBackends")}):e.jsxs(I,{value:l.llmBackend,onValueChange:t=>c("llmBackend",t),children:[e.jsx(_,{children:e.jsx(L,{placeholder:s("distill.form.llmPlaceholder")})}),e.jsx(E,{children:x.map(t=>e.jsxs(u,{value:t.name,children:[t.name," ",e.jsxs("span",{className:"text-text-muted",children:["· ",t.model]})]},t.name))})]})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-text-dim",children:s("distill.form.scheduleTitle")}),e.jsxs("div",{className:"mt-2 grid grid-cols-1 gap-3 sm:grid-cols-2",children:[e.jsx(b,{label:s("distill.form.enabled"),help:s("distill.form.enabledHelp"),children:e.jsxs(I,{value:l.enabled?"on":"off",onValueChange:t=>c("enabled",t==="on"),children:[e.jsx(_,{children:e.jsx(L,{})}),e.jsxs(E,{children:[e.jsx(u,{value:"on",children:s("distill.form.enabledOn")}),e.jsx(u,{value:"off",children:s("distill.form.enabledOff")})]})]})}),e.jsx(y,{label:s("distill.form.intervalMs"),help:s("distill.form.intervalMsHelp"),value:l.intervalMs,placeholder:S.intervalMs,min:1e4,step:1e4,onChange:t=>c("intervalMs",t)}),e.jsx(y,{label:s("distill.form.floorMin"),help:s("distill.form.floorMinHelp"),value:l.floorMin,placeholder:S.floorMin,min:0,step:5,onChange:t=>c("floorMin",t)}),e.jsx(y,{label:s("distill.form.batchMax"),help:s("distill.form.batchMaxHelp"),value:l.batchMax,placeholder:S.batchMax,min:1,step:1,onChange:t=>c("batchMax",t)}),e.jsx(y,{label:s("distill.form.maxPending"),help:s("distill.form.maxPendingHelp"),value:l.maxPending,placeholder:S.maxPending,min:1,step:10,onChange:t=>c("maxPending",t)})]})]})]})]})}function b({label:n,help:s,children:a}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(Z,{className:"text-xs text-text-dim",children:n}),a,s&&e.jsx("p",{className:"text-[11px] text-text-muted",children:s})]})}function y({label:n,help:s,value:a,placeholder:r,min:p,step:m,onChange:d}){return e.jsx(b,{label:n,help:s,children:e.jsx($,{type:"number",min:p,step:m,value:a,placeholder:r,onChange:x=>d(x.target.value),className:"font-mono text-xs"})})}function Ie(){const{t:n}=P(["memory","common"]),s=ae(),a=s.data,r=ie();async function p(){try{await r.mutateAsync(),g.success(n("distill.actions.runStarted"))}catch(x){const{message:v}=U(x,n);g.error(v)}}const m=!!a?.running,d=a?.pendingTotal??0;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:n("distill.title")}),e.jsxs(B,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>s.refetch(),disabled:s.isFetching,"aria-label":n("actions.refresh",{ns:"common"}),children:[s.isFetching?e.jsx(R,{className:"h-4 w-4 animate-spin"}):e.jsx(re,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:n("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:n("distill.subtitle")})]}),e.jsx(ue,{onSaved:()=>void s.refetch()}),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:n("distill.status.title")}),e.jsx(O,{variant:a?.enabled?"success":"secondary",children:a?.enabled?n("distill.status.enabledTrue"):n("distill.status.enabledFalse")}),m&&e.jsxs(O,{variant:"info",children:[e.jsx(R,{className:"mr-1 inline h-3 w-3 animate-spin"}),n("distill.status.running")]}),e.jsx("div",{className:"ml-auto",children:e.jsxs(B,{variant:"default",size:"sm",onClick:()=>void p(),disabled:r.isPending||m||!a?.enabled,children:[r.isPending?e.jsx(R,{className:"h-4 w-4 animate-spin"}):e.jsx(oe,{className:"h-4 w-4"}),n("distill.actions.runNow")]})})]}),s.isLoading?e.jsx("div",{className:"mt-3 h-20 w-full rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mt-3 grid grid-cols-2 gap-2 sm:grid-cols-3",children:[e.jsx(D,{label:n("distill.status.pending"),value:d,tone:d>0?"warning":"success"}),e.jsx(D,{label:n("distill.status.lastProcessed"),value:a?.lastProcessed??0,tone:"info"}),e.jsx(D,{label:n("distill.status.lastRun"),value:fe(a?.lastRunAt),tone:"info"})]}),d===0&&e.jsxs("p",{className:"mt-2 flex items-center gap-1 text-xs text-text-muted",children:[e.jsx(de,{className:"h-3 w-3"}),n("distill.status.bufferEmpty")]}),a?.lastError&&e.jsxs("p",{className:"mt-2 text-xs text-danger break-all",children:[n("distill.status.lastError"),": ",a.lastError]})]})]})]})}const xe={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 D({label:n,value:s,tone:a}){return e.jsxs("div",{className:ee("rounded-md border bg-bg px-2 py-2",xe[a]),children:[e.jsx("div",{className:"text-[10px] uppercase tracking-wide text-text-dim",children:n}),e.jsx("div",{className:"text-xl font-semibold tabular-nums",children:s})]})}function fe(n){if(!n)return"—";try{const s=new Date(n);return Number.isNaN(s.getTime())?String(n):s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return String(n)}}export{Ie as default};
|
|
7
|
-
//# sourceMappingURL=distill-DxSq7g_8.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"distill-DxSq7g_8.js","sources":["../../node_modules/lucide-react/dist/esm/icons/alarm-clock-check.js","../../src/routes/memory/distill-config-form.tsx","../../src/routes/memory/distill.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst AlarmClockCheck = createLucideIcon(\"AlarmClockCheck\", [\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"8\", key: \"3y4lt7\" }],\n [\"path\", { d: \"M5 3 2 6\", key: \"18tl5t\" }],\n [\"path\", { d: \"m22 6-3-3\", key: \"1opdir\" }],\n [\"path\", { d: \"M6.38 18.7 4 21\", key: \"17xu3x\" }],\n [\"path\", { d: \"M17.64 18.67 20 21\", key: \"kv2oe2\" }],\n [\"path\", { d: \"m9 13 2 2 4-4\", key: \"6343dt\" }]\n]);\n\nexport { AlarmClockCheck as default };\n//# sourceMappingURL=alarm-clock-check.js.map\n","/**\n * DistillConfigForm — inline editor for the \"dream distillation\"\n * scheduler (memory-distiller.ts + memory-distill.ts).\n *\n * Two things the operator configures here:\n *\n * 1. SOURCE — which LLM extracts facts from buffered turns:\n * auto → the turn's own agent (zero-config default; nothing else\n * to set). Recommended for most installs.\n * agent → a specific, already-enabled agent CLI\n * (IMHUB_MEMORY_DISTILL_AGENT).\n * llm → a standalone LLM backend bound to the `distill` role,\n * configured exactly like the native agent's LLM\n * (PUT /api/llm/roles { distill }). No CLI spawn.\n *\n * 2. SCHEDULE — the cadence knobs (enabled / interval / staleness\n * floor / batch size / per-user buffer cap), all IMHUB_MEMORY_DISTILL_*\n * env keys behind the server allowlist.\n *\n * Save flow mirrors vector-backend-form: diff against the last-loaded\n * values, PUT /api/env for the env keys, and — only when source=llm and\n * the chosen backend changed — PUT /api/llm/roles to (re)bind the\n * distill role. Empty agent / backend selections are validated before\n * save so we never persist a half-configured source.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { 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, useConfig } from '@/hooks/use-settings'\nimport { useLlmList, useLlmPutRoles } from '@/hooks/use-llm-admin'\nimport { describeError } from '@/lib/api/errors'\nimport { agentDisplayName } from '@/lib/agent-label'\n\ntype DistillSource = 'auto' | 'agent' | 'llm'\n\ninterface FormState {\n source: DistillSource\n agent: string // IMHUB_MEMORY_DISTILL_AGENT (source=agent)\n llmBackend: string // llmRoles.distill backend name (source=llm)\n enabled: boolean // IMHUB_MEMORY_DISTILL_ENABLED\n intervalMs: string // IMHUB_MEMORY_DISTILL_INTERVAL_MS\n floorMin: string // IMHUB_MEMORY_DISTILL_FLOOR_MIN\n batchMax: string // IMHUB_MEMORY_DISTILL_BATCH_MAX\n maxPending: string // IMHUB_MEMORY_DISTILL_MAX_PENDING\n}\n\n// Mirror of the memory-distiller.ts defaults so placeholders match the\n// runtime fallbacks when a key is unset.\nconst DEFAULTS = {\n intervalMs: '300000',\n floorMin: '30',\n batchMax: '20',\n maxPending: '200',\n} as const\n\nfunction readEnabled(raw: string | undefined): boolean {\n const v = (raw ?? '1').trim().toLowerCase()\n return v !== '0' && v !== 'false' && v !== 'no' && v !== 'off'\n}\n\nfunction readSource(raw: string | undefined): DistillSource {\n const v = (raw || 'auto').toLowerCase()\n return v === 'agent' || v === 'llm' ? v : 'auto'\n}\n\nexport interface DistillConfigFormProps {\n /** Called after a successful save so the parent can refresh status. */\n onSaved?: () => void\n}\n\nexport function DistillConfigForm({ onSaved }: DistillConfigFormProps): JSX.Element {\n const { t } = useTranslation(['memory', 'common'])\n\n const envQuery = useEnv({ reveal: false })\n const env = useMemo(() => envQuery.data?.env ?? {}, [envQuery.data?.env])\n const cfgQuery = useConfig()\n const llmQuery = useLlmList()\n\n const enabledAgents = cfgQuery.data?.agents ?? []\n const llmBackends = llmQuery.data?.backends ?? []\n const currentDistillRole = llmQuery.data?.roles?.distill ?? ''\n\n const readForm = useMemo<() => FormState>(() => () => ({\n source: readSource(env.IMHUB_MEMORY_DISTILL_SOURCE),\n agent: env.IMHUB_MEMORY_DISTILL_AGENT || '',\n llmBackend: currentDistillRole,\n enabled: readEnabled(env.IMHUB_MEMORY_DISTILL_ENABLED),\n intervalMs: env.IMHUB_MEMORY_DISTILL_INTERVAL_MS || '',\n floorMin: env.IMHUB_MEMORY_DISTILL_FLOOR_MIN || '',\n batchMax: env.IMHUB_MEMORY_DISTILL_BATCH_MAX || '',\n maxPending: env.IMHUB_MEMORY_DISTILL_MAX_PENDING || '',\n }), [env, currentDistillRole])\n\n const [form, setForm] = useState<FormState>(readForm)\n const initialRef = useRef<FormState>(form)\n\n // Re-seed from server once the env + llm roles have both loaded (and on\n // any later refetch). useEffect so we don't stomp mid-edit on every render.\n useEffect(() => {\n if (!envQuery.data) return\n const next = readForm()\n setForm(next)\n initialRef.current = next\n }, [envQuery.data, readForm])\n\n const updateEnv = useUpdateEnv()\n const putRoles = useLlmPutRoles()\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 numField(value: string, min: number, label: string): string | null {\n if (!value.trim()) return null\n const n = Number(value)\n if (!Number.isFinite(n) || n < min) return t('distill.form.errors.numRange', { field: label, min })\n return null\n }\n\n function validate(): string | null {\n if (form.source === 'agent' && !form.agent.trim()) {\n return t('distill.form.errors.agentRequired')\n }\n if (form.source === 'llm' && !form.llmBackend.trim()) {\n return t('distill.form.errors.llmRequired')\n }\n return (\n numField(form.intervalMs, 10000, t('distill.form.intervalMs'))\n ?? numField(form.floorMin, 0, t('distill.form.floorMin'))\n ?? numField(form.batchMax, 1, t('distill.form.batchMax'))\n ?? numField(form.maxPending, 1, t('distill.form.maxPending'))\n )\n }\n\n function buildEnvUpdates(): Record<string, string | null> {\n const initial = initialRef.current\n const out: Record<string, string | null> = {}\n const diffStr = (key: string, cur: string, prev: string): void => {\n if (cur === prev) return\n out[key] = cur.trim() === '' ? null : cur.trim()\n }\n if (form.source !== initial.source) {\n // 'auto' is the runtime default → store null to keep env tidy.\n out.IMHUB_MEMORY_DISTILL_SOURCE = form.source === 'auto' ? null : form.source\n }\n if (form.enabled !== initial.enabled) {\n out.IMHUB_MEMORY_DISTILL_ENABLED = form.enabled ? '1' : '0'\n }\n // Only persist the agent name when the chosen source actually uses it,\n // so flipping away from 'agent' doesn't leave a stale key behind.\n if (form.source === 'agent') {\n diffStr('IMHUB_MEMORY_DISTILL_AGENT', form.agent, initial.agent)\n } else if (initial.agent) {\n out.IMHUB_MEMORY_DISTILL_AGENT = null\n }\n diffStr('IMHUB_MEMORY_DISTILL_INTERVAL_MS', form.intervalMs, initial.intervalMs)\n diffStr('IMHUB_MEMORY_DISTILL_FLOOR_MIN', form.floorMin, initial.floorMin)\n diffStr('IMHUB_MEMORY_DISTILL_BATCH_MAX', form.batchMax, initial.batchMax)\n diffStr('IMHUB_MEMORY_DISTILL_MAX_PENDING', form.maxPending, initial.maxPending)\n return out\n }\n\n async function onSave(): Promise<void> {\n const err = validate()\n if (err) { toast.error(err); return }\n\n const envUpdates = buildEnvUpdates()\n const roleChanged = form.source === 'llm'\n && form.llmBackend.trim() !== ''\n && form.llmBackend !== initialRef.current.llmBackend\n\n if (Object.keys(envUpdates).length === 0 && !roleChanged) {\n toast.info(t('distill.form.nothingChanged'))\n return\n }\n\n try {\n if (Object.keys(envUpdates).length > 0) {\n await updateEnv.mutateAsync({ updates: envUpdates })\n }\n if (roleChanged) {\n await putRoles.mutateAsync({ distill: form.llmBackend.trim() })\n }\n toast.success(t('distill.form.savedToast'))\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 || putRoles.isPending\n const noBackends = llmBackends.length === 0\n const noAgents = enabledAgents.length === 0\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('distill.form.title')}</h2>\n {dirty && <Badge variant=\"info\">{t('distill.form.dirty')}</Badge>}\n <div className=\"ml-auto flex items-center gap-2\">\n {dirty && (\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onClick={onDiscard} disabled={busy}>\n {t('distill.form.discard')}\n </Button>\n )}\n <Button type=\"button\" size=\"sm\" onClick={() => void onSave()} disabled={!dirty || busy}>\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {t('distill.form.save')}\n </Button>\n </div>\n </div>\n <p className=\"mt-1 text-xs text-text-dim\">{t('distill.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 flex flex-col gap-4\">\n {/* ── Source ── */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <Field label={t('distill.form.source')} help={t('distill.form.sourceHelp')}>\n <Select value={form.source} onValueChange={(v) => set('source', v as DistillSource)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"auto\">{t('distill.form.sourceAuto')}</SelectItem>\n <SelectItem value=\"agent\">{t('distill.form.sourceAgent')}</SelectItem>\n <SelectItem value=\"llm\">{t('distill.form.sourceLlm')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n\n {form.source === 'auto' && (\n <div className=\"flex items-end\">\n <p className=\"text-[11px] text-text-muted\">{t('distill.form.autoNote')}</p>\n </div>\n )}\n\n {form.source === 'agent' && (\n <Field label={t('distill.form.agent')} help={t('distill.form.agentHelp')}>\n {noAgents ? (\n <p className=\"text-[11px] text-warning\">{t('distill.form.noAgents')}</p>\n ) : (\n <Select value={form.agent} onValueChange={(v) => set('agent', v)}>\n <SelectTrigger>\n <SelectValue placeholder={t('distill.form.agentPlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {enabledAgents.map((name) => (\n <SelectItem key={name} value={name}>{agentDisplayName(name)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </Field>\n )}\n\n {form.source === 'llm' && (\n <Field label={t('distill.form.llmBackend')} help={t('distill.form.llmBackendHelp')}>\n {noBackends ? (\n <p className=\"text-[11px] text-warning\">{t('distill.form.noBackends')}</p>\n ) : (\n <Select value={form.llmBackend} onValueChange={(v) => set('llmBackend', v)}>\n <SelectTrigger>\n <SelectValue placeholder={t('distill.form.llmPlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {llmBackends.map((b) => (\n <SelectItem key={b.name} value={b.name}>\n {b.name} <span className=\"text-text-muted\">· {b.model}</span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </Field>\n )}\n </div>\n\n {/* ── Schedule ── */}\n <div>\n <div className=\"text-xs font-medium text-text-dim\">{t('distill.form.scheduleTitle')}</div>\n <div className=\"mt-2 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <Field label={t('distill.form.enabled')} help={t('distill.form.enabledHelp')}>\n <Select\n value={form.enabled ? 'on' : 'off'}\n onValueChange={(v) => set('enabled', v === 'on')}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"on\">{t('distill.form.enabledOn')}</SelectItem>\n <SelectItem value=\"off\">{t('distill.form.enabledOff')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n <NumberField\n label={t('distill.form.intervalMs')}\n help={t('distill.form.intervalMsHelp')}\n value={form.intervalMs}\n placeholder={DEFAULTS.intervalMs}\n min={10000}\n step={10000}\n onChange={(v) => set('intervalMs', v)}\n />\n <NumberField\n label={t('distill.form.floorMin')}\n help={t('distill.form.floorMinHelp')}\n value={form.floorMin}\n placeholder={DEFAULTS.floorMin}\n min={0}\n step={5}\n onChange={(v) => set('floorMin', v)}\n />\n <NumberField\n label={t('distill.form.batchMax')}\n help={t('distill.form.batchMaxHelp')}\n value={form.batchMax}\n placeholder={DEFAULTS.batchMax}\n min={1}\n step={1}\n onChange={(v) => set('batchMax', v)}\n />\n <NumberField\n label={t('distill.form.maxPending')}\n help={t('distill.form.maxPendingHelp')}\n value={form.maxPending}\n placeholder={DEFAULTS.maxPending}\n min={1}\n step={10}\n onChange={(v) => set('maxPending', v)}\n />\n </div>\n </div>\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\nfunction NumberField({\n label,\n help,\n value,\n placeholder,\n min,\n step,\n onChange,\n}: {\n label: string\n help?: string\n value: string\n placeholder: string\n min: number\n step: number\n onChange: (v: string) => void\n}): JSX.Element {\n return (\n <Field label={label} help={help}>\n <Input\n type=\"number\"\n min={min}\n step={step}\n value={value}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n )\n}\n","/**\n * /memory/distill — \"dream distillation\" control surface.\n *\n * Dream distillation buffers every chat turn into pending_distill and\n * batch-extracts facts in the background when the system is idle (or\n * once a user's oldest buffered turn passes the staleness floor). This\n * tab lets the operator:\n *\n * - configure the extraction SOURCE + SCHEDULE (DistillConfigForm)\n * - watch the live buffer depth + last-run telemetry (status tiles)\n * - force a pass now (\"Run now\" → POST /api/memory/distill)\n *\n * Status polls every 3s (useDistillStatus) so a manual run visibly\n * drains `pendingTotal` to zero without a refresh. This view is global\n * (not per-user) — the buffer spans every user — so it ignores the\n * layout's ?user= filter.\n */\n\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { AlarmClockCheck, Loader2, Play, RefreshCcw } from 'lucide-react'\n\nimport { DistillConfigForm } from './distill-config-form'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { useDistillStatus, useTriggerDistill } from '@/hooks/use-memory'\nimport { describeError } from '@/lib/api/errors'\nimport { cn } from '@/lib/utils'\n\nexport default function MemoryDistillRoute(): JSX.Element {\n const { t } = useTranslation(['memory', 'common'])\n const statusQuery = useDistillStatus()\n const status = statusQuery.data\n const trigger = useTriggerDistill()\n\n async function onRunNow(): Promise<void> {\n try {\n await trigger.mutateAsync()\n toast.success(t('distill.actions.runStarted'))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n }\n }\n\n const running = !!status?.running\n const pending = status?.pendingTotal ?? 0\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('distill.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('distill.subtitle')}</p>\n </header>\n\n {/* Configuration */}\n <DistillConfigForm onSaved={() => void statusQuery.refetch()} />\n\n {/* Status + actions */}\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('distill.status.title')}</span>\n <Badge variant={status?.enabled ? 'success' : 'secondary'}>\n {status?.enabled ? t('distill.status.enabledTrue') : t('distill.status.enabledFalse')}\n </Badge>\n {running && (\n <Badge variant=\"info\">\n <Loader2 className=\"mr-1 inline h-3 w-3 animate-spin\" />\n {t('distill.status.running')}\n </Badge>\n )}\n <div className=\"ml-auto\">\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={() => void onRunNow()}\n disabled={trigger.isPending || running || !status?.enabled}\n >\n {trigger.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Play className=\"h-4 w-4\" />}\n {t('distill.actions.runNow')}\n </Button>\n </div>\n </div>\n\n {statusQuery.isLoading ? (\n <div className=\"mt-3 h-20 w-full rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <>\n <div className=\"mt-3 grid grid-cols-2 gap-2 sm:grid-cols-3\">\n <StatTile label={t('distill.status.pending')} value={pending} tone={pending > 0 ? 'warning' : 'success'} />\n <StatTile label={t('distill.status.lastProcessed')} value={status?.lastProcessed ?? 0} tone=\"info\" />\n <StatTile label={t('distill.status.lastRun')} value={formatEpoch(status?.lastRunAt)} tone=\"info\" />\n </div>\n {pending === 0 && (\n <p className=\"mt-2 flex items-center gap-1 text-xs text-text-muted\">\n <AlarmClockCheck className=\"h-3 w-3\" />\n {t('distill.status.bufferEmpty')}\n </p>\n )}\n {status?.lastError && (\n <p className=\"mt-2 text-xs text-danger break-all\">\n {t('distill.status.lastError')}: {status.lastError}\n </p>\n )}\n </>\n )}\n </div>\n </div>\n )\n}\n\ninterface StatTileProps {\n label: string\n value: number | string\n tone: 'info' | 'success' | 'warning' | 'danger'\n}\n\nconst TONE_STYLES: Record<StatTileProps['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 StatTile({ label, value, tone }: StatTileProps): 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 formatEpoch(ms: number | null | undefined): string {\n if (!ms) return '—'\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":["AlarmClockCheck","createLucideIcon","DEFAULTS","readEnabled","raw","v","readSource","DistillConfigForm","onSaved","t","useTranslation","envQuery","useEnv","env","useMemo","cfgQuery","useConfig","llmQuery","useLlmList","enabledAgents","llmBackends","currentDistillRole","readForm","form","setForm","useState","initialRef","useRef","useEffect","next","updateEnv","useUpdateEnv","putRoles","useLlmPutRoles","dirty","initial","k","set","prev","numField","value","min","label","n","validate","buildEnvUpdates","out","diffStr","key","cur","onSave","err","toast","envUpdates","roleChanged","serr","message","describeError","onDiscard","busy","noBackends","noAgents","jsxs","jsx","Badge","Button","Loader2","Save","Field","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","name","agentDisplayName","b","NumberField","help","children","Label","placeholder","step","onChange","Input","e","MemoryDistillRoute","statusQuery","useDistillStatus","status","trigger","useTriggerDistill","onRunNow","running","pending","RefreshCcw","Play","Fragment","StatTile","formatEpoch","TONE_STYLES","tone","cn","ms","d"],"mappings":"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","x_google_ignoreList":[0]}
|