@agentunion/kite 1.5.0 → 1.6.0
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/.claude/skills/kite/checklists/feature-checklist.md +496 -0
- package/.claude/skills/kite/references/event-patterns.md +180 -0
- package/.claude/skills/kite/references/health-check.md +202 -0
- package/.claude/skills/kite/references/http-service.md +199 -0
- package/.claude/skills/kite/references/module-md-spec.md +172 -0
- package/.claude/skills/kite/references/multi-connection.md +147 -0
- package/.claude/skills/kite/references/rpc-patterns.md +199 -0
- package/.claude/skills/kite/references/shutdown-sequence.md +146 -0
- package/.claude/skills/kite/references/stdin-protocol.md +147 -0
- package/.claude/skills/kite/references/test-center-integration.md +178 -0
- package/.claude/skills/kite/references/ws-lifecycle.md +301 -0
- package/.claude/skills/kite/skill.md +272 -0
- package/.claude/skills/kite/templates/go/README.md +20 -0
- package/.claude/skills/kite/templates/node/entry.js +134 -0
- package/.claude/skills/kite/templates/node/module.md +16 -0
- package/.claude/skills/kite/templates/node/server.js +351 -0
- package/.claude/skills/kite/templates/node/server_http.js +90 -0
- package/.claude/skills/kite/templates/python/entry.py +425 -0
- package/.claude/skills/kite/templates/python/module.md +26 -0
- package/.claude/skills/kite/templates/python/server.py +447 -0
- package/.claude/skills/kite/templates/python/server_http.py +433 -0
- package/cli.js +38 -4
- package/core/env_checker.py +96 -0
- package/docs/05-/347/237/255/344/277/241/350/256/244/350/257/201/344/270/216/347/224/250/346/210/267/344/277/241/346/201/257/346/216/245/345/217/243/346/226/207/346/241/243.md +507 -0
- package/docs/ACP/345/215/217/350/256/256/345/205/274/345/256/271/346/226/271/346/241/210.md +138 -0
- package/docs/CI/344/270/216AI/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/346/226/271/346/241/210.md +75 -0
- package/docs/CLI/345/274/200/345/217/221/350/256/241/345/210/222.md +595 -0
- package/docs/ClaudeCode/350/277/234/347/250/213/345/215/217/344/275/234/347/263/273/347/273/237-/346/212/200/346/234/257/350/257/204/344/274/260.md +535 -0
- package/docs/ClaudeCode/350/277/234/347/250/213/345/215/217/344/275/234/347/263/273/347/273/237/350/256/276/350/256/241.md +631 -0
- package/docs/Evol-App/344/275/277/347/224/250KernelClient/346/224/271/351/200/240/345/256/214/346/210/220.md +342 -0
- package/docs/Evol/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/346/246/202/350/246/201.md +604 -0
- package/docs/Evol/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/350/256/276/350/256/241.md +1708 -0
- package/docs/Evol/346/250/241/345/235/227/350/256/276/350/256/241/346/226/271/346/241/210.md +1154 -0
- package/docs/Evol/351/241/265/351/235/242/346/217/222/344/273/266/345/214/226-Evol/346/250/241/345/235/227/345/256/236/346/226/275/346/214/207/345/215/227.md +403 -0
- package/docs/Evol/351/241/265/351/235/242/346/217/222/344/273/266/345/214/226-/345/244/226/351/203/250/346/250/241/345/235/227/346/216/245/345/205/245/346/214/207/345/215/227.md +468 -0
- package/docs/HTTP-RPC/350/277/201/347/247/273/345/210/260WebSocket/350/256/241/345/210/222.md +318 -0
- package/docs/INDEX.md +388 -0
- package/docs/KITE_DOCS_GUIDE.md +33 -0
- package/docs/Kernel-Client-Kite-Token/346/224/257/346/214/201/345/256/236/346/226/275/345/256/214/346/210/220.md +330 -0
- package/docs/Kernel/344/270/273/345/212/250Ping/346/234/272/345/210/266-/346/255/243/347/241/256/345/256/236/347/216/260.md +235 -0
- package/docs/Kernel/344/270/273/345/212/250Ping/346/234/272/345/210/266/345/256/236/346/226/275/346/200/273/347/273/223.md +204 -0
- package/docs/Kite/345/256/211/350/243/205/351/227/256/351/242/230/350/247/243/345/206/263/346/226/271/346/241/210.md +362 -0
- package/docs/Kite/346/216/247/345/210/266/345/217/260/346/217/222/344/273/266/345/214/226/346/236/266/346/236/204/350/256/276/350/256/241-/347/273/210/346/236/201/347/233/256/346/240/207.md +721 -0
- package/docs/Kite/346/216/247/345/210/266/345/217/260/347/273/237/344/270/200WebSocket/346/224/271/351/200/240/346/226/271/346/241/210.md +821 -0
- package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/01-/346/241/206/346/236/266/345/256/232/344/275/215.md +12 -0
- package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/02-/346/240/270/345/277/203/346/246/202/345/277/265.md +341 -0
- package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/03-/347/263/273/347/273/237/346/236/266/346/236/204.md +257 -0
- package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/04-/346/250/241/345/235/227/350/247/204/350/214/203.md +263 -0
- package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/05-/346/240/270/345/277/203/346/265/201/347/250/213-/346/226/260/347/211/210.md +267 -0
- package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/05-/346/240/270/345/277/203/346/265/201/347/250/213.md +149 -0
- package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/06-/347/233/256/345/275/225/347/273/223/346/236/204.md +231 -0
- package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/07-/346/225/260/346/215/256/346/250/241/345/236/213.md +68 -0
- package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/08-/346/211/251/345/261/225/346/200/247.md +34 -0
- package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/09-/344/270/216/345/205/267/344/275/223/345/272/224/347/224/250/347/232/204/345/205/263/347/263/273.md +22 -0
- package/docs/Kite/346/241/206/346/236/266/350/256/276/350/256/241/README.md +46 -0
- package/docs/Kite/347/263/273/347/273/237/345/220/257/345/212/250/346/265/201/347/250/213.md +567 -0
- package/docs/Launcher/345/220/257/345/212/250/345/231/250/346/226/207/346/241/243.md +745 -0
- package/docs/Polyglot/350/277/220/350/241/214/346/227/266/344/270/216Clawdbot/345/205/274/345/256/271/346/200/247/350/256/276/350/256/241.md +321 -0
- package/docs/Redis/344/270/216/346/250/241/345/235/227/345/244/232/345/256/236/344/276/213/346/226/271/346/241/210.md +438 -0
- package/docs/Relay-Kite-Token/350/256/244/350/257/201/345/256/236/346/226/275/345/256/214/346/210/220.md +178 -0
- package/docs/Relay-Token/346/235/203/351/231/220/351/205/215/347/275/256/351/252/214/350/257/201.md +113 -0
- package/docs/Watchdog/345/201/245/345/272/267/346/243/200/346/237/245/344/270/216WebSocket-Ping/346/234/272/345/210/266/345/210/206/346/236/220.md +367 -0
- package/docs/Watchdog/350/265/204/346/272/220/347/233/221/346/216/247/347/255/226/347/225/245.md +92 -0
- package/docs/WebSocket/346/216/245/346/224/266/345/276/252/347/216/257/346/255/273/351/224/201/351/230/262/350/214/203/350/247/204/350/214/203.md +357 -0
- package/docs/WebSocket/350/277/236/346/216/245/351/237/247/346/200/247/344/270/216/351/207/215/350/277/236/346/234/272/345/210/266/345/256/214/346/225/264/346/226/271/346/241/210.md +531 -0
- package/docs/WebSocket/350/277/236/346/216/245/351/237/247/346/200/247/346/226/271/346/241/210.md +169 -0
- package/docs/WebSocket/351/207/215/350/277/236/346/234/272/345/210/266/346/265/213/350/257/225/346/212/245/345/221/212.md +169 -0
- package/docs/WebSocket/351/207/215/350/277/236/351/200/200/351/201/277/346/234/272/345/210/266/346/226/271/346/241/210.md +394 -0
- package/docs/Web/346/250/241/345/235/227/344/270/216Evol/346/250/241/345/235/227/351/207/215/346/236/204/345/210/206/346/236/220.md +521 -0
- package/docs/audit-api-guide.md +68 -0
- package/docs/audit-module-design.md +315 -0
- package/docs/audit-module-implementation-summary.md +149 -0
- package/docs/llm-context-design.md +52 -0
- package/docs/llm-test-enhancement-plan.md +970 -0
- package/docs/logs-api-guide.md +42 -0
- package/docs/npm/345/214/205Python/347/216/257/345/242/203/347/256/241/347/220/206/346/226/271/346/241/210.md +302 -0
- package/docs/npm/345/217/221/345/270/203/344/270/216CLI/344/275/277/347/224/250/346/214/207/345/215/227.md +245 -0
- package/docs/stdio/344/270/216/347/253/257/345/217/243/345/217/221/347/216/260/351/207/215/346/236/204.md +480 -0
- package/docs/web/346/250/241/345/235/227/344/270/255/350/275/254/346/234/215/345/212/241/350/256/276/350/256/241/346/226/271/346/241/210.md +449 -0
- package/docs//344/272/213/344/273/266/345/244/204/347/220/206/346/234/272/345/210/266.md +388 -0
- package/docs//344/272/213/344/273/266/345/244/204/347/220/206/350/247/204/350/214/203.md +113 -0
- package/docs//344/272/213/344/273/266/350/256/242/351/230/205/351/200/232/351/205/215/347/254/246/350/247/204/350/214/203.md +256 -0
- package/docs//344/272/213/344/273/266/351/230/237/345/210/227/345/274/271/346/200/247/347/256/241/347/220/206.md +449 -0
- package/docs//344/272/244/344/272/222/345/274/217/347/273/210/347/253/257/346/216/247/345/210/266/346/226/271/346/241/210.md +301 -0
- package/docs//344/273/243/347/220/206/345/220/257/345/212/250/345/231/250/344/270/216/345/256/271/345/231/250/345/214/226.md +140 -0
- package/docs//344/273/243/347/240/201/347/273/237/350/256/241/345/267/245/345/205/267/344/275/277/347/224/250/350/257/264/346/230/216.md +217 -0
- package/docs//344/274/230/351/233/205/351/200/200/345/207/272/350/247/204/350/214/203.md +362 -0
- package/docs//344/276/235/350/265/226/347/256/241/347/220/206/350/257/264/346/230/216.md +141 -0
- package/docs//344/277/256/345/244/215/346/235/203/351/231/220/351/227/256/351/242/230-evol-RPC/346/235/203/351/231/220.md +268 -0
- package/docs//345/210/240/351/231/244kernel-client-example/345/256/214/346/210/220.md +309 -0
- package/docs//345/210/240/351/231/244ws-management/345/256/214/346/210/220.md +418 -0
- package/docs//345/220/257/345/212/250/344/274/230/345/214/226/346/226/271/346/241/210.md +522 -0
- package/docs//345/220/257/345/212/250/344/276/235/350/265/226/344/270/216/346/216/222/345/272/217.md +105 -0
- package/docs//345/256/211/350/243/205/350/204/232/346/234/254/345/274/200/345/217/221/346/226/207/346/241/243.md +643 -0
- package/docs//345/256/214/346/225/264/345/220/257/345/212/250/346/265/201/347/250/213/350/256/276/350/256/241.md +452 -0
- package/docs//345/256/236/347/216/260/350/247/204/345/210/222.md +195 -0
- package/docs//345/277/203/350/267/263/346/234/272/345/210/266/351/207/215/346/236/204/346/200/273/347/273/223.md +166 -0
- package/docs//346/217/241/346/211/213/350/256/244/350/257/201/346/226/271/346/241/210-/345/256/211/345/205/250/345/256/241/346/237/245.md +176 -0
- package/docs//346/217/241/346/211/213/350/256/244/350/257/201/346/226/271/346/241/210.md +908 -0
- package/docs//346/226/207/346/241/243/346/233/264/346/226/260/346/270/205/345/215/225.md +83 -0
- package/docs//346/227/245/345/277/227/344/270/216/345/274/202/345/270/270/345/244/204/347/220/206/350/247/204/350/214/203.md +829 -0
- package/docs//346/227/245/345/277/227/350/260/203/350/257/225/345/256/236/346/210/230/346/214/207/345/215/227.md +25 -0
- package/docs//346/236/266/346/236/204/345/200/237/351/211/264/346/214/207/345/215/227.md +977 -0
- package/docs//346/236/266/346/236/204/346/224/271/351/200/240-/345/256/214/346/210/220/346/200/273/347/273/223.md +440 -0
- package/docs//346/236/266/346/236/204/347/216/260/347/212/266/344/270/216/347/273/210/346/236/201/347/233/256/346/240/207/345/257/271/346/257/224/345/210/206/346/236/220.md +508 -0
- package/docs//346/250/241/345/235/227/345/244/232/350/277/236/346/216/245/346/216/247/345/210/266/347/255/226/347/225/245.md +220 -0
- package/docs//346/250/241/345/235/227/345/256/211/350/243/205/346/234/272/345/210/266/350/256/276/350/256/241.md +500 -0
- package/docs//346/250/241/345/235/227/345/274/200/345/217/221/346/214/207/345/215/227.md +1824 -0
- package/docs//346/250/241/345/235/227/347/203/255/346/233/264/346/226/260.md +89 -0
- package/docs//346/250/241/345/235/227/350/277/234/347/250/213/351/203/250/347/275/262/345/274/200/345/217/221/350/247/204/350/214/203.md +460 -0
- package/docs//346/250/241/345/235/227/351/200/200/345/207/272/346/234/272/345/210/266/345/256/214/346/225/264/346/226/271/346/241/210.md +303 -0
- package/docs//346/250/241/345/235/227/351/205/215/347/275/256/345/212/240/350/275/275/344/270/216/347/203/255/351/207/215/350/275/275/350/247/204/350/214/203.md +369 -0
- package/docs//346/265/213/350/257/225/344/270/255/345/277/203/346/267/273/345/212/240/346/250/241/345/235/227/346/265/213/350/257/225/346/214/207/345/215/227.md +147 -0
- package/docs//347/211/210/346/234/254/351/224/201/345/256/232/347/216/257/345/242/203/347/256/241/347/220/206/346/226/271/346/241/210.md +331 -0
- package/docs//347/216/257/345/242/203/345/217/230/351/207/217/344/270/216/350/277/220/350/241/214/346/227/266/347/233/256/345/275/225/350/256/276/350/256/241.md +499 -0
- package/docs//347/216/257/345/242/203/347/256/241/347/220/206/345/256/214/346/225/264/346/226/271/346/241/210.md +334 -0
- package/docs//350/231/232/346/213/237/346/250/241/345/235/227/344/270/255/350/275/254/346/234/215/345/212/241/345/256/214/346/225/264/350/256/276/350/256/241.md +1496 -0
- package/docs//350/231/232/346/213/237/347/216/257/345/242/203/345/267/245/344/275/234/345/216/237/347/220/206.md +163 -0
- package/docs//350/256/241/345/210/222/347/256/241/347/220/206/345/231/250/344/275/277/347/224/250/346/214/207/345/215/227.md +196 -0
- package/docs//350/256/244/350/257/201/346/250/241/345/235/227/344/270/216Gateway/350/256/276/350/256/241/346/226/271/346/241/210.md +765 -0
- package/docs//350/277/234/347/250/213/346/250/241/345/235/227/350/256/276/350/256/241-/346/227/247/347/211/210.md +1117 -0
- package/docs//350/277/234/347/250/213/346/250/241/345/235/227/350/256/276/350/256/241.md +451 -0
- package/docs//351/207/215/346/236/204/346/234/272/345/210/266/346/270/205/345/215/225.md +192 -0
- package/docs//351/223/276/350/267/257/350/277/275/350/270/252/346/226/271/346/241/210.md +242 -0
- package/docs//351/231/215/347/272/247/347/255/226/347/225/245/350/256/276/350/256/241/346/226/271/346/241/210.md +618 -0
- package/extensions/agents/assistant/entry.py +113 -14
- package/extensions/agents/assistant/module.md +27 -22
- package/extensions/agents/assistant/server.py +291 -105
- package/extensions/channels/acp_channel/entry.py +114 -16
- package/extensions/channels/acp_channel/module.md +4 -0
- package/extensions/channels/acp_channel/server.py +396 -105
- package/extensions/channels/phone_channel/__init__.py +1 -0
- package/extensions/channels/phone_channel/entry.py +503 -0
- package/extensions/channels/phone_channel/module.md +31 -0
- package/extensions/channels/phone_channel/server.py +686 -0
- package/extensions/event_hub_bench/entry.py +55 -12
- package/extensions/event_hub_bench/module.md +27 -27
- package/extensions/services/audit/README.md +134 -0
- package/extensions/services/audit/collector.py +73 -0
- package/extensions/services/audit/entry.py +444 -0
- package/extensions/services/audit/module.md +66 -0
- package/extensions/services/audit/query_audit.py +111 -0
- package/extensions/services/audit/routes/__init__.py +1 -0
- package/extensions/services/audit/routes/routes_audit.py +113 -0
- package/extensions/services/audit/schemas/__init__.py +5 -0
- package/extensions/services/audit/schemas/audit_event.py +92 -0
- package/extensions/services/audit/server.py +542 -0
- package/extensions/services/audit/storage.py +95 -0
- package/extensions/services/auth/entry.py +1054 -0
- package/extensions/services/auth/module.md +31 -0
- package/extensions/services/auth/token_store.py +185 -0
- package/extensions/services/auth/verifiers/evol_account.py +101 -0
- package/extensions/services/auth/verifiers/kite_token.py +38 -0
- package/extensions/services/auth/verifiers/pairing_code.py +71 -0
- package/extensions/services/backup/entry.py +494 -197
- package/extensions/services/backup/module.md +4 -2
- package/extensions/services/dataclaw/api/__init__.py +0 -0
- package/extensions/services/dataclaw/api/admin.py +367 -0
- package/extensions/services/dataclaw/api/copyright.py +175 -0
- package/extensions/services/dataclaw/api/credits.py +177 -0
- package/extensions/services/dataclaw/api/data.py +179 -0
- package/extensions/services/dataclaw/api/demands.py +269 -0
- package/extensions/services/dataclaw/api/feeds.py +262 -0
- package/extensions/services/dataclaw/api/identity.py +505 -0
- package/extensions/services/dataclaw/api/notifications.py +104 -0
- package/extensions/services/dataclaw/api/reviews.py +138 -0
- package/extensions/services/dataclaw/api/search.py +153 -0
- package/extensions/services/dataclaw/api/subscriptions.py +157 -0
- package/extensions/services/dataclaw/config.json5 +96 -0
- package/extensions/services/dataclaw/core/__init__.py +0 -0
- package/extensions/services/dataclaw/core/auth.py +95 -0
- package/extensions/services/dataclaw/core/config.py +50 -0
- package/extensions/services/dataclaw/core/database.py +70 -0
- package/extensions/services/dataclaw/entry.py +416 -0
- package/extensions/services/dataclaw/gofeed/351/241/271/347/233/256/346/211/200/346/234/211/346/235/203/350/275/254/347/247/273/346/265/201/347/250/213/350/257/264/346/230/216.md +309 -0
- package/extensions/services/dataclaw/migrate.py +283 -0
- package/extensions/services/dataclaw/models/__init__.py +0 -0
- package/extensions/services/dataclaw/module.md +49 -0
- package/extensions/services/dataclaw/requirements.txt +18 -0
- package/extensions/services/dataclaw/server.py +759 -0
- package/extensions/services/dataclaw/services/__init__.py +0 -0
- package/extensions/services/dataclaw/services/agent_service.py +132 -0
- package/extensions/services/dataclaw/services/credit_service.py +235 -0
- package/extensions/services/dataclaw/services/email_service.py +140 -0
- package/extensions/services/dataclaw/services/feed_service.py +259 -0
- package/extensions/services/dataclaw/services/notification_service.py +209 -0
- package/extensions/services/dataclaw/services/oauth_service.py +275 -0
- package/extensions/services/dataclaw/services/pricing.py +102 -0
- package/extensions/services/dataclaw/services/quality.py +79 -0
- package/extensions/services/dataclaw/services/reputation.py +142 -0
- package/extensions/services/dataclaw/services/sms_service.py +174 -0
- package/extensions/services/dataclaw/static/css/common.css +853 -0
- package/extensions/services/dataclaw/static/css/themes/blue.css +42 -0
- package/extensions/services/dataclaw/static/css/themes/dark.css +42 -0
- package/extensions/services/dataclaw/static/css/themes/light.css +35 -0
- package/extensions/services/dataclaw/static/js/api.js +103 -0
- package/extensions/services/dataclaw/static/js/common.js +321 -0
- package/extensions/services/dataclaw/static/js/i18n.js +95 -0
- package/extensions/services/dataclaw/static/js/pages/admin.js +152 -0
- package/extensions/services/dataclaw/static/js/pages/dashboard.js +82 -0
- package/extensions/services/dataclaw/static/js/pages/feed-detail.js +180 -0
- package/extensions/services/dataclaw/static/js/pages/feed-manage.js +158 -0
- package/extensions/services/dataclaw/static/js/theme.js +46 -0
- package/extensions/services/dataclaw/static/locales/en-US.json +464 -0
- package/extensions/services/dataclaw/static/locales/ja-JP.json +464 -0
- package/extensions/services/dataclaw/static/locales/zh-CN.json +464 -0
- package/extensions/services/dataclaw/templates/admin/index.html +90 -0
- package/extensions/services/dataclaw/templates/base.html +136 -0
- package/extensions/services/dataclaw/templates/credits/balance.html +106 -0
- package/extensions/services/dataclaw/templates/credits/deposit.html +164 -0
- package/extensions/services/dataclaw/templates/credits/history.html +90 -0
- package/extensions/services/dataclaw/templates/dashboard.html +52 -0
- package/extensions/services/dataclaw/templates/demands/create.html +78 -0
- package/extensions/services/dataclaw/templates/demands/detail.html +136 -0
- package/extensions/services/dataclaw/templates/demands/list.html +94 -0
- package/extensions/services/dataclaw/templates/feeds/create.html +95 -0
- package/extensions/services/dataclaw/templates/feeds/detail.html +110 -0
- package/extensions/services/dataclaw/templates/feeds/list.html +110 -0
- package/extensions/services/dataclaw/templates/feeds/manage.html +88 -0
- package/extensions/services/dataclaw/templates/index.html +185 -0
- package/extensions/services/dataclaw/templates/login.html +246 -0
- package/extensions/services/dataclaw/templates/register.html +164 -0
- package/extensions/services/dataclaw/templates/settings/notifications.html +96 -0
- package/extensions/services/dataclaw/templates/settings/profile.html +167 -0
- package/extensions/services/dataclaw/templates/subscriptions/list.html +64 -0
- package/extensions/services/dataclaw/tests/__init__.py +0 -0
- package/extensions/services/dataclaw/tests/conftest.py +68 -0
- package/extensions/services/dataclaw/tests/integration/__init__.py +0 -0
- package/extensions/services/dataclaw/tests/integration/test_workflows.py +239 -0
- package/extensions/services/dataclaw/tests/unit/__init__.py +0 -0
- package/extensions/services/dataclaw/tests/unit/test_admin.py +70 -0
- package/extensions/services/dataclaw/tests/unit/test_copyright.py +63 -0
- package/extensions/services/dataclaw/tests/unit/test_credits.py +80 -0
- package/extensions/services/dataclaw/tests/unit/test_data.py +98 -0
- package/extensions/services/dataclaw/tests/unit/test_demands.py +106 -0
- package/extensions/services/dataclaw/tests/unit/test_feeds.py +98 -0
- package/extensions/services/dataclaw/tests/unit/test_identity.py +88 -0
- package/extensions/services/dataclaw/tests/unit/test_notifications.py +36 -0
- package/extensions/services/dataclaw/tests/unit/test_reviews.py +68 -0
- package/extensions/services/dataclaw/tests/unit/test_search.py +64 -0
- package/extensions/services/dataclaw/tests/unit/test_subscriptions.py +65 -0
- package/extensions/services/dataclaw/tests/unit/test_system.py +106 -0
- package/extensions/services/dataclaw/utils/__init__.py +0 -0
- package/extensions/services/dataclaw/utils/crypto.py +38 -0
- package/extensions/services/dataclaw/utils/id_generator.py +52 -0
- package/extensions/services/dataclaw/ws/__init__.py +0 -0
- package/extensions/services/dataclaw/ws/handler.py +163 -0
- package/extensions/services/dataclaw//345/215/217/350/256/2561-/351/241/271/347/233/256/346/235/241/344/273/266/346/216/210/346/235/203/344/270/216/350/202/241/346/235/203/345/257/271/344/273/267/345/215/217/350/256/256.md +243 -0
- package/extensions/services/dataclaw//345/215/217/350/256/2562-/351/241/271/347/233/256/350/264/255/344/271/260/346/235/203/344/270/216/345/244/226/345/214/205/345/247/224/346/211/230/345/274/200/345/217/221/345/215/217/350/256/256.md +434 -0
- package/extensions/services/evol/__init__.py +1 -0
- package/extensions/services/evol/async_http.py +551 -0
- package/extensions/services/evol/auth_manager.py +602 -443
- package/extensions/services/evol/config.json5 +16 -0
- package/extensions/services/evol/entry.py +568 -406
- package/extensions/services/evol/evol_api.py +969 -173
- package/extensions/services/evol/mfa_totp.py +77 -0
- package/extensions/services/evol/module.md +150 -32
- package/extensions/services/evol/nonce_pool.py +113 -0
- package/extensions/services/evol/oauth_manager.py +223 -0
- package/extensions/services/evol/pairing.py +3 -2
- package/extensions/services/evol/pairing_codes.jsonl +1 -0
- package/extensions/services/evol/relay.py +1031 -682
- package/extensions/services/evol/relay_config.json5 +85 -67
- package/extensions/services/evol/routes/routes_llm.py +231 -0
- package/extensions/services/evol/routes/routes_rpc.py +90 -89
- package/extensions/services/evol/routes/routes_test.py +11 -4
- package/extensions/services/evol/server.py +2426 -875
- package/extensions/services/evol/static/assets/CommissionView-Cs_ys6Gm.js +1 -0
- package/extensions/services/evol/static/assets/CommissionView-DACet_Oo.css +1 -0
- package/extensions/services/evol/static/assets/IframePage-DbO11U9G.js +1 -0
- package/extensions/services/evol/static/assets/IframePage-c572lT8i.css +1 -0
- package/extensions/services/evol/static/assets/TeamDetailView-DULrGD7k.css +1 -0
- package/extensions/services/evol/static/assets/TeamDetailView-gy_MBEqG.js +139 -0
- package/extensions/services/evol/static/assets/element-plus-Bd7pZkkM.js +63 -0
- package/extensions/services/evol/static/assets/index-CmMONKzG.css +1 -0
- package/extensions/services/evol/static/assets/index-D44bBe__.js +2 -0
- package/extensions/services/evol/static/assets/vue-vendor-DtF-__I4.js +29 -0
- package/extensions/services/evol/static/index.html +16 -781
- package/extensions/services/evol/static/logo.png +0 -0
- package/extensions/services/evol/stats_manager.py +243 -240
- package/extensions/services/evol/web/README.md +89 -0
- package/extensions/services/evol/web/build.bat +44 -0
- package/extensions/services/evol/web/index.html +13 -0
- package/extensions/services/evol/web/package-lock.json +1718 -0
- package/extensions/services/evol/web/package.json +26 -0
- package/extensions/services/evol/web/public/logo.png +0 -0
- package/extensions/services/evol/web/src/App.vue +7 -0
- package/extensions/services/evol/web/src/components/layout/AppHeader.vue +202 -0
- package/extensions/services/evol/web/src/components/layout/AppLayout.vue +61 -0
- package/extensions/services/evol/web/src/components/layout/AppSidebar.vue +115 -0
- package/extensions/services/evol/web/src/components/login/LoginPage.vue +271 -0
- package/extensions/services/evol/web/src/components/team/AddMemberModal.vue +181 -0
- package/extensions/services/evol/web/src/components/team/GroupTreeNode.vue +156 -0
- package/extensions/services/evol/web/src/components/team/TeamAlertConfig.vue +221 -0
- package/extensions/services/evol/web/src/components/team/TeamBillModal.vue +165 -0
- package/extensions/services/evol/web/src/components/team/TeamMembersAndGroups.vue +499 -0
- package/extensions/services/evol/web/src/components/team/TeamStatsPanel.vue +907 -0
- package/extensions/services/evol/web/src/components/team/TreeNode.vue +331 -0
- package/extensions/services/evol/web/src/components/team/stats/StatsExportProgress.vue +44 -0
- package/extensions/services/evol/web/src/components/team/stats/StatsHeader.vue +89 -0
- package/extensions/services/evol/web/src/components/team/stats/StatsMemberDetail.vue +415 -0
- package/extensions/services/evol/web/src/components/team/stats/StatsSummary.vue +42 -0
- package/extensions/services/evol/web/src/components/team/stats/helpers.ts +195 -0
- package/extensions/services/evol/web/src/components/team/stats/stats.css +741 -0
- package/extensions/services/evol/web/src/components/team/stats/useStatsApi.ts +114 -0
- package/extensions/services/evol/web/src/components/team/stats/useStatsCharts.ts +242 -0
- package/extensions/services/evol/web/src/components/team/stats/useStatsExport.ts +232 -0
- package/extensions/services/evol/web/src/composables/useFormatters.ts +42 -0
- package/extensions/services/evol/web/src/composables/useTheme.ts +52 -0
- package/extensions/services/evol/web/src/env.d.ts +7 -0
- package/extensions/services/evol/web/src/i18n/en.ts +361 -0
- package/extensions/services/evol/web/src/i18n/index.ts +36 -0
- package/extensions/services/evol/web/src/i18n/zh.ts +379 -0
- package/extensions/services/evol/web/src/main.ts +21 -0
- package/extensions/services/evol/web/src/router/index.ts +81 -0
- package/extensions/services/evol/web/src/services/kernel-client.ts +406 -0
- package/extensions/services/evol/web/src/stores/auth.ts +189 -0
- package/extensions/services/evol/web/src/stores/connection.ts +134 -0
- package/extensions/services/evol/web/src/stores/pages.ts +79 -0
- package/extensions/services/evol/web/src/styles/base.css +213 -0
- package/extensions/services/evol/web/src/styles/variables.css +138 -0
- package/extensions/services/evol/web/src/types/rpc.ts +35 -0
- package/extensions/services/evol/web/src/types/token.ts +87 -0
- package/extensions/services/evol/web/src/views/AccountView.vue +1532 -0
- package/extensions/services/evol/web/src/views/AiServiceView.vue +219 -0
- package/extensions/services/evol/web/src/views/CommissionView.vue +1220 -0
- package/extensions/services/evol/web/src/views/CreditsView.vue +131 -0
- package/extensions/services/evol/web/src/views/EndpointView.vue +163 -0
- package/extensions/services/evol/web/src/views/IframePage.vue +120 -0
- package/extensions/services/evol/web/src/views/TeamDetailView.vue +473 -0
- package/extensions/services/evol/web/src/views/TeamView.vue +332 -0
- package/extensions/services/evol/web/tsconfig.json +31 -0
- package/extensions/services/evol/web/tsconfig.node.json +10 -0
- package/extensions/services/evol/web/vite.config.ts +49 -0
- package/extensions/services/evolmem/__init__.py +0 -0
- package/extensions/services/evolmem/entry.py +387 -0
- package/extensions/services/evolmem/hooks/__init__.py +0 -0
- package/extensions/services/evolmem/hooks/assistant_stop.py +228 -0
- package/extensions/services/evolmem/hooks/common.py +76 -0
- package/extensions/services/evolmem/hooks/pre_tool_use.py +56 -0
- package/extensions/services/evolmem/hooks/session_end.py +133 -0
- package/extensions/services/evolmem/hooks/session_start.py +229 -0
- package/extensions/services/evolmem/hooks/user_prompt.py +122 -0
- package/extensions/services/evolmem/module.md +48 -0
- package/extensions/services/evolmem/prompts/00-server-info.md +28 -0
- package/extensions/services/evolmem/prompts/01-behavior.md +46 -0
- package/extensions/services/evolmem/prompts/02-summary-format.md +112 -0
- package/extensions/services/evolmem/prompts/03-file-query.md +92 -0
- package/extensions/services/evolmem/prompts/04-topic-stats.md +11 -0
- package/extensions/services/evolmem/prompts/05-recent-topics.md +84 -0
- package/extensions/services/evolmem/scripts/__init__.py +0 -0
- package/extensions/services/evolmem/scripts/extract_keywords.py +40 -0
- package/extensions/services/evolmem/scripts/search_topics.py +91 -0
- package/extensions/services/evolmem/server.py +641 -0
- package/extensions/services/gateway/entry.py +964 -0
- package/extensions/services/gateway/module.md +29 -0
- package/extensions/services/gateway/nonce_pool.py +65 -0
- package/extensions/services/gateway/relay.py +133 -0
- package/extensions/services/gateway/ws_server.py +285 -0
- package/extensions/services/kite_console/auth_manager.py +603 -0
- package/extensions/services/kite_console/config.json5 +19 -0
- package/extensions/services/kite_console/config_loader.py +117 -0
- package/extensions/services/kite_console/entry.py +528 -0
- package/extensions/services/kite_console/evol_api.py +179 -0
- package/extensions/services/kite_console/evol_config.json5 +29 -0
- package/extensions/services/kite_console/mfa_totp.py +77 -0
- package/extensions/services/kite_console/migrate_tokens.py +122 -0
- package/extensions/services/kite_console/module.md +37 -0
- package/extensions/services/kite_console/nonce_pool.py +113 -0
- package/extensions/services/kite_console/oauth_manager.py +223 -0
- package/extensions/services/kite_console/pairing.py +280 -0
- package/extensions/services/kite_console/pairing_codes.jsonl +2 -0
- package/extensions/services/kite_console/relay.py +1350 -0
- package/extensions/services/kite_console/relay_config.json5 +96 -0
- package/extensions/services/kite_console/routes/__init__.py +1 -0
- package/extensions/services/kite_console/routes/routes_llm.py +231 -0
- package/extensions/services/kite_console/routes/routes_proxy.py +115 -0
- package/extensions/services/kite_console/routes/routes_rpc.py +89 -0
- package/extensions/services/kite_console/routes/routes_test.py +68 -0
- package/extensions/services/kite_console/server.py +1742 -0
- package/extensions/services/{evol → kite_console}/static/css/style.css +656 -2
- package/extensions/services/kite_console/static/index.html +1524 -0
- package/extensions/services/{evol → kite_console}/static/js/dialog.js +11 -4
- package/extensions/services/kite_console/static/js/evol-app.js +7740 -0
- package/extensions/services/{evol/static/js/evol-app.js → kite_console/static/js/evol-app.js.backup} +2777 -1949
- package/extensions/services/kite_console/static/js/kernel-client.js +560 -0
- package/extensions/services/{evol/static/js/kernel-client.js → kite_console/static/js/kernel-client.js.backup} +41 -3
- package/extensions/services/{evol → kite_console}/static/js/registry-tests.js +7 -0
- package/extensions/services/kite_console/static/js/tests/ARCHITECTURE.md +67 -0
- package/extensions/services/kite_console/static/js/tests/README.md +140 -0
- package/extensions/services/kite_console/static/js/tests/index.js +161 -0
- package/extensions/services/kite_console/static/js/tests/integration/auth.js +120 -0
- package/extensions/services/kite_console/static/js/tests/integration/channel-interaction.js +188 -0
- package/extensions/services/kite_console/static/js/tests/integration/elastic-connection.js +115 -0
- package/extensions/services/kite_console/static/js/tests/integration/full-workflow.js +43 -0
- package/extensions/services/kite_console/static/js/tests/integration/multi-instance.js +304 -0
- package/extensions/services/kite_console/static/js/tests/integration/nested-rpc.js +266 -0
- package/extensions/services/kite_console/static/js/tests/integration/pingpong.js +25 -0
- package/extensions/services/kite_console/static/js/tests/integration/redis.js +227 -0
- package/extensions/services/kite_console/static/js/tests/integration/registry-core.js +52 -0
- package/extensions/services/kite_console/static/js/tests/integration/remote-deploy.js +85 -0
- package/extensions/services/kite_console/static/js/tests/integration/require-init.js +96 -0
- package/extensions/services/kite_console/static/js/tests/integration/scaling-control.js +193 -0
- package/extensions/services/kite_console/static/js/tests/integration/trace.js +109 -0
- package/extensions/services/kite_console/static/js/tests/modules/acp_channel.js +339 -0
- package/extensions/services/kite_console/static/js/tests/modules/auth.js +96 -0
- package/extensions/services/kite_console/static/js/tests/modules/backup.js +49 -0
- package/extensions/services/kite_console/static/js/tests/modules/gateway.js +41 -0
- package/extensions/services/kite_console/static/js/tests/modules/kernel.js +90 -0
- package/extensions/services/kite_console/static/js/tests/modules/launcher.js +75 -0
- package/extensions/services/kite_console/static/js/tests/modules/multi_instance.js +129 -0
- package/extensions/services/kite_console/static/js/tests/modules/phone_channel.js +364 -0
- package/extensions/services/kite_console/static/js/tests/modules/redis.js +178 -0
- package/extensions/services/kite_console/static/js/tests/modules/watchdog.js +60 -0
- package/extensions/services/kite_console/static/js/tests/modules/web.js +70 -0
- package/extensions/services/kite_console/static/js/tests/test-runner.js +123 -0
- package/extensions/services/kite_console/static/js/virtual-list.js +200 -0
- package/extensions/services/kite_console/static/test_kernel_client_token.html +352 -0
- package/extensions/services/kite_console/stats_manager.py +247 -0
- package/extensions/services/logs/README.md +215 -0
- package/extensions/services/logs/api_logger.py +37 -0
- package/extensions/services/logs/baseline.py +121 -0
- package/extensions/services/logs/cleaner.py +76 -0
- package/extensions/services/logs/entry.py +449 -0
- package/extensions/services/logs/formatter.py +129 -0
- package/extensions/services/logs/module.md +38 -0
- package/extensions/services/logs/quick_diagnostic.py +128 -0
- package/extensions/services/logs/routes/__init__.py +1 -0
- package/extensions/services/logs/routes/routes_logs.py +218 -0
- package/extensions/services/logs/routes/routes_logs.py.backup +173 -0
- package/extensions/services/logs/scanner.py +100 -0
- package/extensions/services/logs/searcher.py +263 -0
- package/extensions/services/logs/server.py +553 -0
- package/extensions/services/logs.zip +0 -0
- package/extensions/services/model_service/config.json5 +30 -0
- package/extensions/services/model_service/entry.py +620 -171
- package/extensions/services/model_service/module.md +11 -2
- package/extensions/services/proxy/__init__.py +0 -0
- package/extensions/services/proxy/aid_manager.py +419 -0
- package/extensions/services/proxy/auth_bridge.py +182 -0
- package/extensions/services/proxy/config_store.py +79 -0
- package/extensions/services/proxy/entry.py +528 -0
- package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +2 -2
- package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +18 -28
- package/extensions/services/proxy/evol/presenter/configPresenter.py +80 -1127
- package/extensions/services/proxy/evol/presenter/userPresenter.py +71 -477
- package/extensions/services/proxy/evol/server/claude_proxy_async.py +11 -7
- package/extensions/services/proxy/module.md +151 -0
- package/extensions/services/proxy/server.py +952 -271
- package/extensions/services/redis/ALIGNMENT_CHECKLIST.md +121 -0
- package/extensions/services/redis/ALIGNMENT_STATUS.md +548 -0
- package/extensions/services/redis/config.json5 +8 -0
- package/extensions/services/redis/entry.py +1509 -0
- package/extensions/services/redis/entry.py.backup +405 -0
- package/extensions/services/redis/module.md +48 -0
- package/extensions/services/redis/redis_builtin.py +332 -0
- package/extensions/services/redis/redis_external.py +164 -0
- package/extensions/services/testUi/entry.py +446 -0
- package/extensions/services/testUi/module.md +18 -0
- package/extensions/services/testUi/ui/cards.html +131 -0
- package/extensions/services/testUi/ui/index.html +22 -0
- package/extensions/services/testUi/ui/particles.html +143 -0
- package/extensions/services/watchdog/entry.py +1258 -793
- package/extensions/services/watchdog/module.md +2 -0
- package/extensions/services/watchdog/monitor.py +465 -87
- package/extensions/services/web/auth_manager.py +602 -0
- package/extensions/services/web/config.json5 +11 -0
- package/extensions/services/web/entry.py +598 -478
- package/extensions/services/web/mfa_totp.py +77 -0
- package/extensions/services/web/module.md +16 -13
- package/extensions/services/web/nonce_pool.py +113 -0
- package/extensions/services/web/oauth_manager.py +223 -0
- package/extensions/services/web/pairing.py +3 -2
- package/extensions/services/web/pairing_codes.jsonl +1 -0
- package/extensions/services/web/relay.py +442 -63
- package/extensions/services/web/relay_config.json5 +1 -2
- package/extensions/services/web/routes/routes_rpc.py +6 -6
- package/extensions/services/web/server.py +360 -173
- package/extensions/services/web/static/index.html +1752 -1738
- package/extensions/services/web/static/js/app.js +32 -0
- package/extensions/services/web/static/js/kernel-client.js +48 -9
- package/extensions/services/web/vendor/bluetooth/audio.py +1 -1
- package/extensions/services/web/vendor/config.py +2 -2
- package/extensions/services/web/vendor/storage/identity.py +1 -1
- package/kernel/entry.py +77 -23
- package/kernel/event_hub.py +1122 -74
- package/kernel/module.md +2 -1
- package/kernel/registry_store.py +208 -11
- package/kernel/rpc_router.py +1400 -491
- package/kernel/server.py +1021 -134
- package/kite_cli/builders/__init__.py +4 -0
- package/kite_cli/builders/base.py +67 -0
- package/kite_cli/builders/custom.py +31 -0
- package/kite_cli/builders/detector.py +56 -0
- package/kite_cli/builders/go.py +34 -0
- package/kite_cli/builders/gradle.py +41 -0
- package/kite_cli/builders/maven.py +36 -0
- package/kite_cli/builders/npm.py +44 -0
- package/kite_cli/builders/python.py +37 -0
- package/kite_cli/commands/BUILD_GUIDE.md +109 -0
- package/kite_cli/commands/build.py +142 -0
- package/kite_cli/commands/check.py +60 -0
- package/kite_cli/commands/config.py +156 -0
- package/kite_cli/commands/deps.py +58 -0
- package/kite_cli/commands/deps_install.py +7 -7
- package/kite_cli/commands/disable.py +162 -0
- package/kite_cli/commands/enable.py +162 -0
- package/kite_cli/commands/export.py +96 -0
- package/kite_cli/commands/import_cmd.py +110 -0
- package/kite_cli/commands/install.py +50 -23
- package/kite_cli/commands/install_skill.py +107 -0
- package/kite_cli/commands/list.py +128 -31
- package/kite_cli/commands/outdated.py +202 -0
- package/kite_cli/commands/search.py +33 -17
- package/kite_cli/commands/update.py +115 -2
- package/kite_cli/commands/venv_setup.py +6 -6
- package/kite_cli/commands/why.py +48 -0
- package/kite_cli/core/config_manager.py +145 -0
- package/kite_cli/core/downloader.py +32 -2
- package/kite_cli/main.py +151 -5
- package/kite_cli/utils/colors.py +153 -0
- package/kite_cli/utils/dependency_graph.py +209 -0
- package/kite_cli/utils/process.py +55 -0
- package/kite_cli/utils/progress.py +207 -0
- package/kite_cli/utils/table.py +101 -0
- package/launcher/count_lines.py +192 -43
- package/launcher/entry.py +4543 -2802
- package/launcher/logging_setup.py +54 -1
- package/launcher/module.md +32 -6
- package/launcher/module_scanner.py +93 -20
- package/launcher/process_manager.py +355 -76
- package/main.py +6 -0
- package/package.json +4 -1
- package/requirements.txt +41 -38
- package/scripts/auto-fix-deps.py +128 -0
- package/scripts/env-manager.js +25 -2
- package/scripts/final-test.js +78 -0
- package/scripts/setup-python-env.js +700 -191
- package/scripts/test-alluser.js +48 -0
- package/scripts/test-different-version.js +86 -0
- package/scripts/test-direct.js +63 -0
- package/scripts/test-extract-installer.js +28 -0
- package/scripts/test-install-log.js +54 -0
- package/scripts/test-installer.js +39 -0
- package/scripts/test-integration.js +250 -0
- package/scripts/test-real-install.js +210 -0
- package/scripts/test-targetdir.js +49 -0
- package/scripts/test-venv-real.js +47 -0
- package/scripts/test-venv-simple.js +57 -0
- package/scripts/test-wait.js +49 -0
- package/scripts/test-with-log.js +63 -0
- package/extensions/services/evol/config.yaml +0 -149
- package/extensions/services/evol/routes/routes_management_ws.py +0 -127
- package/extensions/services/evol/static/index_evol.html +0 -14
- package/extensions/services/evol/static/js/app.js +0 -6304
- package/extensions/services/evol/static/js/auth.js +0 -326
- package/extensions/services/evol/static/js/evol-app-fixed.js +0 -50
- package/extensions/services/evol/static/js/evol-app.js.bak +0 -1800
- package/extensions/services/evol/static/js/kernel-client-example.js +0 -228
- package/extensions/services/evol/static/js/main.js +0 -141
- package/extensions/services/evol/static/js/stats.js +0 -217
- package/extensions/services/evol/static/js/token-manager.js +0 -175
- package/extensions/services/proxy/CHANGELOG_20260308.md +0 -258
- package/extensions/services/proxy/_fix_prints.py +0 -133
- package/extensions/services/proxy/_fix_prints2.py +0 -87
- package/extensions/services/proxy/console_auth.py +0 -109
- package/extensions/services/proxy/logs/websocket.log +0 -260
- package/extensions/services/proxy/main.py +0 -240
- package/extensions/services/proxy/requirements.txt +0 -13
- package/extensions/services/web/config.yaml +0 -149
- /package/extensions/services/{evol → kite_console}/static/pairing.html +0 -0
- /package/extensions/services/{evol → kite_console}/static/test_registry.html +0 -0
- /package/extensions/services/{evol → kite_console}/static/test_relay.html +0 -0
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
"""
|
|
2
|
+
configPresenter - Proxy 模块适配版
|
|
3
|
+
|
|
4
|
+
存储路径改用 KITE_MODULE_DATA,移除对 userPresenter/workPresenter 的依赖。
|
|
5
|
+
保留 proxy 需要的配置读取方法。
|
|
6
|
+
"""
|
|
7
|
+
|
|
1
8
|
import json
|
|
2
9
|
import os
|
|
3
10
|
import threading
|
|
@@ -5,35 +12,40 @@ import time
|
|
|
5
12
|
|
|
6
13
|
from ..log import logger
|
|
7
14
|
|
|
15
|
+
|
|
8
16
|
class configPresenter:
|
|
9
17
|
_lock = threading.Lock()
|
|
10
|
-
_config_dir_initialized = False
|
|
18
|
+
_config_dir_initialized = False
|
|
11
19
|
searchPreviewEnabled = False
|
|
12
20
|
userName = "default"
|
|
13
|
-
KEY_CLAUDE_AGENT_NAME = "claude_agent_name"
|
|
14
|
-
KEY_GEMINI_AGENT_NAME = "gemini_agent_name"
|
|
15
|
-
|
|
21
|
+
KEY_CLAUDE_AGENT_NAME = "claude_agent_name"
|
|
22
|
+
KEY_GEMINI_AGENT_NAME = "gemini_agent_name"
|
|
23
|
+
|
|
24
|
+
# 代理模式下的 evol_token(由 auth_bridge 注入)
|
|
25
|
+
_evol_token = None
|
|
26
|
+
_evol_token_lock = threading.Lock()
|
|
27
|
+
|
|
16
28
|
@staticmethod
|
|
17
29
|
def get_config_dir():
|
|
18
|
-
"""
|
|
19
|
-
|
|
30
|
+
"""获取配置目录:优先使用 KITE_MODULE_DATA"""
|
|
31
|
+
module_data = os.environ.get("KITE_MODULE_DATA", "")
|
|
32
|
+
if module_data:
|
|
33
|
+
return os.path.join(module_data, "config")
|
|
20
34
|
|
|
35
|
+
import platform
|
|
21
36
|
if platform.system() == "Windows":
|
|
22
|
-
app_path = os.path.join(os.getenv("APPDATA", "~"), "evol",configPresenter.userName)
|
|
37
|
+
app_path = os.path.join(os.getenv("APPDATA", "~"), "evol", configPresenter.userName)
|
|
23
38
|
else:
|
|
24
39
|
home_dir = os.path.expanduser("~")
|
|
25
40
|
if os.access(home_dir, os.W_OK):
|
|
26
|
-
app_path = os.path.join(home_dir, ".evol",configPresenter.userName)
|
|
27
|
-
|
|
41
|
+
app_path = os.path.join(home_dir, ".evol", configPresenter.userName)
|
|
28
42
|
else:
|
|
29
43
|
import tempfile
|
|
30
|
-
app_path = os.path.join(tempfile.gettempdir(), "evol",configPresenter.userName)
|
|
31
|
-
logger.debug(f"using config dir: {app_path}")
|
|
44
|
+
app_path = os.path.join(tempfile.gettempdir(), "evol", configPresenter.userName)
|
|
32
45
|
return app_path
|
|
33
46
|
|
|
34
47
|
@staticmethod
|
|
35
48
|
def ensure_config_dir():
|
|
36
|
-
"""确保配置目录存在,只在需要时创建一次"""
|
|
37
49
|
if not configPresenter._config_dir_initialized:
|
|
38
50
|
config_dir = configPresenter.get_config_dir()
|
|
39
51
|
try:
|
|
@@ -41,149 +53,89 @@ class configPresenter:
|
|
|
41
53
|
configPresenter._config_dir_initialized = True
|
|
42
54
|
except Exception as e:
|
|
43
55
|
print(f"创建配置目录失败: {e}")
|
|
44
|
-
# 降级到临时目录
|
|
45
|
-
import tempfile
|
|
46
|
-
|
|
47
|
-
config_dir = tempfile.gettempdir()
|
|
48
56
|
return True
|
|
49
|
-
|
|
57
|
+
|
|
50
58
|
@staticmethod
|
|
51
59
|
def get_claude_agent_name():
|
|
52
|
-
"""获取Claude智能体名称"""
|
|
53
|
-
"""获取Claude代理Agent名称,如果未设置则返回默认值"""
|
|
54
|
-
#return "claude_code_proxy.aid.pub"
|
|
55
60
|
agent_name = configPresenter.getSetting(configPresenter.KEY_CLAUDE_AGENT_NAME)
|
|
56
61
|
if agent_name is None:
|
|
57
|
-
return "claude_code_proxy_1.aid.pub"
|
|
58
|
-
#return "claude_code_proxy.aid.pub"
|
|
62
|
+
return "claude_code_proxy_1.aid.pub"
|
|
59
63
|
return agent_name
|
|
60
64
|
|
|
61
65
|
@staticmethod
|
|
62
66
|
def get_gemini_agent_name():
|
|
63
|
-
"""获取Gemini智能体名称"""
|
|
64
|
-
"""获取Gemini代理Agent名称,如果未设置则返回默认值"""
|
|
65
67
|
agent_name = configPresenter.getSetting(configPresenter.KEY_GEMINI_AGENT_NAME)
|
|
66
68
|
if agent_name is None:
|
|
67
|
-
return "gemini_proxy.aid.pub"
|
|
69
|
+
return "gemini_proxy.aid.pub"
|
|
68
70
|
return agent_name
|
|
69
71
|
|
|
70
|
-
|
|
71
72
|
@staticmethod
|
|
72
|
-
def get_config_file_path(workspaceName
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
config_dir = configPresenter.get_config_dir()
|
|
77
|
-
return os.path.join(config_dir, "key_value_store.json")
|
|
78
|
-
else:
|
|
79
|
-
from evol.presenter.workPresenter import workPresenter
|
|
80
|
-
workspace = workPresenter.get_evol_workspace_path(workspaceName)
|
|
81
|
-
return os.path.join(workspace, "key_value_store.json")
|
|
73
|
+
def get_config_file_path(workspaceName=""):
|
|
74
|
+
configPresenter.ensure_config_dir()
|
|
75
|
+
config_dir = configPresenter.get_config_dir()
|
|
76
|
+
return os.path.join(config_dir, "key_value_store.json")
|
|
82
77
|
|
|
83
78
|
@staticmethod
|
|
84
|
-
def getSetting(key,workspaceName
|
|
85
|
-
"""
|
|
86
|
-
从本地文件读取指定键的值
|
|
87
|
-
"""
|
|
79
|
+
def getSetting(key, workspaceName=""):
|
|
88
80
|
filepath = configPresenter.get_config_file_path(workspaceName)
|
|
89
81
|
try:
|
|
90
82
|
with open(filepath, "r", encoding="utf-8") as f:
|
|
91
83
|
content = f.read().strip()
|
|
92
|
-
if not content:
|
|
84
|
+
if not content:
|
|
93
85
|
return None
|
|
94
86
|
data = json.loads(content)
|
|
95
|
-
|
|
96
|
-
return value
|
|
87
|
+
return data.get(key)
|
|
97
88
|
except FileNotFoundError:
|
|
98
89
|
return None
|
|
99
|
-
except json.JSONDecodeError
|
|
100
|
-
logger.error(f"JSON格式错误: {e}")
|
|
101
|
-
# 如果JSON格式错误,重新创建一个空的配置文件
|
|
90
|
+
except json.JSONDecodeError:
|
|
102
91
|
try:
|
|
103
92
|
with open(filepath, "w", encoding="utf-8") as f:
|
|
104
93
|
json.dump({}, f, indent=4, ensure_ascii=False)
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
logger.error(f"重新创建配置文件失败: {write_error}")
|
|
94
|
+
except Exception:
|
|
95
|
+
pass
|
|
108
96
|
return None
|
|
109
|
-
except Exception
|
|
110
|
-
logger.exception(f"读取设置时出错: {e}")
|
|
97
|
+
except Exception:
|
|
111
98
|
return None
|
|
112
99
|
|
|
113
100
|
@staticmethod
|
|
114
|
-
def setSetting(key, value,workspaceName
|
|
115
|
-
"""
|
|
116
|
-
将键值对存储到本地文件(线程安全版本)
|
|
117
|
-
"""
|
|
118
|
-
logger.info(f"开始保存设置: {key} = {value}")
|
|
101
|
+
def setSetting(key, value, workspaceName=""):
|
|
119
102
|
try:
|
|
120
|
-
with configPresenter._lock:
|
|
103
|
+
with configPresenter._lock:
|
|
121
104
|
filepath = configPresenter.get_config_file_path(workspaceName)
|
|
122
105
|
if not os.path.exists(filepath):
|
|
123
106
|
with open(filepath, "w", encoding="utf-8") as f:
|
|
124
107
|
json.dump({}, f, indent=4, ensure_ascii=False)
|
|
125
108
|
|
|
126
|
-
# 读取现有数据
|
|
127
109
|
try:
|
|
128
110
|
with open(filepath, "r", encoding="utf-8") as f:
|
|
129
111
|
data = json.load(f)
|
|
130
112
|
except (json.JSONDecodeError, FileNotFoundError):
|
|
131
113
|
data = {}
|
|
132
114
|
|
|
133
|
-
# 更新数据
|
|
134
|
-
old_value = data.get(key, "未设置")
|
|
135
115
|
data[key] = value
|
|
136
116
|
|
|
137
|
-
# 写回文件
|
|
138
117
|
with open(filepath, "w", encoding="utf-8") as f:
|
|
139
118
|
json.dump(data, f, indent=4, ensure_ascii=False)
|
|
140
119
|
except Exception as e:
|
|
141
120
|
logger.exception(f"保存设置时出错: {e}")
|
|
142
121
|
return False
|
|
143
122
|
return True
|
|
144
|
-
|
|
145
|
-
@staticmethod
|
|
146
|
-
def setCurrentModelInfo(workspaceName,modelId,providerId):
|
|
147
|
-
configPresenter.setSetting("currentModel", modelId,workspaceName)
|
|
148
|
-
configPresenter.setSetting("currentProvider", providerId,workspaceName)
|
|
149
|
-
|
|
150
|
-
@staticmethod
|
|
151
|
-
def getCurrentModelInfo(workspaceName):
|
|
152
|
-
currentModel = configPresenter.getSetting("currentModel",workspaceName)
|
|
153
|
-
currentProvider = configPresenter.getSetting("currentProvider",workspaceName)
|
|
154
|
-
return {"modelId": currentModel, "providerId": currentProvider}
|
|
155
|
-
|
|
156
|
-
@staticmethod
|
|
157
|
-
def setProviderById(key,value):
|
|
158
|
-
pass
|
|
159
|
-
|
|
160
|
-
@staticmethod
|
|
161
|
-
def deleteProviders(id):
|
|
162
|
-
pass
|
|
163
123
|
|
|
164
124
|
@staticmethod
|
|
165
|
-
def
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
def get_fsss2_file_path():
|
|
170
|
-
"""获取fsss2文件的完整路径(用于存储token)"""
|
|
171
|
-
configPresenter.ensure_config_dir()
|
|
172
|
-
config_dir = configPresenter.get_config_dir()
|
|
173
|
-
return os.path.join(config_dir, "fsss2")
|
|
125
|
+
def set_evol_token(token: str):
|
|
126
|
+
"""由 auth_bridge 注入 evol_token"""
|
|
127
|
+
with configPresenter._evol_token_lock:
|
|
128
|
+
configPresenter._evol_token = token
|
|
174
129
|
|
|
175
130
|
@staticmethod
|
|
176
131
|
def get_token():
|
|
177
|
-
"""
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
2. 如果没读取到,再读取原来位置的token
|
|
182
|
-
3. 如果原位置有token,写入fsss2文件再返回
|
|
183
|
-
"""
|
|
184
|
-
fsss2_path = configPresenter.get_fsss2_file_path()
|
|
132
|
+
"""获取 token - 优先从 auth_bridge 注入的值获取"""
|
|
133
|
+
with configPresenter._evol_token_lock:
|
|
134
|
+
if configPresenter._evol_token:
|
|
135
|
+
return configPresenter._evol_token
|
|
185
136
|
|
|
186
|
-
#
|
|
137
|
+
# 回退到文件
|
|
138
|
+
fsss2_path = configPresenter.get_fsss2_file_path()
|
|
187
139
|
try:
|
|
188
140
|
with open(fsss2_path, "r", encoding="utf-8") as f:
|
|
189
141
|
token = f.read().strip()
|
|
@@ -191,1091 +143,92 @@ class configPresenter:
|
|
|
191
143
|
return token
|
|
192
144
|
except FileNotFoundError:
|
|
193
145
|
pass
|
|
194
|
-
except Exception
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
# 2. fsss2没读到,尝试从原位置读取
|
|
198
|
-
old_token = configPresenter.getSetting("token")
|
|
199
|
-
if old_token:
|
|
200
|
-
# 3. 原位置有token,写入fsss2文件
|
|
201
|
-
try:
|
|
202
|
-
with open(fsss2_path, "w", encoding="utf-8") as f:
|
|
203
|
-
f.write(old_token)
|
|
204
|
-
logger.info("已将token从原位置迁移到fsss2文件")
|
|
205
|
-
except Exception as e:
|
|
206
|
-
logger.error(f"迁移token到fsss2文件时出错: {e}")
|
|
207
|
-
return old_token
|
|
146
|
+
except Exception:
|
|
147
|
+
pass
|
|
208
148
|
|
|
209
|
-
return
|
|
149
|
+
return configPresenter.getSetting("token")
|
|
210
150
|
|
|
211
151
|
@staticmethod
|
|
212
152
|
def set_token(token: str):
|
|
213
|
-
"""
|
|
214
|
-
设置token(写入fsss2文件)
|
|
215
|
-
如果token为空或None,删除fsss2文件以清除token
|
|
216
|
-
"""
|
|
217
153
|
fsss2_path = configPresenter.get_fsss2_file_path()
|
|
218
|
-
|
|
219
|
-
# 如果token为空,删除文件以清除token
|
|
220
154
|
if not token:
|
|
221
155
|
try:
|
|
222
156
|
if os.path.exists(fsss2_path):
|
|
223
157
|
os.remove(fsss2_path)
|
|
224
|
-
logger.info("token已清除(fsss2文件已删除)")
|
|
225
158
|
return True
|
|
226
|
-
except Exception
|
|
227
|
-
logger.exception(f"清除token时出错: {e}")
|
|
159
|
+
except Exception:
|
|
228
160
|
return False
|
|
229
161
|
|
|
230
162
|
try:
|
|
231
163
|
with open(fsss2_path, "w", encoding="utf-8") as f:
|
|
232
164
|
f.write(token)
|
|
233
|
-
logger.info("token已保存到fsss2文件")
|
|
234
165
|
return True
|
|
235
|
-
except Exception as e:
|
|
236
|
-
logger.exception(f"保存token到fsss2文件时出错: {e}")
|
|
237
|
-
return False
|
|
238
|
-
|
|
239
|
-
@staticmethod
|
|
240
|
-
def set_account_info(username: str, password: str):
|
|
241
|
-
account_info = {"username": username, "password": password}
|
|
242
|
-
return configPresenter.setSetting("account_info", json.dumps(account_info))
|
|
243
|
-
|
|
244
|
-
@staticmethod
|
|
245
|
-
def get_account_info():
|
|
246
|
-
try:
|
|
247
|
-
user_info = configPresenter.getSetting("account_info")
|
|
248
|
-
if user_info is None:
|
|
249
|
-
return None
|
|
250
|
-
return json.loads(user_info)
|
|
251
|
-
except:
|
|
252
|
-
return None
|
|
253
|
-
|
|
254
|
-
@staticmethod
|
|
255
|
-
def set_user_info(aid: str, password: str):
|
|
256
|
-
user_info = {"aid": aid, "password": password}
|
|
257
|
-
return configPresenter.setSetting("user_info", json.dumps(user_info))
|
|
258
|
-
|
|
259
|
-
@staticmethod
|
|
260
|
-
def get_user_info():
|
|
261
|
-
try:
|
|
262
|
-
user_info = configPresenter.getSetting("user_info")
|
|
263
|
-
if user_info is None:
|
|
264
|
-
return None
|
|
265
|
-
return json.loads(user_info)
|
|
266
|
-
except:
|
|
267
|
-
return None
|
|
268
|
-
|
|
269
|
-
@staticmethod
|
|
270
|
-
def getSearchPreviewEnabled():
|
|
271
|
-
return configPresenter.searchPreviewEnabled
|
|
272
|
-
|
|
273
|
-
@staticmethod
|
|
274
|
-
def getCustomSearchEngines():
|
|
275
|
-
return 'baidu'
|
|
276
|
-
|
|
277
|
-
@staticmethod
|
|
278
|
-
def getProviders():
|
|
279
|
-
return []
|
|
280
|
-
|
|
281
|
-
@staticmethod
|
|
282
|
-
def getDefaultProviders():
|
|
283
|
-
return ""
|
|
284
|
-
|
|
285
|
-
@staticmethod
|
|
286
|
-
def getLanguage():
|
|
287
|
-
return "zh-CN"
|
|
288
|
-
|
|
289
|
-
@staticmethod
|
|
290
|
-
def getModelDefaultConfig(modal):
|
|
291
|
-
return "";
|
|
292
|
-
|
|
293
|
-
@staticmethod
|
|
294
|
-
def getArtifactsEffectEnabled():
|
|
295
|
-
return False
|
|
296
|
-
|
|
297
|
-
@staticmethod
|
|
298
|
-
def setProviderById(key,value):
|
|
299
|
-
pass
|
|
300
|
-
|
|
301
|
-
@staticmethod
|
|
302
|
-
def deleteProviders(id):
|
|
303
|
-
pass
|
|
304
|
-
|
|
305
|
-
@staticmethod
|
|
306
|
-
def addProviders(value):
|
|
307
|
-
pass
|
|
308
|
-
|
|
309
|
-
@staticmethod
|
|
310
|
-
def is_autostart_enabled():
|
|
311
|
-
return False
|
|
312
|
-
|
|
313
|
-
@staticmethod
|
|
314
|
-
def disable_autostart():
|
|
315
|
-
return False
|
|
316
|
-
|
|
317
|
-
@staticmethod
|
|
318
|
-
def enable_autostart():
|
|
319
|
-
return False
|
|
320
|
-
|
|
321
|
-
@staticmethod
|
|
322
|
-
def get_statistics_cache(workspace_name: str):
|
|
323
|
-
"""
|
|
324
|
-
获取工作空间统计数据缓存
|
|
325
|
-
|
|
326
|
-
Args:
|
|
327
|
-
workspace_name (str): 工作空间名称
|
|
328
|
-
|
|
329
|
-
Returns:
|
|
330
|
-
dict: 缓存数据,包含timestamp和data字段,如果没有缓存则返回None
|
|
331
|
-
"""
|
|
332
|
-
cache_key = f"statistics_cache_{workspace_name}"
|
|
333
|
-
return configPresenter.getSetting(cache_key, workspace_name)
|
|
334
|
-
|
|
335
|
-
@staticmethod
|
|
336
|
-
def set_statistics_cache(workspace_name: str, statistics_data: dict):
|
|
337
|
-
"""
|
|
338
|
-
设置工作空间统计数据缓存
|
|
339
|
-
|
|
340
|
-
Args:
|
|
341
|
-
workspace_name (str): 工作空间名称
|
|
342
|
-
statistics_data (dict): 统计数据
|
|
343
|
-
|
|
344
|
-
Returns:
|
|
345
|
-
bool: 是否设置成功
|
|
346
|
-
"""
|
|
347
|
-
cache_key = f"statistics_cache_{workspace_name}"
|
|
348
|
-
cache_data = {
|
|
349
|
-
"timestamp": time.time(),
|
|
350
|
-
"data": statistics_data
|
|
351
|
-
}
|
|
352
|
-
return configPresenter.setSetting(cache_key, cache_data, workspace_name)
|
|
353
|
-
|
|
354
|
-
@staticmethod
|
|
355
|
-
def is_statistics_cache_valid(workspace_name: str, cache_timeout: int = 300):
|
|
356
|
-
"""
|
|
357
|
-
检查统计数据缓存是否有效(默认5分钟过期)
|
|
358
|
-
|
|
359
|
-
Args:
|
|
360
|
-
workspace_name (str): 工作空间名称
|
|
361
|
-
cache_timeout (int): 缓存超时时间(秒),默认300秒(5分钟)
|
|
362
|
-
|
|
363
|
-
Returns:
|
|
364
|
-
bool: 缓存是否有效
|
|
365
|
-
"""
|
|
366
|
-
cache_data = configPresenter.get_statistics_cache(workspace_name)
|
|
367
|
-
if not cache_data or not isinstance(cache_data, dict):
|
|
368
|
-
return False
|
|
369
|
-
|
|
370
|
-
timestamp = cache_data.get("timestamp")
|
|
371
|
-
if not timestamp:
|
|
372
|
-
return False
|
|
373
|
-
|
|
374
|
-
current_time = time.time()
|
|
375
|
-
return (current_time - timestamp) < cache_timeout
|
|
376
|
-
|
|
377
|
-
@staticmethod
|
|
378
|
-
def get_default_download_path():
|
|
379
|
-
"""
|
|
380
|
-
获取系统默认下载路径
|
|
381
|
-
|
|
382
|
-
Returns:
|
|
383
|
-
str: 默认下载路径
|
|
384
|
-
"""
|
|
385
|
-
import platform
|
|
386
|
-
|
|
387
|
-
if platform.system() == "Windows":
|
|
388
|
-
# Windows系统下载路径
|
|
389
|
-
downloads_path = os.path.join(os.path.expanduser("~"), "Downloads")
|
|
390
|
-
elif platform.system() == "Darwin": # macOS
|
|
391
|
-
downloads_path = os.path.join(os.path.expanduser("~"), "Downloads")
|
|
392
|
-
else: # Linux
|
|
393
|
-
downloads_path = os.path.join(os.path.expanduser("~"), "Downloads")
|
|
394
|
-
|
|
395
|
-
# 确保路径存在
|
|
396
|
-
if not os.path.exists(downloads_path):
|
|
397
|
-
try:
|
|
398
|
-
os.makedirs(downloads_path, exist_ok=True)
|
|
399
|
-
except Exception as e:
|
|
400
|
-
logger.error(f"创建下载目录失败: {e}")
|
|
401
|
-
# 降级到用户主目录
|
|
402
|
-
downloads_path = os.path.expanduser("~")
|
|
403
|
-
|
|
404
|
-
return downloads_path
|
|
405
|
-
|
|
406
|
-
@staticmethod
|
|
407
|
-
def get_download_path():
|
|
408
|
-
"""
|
|
409
|
-
获取下载路径设置,如果没有设置则返回系统默认下载路径
|
|
410
|
-
|
|
411
|
-
Returns:
|
|
412
|
-
str: 下载路径
|
|
413
|
-
"""
|
|
414
|
-
download_path = configPresenter.getSetting("download_path")
|
|
415
|
-
if not download_path:
|
|
416
|
-
# 如果没有设置,获取系统默认下载路径并保存
|
|
417
|
-
default_path = configPresenter.get_default_download_path()
|
|
418
|
-
configPresenter.set_download_path(default_path)
|
|
419
|
-
return default_path
|
|
420
|
-
return download_path
|
|
421
|
-
|
|
422
|
-
@staticmethod
|
|
423
|
-
def set_download_path(path: str):
|
|
424
|
-
"""
|
|
425
|
-
设置下载路径
|
|
426
|
-
|
|
427
|
-
Args:
|
|
428
|
-
path (str): 下载路径
|
|
429
|
-
|
|
430
|
-
Returns:
|
|
431
|
-
bool: 是否设置成功
|
|
432
|
-
"""
|
|
433
|
-
return configPresenter.setSetting("download_path", path)
|
|
434
|
-
|
|
435
|
-
# ============ 默认工作空间路径配置 ============
|
|
436
|
-
|
|
437
|
-
@staticmethod
|
|
438
|
-
def get_default_workspace_path():
|
|
439
|
-
"""
|
|
440
|
-
获取默认工作空间路径
|
|
441
|
-
|
|
442
|
-
Returns:
|
|
443
|
-
str: 默认工作空间路径,如果未设置则返回None
|
|
444
|
-
"""
|
|
445
|
-
return configPresenter.getSetting("default_workspace_path")
|
|
446
|
-
|
|
447
|
-
@staticmethod
|
|
448
|
-
def get_default_workspace_base_path():
|
|
449
|
-
"""
|
|
450
|
-
获取默认工作空间基础路径(系统默认路径)
|
|
451
|
-
|
|
452
|
-
Returns:
|
|
453
|
-
str: 默认工作空间基础路径
|
|
454
|
-
"""
|
|
455
|
-
return os.path.join(configPresenter.get_config_dir(), "workspace")
|
|
456
|
-
|
|
457
|
-
@staticmethod
|
|
458
|
-
def set_default_workspace_path(path: str):
|
|
459
|
-
"""
|
|
460
|
-
设置默认工作空间路径
|
|
461
|
-
|
|
462
|
-
Args:
|
|
463
|
-
path (str): 默认工作空间路径
|
|
464
|
-
|
|
465
|
-
Returns:
|
|
466
|
-
bool: 是否设置成功
|
|
467
|
-
"""
|
|
468
|
-
return configPresenter.setSetting("default_workspace_path", path)
|
|
469
|
-
|
|
470
|
-
# ============ AI 网关配置管理 ============
|
|
471
|
-
|
|
472
|
-
KEY_AI_GATEWAY_TYPE = "ai_gateway_type"
|
|
473
|
-
KEY_AI_GATEWAY_CONFIGS = "ai_gateway_configs"
|
|
474
|
-
|
|
475
|
-
# 默认网关配置
|
|
476
|
-
DEFAULT_GATEWAY_CONFIGS = {
|
|
477
|
-
"local": {
|
|
478
|
-
"type": "local",
|
|
479
|
-
"name": "本地网关",
|
|
480
|
-
"description": "使用本地 ModelGate 服务",
|
|
481
|
-
"baseUrl": "http://127.0.0.1:13148",
|
|
482
|
-
"apiVersion": "/v1",
|
|
483
|
-
"timeout": 30000,
|
|
484
|
-
"retryCount": 3,
|
|
485
|
-
"enabled": True
|
|
486
|
-
},
|
|
487
|
-
"cloud": {
|
|
488
|
-
"type": "cloud",
|
|
489
|
-
"name": "Evol 网关",
|
|
490
|
-
"description": "使用 Evol 云端服务",
|
|
491
|
-
# 兜底配置,实际云端地址会由 userPresenter 的网关信息覆盖
|
|
492
|
-
"baseUrl": "https://mg-new.evolai.cn",
|
|
493
|
-
"apiVersion": "/v1",
|
|
494
|
-
"timeout": 30000,
|
|
495
|
-
"retryCount": 3,
|
|
496
|
-
"enabled": True
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
@staticmethod
|
|
501
|
-
def get_gateway_type():
|
|
502
|
-
"""
|
|
503
|
-
获取当前网关类型
|
|
504
|
-
|
|
505
|
-
Returns:
|
|
506
|
-
str: 'local' 或 'cloud',默认 'cloud'
|
|
507
|
-
"""
|
|
508
|
-
gateway_type = configPresenter.getSetting(configPresenter.KEY_AI_GATEWAY_TYPE)
|
|
509
|
-
if not gateway_type:
|
|
510
|
-
# 默认使用云端网关
|
|
511
|
-
configPresenter.set_gateway_type("cloud")
|
|
512
|
-
return "cloud"
|
|
513
|
-
return gateway_type
|
|
514
|
-
|
|
515
|
-
@staticmethod
|
|
516
|
-
def set_gateway_type(gateway_type: str):
|
|
517
|
-
"""
|
|
518
|
-
设置当前网关类型
|
|
519
|
-
|
|
520
|
-
Args:
|
|
521
|
-
gateway_type (str): 'local', 'cloud', 或 'custom-{id}'
|
|
522
|
-
|
|
523
|
-
Returns:
|
|
524
|
-
bool: 是否设置成功
|
|
525
|
-
"""
|
|
526
|
-
# 验证网关类型
|
|
527
|
-
if gateway_type in ["local", "cloud"]:
|
|
528
|
-
# 预设网关,直接设置
|
|
529
|
-
logger.info(f"Setting gateway type to: {gateway_type}")
|
|
530
|
-
return configPresenter.setSetting(configPresenter.KEY_AI_GATEWAY_TYPE, gateway_type)
|
|
531
|
-
elif gateway_type.startswith("custom-"):
|
|
532
|
-
# 自定义网关,验证是否存在
|
|
533
|
-
gateway_id = gateway_type.replace("custom-", "")
|
|
534
|
-
custom_gateway = configPresenter.get_custom_gateway(gateway_id)
|
|
535
|
-
if custom_gateway:
|
|
536
|
-
logger.info(f"Setting gateway type to custom: {gateway_id}")
|
|
537
|
-
return configPresenter.setSetting(configPresenter.KEY_AI_GATEWAY_TYPE, gateway_type)
|
|
538
|
-
else:
|
|
539
|
-
logger.error(f"Custom gateway not found: {gateway_id}")
|
|
540
|
-
return False
|
|
541
|
-
else:
|
|
542
|
-
logger.error(f"Invalid gateway type: {gateway_type}")
|
|
543
|
-
return False
|
|
544
|
-
|
|
545
|
-
@staticmethod
|
|
546
|
-
def get_gateway_configs():
|
|
547
|
-
"""
|
|
548
|
-
获取所有网关配置
|
|
549
|
-
|
|
550
|
-
Returns:
|
|
551
|
-
dict: 所有网关配置
|
|
552
|
-
"""
|
|
553
|
-
#configs = configPresenter.getSetting(configPresenter.KEY_AI_GATEWAY_CONFIGS)
|
|
554
|
-
#if not configs:
|
|
555
|
-
# 首次使用,保存默认配置
|
|
556
|
-
configPresenter.set_gateway_configs(configPresenter.DEFAULT_GATEWAY_CONFIGS)
|
|
557
|
-
return configPresenter.DEFAULT_GATEWAY_CONFIGS
|
|
558
|
-
#return configs
|
|
559
|
-
|
|
560
|
-
@staticmethod
|
|
561
|
-
def _apply_cloud_gateway_info(config: dict) -> dict:
|
|
562
|
-
if not isinstance(config, dict):
|
|
563
|
-
return config
|
|
564
|
-
|
|
565
|
-
try:
|
|
566
|
-
from .userPresenter import userPresenter
|
|
567
|
-
|
|
568
|
-
result = userPresenter.get_cloud_gateway_info()
|
|
569
|
-
gateway_info = None
|
|
570
|
-
if isinstance(result, dict):
|
|
571
|
-
gateway_info = result.get("gateway_info")
|
|
572
|
-
|
|
573
|
-
if isinstance(gateway_info, dict):
|
|
574
|
-
base_url = gateway_info.get("modelBaseUrl") or gateway_info.get("apiUrl")
|
|
575
|
-
if base_url:
|
|
576
|
-
updated = dict(config)
|
|
577
|
-
updated["baseUrl"] = base_url
|
|
578
|
-
return updated
|
|
579
166
|
except Exception:
|
|
580
|
-
return config
|
|
581
|
-
|
|
582
|
-
return config
|
|
583
|
-
|
|
584
|
-
@staticmethod
|
|
585
|
-
def set_gateway_configs(configs: dict):
|
|
586
|
-
"""
|
|
587
|
-
设置所有网关配置
|
|
588
|
-
|
|
589
|
-
Args:
|
|
590
|
-
configs (dict): 网关配置字典
|
|
591
|
-
|
|
592
|
-
Returns:
|
|
593
|
-
bool: 是否设置成功
|
|
594
|
-
"""
|
|
595
|
-
return configPresenter.setSetting(configPresenter.KEY_AI_GATEWAY_CONFIGS, configs)
|
|
596
|
-
|
|
597
|
-
@staticmethod
|
|
598
|
-
def get_gateway_config(gateway_type: str = None):
|
|
599
|
-
"""
|
|
600
|
-
获取指定网关的配置(支持自定义网关)
|
|
601
|
-
|
|
602
|
-
Args:
|
|
603
|
-
gateway_type (str): 网关类型,不传则使用当前网关
|
|
604
|
-
|
|
605
|
-
Returns:
|
|
606
|
-
dict: 网关配置
|
|
607
|
-
"""
|
|
608
|
-
if not gateway_type:
|
|
609
|
-
gateway_type = configPresenter.get_gateway_type()
|
|
610
|
-
|
|
611
|
-
# 检查是否为自定义网关
|
|
612
|
-
if gateway_type and gateway_type.startswith("custom-"):
|
|
613
|
-
gateway_id = gateway_type.replace("custom-", "")
|
|
614
|
-
custom_config = configPresenter.get_custom_gateway(gateway_id)
|
|
615
|
-
if custom_config:
|
|
616
|
-
logger.debug(f"Using custom gateway config: {gateway_id}")
|
|
617
|
-
return custom_config
|
|
618
|
-
else:
|
|
619
|
-
logger.warning(f"Custom gateway not found: {gateway_id}, using default cloud gateway")
|
|
620
|
-
return configPresenter.DEFAULT_GATEWAY_CONFIGS.get("cloud", {})
|
|
621
|
-
|
|
622
|
-
# 原有逻辑:本地或云端网关
|
|
623
|
-
configs = configPresenter.get_gateway_configs()
|
|
624
|
-
config = configs.get(gateway_type)
|
|
625
|
-
|
|
626
|
-
if not config:
|
|
627
|
-
logger.warning(f"Gateway config not found: {gateway_type}, using default")
|
|
628
|
-
return configPresenter.DEFAULT_GATEWAY_CONFIGS.get(gateway_type, {})
|
|
629
|
-
|
|
630
|
-
if gateway_type == "cloud":
|
|
631
|
-
return configPresenter._apply_cloud_gateway_info(config)
|
|
632
|
-
|
|
633
|
-
return config
|
|
634
|
-
|
|
635
|
-
@staticmethod
|
|
636
|
-
def get_current_gateway_base_url():
|
|
637
|
-
"""
|
|
638
|
-
获取当前网关的 Base URL
|
|
639
|
-
|
|
640
|
-
Returns:
|
|
641
|
-
str: 当前网关的基础 URL
|
|
642
|
-
"""
|
|
643
|
-
config = configPresenter.get_gateway_config()
|
|
644
|
-
return config.get("baseUrl", "http://127.0.0.1:13148")
|
|
645
|
-
|
|
646
|
-
@staticmethod
|
|
647
|
-
def get_current_gateway_api_url():
|
|
648
|
-
"""
|
|
649
|
-
获取当前网关的 API URL(含版本)
|
|
650
|
-
|
|
651
|
-
Returns:
|
|
652
|
-
str: 当前网关的 API URL
|
|
653
|
-
"""
|
|
654
|
-
config = configPresenter.get_gateway_config()
|
|
655
|
-
base_url = config.get("baseUrl", "http://127.0.0.1:13148")
|
|
656
|
-
api_version = config.get("apiVersion", "/v1")
|
|
657
|
-
return f"{base_url}{api_version}"
|
|
658
|
-
|
|
659
|
-
@staticmethod
|
|
660
|
-
def get_current_gateway_api_key():
|
|
661
|
-
"""
|
|
662
|
-
获取当前网关的 API Key
|
|
663
|
-
|
|
664
|
-
Returns:
|
|
665
|
-
str: 当前网关的 API Key,如果没有则返回空字符串
|
|
666
|
-
"""
|
|
667
|
-
config = configPresenter.get_gateway_config()
|
|
668
|
-
return config.get("apiKey", "")
|
|
669
|
-
|
|
670
|
-
@staticmethod
|
|
671
|
-
def build_gateway_url(endpoint: str, include_version: bool = True, gateway_type: str = None):
|
|
672
|
-
"""
|
|
673
|
-
构建完整的网关端点 URL
|
|
674
|
-
|
|
675
|
-
Args:
|
|
676
|
-
endpoint (str): 端点路径
|
|
677
|
-
include_version (bool): 是否包含版本号
|
|
678
|
-
gateway_type (str): 网关类型,不传则使用当前网关
|
|
679
|
-
|
|
680
|
-
Returns:
|
|
681
|
-
str: 完整的 URL
|
|
682
|
-
"""
|
|
683
|
-
config = configPresenter.get_gateway_config(gateway_type)
|
|
684
|
-
base_url = config.get("baseUrl", "http://127.0.0.1:13148")
|
|
685
|
-
|
|
686
|
-
if include_version:
|
|
687
|
-
api_version = config.get("apiVersion", "/v1")
|
|
688
|
-
base = f"{base_url}{api_version}"
|
|
689
|
-
else:
|
|
690
|
-
base = base_url
|
|
691
|
-
|
|
692
|
-
# 确保 endpoint 以 / 开头
|
|
693
|
-
if not endpoint.startswith("/"):
|
|
694
|
-
endpoint = f"/{endpoint}"
|
|
695
|
-
|
|
696
|
-
return f"{base}{endpoint}"
|
|
697
|
-
|
|
698
|
-
# ============ 自定义网关管理 ============
|
|
699
|
-
|
|
700
|
-
KEY_CUSTOM_GATEWAYS = "custom_gateways"
|
|
701
|
-
|
|
702
|
-
@staticmethod
|
|
703
|
-
def get_custom_gateways():
|
|
704
|
-
"""
|
|
705
|
-
获取所有自定义网关配置
|
|
706
|
-
|
|
707
|
-
Returns:
|
|
708
|
-
dict: 自定义网关配置字典,格式为 {gateway_id: config}
|
|
709
|
-
"""
|
|
710
|
-
gateways = configPresenter.getSetting(configPresenter.KEY_CUSTOM_GATEWAYS)
|
|
711
|
-
return gateways if gateways else {}
|
|
712
|
-
|
|
713
|
-
@staticmethod
|
|
714
|
-
def add_custom_gateway(config=None):
|
|
715
|
-
"""
|
|
716
|
-
添加自定义网关
|
|
717
|
-
|
|
718
|
-
Args:
|
|
719
|
-
config (dict): 网关配置,包含 name, baseUrl, apiKey, apiType 等字段
|
|
720
|
-
|
|
721
|
-
Returns:
|
|
722
|
-
dict: {"success": bool, "id": str} 添加结果
|
|
723
|
-
"""
|
|
724
|
-
import uuid
|
|
725
|
-
|
|
726
|
-
try:
|
|
727
|
-
logger.info(f"add_custom_gateway called with config: {config}")
|
|
728
|
-
logger.info(f"config type: {type(config)}")
|
|
729
|
-
|
|
730
|
-
if config is None:
|
|
731
|
-
logger.error("Config is None!")
|
|
732
|
-
return {"success": False, "id": "", "error": "Config is None"}
|
|
733
|
-
|
|
734
|
-
if not isinstance(config, dict):
|
|
735
|
-
logger.error(f"Config is not a dict, it's {type(config)}")
|
|
736
|
-
return {"success": False, "id": "", "error": f"Config must be dict, got {type(config)}"}
|
|
737
|
-
|
|
738
|
-
# 生成唯一ID
|
|
739
|
-
gateway_id = str(uuid.uuid4())[:8]
|
|
740
|
-
|
|
741
|
-
gateways = configPresenter.get_custom_gateways()
|
|
742
|
-
|
|
743
|
-
# 根据API类型确定API版本
|
|
744
|
-
api_type = config.get("apiType", "openai")
|
|
745
|
-
api_version = "/v1" # OpenAI风格默认使用 /v1
|
|
746
|
-
|
|
747
|
-
# 构建完整的网关配置
|
|
748
|
-
gateways[gateway_id] = {
|
|
749
|
-
"id": gateway_id,
|
|
750
|
-
"type": f"custom-{gateway_id}",
|
|
751
|
-
"name": config.get("name", "自定义网关"),
|
|
752
|
-
"description": config.get("description", f"自定义网关 - {config.get('baseUrl', '')}"),
|
|
753
|
-
"baseUrl": config.get("baseUrl", ""),
|
|
754
|
-
"apiKey": config.get("apiKey", ""),
|
|
755
|
-
"apiType": api_type,
|
|
756
|
-
"apiVersion": api_version, # 根据API类型自动设置
|
|
757
|
-
"timeout": config.get("timeout", 30000),
|
|
758
|
-
"retryCount": config.get("retryCount", 3),
|
|
759
|
-
"enabled": True,
|
|
760
|
-
"isCustom": True,
|
|
761
|
-
"createdAt": time.strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
762
|
-
}
|
|
763
|
-
|
|
764
|
-
success = configPresenter.setSetting(configPresenter.KEY_CUSTOM_GATEWAYS, gateways)
|
|
765
|
-
|
|
766
|
-
if success:
|
|
767
|
-
logger.info(f"Added custom gateway: {gateway_id} - {config.get('name')} (API Type: {api_type})")
|
|
768
|
-
else:
|
|
769
|
-
logger.error(f"Failed to add custom gateway: {config.get('name')}")
|
|
770
|
-
|
|
771
|
-
return {"success": success, "id": gateway_id}
|
|
772
|
-
except Exception as e:
|
|
773
|
-
logger.exception(f"Exception in add_custom_gateway: {e}")
|
|
774
|
-
return {"success": False, "id": "", "error": str(e)}
|
|
775
|
-
|
|
776
|
-
@staticmethod
|
|
777
|
-
def update_custom_gateway(gateway_id: str, config: dict):
|
|
778
|
-
"""
|
|
779
|
-
更新自定义网关配置
|
|
780
|
-
|
|
781
|
-
Args:
|
|
782
|
-
gateway_id (str): 网关ID
|
|
783
|
-
config (dict): 要更新的配置字段
|
|
784
|
-
|
|
785
|
-
Returns:
|
|
786
|
-
bool: 是否更新成功
|
|
787
|
-
"""
|
|
788
|
-
gateways = configPresenter.get_custom_gateways()
|
|
789
|
-
|
|
790
|
-
if gateway_id not in gateways:
|
|
791
|
-
logger.error(f"Custom gateway not found: {gateway_id}")
|
|
792
|
-
return False
|
|
793
|
-
|
|
794
|
-
# 保留原有的ID、类型和创建时间
|
|
795
|
-
original = gateways[gateway_id]
|
|
796
|
-
|
|
797
|
-
# 如果更新了apiType,需要更新对应的apiVersion
|
|
798
|
-
if "apiType" in config:
|
|
799
|
-
api_type = config.get("apiType", "openai")
|
|
800
|
-
config["apiVersion"] = "/v1" # OpenAI风格使用 /v1
|
|
801
|
-
|
|
802
|
-
# 更新配置(合并新旧配置)
|
|
803
|
-
updated_config = {
|
|
804
|
-
**original,
|
|
805
|
-
**config,
|
|
806
|
-
"id": gateway_id, # 确保ID不变
|
|
807
|
-
"type": f"custom-{gateway_id}", # 确保type不变
|
|
808
|
-
"createdAt": original.get("createdAt"), # 确保创建时间不变
|
|
809
|
-
"isCustom": True # 确保isCustom标记不变
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
gateways[gateway_id] = updated_config
|
|
813
|
-
|
|
814
|
-
success = configPresenter.setSetting(configPresenter.KEY_CUSTOM_GATEWAYS, gateways)
|
|
815
|
-
|
|
816
|
-
if success:
|
|
817
|
-
logger.info(f"Updated custom gateway: {gateway_id} (API Type: {updated_config.get('apiType', 'openai')})")
|
|
818
|
-
else:
|
|
819
|
-
logger.error(f"Failed to update custom gateway: {gateway_id}")
|
|
820
|
-
|
|
821
|
-
return success
|
|
822
|
-
|
|
823
|
-
@staticmethod
|
|
824
|
-
def delete_custom_gateway(gateway_id: str):
|
|
825
|
-
"""
|
|
826
|
-
删除自定义网关
|
|
827
|
-
|
|
828
|
-
Args:
|
|
829
|
-
gateway_id (str): 网关ID
|
|
830
|
-
|
|
831
|
-
Returns:
|
|
832
|
-
bool: 是否删除成功
|
|
833
|
-
"""
|
|
834
|
-
gateways = configPresenter.get_custom_gateways()
|
|
835
|
-
|
|
836
|
-
if gateway_id not in gateways:
|
|
837
|
-
logger.warning(f"Custom gateway not found for deletion: {gateway_id}")
|
|
838
|
-
return False
|
|
839
|
-
|
|
840
|
-
# 检查是否正在使用该网关
|
|
841
|
-
current_gateway_type = configPresenter.get_gateway_type()
|
|
842
|
-
if current_gateway_type == f"custom-{gateway_id}":
|
|
843
|
-
logger.warning(f"Cannot delete custom gateway {gateway_id}: currently in use")
|
|
844
|
-
# 自动切换到云端网关
|
|
845
|
-
configPresenter.set_gateway_type("cloud")
|
|
846
|
-
logger.info("Switched to cloud gateway")
|
|
847
|
-
|
|
848
|
-
del gateways[gateway_id]
|
|
849
|
-
|
|
850
|
-
success = configPresenter.setSetting(configPresenter.KEY_CUSTOM_GATEWAYS, gateways)
|
|
851
|
-
|
|
852
|
-
if success:
|
|
853
|
-
logger.info(f"Deleted custom gateway: {gateway_id}")
|
|
854
|
-
else:
|
|
855
|
-
logger.error(f"Failed to delete custom gateway: {gateway_id}")
|
|
856
|
-
|
|
857
|
-
return success
|
|
858
|
-
|
|
859
|
-
@staticmethod
|
|
860
|
-
def get_custom_gateway(gateway_id: str):
|
|
861
|
-
"""
|
|
862
|
-
获取指定的自定义网关配置
|
|
863
|
-
|
|
864
|
-
Args:
|
|
865
|
-
gateway_id (str): 网关ID
|
|
866
|
-
|
|
867
|
-
Returns:
|
|
868
|
-
dict: 网关配置,如果不存在则返回None
|
|
869
|
-
"""
|
|
870
|
-
gateways = configPresenter.get_custom_gateways()
|
|
871
|
-
return gateways.get(gateway_id)
|
|
872
|
-
|
|
873
|
-
# ============ 应用设置配置管理 ============
|
|
874
|
-
|
|
875
|
-
KEY_APP_SETTINGS_HTTP_RULE = "app_settings_http_rule"
|
|
876
|
-
|
|
877
|
-
@staticmethod
|
|
878
|
-
def get_app_settings_http_rule():
|
|
879
|
-
"""
|
|
880
|
-
获取应用设置 - 允许局域网访问配置
|
|
881
|
-
|
|
882
|
-
Returns:
|
|
883
|
-
bool: True 允许局域网访问, False 不允许(默认)
|
|
884
|
-
"""
|
|
885
|
-
result = configPresenter.getSetting(configPresenter.KEY_APP_SETTINGS_HTTP_RULE)
|
|
886
|
-
if result is None:
|
|
887
167
|
return False
|
|
888
|
-
# 处理字符串类型的返回值
|
|
889
|
-
if isinstance(result, str):
|
|
890
|
-
return result.lower() == 'true'
|
|
891
|
-
return bool(result)
|
|
892
168
|
|
|
893
169
|
@staticmethod
|
|
894
|
-
def
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
Args:
|
|
899
|
-
enabled (bool): True 允许局域网访问, False 不允许
|
|
900
|
-
|
|
901
|
-
Returns:
|
|
902
|
-
bool: 是否设置成功
|
|
903
|
-
"""
|
|
904
|
-
return configPresenter.setSetting(configPresenter.KEY_APP_SETTINGS_HTTP_RULE, enabled)
|
|
905
|
-
|
|
906
|
-
# ============ 网络代理配置管理 ============
|
|
170
|
+
def get_fsss2_file_path():
|
|
171
|
+
configPresenter.ensure_config_dir()
|
|
172
|
+
config_dir = configPresenter.get_config_dir()
|
|
173
|
+
return os.path.join(config_dir, "fsss2")
|
|
907
174
|
|
|
908
|
-
#
|
|
909
|
-
_proxy_cache = None
|
|
175
|
+
# 代理相关配置
|
|
176
|
+
_proxy_cache = None
|
|
910
177
|
KEY_USE_SYSTEM_PROXY = "use_system_proxy"
|
|
911
178
|
|
|
912
179
|
@staticmethod
|
|
913
180
|
def get_use_system_proxy():
|
|
914
|
-
"""
|
|
915
|
-
获取是否使用系统代理配置(优先从内存缓存读取)
|
|
916
|
-
|
|
917
|
-
Returns:
|
|
918
|
-
bool: True 表示使用系统代理, False 表示不使用(默认)
|
|
919
|
-
"""
|
|
920
|
-
# 优先从缓存读取
|
|
921
181
|
if configPresenter._proxy_cache is not None:
|
|
922
182
|
return configPresenter._proxy_cache
|
|
923
|
-
|
|
924
|
-
# 从硬盘加载
|
|
925
183
|
result = configPresenter.getSetting(configPresenter.KEY_USE_SYSTEM_PROXY)
|
|
926
184
|
if result is None:
|
|
927
|
-
value = False
|
|
185
|
+
value = False
|
|
928
186
|
elif isinstance(result, str):
|
|
929
187
|
value = result.lower() == 'true'
|
|
930
188
|
else:
|
|
931
189
|
value = bool(result)
|
|
932
|
-
|
|
933
|
-
# 更新缓存
|
|
934
190
|
configPresenter._proxy_cache = value
|
|
935
191
|
return value
|
|
936
192
|
|
|
937
193
|
@staticmethod
|
|
938
194
|
def set_use_system_proxy(use_proxy: bool):
|
|
939
|
-
"""
|
|
940
|
-
设置是否使用系统代理配置(先更新内存,再写硬盘)
|
|
941
|
-
|
|
942
|
-
Args:
|
|
943
|
-
use_proxy (bool): True 表示使用系统代理, False 表示不使用
|
|
944
|
-
|
|
945
|
-
Returns:
|
|
946
|
-
bool: 是否设置成功
|
|
947
|
-
"""
|
|
948
|
-
# 1. 先更新内存缓存
|
|
949
195
|
configPresenter._proxy_cache = use_proxy
|
|
950
|
-
|
|
951
|
-
# 2. 再写硬盘
|
|
952
196
|
return configPresenter.setSetting(configPresenter.KEY_USE_SYSTEM_PROXY, use_proxy)
|
|
953
197
|
|
|
198
|
+
# 兼容性存根
|
|
954
199
|
@staticmethod
|
|
955
|
-
def
|
|
956
|
-
|
|
957
|
-
启动时加载代理配置到内存(可选调用,懒加载也可以)
|
|
958
|
-
|
|
959
|
-
Returns:
|
|
960
|
-
bool: 当前的代理配置值
|
|
961
|
-
"""
|
|
962
|
-
return configPresenter.get_use_system_proxy()
|
|
963
|
-
|
|
964
|
-
# ============ Tab-MCP 绑定配置管理 ============
|
|
965
|
-
|
|
966
|
-
KEY_TAB_MCP_BINDINGS = "tab_mcp_bindings"
|
|
967
|
-
|
|
968
|
-
# 默认Tab-MCP绑定配置(硬编码回退值)
|
|
969
|
-
# V1格式:字符串表示单个MCP名称
|
|
970
|
-
# 后续V2格式:对象可支持多MCP或SubAgent
|
|
971
|
-
DEFAULT_TAB_MCP_BINDINGS = {
|
|
972
|
-
"files": "Evol记忆",
|
|
973
|
-
"web": "Evol浏览器自动化",
|
|
974
|
-
"pdf": "PDF助手",
|
|
975
|
-
"excel": "Evol记忆",
|
|
976
|
-
"word": "Evol记忆",
|
|
977
|
-
"terminal": "Evol终端控制器",
|
|
978
|
-
}
|
|
200
|
+
def getSearchPreviewEnabled():
|
|
201
|
+
return False
|
|
979
202
|
|
|
980
203
|
@staticmethod
|
|
981
|
-
def
|
|
982
|
-
|
|
983
|
-
获取Tab-MCP绑定配置
|
|
984
|
-
|
|
985
|
-
Returns:
|
|
986
|
-
dict: Tab类型到MCP服务名称的映射,格式为 {tabType: mcpServerName}
|
|
987
|
-
"""
|
|
988
|
-
bindings = configPresenter.getSetting(configPresenter.KEY_TAB_MCP_BINDINGS)
|
|
989
|
-
if not bindings or not isinstance(bindings, dict):
|
|
990
|
-
# 返回默认配置
|
|
991
|
-
return dict(configPresenter.DEFAULT_TAB_MCP_BINDINGS)
|
|
992
|
-
# 合并默认值,确保新增的tabType有默认配置
|
|
993
|
-
return {**configPresenter.DEFAULT_TAB_MCP_BINDINGS, **bindings}
|
|
204
|
+
def getCustomSearchEngines():
|
|
205
|
+
return 'baidu'
|
|
994
206
|
|
|
995
207
|
@staticmethod
|
|
996
|
-
def
|
|
997
|
-
|
|
998
|
-
设置Tab-MCP绑定配置
|
|
999
|
-
|
|
1000
|
-
Args:
|
|
1001
|
-
bindings (dict): Tab类型到MCP服务名称的映射
|
|
1002
|
-
|
|
1003
|
-
Returns:
|
|
1004
|
-
bool: 是否设置成功
|
|
1005
|
-
"""
|
|
1006
|
-
return configPresenter.setSetting(configPresenter.KEY_TAB_MCP_BINDINGS, bindings)
|
|
208
|
+
def getProviders():
|
|
209
|
+
return []
|
|
1007
210
|
|
|
1008
211
|
@staticmethod
|
|
1009
|
-
def
|
|
1010
|
-
""
|
|
1011
|
-
获取指定Tab类型的默认MCP服务名称
|
|
1012
|
-
|
|
1013
|
-
Args:
|
|
1014
|
-
tab_type (str): Tab类型
|
|
1015
|
-
|
|
1016
|
-
Returns:
|
|
1017
|
-
str: MCP服务名称,如果未配置返回空字符串
|
|
1018
|
-
"""
|
|
1019
|
-
bindings = configPresenter.get_tab_mcp_bindings()
|
|
1020
|
-
return bindings.get(tab_type, "")
|
|
212
|
+
def getDefaultProviders():
|
|
213
|
+
return ""
|
|
1021
214
|
|
|
1022
215
|
@staticmethod
|
|
1023
|
-
def
|
|
1024
|
-
""
|
|
1025
|
-
设置指定Tab类型的MCP服务
|
|
1026
|
-
|
|
1027
|
-
Args:
|
|
1028
|
-
tab_type (str): Tab类型
|
|
1029
|
-
mcp_server_name (str): MCP服务名称,空字符串表示重置为默认值
|
|
1030
|
-
|
|
1031
|
-
Returns:
|
|
1032
|
-
bool: 是否设置成功
|
|
1033
|
-
"""
|
|
1034
|
-
bindings = configPresenter.get_tab_mcp_bindings()
|
|
1035
|
-
|
|
1036
|
-
if mcp_server_name == '':
|
|
1037
|
-
# 空字符串表示重置:删除该key,让默认值生效
|
|
1038
|
-
bindings.pop(tab_type, None)
|
|
1039
|
-
else:
|
|
1040
|
-
# 设置用户自定义的MCP服务
|
|
1041
|
-
bindings[tab_type] = mcp_server_name
|
|
1042
|
-
|
|
1043
|
-
return configPresenter.set_tab_mcp_bindings(bindings)
|
|
216
|
+
def getLanguage():
|
|
217
|
+
return "zh-CN"
|
|
1044
218
|
|
|
1045
|
-
|
|
219
|
+
@staticmethod
|
|
220
|
+
def getModelDefaultConfig(modal):
|
|
221
|
+
return ""
|
|
1046
222
|
|
|
1047
|
-
|
|
1048
|
-
|
|
223
|
+
@staticmethod
|
|
224
|
+
def getArtifactsEffectEnabled():
|
|
225
|
+
return False
|
|
1049
226
|
|
|
1050
227
|
@staticmethod
|
|
1051
228
|
def get_remote_access_enabled():
|
|
1052
|
-
""
|
|
1053
|
-
获取远程访问总开关状态
|
|
1054
|
-
|
|
1055
|
-
Returns:
|
|
1056
|
-
bool: True 允许远程访问, False 禁止远程访问(默认)
|
|
1057
|
-
"""
|
|
1058
|
-
result = configPresenter.getSetting(configPresenter.KEY_REMOTE_ACCESS_ENABLED)
|
|
229
|
+
result = configPresenter.getSetting("remote_access_enabled")
|
|
1059
230
|
if result is None:
|
|
1060
|
-
return
|
|
231
|
+
return True # Proxy 模块默认允许访问
|
|
1061
232
|
if isinstance(result, str):
|
|
1062
233
|
return result.lower() == 'true'
|
|
1063
234
|
return bool(result)
|
|
1064
|
-
|
|
1065
|
-
@staticmethod
|
|
1066
|
-
def set_remote_access_enabled(enabled: bool):
|
|
1067
|
-
"""
|
|
1068
|
-
设置远程访问总开关
|
|
1069
|
-
|
|
1070
|
-
Args:
|
|
1071
|
-
enabled (bool): True 允许远程访问, False 禁止远程访问
|
|
1072
|
-
|
|
1073
|
-
Returns:
|
|
1074
|
-
bool: 是否设置成功
|
|
1075
|
-
"""
|
|
1076
|
-
return configPresenter.setSetting(configPresenter.KEY_REMOTE_ACCESS_ENABLED, enabled)
|
|
1077
|
-
|
|
1078
|
-
@staticmethod
|
|
1079
|
-
def get_disabled_pairing_codes():
|
|
1080
|
-
"""
|
|
1081
|
-
获取禁用的配对码列表
|
|
1082
|
-
|
|
1083
|
-
Returns:
|
|
1084
|
-
list: 禁用的配对码列表
|
|
1085
|
-
"""
|
|
1086
|
-
result = configPresenter.getSetting(configPresenter.KEY_DISABLED_PAIRING_CODES)
|
|
1087
|
-
if result is None:
|
|
1088
|
-
return []
|
|
1089
|
-
if isinstance(result, str):
|
|
1090
|
-
# 支持逗号分隔的字符串格式
|
|
1091
|
-
if not result.strip():
|
|
1092
|
-
return []
|
|
1093
|
-
return [code.strip() for code in result.split(',') if code.strip()]
|
|
1094
|
-
if isinstance(result, list):
|
|
1095
|
-
return result
|
|
1096
|
-
return []
|
|
1097
|
-
|
|
1098
|
-
@staticmethod
|
|
1099
|
-
def set_disabled_pairing_codes(codes: list):
|
|
1100
|
-
"""
|
|
1101
|
-
设置禁用的配对码列表
|
|
1102
|
-
|
|
1103
|
-
Args:
|
|
1104
|
-
codes (list): 禁用的配对码列表
|
|
1105
|
-
|
|
1106
|
-
Returns:
|
|
1107
|
-
bool: 是否设置成功
|
|
1108
|
-
"""
|
|
1109
|
-
return configPresenter.setSetting(configPresenter.KEY_DISABLED_PAIRING_CODES, codes)
|
|
1110
|
-
|
|
1111
|
-
@staticmethod
|
|
1112
|
-
def add_disabled_pairing_code(code: str):
|
|
1113
|
-
"""
|
|
1114
|
-
添加一个禁用的配对码
|
|
1115
|
-
|
|
1116
|
-
Args:
|
|
1117
|
-
code (str): 要禁用的配对码
|
|
1118
|
-
|
|
1119
|
-
Returns:
|
|
1120
|
-
bool: 是否添加成功
|
|
1121
|
-
"""
|
|
1122
|
-
if not code or not code.strip():
|
|
1123
|
-
return False
|
|
1124
|
-
codes = configPresenter.get_disabled_pairing_codes()
|
|
1125
|
-
code = code.strip()
|
|
1126
|
-
if code not in codes:
|
|
1127
|
-
codes.append(code)
|
|
1128
|
-
return configPresenter.set_disabled_pairing_codes(codes)
|
|
1129
|
-
return True
|
|
1130
|
-
|
|
1131
|
-
@staticmethod
|
|
1132
|
-
def remove_disabled_pairing_code(code: str):
|
|
1133
|
-
"""
|
|
1134
|
-
移除一个禁用的配对码
|
|
1135
|
-
|
|
1136
|
-
Args:
|
|
1137
|
-
code (str): 要移除的配对码
|
|
1138
|
-
|
|
1139
|
-
Returns:
|
|
1140
|
-
bool: 是否移除成功
|
|
1141
|
-
"""
|
|
1142
|
-
if not code or not code.strip():
|
|
1143
|
-
return False
|
|
1144
|
-
codes = configPresenter.get_disabled_pairing_codes()
|
|
1145
|
-
code = code.strip()
|
|
1146
|
-
if code in codes:
|
|
1147
|
-
codes.remove(code)
|
|
1148
|
-
return configPresenter.set_disabled_pairing_codes(codes)
|
|
1149
|
-
return True
|
|
1150
|
-
|
|
1151
|
-
@staticmethod
|
|
1152
|
-
def is_pairing_code_disabled(code: str):
|
|
1153
|
-
"""
|
|
1154
|
-
检查配对码是否被禁用
|
|
1155
|
-
|
|
1156
|
-
Args:
|
|
1157
|
-
code (str): 配对码
|
|
1158
|
-
|
|
1159
|
-
Returns:
|
|
1160
|
-
bool: True 表示被禁用, False 表示未被禁用
|
|
1161
|
-
"""
|
|
1162
|
-
if not code or not code.strip():
|
|
1163
|
-
return False
|
|
1164
|
-
codes = configPresenter.get_disabled_pairing_codes()
|
|
1165
|
-
return code.strip() in codes
|
|
1166
|
-
|
|
1167
|
-
@staticmethod
|
|
1168
|
-
def get_remote_access_config():
|
|
1169
|
-
"""
|
|
1170
|
-
获取远程访问配置(总开关 + 禁用的配对码)
|
|
1171
|
-
|
|
1172
|
-
Returns:
|
|
1173
|
-
dict: {
|
|
1174
|
-
"enabled": bool,
|
|
1175
|
-
"disabled_codes": list
|
|
1176
|
-
}
|
|
1177
|
-
"""
|
|
1178
|
-
return {
|
|
1179
|
-
"enabled": configPresenter.get_remote_access_enabled(),
|
|
1180
|
-
"disabled_codes": configPresenter.get_disabled_pairing_codes()
|
|
1181
|
-
}
|
|
1182
|
-
|
|
1183
|
-
@staticmethod
|
|
1184
|
-
def set_remote_access_config(enabled: bool = None, disabled_codes: list = None):
|
|
1185
|
-
"""
|
|
1186
|
-
设置远程访问配置
|
|
1187
|
-
|
|
1188
|
-
Args:
|
|
1189
|
-
enabled (bool): 总开关状态(可选)
|
|
1190
|
-
disabled_codes (list): 禁用的配对码列表(可选)
|
|
1191
|
-
|
|
1192
|
-
Returns:
|
|
1193
|
-
dict: {"success": bool, "message": str}
|
|
1194
|
-
"""
|
|
1195
|
-
try:
|
|
1196
|
-
if enabled is not None:
|
|
1197
|
-
configPresenter.set_remote_access_enabled(enabled)
|
|
1198
|
-
if disabled_codes is not None:
|
|
1199
|
-
configPresenter.set_disabled_pairing_codes(disabled_codes)
|
|
1200
|
-
return {"success": True, "message": "配置已更新"}
|
|
1201
|
-
except Exception as e:
|
|
1202
|
-
return {"success": False, "message": str(e)}
|
|
1203
|
-
|
|
1204
|
-
# ============ 用户默认系统提示词配置管理 ============
|
|
1205
|
-
|
|
1206
|
-
KEY_USER_DEFAULT_SYSTEM_PROMPT = "user_default_system_prompt"
|
|
1207
|
-
|
|
1208
|
-
@staticmethod
|
|
1209
|
-
def get_user_default_system_prompt(workspace_name: str):
|
|
1210
|
-
"""
|
|
1211
|
-
获取用户默认系统提示词(workspace级别)
|
|
1212
|
-
|
|
1213
|
-
Args:
|
|
1214
|
-
workspace_name (str): 任务空间名称
|
|
1215
|
-
|
|
1216
|
-
Returns:
|
|
1217
|
-
dict: 提示词数据字典 {'userCustom': str, 'version': str},如果未设置返回默认值
|
|
1218
|
-
"""
|
|
1219
|
-
try:
|
|
1220
|
-
prompt_data = configPresenter.getSetting(
|
|
1221
|
-
configPresenter.KEY_USER_DEFAULT_SYSTEM_PROMPT,
|
|
1222
|
-
workspace_name
|
|
1223
|
-
)
|
|
1224
|
-
|
|
1225
|
-
if not prompt_data:
|
|
1226
|
-
# 返回默认值
|
|
1227
|
-
return {'userCustom': '', 'version': '1.0'}
|
|
1228
|
-
|
|
1229
|
-
# 兼容旧格式(字符串)
|
|
1230
|
-
if isinstance(prompt_data, str):
|
|
1231
|
-
try:
|
|
1232
|
-
return json.loads(prompt_data)
|
|
1233
|
-
except json.JSONDecodeError:
|
|
1234
|
-
# 如果不是JSON,当作纯文本处理
|
|
1235
|
-
return {'userCustom': prompt_data, 'version': '1.0'}
|
|
1236
|
-
|
|
1237
|
-
# 新格式(字典)
|
|
1238
|
-
return prompt_data
|
|
1239
|
-
except Exception as e:
|
|
1240
|
-
logger.exception(f"获取用户默认系统提示词失败: {e}")
|
|
1241
|
-
return {'userCustom': '', 'version': '1.0'}
|
|
1242
|
-
|
|
1243
|
-
@staticmethod
|
|
1244
|
-
def set_user_default_system_prompt(workspace_name: str, prompt_data: dict):
|
|
1245
|
-
"""
|
|
1246
|
-
设置用户默认系统提示词(workspace级别)
|
|
1247
|
-
|
|
1248
|
-
Args:
|
|
1249
|
-
workspace_name (str): 任务空间名称
|
|
1250
|
-
prompt_data (dict): 提示词数据 {'userCustom': str, 'version': str}
|
|
1251
|
-
|
|
1252
|
-
Returns:
|
|
1253
|
-
bool: 是否设置成功
|
|
1254
|
-
"""
|
|
1255
|
-
try:
|
|
1256
|
-
if not isinstance(prompt_data, dict):
|
|
1257
|
-
logger.error(f"prompt_data必须是字典类型,当前类型: {type(prompt_data)}")
|
|
1258
|
-
return False
|
|
1259
|
-
|
|
1260
|
-
# 确保包含必要字段
|
|
1261
|
-
if 'userCustom' not in prompt_data:
|
|
1262
|
-
prompt_data['userCustom'] = ''
|
|
1263
|
-
if 'version' not in prompt_data:
|
|
1264
|
-
prompt_data['version'] = '1.0'
|
|
1265
|
-
|
|
1266
|
-
success = configPresenter.setSetting(
|
|
1267
|
-
configPresenter.KEY_USER_DEFAULT_SYSTEM_PROMPT,
|
|
1268
|
-
prompt_data,
|
|
1269
|
-
workspace_name
|
|
1270
|
-
)
|
|
1271
|
-
|
|
1272
|
-
if success:
|
|
1273
|
-
logger.info(f"已保存用户默认系统提示词到workspace: {workspace_name}")
|
|
1274
|
-
else:
|
|
1275
|
-
logger.error(f"保存用户默认系统提示词失败: {workspace_name}")
|
|
1276
|
-
|
|
1277
|
-
return success
|
|
1278
|
-
except Exception as e:
|
|
1279
|
-
logger.exception(f"设置用户默认系统提示词失败: {e}")
|
|
1280
|
-
return False
|
|
1281
|
-
|