agim-cli 1.2.45 → 1.2.49
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 +340 -0
- package/README.md +40 -6
- package/README.zh-CN.md +40 -6
- package/dist/cli-ui/config-wizard.js +16 -2
- package/dist/cli-ui/config-wizard.js.map +1 -1
- package/dist/cli-ui/diag.d.ts +29 -0
- package/dist/cli-ui/diag.d.ts.map +1 -0
- package/dist/cli-ui/diag.js +135 -0
- package/dist/cli-ui/diag.js.map +1 -0
- package/dist/cli-ui/i18n.d.ts +38 -0
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +101 -0
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/setup-llm.d.ts +30 -0
- package/dist/cli-ui/setup-llm.d.ts.map +1 -0
- package/dist/cli-ui/setup-llm.js +460 -0
- package/dist/cli-ui/setup-llm.js.map +1 -0
- package/dist/cli-ui/setup-mcp.d.ts +19 -0
- package/dist/cli-ui/setup-mcp.d.ts.map +1 -0
- package/dist/cli-ui/setup-mcp.js +308 -0
- package/dist/cli-ui/setup-mcp.js.map +1 -0
- package/dist/cli-ui/token-menu.js +2 -2
- package/dist/cli-ui/token-menu.js.map +1 -1
- package/dist/cli.js +121 -22
- package/dist/cli.js.map +1 -1
- package/dist/core/access-token.d.ts +16 -5
- package/dist/core/access-token.d.ts.map +1 -1
- package/dist/core/access-token.js +82 -13
- package/dist/core/access-token.js.map +1 -1
- package/dist/core/agent-cwd.d.ts.map +1 -1
- package/dist/core/agent-cwd.js +74 -0
- package/dist/core/agent-cwd.js.map +1 -1
- package/dist/core/approval-bus.d.ts +22 -0
- package/dist/core/approval-bus.d.ts.map +1 -1
- package/dist/core/approval-bus.js +93 -0
- package/dist/core/approval-bus.js.map +1 -1
- package/dist/core/ask-user-router.d.ts +24 -0
- package/dist/core/ask-user-router.d.ts.map +1 -0
- package/dist/core/ask-user-router.js +84 -0
- package/dist/core/ask-user-router.js.map +1 -0
- package/dist/core/ask-user-rpc.d.ts +80 -0
- package/dist/core/ask-user-rpc.d.ts.map +1 -0
- package/dist/core/ask-user-rpc.js +388 -0
- package/dist/core/ask-user-rpc.js.map +1 -0
- package/dist/core/audit-log.d.ts +1 -1
- package/dist/core/audit-log.d.ts.map +1 -1
- package/dist/core/audit-log.js.map +1 -1
- package/dist/core/commands/builtin.d.ts.map +1 -1
- package/dist/core/commands/builtin.js +21 -5
- package/dist/core/commands/builtin.js.map +1 -1
- package/dist/core/commands/goal.d.ts +3 -0
- package/dist/core/commands/goal.d.ts.map +1 -0
- package/dist/core/commands/goal.js +240 -0
- package/dist/core/commands/goal.js.map +1 -0
- package/dist/core/commands/heartbeat.d.ts +3 -0
- package/dist/core/commands/heartbeat.d.ts.map +1 -0
- package/dist/core/commands/heartbeat.js +219 -0
- package/dist/core/commands/heartbeat.js.map +1 -0
- package/dist/core/commands/router-compare.d.ts +3 -0
- package/dist/core/commands/router-compare.d.ts.map +1 -0
- package/dist/core/commands/router-compare.js +81 -0
- package/dist/core/commands/router-compare.js.map +1 -0
- package/dist/core/commands/router.d.ts.map +1 -1
- package/dist/core/commands/router.js +9 -1
- package/dist/core/commands/router.js.map +1 -1
- package/dist/core/commands/skill.d.ts +3 -0
- package/dist/core/commands/skill.d.ts.map +1 -0
- package/dist/core/commands/skill.js +91 -0
- package/dist/core/commands/skill.js.map +1 -0
- package/dist/core/config-schema.d.ts +28 -0
- package/dist/core/config-schema.d.ts.map +1 -1
- package/dist/core/config-schema.js +124 -0
- package/dist/core/config-schema.js.map +1 -1
- package/dist/core/goals.d.ts +81 -0
- package/dist/core/goals.d.ts.map +1 -0
- package/dist/core/goals.js +361 -0
- package/dist/core/goals.js.map +1 -0
- package/dist/core/heartbeat-store.d.ts +90 -0
- package/dist/core/heartbeat-store.d.ts.map +1 -0
- package/dist/core/heartbeat-store.js +302 -0
- package/dist/core/heartbeat-store.js.map +1 -0
- package/dist/core/heartbeat.d.ts +35 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +332 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/intent-llm.d.ts +9 -0
- package/dist/core/intent-llm.d.ts.map +1 -1
- package/dist/core/intent-llm.js +77 -32
- package/dist/core/intent-llm.js.map +1 -1
- package/dist/core/llm/agent-loop.d.ts +112 -0
- package/dist/core/llm/agent-loop.d.ts.map +1 -0
- package/dist/core/llm/agent-loop.js +313 -0
- package/dist/core/llm/agent-loop.js.map +1 -0
- package/dist/core/llm/anthropic-provider.d.ts +53 -0
- package/dist/core/llm/anthropic-provider.d.ts.map +1 -0
- package/dist/core/llm/anthropic-provider.js +339 -0
- package/dist/core/llm/anthropic-provider.js.map +1 -0
- package/dist/core/llm/auto-compact.d.ts +35 -0
- package/dist/core/llm/auto-compact.d.ts.map +1 -0
- package/dist/core/llm/auto-compact.js +149 -0
- package/dist/core/llm/auto-compact.js.map +1 -0
- package/dist/core/llm/builtin-dispatcher.d.ts +21 -0
- package/dist/core/llm/builtin-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/builtin-dispatcher.js +196 -0
- package/dist/core/llm/builtin-dispatcher.js.map +1 -0
- package/dist/core/llm/imhub-dispatcher.d.ts +27 -0
- package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/imhub-dispatcher.js +308 -0
- package/dist/core/llm/imhub-dispatcher.js.map +1 -0
- package/dist/core/llm/index.d.ts +11 -0
- package/dist/core/llm/index.d.ts.map +1 -0
- package/dist/core/llm/index.js +16 -0
- package/dist/core/llm/index.js.map +1 -0
- package/dist/core/llm/introspection.d.ts +73 -0
- package/dist/core/llm/introspection.d.ts.map +1 -0
- package/dist/core/llm/introspection.js +90 -0
- package/dist/core/llm/introspection.js.map +1 -0
- package/dist/core/llm/mcp-client.d.ts +80 -0
- package/dist/core/llm/mcp-client.d.ts.map +1 -0
- package/dist/core/llm/mcp-client.js +270 -0
- package/dist/core/llm/mcp-client.js.map +1 -0
- package/dist/core/llm/mcp-registry.d.ts +57 -0
- package/dist/core/llm/mcp-registry.d.ts.map +1 -0
- package/dist/core/llm/mcp-registry.js +155 -0
- package/dist/core/llm/mcp-registry.js.map +1 -0
- package/dist/core/llm/openai-compat-provider.d.ts +65 -0
- package/dist/core/llm/openai-compat-provider.d.ts.map +1 -0
- package/dist/core/llm/openai-compat-provider.js +451 -0
- package/dist/core/llm/openai-compat-provider.js.map +1 -0
- package/dist/core/llm/policy-approval-gate.d.ts +30 -0
- package/dist/core/llm/policy-approval-gate.d.ts.map +1 -0
- package/dist/core/llm/policy-approval-gate.js +86 -0
- package/dist/core/llm/policy-approval-gate.js.map +1 -0
- package/dist/core/llm/provider-base.d.ts +302 -0
- package/dist/core/llm/provider-base.d.ts.map +1 -0
- package/dist/core/llm/provider-base.js +222 -0
- package/dist/core/llm/provider-base.js.map +1 -0
- package/dist/core/llm/registry.d.ts +44 -0
- package/dist/core/llm/registry.d.ts.map +1 -0
- package/dist/core/llm/registry.js +160 -0
- package/dist/core/llm/registry.js.map +1 -0
- package/dist/core/llm/secrets.d.ts +46 -0
- package/dist/core/llm/secrets.d.ts.map +1 -0
- package/dist/core/llm/secrets.js +157 -0
- package/dist/core/llm/secrets.js.map +1 -0
- package/dist/core/llm/tool-dispatcher.d.ts +37 -0
- package/dist/core/llm/tool-dispatcher.d.ts.map +1 -0
- package/dist/core/llm/tool-dispatcher.js +85 -0
- package/dist/core/llm/tool-dispatcher.js.map +1 -0
- package/dist/core/memory-consolidate.d.ts.map +1 -1
- package/dist/core/memory-consolidate.js +38 -23
- package/dist/core/memory-consolidate.js.map +1 -1
- package/dist/core/memory-distill.d.ts.map +1 -1
- package/dist/core/memory-distill.js +51 -25
- package/dist/core/memory-distill.js.map +1 -1
- package/dist/core/memory-rpc.d.ts.map +1 -1
- package/dist/core/memory-rpc.js +6 -0
- package/dist/core/memory-rpc.js.map +1 -1
- package/dist/core/message-sink.d.ts.map +1 -1
- package/dist/core/message-sink.js +76 -0
- package/dist/core/message-sink.js.map +1 -1
- package/dist/core/notification-evaluator.d.ts +49 -0
- package/dist/core/notification-evaluator.d.ts.map +1 -0
- package/dist/core/notification-evaluator.js +232 -0
- package/dist/core/notification-evaluator.js.map +1 -0
- package/dist/core/onboarding.d.ts.map +1 -1
- package/dist/core/onboarding.js +10 -0
- package/dist/core/onboarding.js.map +1 -1
- package/dist/core/persona.d.ts +10 -0
- package/dist/core/persona.d.ts.map +1 -1
- package/dist/core/persona.js +28 -14
- package/dist/core/persona.js.map +1 -1
- package/dist/core/push-rpc.d.ts +8 -0
- package/dist/core/push-rpc.d.ts.map +1 -1
- package/dist/core/push-rpc.js +41 -1
- package/dist/core/push-rpc.js.map +1 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +11 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/core/render-router.d.ts.map +1 -1
- package/dist/core/render-router.js +23 -6
- package/dist/core/render-router.js.map +1 -1
- package/dist/core/router-compare.d.ts +76 -0
- package/dist/core/router-compare.d.ts.map +1 -0
- package/dist/core/router-compare.js +253 -0
- package/dist/core/router-compare.js.map +1 -0
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +25 -1
- package/dist/core/router.js.map +1 -1
- package/dist/core/skills/builtin/agim-self/SKILL.md +81 -0
- package/dist/core/skills/loader.d.ts +120 -0
- package/dist/core/skills/loader.d.ts.map +1 -0
- package/dist/core/skills/loader.js +577 -0
- package/dist/core/skills/loader.js.map +1 -0
- package/dist/core/skills-rpc.d.ts +44 -0
- package/dist/core/skills-rpc.d.ts.map +1 -0
- package/dist/core/skills-rpc.js +71 -0
- package/dist/core/skills-rpc.js.map +1 -0
- package/dist/core/types.d.ts +35 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/util/format-age.d.ts +20 -0
- package/dist/core/util/format-age.d.ts.map +1 -0
- package/dist/core/util/format-age.js +86 -0
- package/dist/core/util/format-age.js.map +1 -0
- package/dist/plugins/agents/acp/acp-adapter.d.ts +3 -0
- package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/acp/acp-adapter.js +12 -0
- package/dist/plugins/agents/acp/acp-adapter.js.map +1 -1
- package/dist/plugins/agents/antigravity/index.d.ts +1 -0
- package/dist/plugins/agents/antigravity/index.d.ts.map +1 -1
- package/dist/plugins/agents/antigravity/index.js +1 -0
- package/dist/plugins/agents/antigravity/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/index.d.ts +1 -0
- package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/index.js +1 -0
- package/dist/plugins/agents/claude-code/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +22 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.js +157 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
- package/dist/plugins/agents/codex/index.d.ts +1 -0
- package/dist/plugins/agents/codex/index.d.ts.map +1 -1
- package/dist/plugins/agents/codex/index.js +1 -0
- package/dist/plugins/agents/codex/index.js.map +1 -1
- package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts +43 -0
- package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts.map +1 -0
- package/dist/plugins/agents/cursor/ensure-mcp-config.js +99 -0
- package/dist/plugins/agents/cursor/ensure-mcp-config.js.map +1 -0
- package/dist/plugins/agents/cursor/index.d.ts +28 -0
- package/dist/plugins/agents/cursor/index.d.ts.map +1 -0
- package/dist/plugins/agents/cursor/index.js +290 -0
- package/dist/plugins/agents/cursor/index.js.map +1 -0
- package/dist/plugins/agents/native/index.d.ts +34 -0
- package/dist/plugins/agents/native/index.d.ts.map +1 -0
- package/dist/plugins/agents/native/index.js +598 -0
- package/dist/plugins/agents/native/index.js.map +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +4 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js +26 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
- package/dist/web/agim-skills-api.d.ts +4 -0
- package/dist/web/agim-skills-api.d.ts.map +1 -0
- package/dist/web/agim-skills-api.js +150 -0
- package/dist/web/agim-skills-api.js.map +1 -0
- package/dist/web/background-tasks-api.d.ts +7 -0
- package/dist/web/background-tasks-api.d.ts.map +1 -0
- package/dist/web/background-tasks-api.js +225 -0
- package/dist/web/background-tasks-api.js.map +1 -0
- package/dist/web/llm-api.d.ts +8 -0
- package/dist/web/llm-api.d.ts.map +1 -0
- package/dist/web/llm-api.js +300 -0
- package/dist/web/llm-api.js.map +1 -0
- package/dist/web/mcp-api.d.ts +8 -0
- package/dist/web/mcp-api.d.ts.map +1 -0
- package/dist/web/mcp-api.js +205 -0
- package/dist/web/mcp-api.js.map +1 -0
- package/dist/web/public/assets/{a2a-Cdl8iY0e.js → a2a-06bnQicA.js} +3 -3
- package/dist/web/public/assets/{a2a-Cdl8iY0e.js.map → a2a-06bnQicA.js.map} +1 -1
- package/dist/web/public/assets/{activity-DXahuK1C.js → activity-Bhc6Esfy.js} +2 -2
- package/dist/web/public/assets/{activity-DXahuK1C.js.map → activity-Bhc6Esfy.js.map} +1 -1
- package/dist/web/public/assets/{admins-C8fJsuHC.js → admins-BVpnOw3o.js} +3 -3
- package/dist/web/public/assets/{admins-C8fJsuHC.js.map → admins-BVpnOw3o.js.map} +1 -1
- package/dist/web/public/assets/agents-Cn7D3UMz.js +7 -0
- package/dist/web/public/assets/agents-Cn7D3UMz.js.map +1 -0
- package/dist/web/public/assets/{approvals-CpyL90ef.js → approvals-BJiLyoLf.js} +3 -3
- package/dist/web/public/assets/{approvals-CpyL90ef.js.map → approvals-BJiLyoLf.js.map} +1 -1
- package/dist/web/public/assets/asks-C7gKbna1.js +7 -0
- package/dist/web/public/assets/asks-C7gKbna1.js.map +1 -0
- package/dist/web/public/assets/{audit-DDqpiC3z.js → audit-DgWZD8l5.js} +2 -2
- package/dist/web/public/assets/{audit-DDqpiC3z.js.map → audit-DgWZD8l5.js.map} +1 -1
- package/dist/web/public/assets/bell-pWZT2wlM.js +7 -0
- package/dist/web/public/assets/bell-pWZT2wlM.js.map +1 -0
- package/dist/web/public/assets/{bgjobs-CAFV-I4I.js → bgjobs-DkAJdzHf.js} +2 -2
- package/dist/web/public/assets/{bgjobs-CAFV-I4I.js.map → bgjobs-DkAJdzHf.js.map} +1 -1
- package/dist/web/public/assets/{brain-CJyZe3Oa.js → brain-B0mM-ro_.js} +2 -2
- package/dist/web/public/assets/{brain-CJyZe3Oa.js.map → brain-B0mM-ro_.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-DcLbQF2I.js → briefcase-CUQlj33_.js} +2 -2
- package/dist/web/public/assets/{briefcase-DcLbQF2I.js.map → briefcase-CUQlj33_.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-BhKELKvM.js → chevron-right-CJuDP_fx.js} +2 -2
- package/dist/web/public/assets/{chevron-right-BhKELKvM.js.map → chevron-right-CJuDP_fx.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-D1qST9RS.js → circle-check-CYse8LRx.js} +2 -2
- package/dist/web/public/assets/{circle-check-D1qST9RS.js.map → circle-check-CYse8LRx.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js → circle-check-big-9NpJLA1Z.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js.map → circle-check-big-9NpJLA1Z.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-DtePUX5x.js → circle-x-BxZ24SVG.js} +2 -2
- package/dist/web/public/assets/{circle-x-DtePUX5x.js.map → circle-x-BxZ24SVG.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js → confirm-dialog-CmHeZ7ei.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js.map → confirm-dialog-CmHeZ7ei.js.map} +1 -1
- package/dist/web/public/assets/{data-table-BRLUxacD.js → data-table-tu4BIahS.js} +5 -5
- package/dist/web/public/assets/{data-table-BRLUxacD.js.map → data-table-tu4BIahS.js.map} +1 -1
- package/dist/web/public/assets/{dialog-By4YA8bm.js → dialog-D8QAkLhI.js} +3 -3
- package/dist/web/public/assets/{dialog-By4YA8bm.js.map → dialog-D8QAkLhI.js.map} +1 -1
- package/dist/web/public/assets/{download-CiTB2sCh.js → download-DBS0ZPTh.js} +2 -2
- package/dist/web/public/assets/{download-CiTB2sCh.js.map → download-DBS0ZPTh.js.map} +1 -1
- package/dist/web/public/assets/{email-H-b2AExg.js → email-DgbAEEvZ.js} +3 -3
- package/dist/web/public/assets/{email-H-b2AExg.js.map → email-DgbAEEvZ.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-DZJTUlvz.js → empty-state-B1S_EYNJ.js} +2 -2
- package/dist/web/public/assets/{empty-state-DZJTUlvz.js.map → empty-state-B1S_EYNJ.js.map} +1 -1
- package/dist/web/public/assets/{external-link-CfU6Rttn.js → external-link-Dkmwlv6p.js} +2 -2
- package/dist/web/public/assets/{external-link-CfU6Rttn.js.map → external-link-Dkmwlv6p.js.map} +1 -1
- package/dist/web/public/assets/{eye-BvWcd0pJ.js → eye-Ch0DLviZ.js} +4 -4
- package/dist/web/public/assets/{eye-BvWcd0pJ.js.map → eye-Ch0DLviZ.js.map} +1 -1
- package/dist/web/public/assets/{facts-BRDbQLSI.js → facts-C3YV1Mkp.js} +2 -2
- package/dist/web/public/assets/{facts-BRDbQLSI.js.map → facts-C3YV1Mkp.js.map} +1 -1
- package/dist/web/public/assets/goals-DEt5gGry.js +17 -0
- package/dist/web/public/assets/goals-DEt5gGry.js.map +1 -0
- package/dist/web/public/assets/{health-DJPFOiKw.js → health-DuB9uNiZ.js} +2 -2
- package/dist/web/public/assets/{health-DJPFOiKw.js.map → health-DuB9uNiZ.js.map} +1 -1
- package/dist/web/public/assets/heart-pulse-CD8xNAGs.js +7 -0
- package/dist/web/public/assets/heart-pulse-CD8xNAGs.js.map +1 -0
- package/dist/web/public/assets/heartbeat-DbR8VwmG.js +7 -0
- package/dist/web/public/assets/heartbeat-DbR8VwmG.js.map +1 -0
- package/dist/web/public/assets/hot-izk3vGQB.js +17 -0
- package/dist/web/public/assets/hot-izk3vGQB.js.map +1 -0
- package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
- package/dist/web/public/assets/index-BY1vfCja.js +166 -0
- package/dist/web/public/assets/index-BY1vfCja.js.map +1 -0
- package/dist/web/public/assets/installed-BXB3-YIy.js +31 -0
- package/dist/web/public/assets/installed-BXB3-YIy.js.map +1 -0
- package/dist/web/public/assets/{jobs-DdWaBgOh.js → jobs-DkbM4mIQ.js} +2 -2
- package/dist/web/public/assets/{jobs-DdWaBgOh.js.map → jobs-DkbM4mIQ.js.map} +1 -1
- package/dist/web/public/assets/{layout-Dr12u0W_.js → layout-5ePj6Bek.js} +2 -2
- package/dist/web/public/assets/{layout-Dr12u0W_.js.map → layout-5ePj6Bek.js.map} +1 -1
- package/dist/web/public/assets/layout-B5Dzy_Zc.js +2 -0
- package/dist/web/public/assets/layout-B5Dzy_Zc.js.map +1 -0
- package/dist/web/public/assets/layout-BZpbNQFb.js +2 -0
- package/dist/web/public/assets/layout-BZpbNQFb.js.map +1 -0
- package/dist/web/public/assets/layout-DY9Xq34u.js +2 -0
- package/dist/web/public/assets/layout-DY9Xq34u.js.map +1 -0
- package/dist/web/public/assets/{layout-BybpkTy0.js → layout-DxzBaeTv.js} +2 -2
- package/dist/web/public/assets/{layout-BybpkTy0.js.map → layout-DxzBaeTv.js.map} +1 -1
- package/dist/web/public/assets/llm-Dg4W7eRM.js +7 -0
- package/dist/web/public/assets/llm-Dg4W7eRM.js.map +1 -0
- package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js → loader-circle-pGNYdPoE.js} +2 -2
- package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js.map → loader-circle-pGNYdPoE.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-B8hea8yW.js → map-pin-D1UX9mg7.js} +2 -2
- package/dist/web/public/assets/{map-pin-B8hea8yW.js.map → map-pin-D1UX9mg7.js.map} +1 -1
- package/dist/web/public/assets/mcp-uoOzu4_J.js +7 -0
- package/dist/web/public/assets/mcp-uoOzu4_J.js.map +1 -0
- package/dist/web/public/assets/{memos-C0_I1Uzt.js → memos-CAWASHg5.js} +2 -2
- package/dist/web/public/assets/{memos-C0_I1Uzt.js.map → memos-CAWASHg5.js.map} +1 -1
- package/dist/web/public/assets/{messengers-DuS5_JlE.js → messengers-B1-mZms8.js} +3 -3
- package/dist/web/public/assets/{messengers-DuS5_JlE.js.map → messengers-B1-mZms8.js.map} +1 -1
- package/dist/web/public/assets/native-agent-UuVvvzsW.js +7 -0
- package/dist/web/public/assets/native-agent-UuVvvzsW.js.map +1 -0
- package/dist/web/public/assets/{network-CpkocMHV.js → network-DpjSgAwW.js} +2 -2
- package/dist/web/public/assets/{network-CpkocMHV.js.map → network-DpjSgAwW.js.map} +1 -1
- package/dist/web/public/assets/{outbox-mGqTV2Ex.js → outbox-DeAgiXkY.js} +3 -3
- package/dist/web/public/assets/{outbox-mGqTV2Ex.js.map → outbox-DeAgiXkY.js.map} +1 -1
- package/dist/web/public/assets/{pagination-BAYvy11u.js → pagination-5GD_he3L.js} +3 -3
- package/dist/web/public/assets/{pagination-BAYvy11u.js.map → pagination-5GD_he3L.js.map} +1 -1
- package/dist/web/public/assets/{persona-CM0TLPJa.js → persona-BhkDCmeB.js} +2 -2
- package/dist/web/public/assets/{persona-CM0TLPJa.js.map → persona-BhkDCmeB.js.map} +1 -1
- package/dist/web/public/assets/{play-DMgMpe7N.js → play-B7o6cJ8W.js} +2 -2
- package/dist/web/public/assets/{play-DMgMpe7N.js.map → play-B7o6cJ8W.js.map} +1 -1
- package/dist/web/public/assets/plus-C5d4C6Zp.js +7 -0
- package/dist/web/public/assets/plus-C5d4C6Zp.js.map +1 -0
- package/dist/web/public/assets/policy-Ct_sKm3Y.js +2 -0
- package/dist/web/public/assets/{policy-Ch-xirrA.js.map → policy-Ct_sKm3Y.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js → refresh-ccw-BlXMN3UX.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js.map → refresh-ccw-BlXMN3UX.js.map} +1 -1
- package/dist/web/public/assets/{reminders-Dbe7Rc4h.js → reminders-gb1Y0S3t.js} +4 -9
- package/dist/web/public/assets/reminders-gb1Y0S3t.js.map +1 -0
- package/dist/web/public/assets/{save-1aALBaZc.js → save-DAFuApnY.js} +2 -2
- package/dist/web/public/assets/{save-1aALBaZc.js.map → save-DAFuApnY.js.map} +1 -1
- package/dist/web/public/assets/{schedules-BBQ2wcnS.js → schedules-CtFumT2B.js} +3 -3
- package/dist/web/public/assets/{schedules-BBQ2wcnS.js.map → schedules-CtFumT2B.js.map} +1 -1
- package/dist/web/public/assets/{search-DDYjsJ7-.js → search-BWuZE0YD.js} +2 -2
- package/dist/web/public/assets/{search-DDYjsJ7-.js.map → search-BWuZE0YD.js.map} +1 -1
- package/dist/web/public/assets/{service-DMp11TKF.js → service-lah7RWEc.js} +3 -3
- package/dist/web/public/assets/{service-DMp11TKF.js.map → service-lah7RWEc.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-Cvj81JKi.js → status-badge-BgmFa_8z.js} +2 -2
- package/dist/web/public/assets/{status-badge-Cvj81JKi.js.map → status-badge-BgmFa_8z.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js → subtasks-CgqrOGhl.js} +3 -3
- package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js.map → subtasks-CgqrOGhl.js.map} +1 -1
- package/dist/web/public/assets/{table-B6nK6k3L.js → table-BhDzIBvB.js} +2 -2
- package/dist/web/public/assets/{table-B6nK6k3L.js.map → table-BhDzIBvB.js.map} +1 -1
- package/dist/web/public/assets/{topn-BwFh2jKv.js → topn-DXgTCdM_.js} +3 -3
- package/dist/web/public/assets/{topn-BwFh2jKv.js.map → topn-DXgTCdM_.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-CqpMjbu5.js → trash-2-i4F_Rzh3.js} +3 -3
- package/dist/web/public/assets/{trash-2-CqpMjbu5.js.map → trash-2-i4F_Rzh3.js.map} +1 -1
- package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js +2 -0
- package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js.map +1 -0
- package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js +2 -0
- package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js.map +1 -0
- package/dist/web/public/assets/{use-memory-jxZdt-RL.js → use-memory-B_RQWQyG.js} +2 -2
- package/dist/web/public/assets/{use-memory-jxZdt-RL.js.map → use-memory-B_RQWQyG.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-9TDgLO9y.js → use-observability-CCTN-a71.js} +2 -2
- package/dist/web/public/assets/{use-observability-9TDgLO9y.js.map → use-observability-CCTN-a71.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-DFB_c2pr.js → use-settings-D4EdDLiK.js} +2 -2
- package/dist/web/public/assets/{use-settings-DFB_c2pr.js.map → use-settings-D4EdDLiK.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js → use-workspace-BhTEp_QH.js} +2 -2
- package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js.map → use-workspace-BhTEp_QH.js.map} +1 -1
- package/dist/web/public/assets/useQuery-DmoWKLw3.js +2 -0
- package/dist/web/public/assets/{useQuery-rLmHxFp4.js.map → useQuery-DmoWKLw3.js.map} +1 -1
- package/dist/web/public/assets/{vector-D9UqmLi6.js → vector-By-cheMu.js} +2 -2
- package/dist/web/public/assets/{vector-D9UqmLi6.js.map → vector-By-cheMu.js.map} +1 -1
- package/dist/web/public/assets/{viewer-_OpObeWr.js → viewer-CJNrz2iw.js} +3 -3
- package/dist/web/public/assets/{viewer-_OpObeWr.js.map → viewer-CJNrz2iw.js.map} +1 -1
- package/dist/web/public/assets/{workspace-DSHRdspq.js → workspace-DvYlIAhu.js} +4 -4
- package/dist/web/public/assets/{workspace-DSHRdspq.js.map → workspace-DvYlIAhu.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-CsBdhbXz.js → workspaces-2pn73O-K.js} +3 -3
- package/dist/web/public/assets/{workspaces-CsBdhbXz.js.map → workspaces-2pn73O-K.js.map} +1 -1
- package/dist/web/public/assets/{x-D1re-vBd.js → x-5Z_de5zo.js} +2 -2
- package/dist/web/public/assets/{x-D1re-vBd.js.map → x-5Z_de5zo.js.map} +1 -1
- package/dist/web/public/index.html +2 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +45 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +2 -2
- package/dist/web/public/assets/agents-lrzFDGgX.js +0 -12
- package/dist/web/public/assets/agents-lrzFDGgX.js.map +0 -1
- package/dist/web/public/assets/hot-CFGHGkqL.js +0 -17
- package/dist/web/public/assets/hot-CFGHGkqL.js.map +0 -1
- package/dist/web/public/assets/index-C4hk1i67.js +0 -166
- package/dist/web/public/assets/index-C4hk1i67.js.map +0 -1
- package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
- package/dist/web/public/assets/installed-UONWfKHS.js +0 -7
- package/dist/web/public/assets/installed-UONWfKHS.js.map +0 -1
- package/dist/web/public/assets/layout-C8_IQRGM.js +0 -2
- package/dist/web/public/assets/layout-C8_IQRGM.js.map +0 -1
- package/dist/web/public/assets/layout-CxRHLqvi.js +0 -2
- package/dist/web/public/assets/layout-CxRHLqvi.js.map +0 -1
- package/dist/web/public/assets/layout-LC5zjw1h.js +0 -2
- package/dist/web/public/assets/layout-LC5zjw1h.js.map +0 -1
- package/dist/web/public/assets/policy-Ch-xirrA.js +0 -2
- package/dist/web/public/assets/reminders-Dbe7Rc4h.js.map +0 -1
- package/dist/web/public/assets/use-skills-OZKB5x-S.js +0 -2
- package/dist/web/public/assets/use-skills-OZKB5x-S.js.map +0 -1
- package/dist/web/public/assets/useQuery-rLmHxFp4.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery-rLmHxFp4.js","sources":["../../node_modules/@tanstack/query-core/build/modern/queryObserver.js","../../node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.js","../../node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.js","../../node_modules/@tanstack/react-query/build/modern/errorBoundaryUtils.js","../../node_modules/@tanstack/react-query/build/modern/suspense.js","../../node_modules/@tanstack/react-query/build/modern/useBaseQuery.js","../../node_modules/@tanstack/react-query/build/modern/useQuery.js"],"sourcesContent":["// src/queryObserver.ts\nimport { focusManager } from \"./focusManager.js\";\nimport { environmentManager } from \"./environmentManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { fetchState } from \"./query.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { pendingThenable } from \"./thenable.js\";\nimport {\n isValidTimeout,\n noop,\n replaceData,\n resolveQueryBoolean,\n resolveStaleTime,\n shallowEqualObjects,\n timeUntilStale\n} from \"./utils.js\";\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar QueryObserver = class extends Subscribable {\n constructor(client, options) {\n super();\n this.options = options;\n this.#client = client;\n this.#selectError = null;\n this.#currentThenable = pendingThenable();\n this.bindMethods();\n this.setOptions(options);\n }\n #client;\n #currentQuery = void 0;\n #currentQueryInitialState = void 0;\n #currentResult = void 0;\n #currentResultState;\n #currentResultOptions;\n #currentThenable;\n #selectError;\n #selectFn;\n #selectResult;\n // This property keeps track of the last query with defined data.\n // It will be used to pass the previous data and query to the placeholder function between renders.\n #lastQueryWithDefinedData;\n #staleTimeoutId;\n #refetchIntervalId;\n #currentRefetchInterval;\n #trackedProps = /* @__PURE__ */ new Set();\n bindMethods() {\n this.refetch = this.refetch.bind(this);\n }\n onSubscribe() {\n if (this.listeners.size === 1) {\n this.#currentQuery.addObserver(this);\n if (shouldFetchOnMount(this.#currentQuery, this.options)) {\n this.#executeFetch();\n } else {\n this.updateResult();\n }\n this.#updateTimers();\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.destroy();\n }\n }\n shouldFetchOnReconnect() {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnReconnect\n );\n }\n shouldFetchOnWindowFocus() {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnWindowFocus\n );\n }\n destroy() {\n this.listeners = /* @__PURE__ */ new Set();\n this.#clearStaleTimeout();\n this.#clearRefetchInterval();\n this.#currentQuery.removeObserver(this);\n }\n setOptions(options) {\n const prevOptions = this.options;\n const prevQuery = this.#currentQuery;\n this.options = this.#client.defaultQueryOptions(options);\n if (this.options.enabled !== void 0 && typeof this.options.enabled !== \"boolean\" && typeof this.options.enabled !== \"function\" && typeof resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== \"boolean\") {\n throw new Error(\n \"Expected enabled to be a boolean or a callback that returns a boolean\"\n );\n }\n this.#updateQuery();\n this.#currentQuery.setOptions(this.options);\n if (prevOptions._defaulted && !shallowEqualObjects(this.options, prevOptions)) {\n this.#client.getQueryCache().notify({\n type: \"observerOptionsUpdated\",\n query: this.#currentQuery,\n observer: this\n });\n }\n const mounted = this.hasListeners();\n if (mounted && shouldFetchOptionally(\n this.#currentQuery,\n prevQuery,\n this.options,\n prevOptions\n )) {\n this.#executeFetch();\n }\n this.updateResult();\n if (mounted && (this.#currentQuery !== prevQuery || resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== resolveQueryBoolean(prevOptions.enabled, this.#currentQuery) || resolveStaleTime(this.options.staleTime, this.#currentQuery) !== resolveStaleTime(prevOptions.staleTime, this.#currentQuery))) {\n this.#updateStaleTimeout();\n }\n const nextRefetchInterval = this.#computeRefetchInterval();\n if (mounted && (this.#currentQuery !== prevQuery || resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== resolveQueryBoolean(prevOptions.enabled, this.#currentQuery) || nextRefetchInterval !== this.#currentRefetchInterval)) {\n this.#updateRefetchInterval(nextRefetchInterval);\n }\n }\n getOptimisticResult(options) {\n const query = this.#client.getQueryCache().build(this.#client, options);\n const result = this.createResult(query, options);\n if (shouldAssignObserverCurrentProperties(this, result)) {\n this.#currentResult = result;\n this.#currentResultOptions = this.options;\n this.#currentResultState = this.#currentQuery.state;\n }\n return result;\n }\n getCurrentResult() {\n return this.#currentResult;\n }\n trackResult(result, onPropTracked) {\n return new Proxy(result, {\n get: (target, key) => {\n this.trackProp(key);\n onPropTracked?.(key);\n if (key === \"promise\") {\n this.trackProp(\"data\");\n if (!this.options.experimental_prefetchInRender && this.#currentThenable.status === \"pending\") {\n this.#currentThenable.reject(\n new Error(\n \"experimental_prefetchInRender feature flag is not enabled\"\n )\n );\n }\n }\n return Reflect.get(target, key);\n }\n });\n }\n trackProp(key) {\n this.#trackedProps.add(key);\n }\n getCurrentQuery() {\n return this.#currentQuery;\n }\n refetch({ ...options } = {}) {\n return this.fetch({\n ...options\n });\n }\n fetchOptimistic(options) {\n const defaultedOptions = this.#client.defaultQueryOptions(options);\n const query = this.#client.getQueryCache().build(this.#client, defaultedOptions);\n return query.fetch().then(() => this.createResult(query, defaultedOptions));\n }\n fetch(fetchOptions) {\n return this.#executeFetch({\n ...fetchOptions,\n cancelRefetch: fetchOptions.cancelRefetch ?? true\n }).then(() => {\n this.updateResult();\n return this.#currentResult;\n });\n }\n #executeFetch(fetchOptions) {\n this.#updateQuery();\n let promise = this.#currentQuery.fetch(\n this.options,\n fetchOptions\n );\n if (!fetchOptions?.throwOnError) {\n promise = promise.catch(noop);\n }\n return promise;\n }\n #updateStaleTimeout() {\n this.#clearStaleTimeout();\n const staleTime = resolveStaleTime(\n this.options.staleTime,\n this.#currentQuery\n );\n if (environmentManager.isServer() || this.#currentResult.isStale || !isValidTimeout(staleTime)) {\n return;\n }\n const time = timeUntilStale(this.#currentResult.dataUpdatedAt, staleTime);\n const timeout = time + 1;\n this.#staleTimeoutId = timeoutManager.setTimeout(() => {\n if (!this.#currentResult.isStale) {\n this.updateResult();\n }\n }, timeout);\n }\n #computeRefetchInterval() {\n return (typeof this.options.refetchInterval === \"function\" ? this.options.refetchInterval(this.#currentQuery) : this.options.refetchInterval) ?? false;\n }\n #updateRefetchInterval(nextInterval) {\n this.#clearRefetchInterval();\n this.#currentRefetchInterval = nextInterval;\n if (environmentManager.isServer() || resolveQueryBoolean(this.options.enabled, this.#currentQuery) === false || !isValidTimeout(this.#currentRefetchInterval) || this.#currentRefetchInterval === 0) {\n return;\n }\n this.#refetchIntervalId = timeoutManager.setInterval(() => {\n if (this.options.refetchIntervalInBackground || focusManager.isFocused()) {\n this.#executeFetch();\n }\n }, this.#currentRefetchInterval);\n }\n #updateTimers() {\n this.#updateStaleTimeout();\n this.#updateRefetchInterval(this.#computeRefetchInterval());\n }\n #clearStaleTimeout() {\n if (this.#staleTimeoutId !== void 0) {\n timeoutManager.clearTimeout(this.#staleTimeoutId);\n this.#staleTimeoutId = void 0;\n }\n }\n #clearRefetchInterval() {\n if (this.#refetchIntervalId !== void 0) {\n timeoutManager.clearInterval(this.#refetchIntervalId);\n this.#refetchIntervalId = void 0;\n }\n }\n createResult(query, options) {\n const prevQuery = this.#currentQuery;\n const prevOptions = this.options;\n const prevResult = this.#currentResult;\n const prevResultState = this.#currentResultState;\n const prevResultOptions = this.#currentResultOptions;\n const queryChange = query !== prevQuery;\n const queryInitialState = queryChange ? query.state : this.#currentQueryInitialState;\n const { state } = query;\n let newState = { ...state };\n let isPlaceholderData = false;\n let data;\n if (options._optimisticResults) {\n const mounted = this.hasListeners();\n const fetchOnMount = !mounted && shouldFetchOnMount(query, options);\n const fetchOptionally = mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions);\n if (fetchOnMount || fetchOptionally) {\n newState = {\n ...newState,\n ...fetchState(state.data, query.options)\n };\n }\n if (options._optimisticResults === \"isRestoring\") {\n newState.fetchStatus = \"idle\";\n }\n }\n let { error, errorUpdatedAt, status } = newState;\n data = newState.data;\n let skipSelect = false;\n if (options.placeholderData !== void 0 && data === void 0 && status === \"pending\") {\n let placeholderData;\n if (prevResult?.isPlaceholderData && options.placeholderData === prevResultOptions?.placeholderData) {\n placeholderData = prevResult.data;\n skipSelect = true;\n } else {\n placeholderData = typeof options.placeholderData === \"function\" ? options.placeholderData(\n this.#lastQueryWithDefinedData?.state.data,\n this.#lastQueryWithDefinedData\n ) : options.placeholderData;\n }\n if (placeholderData !== void 0) {\n status = \"success\";\n data = replaceData(\n prevResult?.data,\n placeholderData,\n options\n );\n isPlaceholderData = true;\n }\n }\n if (options.select && data !== void 0 && !skipSelect) {\n if (prevResult && data === prevResultState?.data && options.select === this.#selectFn) {\n data = this.#selectResult;\n } else {\n try {\n this.#selectFn = options.select;\n data = options.select(data);\n data = replaceData(prevResult?.data, data, options);\n this.#selectResult = data;\n this.#selectError = null;\n } catch (selectError) {\n this.#selectError = selectError;\n }\n }\n }\n if (this.#selectError) {\n error = this.#selectError;\n data = this.#selectResult;\n errorUpdatedAt = Date.now();\n status = \"error\";\n }\n const isFetching = newState.fetchStatus === \"fetching\";\n const isPending = status === \"pending\";\n const isError = status === \"error\";\n const isLoading = isPending && isFetching;\n const hasData = data !== void 0;\n const result = {\n status,\n fetchStatus: newState.fetchStatus,\n isPending,\n isSuccess: status === \"success\",\n isError,\n isInitialLoading: isLoading,\n isLoading,\n data,\n dataUpdatedAt: newState.dataUpdatedAt,\n error,\n errorUpdatedAt,\n failureCount: newState.fetchFailureCount,\n failureReason: newState.fetchFailureReason,\n errorUpdateCount: newState.errorUpdateCount,\n isFetched: query.isFetched(),\n isFetchedAfterMount: newState.dataUpdateCount > queryInitialState.dataUpdateCount || newState.errorUpdateCount > queryInitialState.errorUpdateCount,\n isFetching,\n isRefetching: isFetching && !isPending,\n isLoadingError: isError && !hasData,\n isPaused: newState.fetchStatus === \"paused\",\n isPlaceholderData,\n isRefetchError: isError && hasData,\n isStale: isStale(query, options),\n refetch: this.refetch,\n promise: this.#currentThenable,\n isEnabled: resolveQueryBoolean(options.enabled, query) !== false\n };\n const nextResult = result;\n if (this.options.experimental_prefetchInRender) {\n const hasResultData = nextResult.data !== void 0;\n const isErrorWithoutData = nextResult.status === \"error\" && !hasResultData;\n const finalizeThenableIfPossible = (thenable) => {\n if (isErrorWithoutData) {\n thenable.reject(nextResult.error);\n } else if (hasResultData) {\n thenable.resolve(nextResult.data);\n }\n };\n const recreateThenable = () => {\n const pending = this.#currentThenable = nextResult.promise = pendingThenable();\n finalizeThenableIfPossible(pending);\n };\n const prevThenable = this.#currentThenable;\n switch (prevThenable.status) {\n case \"pending\":\n if (query.queryHash === prevQuery.queryHash) {\n finalizeThenableIfPossible(prevThenable);\n }\n break;\n case \"fulfilled\":\n if (isErrorWithoutData || nextResult.data !== prevThenable.value) {\n recreateThenable();\n }\n break;\n case \"rejected\":\n if (!isErrorWithoutData || nextResult.error !== prevThenable.reason) {\n recreateThenable();\n }\n break;\n }\n }\n return nextResult;\n }\n updateResult() {\n const prevResult = this.#currentResult;\n const nextResult = this.createResult(this.#currentQuery, this.options);\n this.#currentResultState = this.#currentQuery.state;\n this.#currentResultOptions = this.options;\n if (this.#currentResultState.data !== void 0) {\n this.#lastQueryWithDefinedData = this.#currentQuery;\n }\n if (shallowEqualObjects(nextResult, prevResult)) {\n return;\n }\n this.#currentResult = nextResult;\n const shouldNotifyListeners = () => {\n if (!prevResult) {\n return true;\n }\n const { notifyOnChangeProps } = this.options;\n const notifyOnChangePropsValue = typeof notifyOnChangeProps === \"function\" ? notifyOnChangeProps() : notifyOnChangeProps;\n if (notifyOnChangePropsValue === \"all\" || !notifyOnChangePropsValue && !this.#trackedProps.size) {\n return true;\n }\n const includedProps = new Set(\n notifyOnChangePropsValue ?? this.#trackedProps\n );\n if (this.options.throwOnError) {\n includedProps.add(\"error\");\n }\n return Object.keys(this.#currentResult).some((key) => {\n const typedKey = key;\n const changed = this.#currentResult[typedKey] !== prevResult[typedKey];\n return changed && includedProps.has(typedKey);\n });\n };\n this.#notify({ listeners: shouldNotifyListeners() });\n }\n #updateQuery() {\n const query = this.#client.getQueryCache().build(this.#client, this.options);\n if (query === this.#currentQuery) {\n return;\n }\n const prevQuery = this.#currentQuery;\n this.#currentQuery = query;\n this.#currentQueryInitialState = query.state;\n if (this.hasListeners()) {\n prevQuery?.removeObserver(this);\n query.addObserver(this);\n }\n }\n onQueryUpdate() {\n this.updateResult();\n if (this.hasListeners()) {\n this.#updateTimers();\n }\n }\n #notify(notifyOptions) {\n notifyManager.batch(() => {\n if (notifyOptions.listeners) {\n this.listeners.forEach((listener) => {\n listener(this.#currentResult);\n });\n }\n this.#client.getQueryCache().notify({\n query: this.#currentQuery,\n type: \"observerResultsUpdated\"\n });\n });\n }\n};\nfunction shouldLoadOnMount(query, options) {\n return resolveQueryBoolean(options.enabled, query) !== false && query.state.data === void 0 && !(query.state.status === \"error\" && resolveQueryBoolean(options.retryOnMount, query) === false);\n}\nfunction shouldFetchOnMount(query, options) {\n return shouldLoadOnMount(query, options) || query.state.data !== void 0 && shouldFetchOn(query, options, options.refetchOnMount);\n}\nfunction shouldFetchOn(query, options, field) {\n if (resolveQueryBoolean(options.enabled, query) !== false && resolveStaleTime(options.staleTime, query) !== \"static\") {\n const value = typeof field === \"function\" ? field(query) : field;\n return value === \"always\" || value !== false && isStale(query, options);\n }\n return false;\n}\nfunction shouldFetchOptionally(query, prevQuery, options, prevOptions) {\n return (query !== prevQuery || resolveQueryBoolean(prevOptions.enabled, query) === false) && (!options.suspense || query.state.status !== \"error\") && isStale(query, options);\n}\nfunction isStale(query, options) {\n return resolveQueryBoolean(options.enabled, query) !== false && query.isStaleByTime(resolveStaleTime(options.staleTime, query));\n}\nfunction shouldAssignObserverCurrentProperties(observer, optimisticResult) {\n if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {\n return true;\n }\n return false;\n}\nexport {\n QueryObserver\n};\n//# sourceMappingURL=queryObserver.js.map","\"use client\";\n\n// src/IsRestoringProvider.ts\nimport * as React from \"react\";\nvar IsRestoringContext = React.createContext(false);\nvar useIsRestoring = () => React.useContext(IsRestoringContext);\nvar IsRestoringProvider = IsRestoringContext.Provider;\nexport {\n IsRestoringProvider,\n useIsRestoring\n};\n//# sourceMappingURL=IsRestoringProvider.js.map","\"use client\";\n\n// src/QueryErrorResetBoundary.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nfunction createValue() {\n let isReset = false;\n return {\n clearReset: () => {\n isReset = false;\n },\n reset: () => {\n isReset = true;\n },\n isReset: () => {\n return isReset;\n }\n };\n}\nvar QueryErrorResetBoundaryContext = React.createContext(createValue());\nvar useQueryErrorResetBoundary = () => React.useContext(QueryErrorResetBoundaryContext);\nvar QueryErrorResetBoundary = ({\n children\n}) => {\n const [value] = React.useState(() => createValue());\n return /* @__PURE__ */ jsx(QueryErrorResetBoundaryContext.Provider, { value, children: typeof children === \"function\" ? children(value) : children });\n};\nexport {\n QueryErrorResetBoundary,\n useQueryErrorResetBoundary\n};\n//# sourceMappingURL=QueryErrorResetBoundary.js.map","\"use client\";\n\n// src/errorBoundaryUtils.ts\nimport * as React from \"react\";\nimport { shouldThrowError } from \"@tanstack/query-core\";\nvar ensurePreventErrorBoundaryRetry = (options, errorResetBoundary, query) => {\n const throwOnError = query?.state.error && typeof options.throwOnError === \"function\" ? shouldThrowError(options.throwOnError, [query.state.error, query]) : options.throwOnError;\n if (options.suspense || options.experimental_prefetchInRender || throwOnError) {\n if (!errorResetBoundary.isReset()) {\n options.retryOnMount = false;\n }\n }\n};\nvar useClearResetErrorBoundary = (errorResetBoundary) => {\n React.useEffect(() => {\n errorResetBoundary.clearReset();\n }, [errorResetBoundary]);\n};\nvar getHasError = ({\n result,\n errorResetBoundary,\n throwOnError,\n query,\n suspense\n}) => {\n return result.isError && !errorResetBoundary.isReset() && !result.isFetching && query && (suspense && result.data === void 0 || shouldThrowError(throwOnError, [result.error, query]));\n};\nexport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary\n};\n//# sourceMappingURL=errorBoundaryUtils.js.map","// src/suspense.ts\nvar defaultThrowOnError = (_error, query) => query.state.data === void 0;\nvar ensureSuspenseTimers = (defaultedOptions) => {\n if (defaultedOptions.suspense) {\n const MIN_SUSPENSE_TIME_MS = 1e3;\n const clamp = (value) => value === \"static\" ? value : Math.max(value ?? MIN_SUSPENSE_TIME_MS, MIN_SUSPENSE_TIME_MS);\n const originalStaleTime = defaultedOptions.staleTime;\n defaultedOptions.staleTime = typeof originalStaleTime === \"function\" ? (...args) => clamp(originalStaleTime(...args)) : clamp(originalStaleTime);\n if (typeof defaultedOptions.gcTime === \"number\") {\n defaultedOptions.gcTime = Math.max(\n defaultedOptions.gcTime,\n MIN_SUSPENSE_TIME_MS\n );\n }\n }\n};\nvar willFetch = (result, isRestoring) => result.isLoading && result.isFetching && !isRestoring;\nvar shouldSuspend = (defaultedOptions, result) => defaultedOptions?.suspense && result.isPending;\nvar fetchOptimistic = (defaultedOptions, observer, errorResetBoundary) => observer.fetchOptimistic(defaultedOptions).catch(() => {\n errorResetBoundary.clearReset();\n});\nexport {\n defaultThrowOnError,\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend,\n willFetch\n};\n//# sourceMappingURL=suspense.js.map","\"use client\";\n\n// src/useBaseQuery.ts\nimport * as React from \"react\";\nimport { environmentManager, noop, notifyManager } from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { useQueryErrorResetBoundary } from \"./QueryErrorResetBoundary.js\";\nimport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary\n} from \"./errorBoundaryUtils.js\";\nimport { useIsRestoring } from \"./IsRestoringProvider.js\";\nimport {\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend,\n willFetch\n} from \"./suspense.js\";\nfunction useBaseQuery(options, Observer, queryClient) {\n if (process.env.NODE_ENV !== \"production\") {\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new Error(\n 'Bad argument type. Starting with v5, only the \"Object\" form is allowed when calling query related functions. Please use the error stack to find the culprit call. More info here: https://tanstack.com/query/latest/docs/react/guides/migrating-to-v5#supports-a-single-signature-one-object'\n );\n }\n }\n const isRestoring = useIsRestoring();\n const errorResetBoundary = useQueryErrorResetBoundary();\n const client = useQueryClient(queryClient);\n const defaultedOptions = client.defaultQueryOptions(options);\n client.getDefaultOptions().queries?._experimental_beforeQuery?.(\n defaultedOptions\n );\n const query = client.getQueryCache().get(defaultedOptions.queryHash);\n if (process.env.NODE_ENV !== \"production\") {\n if (!defaultedOptions.queryFn) {\n console.error(\n `[${defaultedOptions.queryHash}]: No queryFn was passed as an option, and no default queryFn was found. The queryFn parameter is only optional when using a default queryFn. More info here: https://tanstack.com/query/latest/docs/framework/react/guides/default-query-function`\n );\n }\n }\n defaultedOptions._optimisticResults = isRestoring ? \"isRestoring\" : \"optimistic\";\n ensureSuspenseTimers(defaultedOptions);\n ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary, query);\n useClearResetErrorBoundary(errorResetBoundary);\n const isNewCacheEntry = !client.getQueryCache().get(defaultedOptions.queryHash);\n const [observer] = React.useState(\n () => new Observer(\n client,\n defaultedOptions\n )\n );\n const result = observer.getOptimisticResult(defaultedOptions);\n const shouldSubscribe = !isRestoring && options.subscribed !== false;\n React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => {\n const unsubscribe = shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop;\n observer.updateResult();\n return unsubscribe;\n },\n [observer, shouldSubscribe]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n React.useEffect(() => {\n observer.setOptions(defaultedOptions);\n }, [defaultedOptions, observer]);\n if (shouldSuspend(defaultedOptions, result)) {\n throw fetchOptimistic(defaultedOptions, observer, errorResetBoundary);\n }\n if (getHasError({\n result,\n errorResetBoundary,\n throwOnError: defaultedOptions.throwOnError,\n query,\n suspense: defaultedOptions.suspense\n })) {\n throw result.error;\n }\n ;\n client.getDefaultOptions().queries?._experimental_afterQuery?.(\n defaultedOptions,\n result\n );\n if (defaultedOptions.experimental_prefetchInRender && !environmentManager.isServer() && willFetch(result, isRestoring)) {\n const promise = isNewCacheEntry ? (\n // Fetch immediately on render in order to ensure `.promise` is resolved even if the component is unmounted\n fetchOptimistic(defaultedOptions, observer, errorResetBoundary)\n ) : (\n // subscribe to the \"cache promise\" so that we can finalize the currentThenable once data comes in\n query?.promise\n );\n promise?.catch(noop).finally(() => {\n observer.updateResult();\n });\n }\n return !defaultedOptions.notifyOnChangeProps ? observer.trackResult(result) : result;\n}\nexport {\n useBaseQuery\n};\n//# sourceMappingURL=useBaseQuery.js.map","\"use client\";\n\n// src/useQuery.ts\nimport { QueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useQuery(options, queryClient) {\n return useBaseQuery(options, QueryObserver, queryClient);\n}\nexport {\n useQuery\n};\n//# sourceMappingURL=useQuery.js.map"],"names":["QueryObserver","Subscribable","client","options","#client","#selectError","#currentThenable","pendingThenable","#currentQuery","#currentQueryInitialState","#currentResult","#currentResultState","#currentResultOptions","#selectFn","#selectResult","#lastQueryWithDefinedData","#staleTimeoutId","#refetchIntervalId","#currentRefetchInterval","#trackedProps","shouldFetchOnMount","#executeFetch","#updateTimers","shouldFetchOn","#clearStaleTimeout","#clearRefetchInterval","prevOptions","prevQuery","resolveQueryBoolean","#updateQuery","shallowEqualObjects","mounted","shouldFetchOptionally","resolveStaleTime","#updateStaleTimeout","nextRefetchInterval","#computeRefetchInterval","#updateRefetchInterval","query","result","shouldAssignObserverCurrentProperties","onPropTracked","target","key","defaultedOptions","fetchOptions","promise","noop","staleTime","environmentManager","isValidTimeout","timeout","timeUntilStale","timeoutManager","nextInterval","focusManager","prevResult","prevResultState","prevResultOptions","queryInitialState","state","newState","isPlaceholderData","data","fetchOnMount","fetchOptionally","fetchState","error","errorUpdatedAt","status","skipSelect","placeholderData","replaceData","selectError","isFetching","isPending","isError","isLoading","hasData","nextResult","isStale","hasResultData","isErrorWithoutData","finalizeThenableIfPossible","thenable","recreateThenable","pending","prevThenable","shouldNotifyListeners","notifyOnChangeProps","notifyOnChangePropsValue","includedProps","typedKey","#notify","notifyOptions","notifyManager","listener","shouldLoadOnMount","field","value","observer","optimisticResult","IsRestoringContext","React.createContext","useIsRestoring","React.useContext","createValue","isReset","QueryErrorResetBoundaryContext","useQueryErrorResetBoundary","ensurePreventErrorBoundaryRetry","errorResetBoundary","throwOnError","shouldThrowError","useClearResetErrorBoundary","React.useEffect","getHasError","suspense","ensureSuspenseTimers","clamp","originalStaleTime","args","willFetch","isRestoring","shouldSuspend","fetchOptimistic","useBaseQuery","Observer","queryClient","useQueryClient","isNewCacheEntry","React.useState","shouldSubscribe","React.useSyncExternalStore","React.useCallback","onStoreChange","unsubscribe","useQuery"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}
|
|
1
|
+
{"version":3,"file":"useQuery-DmoWKLw3.js","sources":["../../node_modules/@tanstack/query-core/build/modern/queryObserver.js","../../node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.js","../../node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.js","../../node_modules/@tanstack/react-query/build/modern/errorBoundaryUtils.js","../../node_modules/@tanstack/react-query/build/modern/suspense.js","../../node_modules/@tanstack/react-query/build/modern/useBaseQuery.js","../../node_modules/@tanstack/react-query/build/modern/useQuery.js"],"sourcesContent":["// src/queryObserver.ts\nimport { focusManager } from \"./focusManager.js\";\nimport { environmentManager } from \"./environmentManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { fetchState } from \"./query.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { pendingThenable } from \"./thenable.js\";\nimport {\n isValidTimeout,\n noop,\n replaceData,\n resolveQueryBoolean,\n resolveStaleTime,\n shallowEqualObjects,\n timeUntilStale\n} from \"./utils.js\";\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar QueryObserver = class extends Subscribable {\n constructor(client, options) {\n super();\n this.options = options;\n this.#client = client;\n this.#selectError = null;\n this.#currentThenable = pendingThenable();\n this.bindMethods();\n this.setOptions(options);\n }\n #client;\n #currentQuery = void 0;\n #currentQueryInitialState = void 0;\n #currentResult = void 0;\n #currentResultState;\n #currentResultOptions;\n #currentThenable;\n #selectError;\n #selectFn;\n #selectResult;\n // This property keeps track of the last query with defined data.\n // It will be used to pass the previous data and query to the placeholder function between renders.\n #lastQueryWithDefinedData;\n #staleTimeoutId;\n #refetchIntervalId;\n #currentRefetchInterval;\n #trackedProps = /* @__PURE__ */ new Set();\n bindMethods() {\n this.refetch = this.refetch.bind(this);\n }\n onSubscribe() {\n if (this.listeners.size === 1) {\n this.#currentQuery.addObserver(this);\n if (shouldFetchOnMount(this.#currentQuery, this.options)) {\n this.#executeFetch();\n } else {\n this.updateResult();\n }\n this.#updateTimers();\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.destroy();\n }\n }\n shouldFetchOnReconnect() {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnReconnect\n );\n }\n shouldFetchOnWindowFocus() {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnWindowFocus\n );\n }\n destroy() {\n this.listeners = /* @__PURE__ */ new Set();\n this.#clearStaleTimeout();\n this.#clearRefetchInterval();\n this.#currentQuery.removeObserver(this);\n }\n setOptions(options) {\n const prevOptions = this.options;\n const prevQuery = this.#currentQuery;\n this.options = this.#client.defaultQueryOptions(options);\n if (this.options.enabled !== void 0 && typeof this.options.enabled !== \"boolean\" && typeof this.options.enabled !== \"function\" && typeof resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== \"boolean\") {\n throw new Error(\n \"Expected enabled to be a boolean or a callback that returns a boolean\"\n );\n }\n this.#updateQuery();\n this.#currentQuery.setOptions(this.options);\n if (prevOptions._defaulted && !shallowEqualObjects(this.options, prevOptions)) {\n this.#client.getQueryCache().notify({\n type: \"observerOptionsUpdated\",\n query: this.#currentQuery,\n observer: this\n });\n }\n const mounted = this.hasListeners();\n if (mounted && shouldFetchOptionally(\n this.#currentQuery,\n prevQuery,\n this.options,\n prevOptions\n )) {\n this.#executeFetch();\n }\n this.updateResult();\n if (mounted && (this.#currentQuery !== prevQuery || resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== resolveQueryBoolean(prevOptions.enabled, this.#currentQuery) || resolveStaleTime(this.options.staleTime, this.#currentQuery) !== resolveStaleTime(prevOptions.staleTime, this.#currentQuery))) {\n this.#updateStaleTimeout();\n }\n const nextRefetchInterval = this.#computeRefetchInterval();\n if (mounted && (this.#currentQuery !== prevQuery || resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== resolveQueryBoolean(prevOptions.enabled, this.#currentQuery) || nextRefetchInterval !== this.#currentRefetchInterval)) {\n this.#updateRefetchInterval(nextRefetchInterval);\n }\n }\n getOptimisticResult(options) {\n const query = this.#client.getQueryCache().build(this.#client, options);\n const result = this.createResult(query, options);\n if (shouldAssignObserverCurrentProperties(this, result)) {\n this.#currentResult = result;\n this.#currentResultOptions = this.options;\n this.#currentResultState = this.#currentQuery.state;\n }\n return result;\n }\n getCurrentResult() {\n return this.#currentResult;\n }\n trackResult(result, onPropTracked) {\n return new Proxy(result, {\n get: (target, key) => {\n this.trackProp(key);\n onPropTracked?.(key);\n if (key === \"promise\") {\n this.trackProp(\"data\");\n if (!this.options.experimental_prefetchInRender && this.#currentThenable.status === \"pending\") {\n this.#currentThenable.reject(\n new Error(\n \"experimental_prefetchInRender feature flag is not enabled\"\n )\n );\n }\n }\n return Reflect.get(target, key);\n }\n });\n }\n trackProp(key) {\n this.#trackedProps.add(key);\n }\n getCurrentQuery() {\n return this.#currentQuery;\n }\n refetch({ ...options } = {}) {\n return this.fetch({\n ...options\n });\n }\n fetchOptimistic(options) {\n const defaultedOptions = this.#client.defaultQueryOptions(options);\n const query = this.#client.getQueryCache().build(this.#client, defaultedOptions);\n return query.fetch().then(() => this.createResult(query, defaultedOptions));\n }\n fetch(fetchOptions) {\n return this.#executeFetch({\n ...fetchOptions,\n cancelRefetch: fetchOptions.cancelRefetch ?? true\n }).then(() => {\n this.updateResult();\n return this.#currentResult;\n });\n }\n #executeFetch(fetchOptions) {\n this.#updateQuery();\n let promise = this.#currentQuery.fetch(\n this.options,\n fetchOptions\n );\n if (!fetchOptions?.throwOnError) {\n promise = promise.catch(noop);\n }\n return promise;\n }\n #updateStaleTimeout() {\n this.#clearStaleTimeout();\n const staleTime = resolveStaleTime(\n this.options.staleTime,\n this.#currentQuery\n );\n if (environmentManager.isServer() || this.#currentResult.isStale || !isValidTimeout(staleTime)) {\n return;\n }\n const time = timeUntilStale(this.#currentResult.dataUpdatedAt, staleTime);\n const timeout = time + 1;\n this.#staleTimeoutId = timeoutManager.setTimeout(() => {\n if (!this.#currentResult.isStale) {\n this.updateResult();\n }\n }, timeout);\n }\n #computeRefetchInterval() {\n return (typeof this.options.refetchInterval === \"function\" ? this.options.refetchInterval(this.#currentQuery) : this.options.refetchInterval) ?? false;\n }\n #updateRefetchInterval(nextInterval) {\n this.#clearRefetchInterval();\n this.#currentRefetchInterval = nextInterval;\n if (environmentManager.isServer() || resolveQueryBoolean(this.options.enabled, this.#currentQuery) === false || !isValidTimeout(this.#currentRefetchInterval) || this.#currentRefetchInterval === 0) {\n return;\n }\n this.#refetchIntervalId = timeoutManager.setInterval(() => {\n if (this.options.refetchIntervalInBackground || focusManager.isFocused()) {\n this.#executeFetch();\n }\n }, this.#currentRefetchInterval);\n }\n #updateTimers() {\n this.#updateStaleTimeout();\n this.#updateRefetchInterval(this.#computeRefetchInterval());\n }\n #clearStaleTimeout() {\n if (this.#staleTimeoutId !== void 0) {\n timeoutManager.clearTimeout(this.#staleTimeoutId);\n this.#staleTimeoutId = void 0;\n }\n }\n #clearRefetchInterval() {\n if (this.#refetchIntervalId !== void 0) {\n timeoutManager.clearInterval(this.#refetchIntervalId);\n this.#refetchIntervalId = void 0;\n }\n }\n createResult(query, options) {\n const prevQuery = this.#currentQuery;\n const prevOptions = this.options;\n const prevResult = this.#currentResult;\n const prevResultState = this.#currentResultState;\n const prevResultOptions = this.#currentResultOptions;\n const queryChange = query !== prevQuery;\n const queryInitialState = queryChange ? query.state : this.#currentQueryInitialState;\n const { state } = query;\n let newState = { ...state };\n let isPlaceholderData = false;\n let data;\n if (options._optimisticResults) {\n const mounted = this.hasListeners();\n const fetchOnMount = !mounted && shouldFetchOnMount(query, options);\n const fetchOptionally = mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions);\n if (fetchOnMount || fetchOptionally) {\n newState = {\n ...newState,\n ...fetchState(state.data, query.options)\n };\n }\n if (options._optimisticResults === \"isRestoring\") {\n newState.fetchStatus = \"idle\";\n }\n }\n let { error, errorUpdatedAt, status } = newState;\n data = newState.data;\n let skipSelect = false;\n if (options.placeholderData !== void 0 && data === void 0 && status === \"pending\") {\n let placeholderData;\n if (prevResult?.isPlaceholderData && options.placeholderData === prevResultOptions?.placeholderData) {\n placeholderData = prevResult.data;\n skipSelect = true;\n } else {\n placeholderData = typeof options.placeholderData === \"function\" ? options.placeholderData(\n this.#lastQueryWithDefinedData?.state.data,\n this.#lastQueryWithDefinedData\n ) : options.placeholderData;\n }\n if (placeholderData !== void 0) {\n status = \"success\";\n data = replaceData(\n prevResult?.data,\n placeholderData,\n options\n );\n isPlaceholderData = true;\n }\n }\n if (options.select && data !== void 0 && !skipSelect) {\n if (prevResult && data === prevResultState?.data && options.select === this.#selectFn) {\n data = this.#selectResult;\n } else {\n try {\n this.#selectFn = options.select;\n data = options.select(data);\n data = replaceData(prevResult?.data, data, options);\n this.#selectResult = data;\n this.#selectError = null;\n } catch (selectError) {\n this.#selectError = selectError;\n }\n }\n }\n if (this.#selectError) {\n error = this.#selectError;\n data = this.#selectResult;\n errorUpdatedAt = Date.now();\n status = \"error\";\n }\n const isFetching = newState.fetchStatus === \"fetching\";\n const isPending = status === \"pending\";\n const isError = status === \"error\";\n const isLoading = isPending && isFetching;\n const hasData = data !== void 0;\n const result = {\n status,\n fetchStatus: newState.fetchStatus,\n isPending,\n isSuccess: status === \"success\",\n isError,\n isInitialLoading: isLoading,\n isLoading,\n data,\n dataUpdatedAt: newState.dataUpdatedAt,\n error,\n errorUpdatedAt,\n failureCount: newState.fetchFailureCount,\n failureReason: newState.fetchFailureReason,\n errorUpdateCount: newState.errorUpdateCount,\n isFetched: query.isFetched(),\n isFetchedAfterMount: newState.dataUpdateCount > queryInitialState.dataUpdateCount || newState.errorUpdateCount > queryInitialState.errorUpdateCount,\n isFetching,\n isRefetching: isFetching && !isPending,\n isLoadingError: isError && !hasData,\n isPaused: newState.fetchStatus === \"paused\",\n isPlaceholderData,\n isRefetchError: isError && hasData,\n isStale: isStale(query, options),\n refetch: this.refetch,\n promise: this.#currentThenable,\n isEnabled: resolveQueryBoolean(options.enabled, query) !== false\n };\n const nextResult = result;\n if (this.options.experimental_prefetchInRender) {\n const hasResultData = nextResult.data !== void 0;\n const isErrorWithoutData = nextResult.status === \"error\" && !hasResultData;\n const finalizeThenableIfPossible = (thenable) => {\n if (isErrorWithoutData) {\n thenable.reject(nextResult.error);\n } else if (hasResultData) {\n thenable.resolve(nextResult.data);\n }\n };\n const recreateThenable = () => {\n const pending = this.#currentThenable = nextResult.promise = pendingThenable();\n finalizeThenableIfPossible(pending);\n };\n const prevThenable = this.#currentThenable;\n switch (prevThenable.status) {\n case \"pending\":\n if (query.queryHash === prevQuery.queryHash) {\n finalizeThenableIfPossible(prevThenable);\n }\n break;\n case \"fulfilled\":\n if (isErrorWithoutData || nextResult.data !== prevThenable.value) {\n recreateThenable();\n }\n break;\n case \"rejected\":\n if (!isErrorWithoutData || nextResult.error !== prevThenable.reason) {\n recreateThenable();\n }\n break;\n }\n }\n return nextResult;\n }\n updateResult() {\n const prevResult = this.#currentResult;\n const nextResult = this.createResult(this.#currentQuery, this.options);\n this.#currentResultState = this.#currentQuery.state;\n this.#currentResultOptions = this.options;\n if (this.#currentResultState.data !== void 0) {\n this.#lastQueryWithDefinedData = this.#currentQuery;\n }\n if (shallowEqualObjects(nextResult, prevResult)) {\n return;\n }\n this.#currentResult = nextResult;\n const shouldNotifyListeners = () => {\n if (!prevResult) {\n return true;\n }\n const { notifyOnChangeProps } = this.options;\n const notifyOnChangePropsValue = typeof notifyOnChangeProps === \"function\" ? notifyOnChangeProps() : notifyOnChangeProps;\n if (notifyOnChangePropsValue === \"all\" || !notifyOnChangePropsValue && !this.#trackedProps.size) {\n return true;\n }\n const includedProps = new Set(\n notifyOnChangePropsValue ?? this.#trackedProps\n );\n if (this.options.throwOnError) {\n includedProps.add(\"error\");\n }\n return Object.keys(this.#currentResult).some((key) => {\n const typedKey = key;\n const changed = this.#currentResult[typedKey] !== prevResult[typedKey];\n return changed && includedProps.has(typedKey);\n });\n };\n this.#notify({ listeners: shouldNotifyListeners() });\n }\n #updateQuery() {\n const query = this.#client.getQueryCache().build(this.#client, this.options);\n if (query === this.#currentQuery) {\n return;\n }\n const prevQuery = this.#currentQuery;\n this.#currentQuery = query;\n this.#currentQueryInitialState = query.state;\n if (this.hasListeners()) {\n prevQuery?.removeObserver(this);\n query.addObserver(this);\n }\n }\n onQueryUpdate() {\n this.updateResult();\n if (this.hasListeners()) {\n this.#updateTimers();\n }\n }\n #notify(notifyOptions) {\n notifyManager.batch(() => {\n if (notifyOptions.listeners) {\n this.listeners.forEach((listener) => {\n listener(this.#currentResult);\n });\n }\n this.#client.getQueryCache().notify({\n query: this.#currentQuery,\n type: \"observerResultsUpdated\"\n });\n });\n }\n};\nfunction shouldLoadOnMount(query, options) {\n return resolveQueryBoolean(options.enabled, query) !== false && query.state.data === void 0 && !(query.state.status === \"error\" && resolveQueryBoolean(options.retryOnMount, query) === false);\n}\nfunction shouldFetchOnMount(query, options) {\n return shouldLoadOnMount(query, options) || query.state.data !== void 0 && shouldFetchOn(query, options, options.refetchOnMount);\n}\nfunction shouldFetchOn(query, options, field) {\n if (resolveQueryBoolean(options.enabled, query) !== false && resolveStaleTime(options.staleTime, query) !== \"static\") {\n const value = typeof field === \"function\" ? field(query) : field;\n return value === \"always\" || value !== false && isStale(query, options);\n }\n return false;\n}\nfunction shouldFetchOptionally(query, prevQuery, options, prevOptions) {\n return (query !== prevQuery || resolveQueryBoolean(prevOptions.enabled, query) === false) && (!options.suspense || query.state.status !== \"error\") && isStale(query, options);\n}\nfunction isStale(query, options) {\n return resolveQueryBoolean(options.enabled, query) !== false && query.isStaleByTime(resolveStaleTime(options.staleTime, query));\n}\nfunction shouldAssignObserverCurrentProperties(observer, optimisticResult) {\n if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {\n return true;\n }\n return false;\n}\nexport {\n QueryObserver\n};\n//# sourceMappingURL=queryObserver.js.map","\"use client\";\n\n// src/IsRestoringProvider.ts\nimport * as React from \"react\";\nvar IsRestoringContext = React.createContext(false);\nvar useIsRestoring = () => React.useContext(IsRestoringContext);\nvar IsRestoringProvider = IsRestoringContext.Provider;\nexport {\n IsRestoringProvider,\n useIsRestoring\n};\n//# sourceMappingURL=IsRestoringProvider.js.map","\"use client\";\n\n// src/QueryErrorResetBoundary.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nfunction createValue() {\n let isReset = false;\n return {\n clearReset: () => {\n isReset = false;\n },\n reset: () => {\n isReset = true;\n },\n isReset: () => {\n return isReset;\n }\n };\n}\nvar QueryErrorResetBoundaryContext = React.createContext(createValue());\nvar useQueryErrorResetBoundary = () => React.useContext(QueryErrorResetBoundaryContext);\nvar QueryErrorResetBoundary = ({\n children\n}) => {\n const [value] = React.useState(() => createValue());\n return /* @__PURE__ */ jsx(QueryErrorResetBoundaryContext.Provider, { value, children: typeof children === \"function\" ? children(value) : children });\n};\nexport {\n QueryErrorResetBoundary,\n useQueryErrorResetBoundary\n};\n//# sourceMappingURL=QueryErrorResetBoundary.js.map","\"use client\";\n\n// src/errorBoundaryUtils.ts\nimport * as React from \"react\";\nimport { shouldThrowError } from \"@tanstack/query-core\";\nvar ensurePreventErrorBoundaryRetry = (options, errorResetBoundary, query) => {\n const throwOnError = query?.state.error && typeof options.throwOnError === \"function\" ? shouldThrowError(options.throwOnError, [query.state.error, query]) : options.throwOnError;\n if (options.suspense || options.experimental_prefetchInRender || throwOnError) {\n if (!errorResetBoundary.isReset()) {\n options.retryOnMount = false;\n }\n }\n};\nvar useClearResetErrorBoundary = (errorResetBoundary) => {\n React.useEffect(() => {\n errorResetBoundary.clearReset();\n }, [errorResetBoundary]);\n};\nvar getHasError = ({\n result,\n errorResetBoundary,\n throwOnError,\n query,\n suspense\n}) => {\n return result.isError && !errorResetBoundary.isReset() && !result.isFetching && query && (suspense && result.data === void 0 || shouldThrowError(throwOnError, [result.error, query]));\n};\nexport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary\n};\n//# sourceMappingURL=errorBoundaryUtils.js.map","// src/suspense.ts\nvar defaultThrowOnError = (_error, query) => query.state.data === void 0;\nvar ensureSuspenseTimers = (defaultedOptions) => {\n if (defaultedOptions.suspense) {\n const MIN_SUSPENSE_TIME_MS = 1e3;\n const clamp = (value) => value === \"static\" ? value : Math.max(value ?? MIN_SUSPENSE_TIME_MS, MIN_SUSPENSE_TIME_MS);\n const originalStaleTime = defaultedOptions.staleTime;\n defaultedOptions.staleTime = typeof originalStaleTime === \"function\" ? (...args) => clamp(originalStaleTime(...args)) : clamp(originalStaleTime);\n if (typeof defaultedOptions.gcTime === \"number\") {\n defaultedOptions.gcTime = Math.max(\n defaultedOptions.gcTime,\n MIN_SUSPENSE_TIME_MS\n );\n }\n }\n};\nvar willFetch = (result, isRestoring) => result.isLoading && result.isFetching && !isRestoring;\nvar shouldSuspend = (defaultedOptions, result) => defaultedOptions?.suspense && result.isPending;\nvar fetchOptimistic = (defaultedOptions, observer, errorResetBoundary) => observer.fetchOptimistic(defaultedOptions).catch(() => {\n errorResetBoundary.clearReset();\n});\nexport {\n defaultThrowOnError,\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend,\n willFetch\n};\n//# sourceMappingURL=suspense.js.map","\"use client\";\n\n// src/useBaseQuery.ts\nimport * as React from \"react\";\nimport { environmentManager, noop, notifyManager } from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { useQueryErrorResetBoundary } from \"./QueryErrorResetBoundary.js\";\nimport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary\n} from \"./errorBoundaryUtils.js\";\nimport { useIsRestoring } from \"./IsRestoringProvider.js\";\nimport {\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend,\n willFetch\n} from \"./suspense.js\";\nfunction useBaseQuery(options, Observer, queryClient) {\n if (process.env.NODE_ENV !== \"production\") {\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new Error(\n 'Bad argument type. Starting with v5, only the \"Object\" form is allowed when calling query related functions. Please use the error stack to find the culprit call. More info here: https://tanstack.com/query/latest/docs/react/guides/migrating-to-v5#supports-a-single-signature-one-object'\n );\n }\n }\n const isRestoring = useIsRestoring();\n const errorResetBoundary = useQueryErrorResetBoundary();\n const client = useQueryClient(queryClient);\n const defaultedOptions = client.defaultQueryOptions(options);\n client.getDefaultOptions().queries?._experimental_beforeQuery?.(\n defaultedOptions\n );\n const query = client.getQueryCache().get(defaultedOptions.queryHash);\n if (process.env.NODE_ENV !== \"production\") {\n if (!defaultedOptions.queryFn) {\n console.error(\n `[${defaultedOptions.queryHash}]: No queryFn was passed as an option, and no default queryFn was found. The queryFn parameter is only optional when using a default queryFn. More info here: https://tanstack.com/query/latest/docs/framework/react/guides/default-query-function`\n );\n }\n }\n const subscribed = options.subscribed !== false;\n defaultedOptions._optimisticResults = isRestoring ? \"isRestoring\" : subscribed ? \"optimistic\" : void 0;\n ensureSuspenseTimers(defaultedOptions);\n ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary, query);\n useClearResetErrorBoundary(errorResetBoundary);\n const isNewCacheEntry = !client.getQueryCache().get(defaultedOptions.queryHash);\n const [observer] = React.useState(\n () => new Observer(\n client,\n defaultedOptions\n )\n );\n const result = observer.getOptimisticResult(defaultedOptions);\n const shouldSubscribe = !isRestoring && subscribed;\n React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => {\n const unsubscribe = shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop;\n observer.updateResult();\n return unsubscribe;\n },\n [observer, shouldSubscribe]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n React.useEffect(() => {\n observer.setOptions(defaultedOptions);\n }, [defaultedOptions, observer]);\n if (shouldSuspend(defaultedOptions, result)) {\n throw fetchOptimistic(defaultedOptions, observer, errorResetBoundary);\n }\n if (getHasError({\n result,\n errorResetBoundary,\n throwOnError: defaultedOptions.throwOnError,\n query,\n suspense: defaultedOptions.suspense\n })) {\n throw result.error;\n }\n ;\n client.getDefaultOptions().queries?._experimental_afterQuery?.(\n defaultedOptions,\n result\n );\n if (defaultedOptions.experimental_prefetchInRender && !environmentManager.isServer() && willFetch(result, isRestoring)) {\n const promise = isNewCacheEntry ? (\n // Fetch immediately on render in order to ensure `.promise` is resolved even if the component is unmounted\n fetchOptimistic(defaultedOptions, observer, errorResetBoundary)\n ) : (\n // subscribe to the \"cache promise\" so that we can finalize the currentThenable once data comes in\n query?.promise\n );\n promise?.catch(noop).finally(() => {\n observer.updateResult();\n });\n }\n return !defaultedOptions.notifyOnChangeProps ? observer.trackResult(result) : result;\n}\nexport {\n useBaseQuery\n};\n//# sourceMappingURL=useBaseQuery.js.map","\"use client\";\n\n// src/useQuery.ts\nimport { QueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useQuery(options, queryClient) {\n return useBaseQuery(options, QueryObserver, queryClient);\n}\nexport {\n useQuery\n};\n//# sourceMappingURL=useQuery.js.map"],"names":["QueryObserver","Subscribable","client","options","#client","#selectError","#currentThenable","pendingThenable","#currentQuery","#currentQueryInitialState","#currentResult","#currentResultState","#currentResultOptions","#selectFn","#selectResult","#lastQueryWithDefinedData","#staleTimeoutId","#refetchIntervalId","#currentRefetchInterval","#trackedProps","shouldFetchOnMount","#executeFetch","#updateTimers","shouldFetchOn","#clearStaleTimeout","#clearRefetchInterval","prevOptions","prevQuery","resolveQueryBoolean","#updateQuery","shallowEqualObjects","mounted","shouldFetchOptionally","resolveStaleTime","#updateStaleTimeout","nextRefetchInterval","#computeRefetchInterval","#updateRefetchInterval","query","result","shouldAssignObserverCurrentProperties","onPropTracked","target","key","defaultedOptions","fetchOptions","promise","noop","staleTime","environmentManager","isValidTimeout","timeout","timeUntilStale","timeoutManager","nextInterval","focusManager","prevResult","prevResultState","prevResultOptions","queryInitialState","state","newState","isPlaceholderData","data","fetchOnMount","fetchOptionally","fetchState","error","errorUpdatedAt","status","skipSelect","placeholderData","replaceData","selectError","isFetching","isPending","isError","isLoading","hasData","nextResult","isStale","hasResultData","isErrorWithoutData","finalizeThenableIfPossible","thenable","recreateThenable","pending","prevThenable","shouldNotifyListeners","notifyOnChangeProps","notifyOnChangePropsValue","includedProps","typedKey","#notify","notifyOptions","notifyManager","listener","shouldLoadOnMount","field","value","observer","optimisticResult","IsRestoringContext","React.createContext","useIsRestoring","React.useContext","createValue","isReset","QueryErrorResetBoundaryContext","useQueryErrorResetBoundary","ensurePreventErrorBoundaryRetry","errorResetBoundary","throwOnError","shouldThrowError","useClearResetErrorBoundary","React.useEffect","getHasError","suspense","ensureSuspenseTimers","clamp","originalStaleTime","args","willFetch","isRestoring","shouldSuspend","fetchOptimistic","useBaseQuery","Observer","queryClient","useQueryClient","subscribed","isNewCacheEntry","React.useState","shouldSubscribe","React.useSyncExternalStore","React.useCallback","onStoreChange","unsubscribe","useQuery"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a9 as R,q as O,aa as K,ac as V,Q 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,a2 as i,z as j,L as Z,ab as J,r as Y}from"./index-C4hk1i67.js";import{e as v}from"./react-C9F3QeMB.js";import{d as $,n as ee}from"./use-settings-DFB_c2pr.js";import{u as te}from"./useQuery-rLmHxFp4.js";import{m as se}from"./use-memory-jxZdt-RL.js";import{L as N}from"./loader-circle-BiR4Xs-3.js";import{S as ae}from"./save-1aALBaZc.js";import{a as re,E as oe}from"./eye-BvWcd0pJ.js";import{C as ne}from"./confirm-dialog-CCfCf6BG.js";import{E as ie}from"./empty-state-DZJTUlvz.js";import{C as z}from"./circle-x-DtePUX5x.js";import{R as ce}from"./refresh-ccw-D8mc4hxU.js";import{P}from"./play-DMgMpe7N.js";import{D as le}from"./download-CiTB2sCh.js";import{T as de}from"./trash-2-CqpMjbu5.js";import{C as me}from"./circle-check-big-EKe3o9y1.js";import"./dialog-By4YA8bm.js";import"./x-D1re-vBd.js";const F={all:["memory","vector"],status:t=>["memory","vector","status",t??null]};function ue(t={}){return te({queryKey:F.status(t.user_key),queryFn:()=>O.getMemoryVectorStatus(t),refetchInterval:3e3,refetchIntervalInBackground:!1})}function L(t){return()=>{t.invalidateQueries({queryKey:F.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(z,{}),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(z,{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-
|
|
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-BY1vfCja.js";import{e as v}from"./react-C9F3QeMB.js";import{d as $,n as ee}from"./use-settings-D4EdDLiK.js";import{u as te}from"./useQuery-DmoWKLw3.js";import{m as se}from"./use-memory-B_RQWQyG.js";import{L as N}from"./loader-circle-pGNYdPoE.js";import{S as ae}from"./save-DAFuApnY.js";import{a as re,E as oe}from"./eye-Ch0DLviZ.js";import{C as ne}from"./confirm-dialog-CmHeZ7ei.js";import{E as ie}from"./empty-state-B1S_EYNJ.js";import{C as F}from"./circle-x-BxZ24SVG.js";import{R as ce}from"./refresh-ccw-BlXMN3UX.js";import{P}from"./play-B7o6cJ8W.js";import{D as le}from"./download-DBS0ZPTh.js";import{T as de}from"./trash-2-i4F_Rzh3.js";import{C as me}from"./circle-check-big-9NpJLA1Z.js";import"./dialog-D8QAkLhI.js";import"./x-5Z_de5zo.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-By-cheMu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vector-D9UqmLi6.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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"}
|
|
1
|
+
{"version":3,"file":"vector-By-cheMu.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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"}
|