Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
10 KiB
JSON
1 line
10 KiB
JSON
{"repo": "aetherclawtech/aetherclaw", "files": {"pkg/providers/factory_test.go": {"bb4979957bb1ec016d992ae8e57cea3ef0f5fbe1": {"t": 1786068376.8858862, "n": 8895, "h": "d49102122cf83da2", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/AetherClawTech/aetherclaw/pkg/auth\"\n\t\"github.com/AetherClawTech/aetherclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4.6\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-openrouter\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-openrouter\",\n\t\t\tModel: \"openrouter/auto\",\n\t\t\tAPIKey: \"sk-or-test\",\n\t\t\tAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-sonnet-4.6\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}}}} |