Files
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
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.
2026-08-07 12:53:47 +08:00

1 line
11 KiB
JSON

{"repo": "3022667993/xianfeng", "files": {"external/openclaw/extensions/opencode-go/provider-catalog.ts": {"61f54b9774a50c0aaf2ac60a104ffed80decdb79": {"t": 1785596396.1509054, "n": 3048, "h": "5237ac6ad8716f4f", "c": "import type { ModelCatalogEntry } from \"openclaw/plugin-sdk/agent-runtime\";\nimport type { ProviderRuntimeModel } from \"openclaw/plugin-sdk/plugin-entry\";\nimport { normalizeModelCompat } from \"openclaw/plugin-sdk/provider-model-shared\";\n\nconst PROVIDER_ID = \"opencode-go\";\n\nconst OPENCODE_GO_OPENAI_BASE_URL = \"https://opencode.ai/zen/go/v1\";\nconst OPENCODE_GO_ANTHROPIC_BASE_URL = \"https://opencode.ai/zen/go\";\n\nconst OPENCODE_GO_SUPPLEMENTAL_MODELS = (\n [\n {\n id: \"deepseek-v4-pro\",\n name: \"DeepSeek V4 Pro\",\n api: \"openai-completions\",\n provider: PROVIDER_ID,\n baseUrl: OPENCODE_GO_OPENAI_BASE_URL,\n reasoning: true,\n input: [\"text\"],\n cost: {\n input: 1.74,\n output: 3.48,\n cacheRead: 0.145,\n cacheWrite: 0,\n },\n contextWindow: 1_000_000,\n maxTokens: 384_000,\n compat: {\n supportsUsageInStreaming: true,\n supportsReasoningEffort: true,\n maxTokensField: \"max_tokens\",\n },\n },\n {\n id: \"deepseek-v4-flash\",\n name: \"DeepSeek V4 Flash\",\n api: \"openai-completions\",\n provider: PROVIDER_ID,\n baseUrl: OPENCODE_GO_OPENAI_BASE_URL,\n reasoning: true,\n input: [\"text\"],\n cost: {\n input: 0.14,\n output: 0.28,\n cacheRead: 0.028,\n cacheWrite: 0,\n },\n contextWindow: 1_000_000,\n maxTokens: 384_000,\n compat: {\n supportsUsageInStreaming: true,\n supportsReasoningEffort: true,\n maxTokensField: \"max_tokens\",\n },\n },\n ] satisfies ProviderRuntimeModel[]\n).map((model) => normalizeModelCompat(model));\n\nexport function listOpencodeGoSupplementalModelCatalogEntries(): ModelCatalogEntry[] {\n return OPENCODE_GO_SUPPLEMENTAL_MODELS.map((model) => ({\n provider: model.provider,\n id: model.id,\n name: model.name,\n reasoning: model.reasoning,\n input: model.input,\n contextWindow: model.contextWindow,\n }));\n}\n\nexport function resolveOpencodeGoSupplementalModel(\n modelId: string,\n): ProviderRuntimeModel | undefined {\n const normalizedModelId = modelId.trim().toLowerCase();\n return OPENCODE_GO_SUPPLEMENTAL_MODELS.find((model) => model.id === normalizedModelId);\n}\n\nfunction normalizeBaseUrl(baseUrl: string | undefined): string {\n return (baseUrl ?? \"\").trim().replace(/\\/+$/, \"\");\n}\n\nexport function normalizeOpencodeGoBaseUrl(params: {\n api?: string | null;\n baseUrl?: string;\n}): string | undefined {\n const normalized = normalizeBaseUrl(params.baseUrl);\n if (!normalized) {\n return undefined;\n }\n if (normalized === OPENCODE_GO_OPENAI_BASE_URL) {\n return OPENCODE_GO_OPENAI_BASE_URL;\n }\n if (normalized === OPENCODE_GO_ANTHROPIC_BASE_URL) {\n return OPENCODE_GO_ANTHROPIC_BASE_URL;\n }\n if (normalized === \"https://opencode.ai/go\") {\n return OPENCODE_GO_ANTHROPIC_BASE_URL;\n }\n if (normalized === \"https://opencode.ai/go/v1\") {\n return params.api === \"anthropic-messages\"\n ? OPENCODE_GO_ANTHROPIC_BASE_URL\n : OPENCODE_GO_OPENAI_BASE_URL;\n }\n return undefined;\n}\n"}}, "external/openclaw/src/agents/models-config.skips-writing-models-json-no-env-token.test.ts": {"61f54b9774a50c0aaf2ac60a104ffed80decdb79": {"t": 1786068280.5274885, "n": 7757, "h": "2847ddb6d8bfb55e", "c": "import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { resolveOpenClawAgentDir } from \"./agent-paths.js\";\nimport {\n CUSTOM_PROXY_MODELS_CONFIG,\n installModelsConfigTestHooks,\n MODELS_CONFIG_IMPLICIT_ENV_VARS,\n unsetEnv,\n withTempEnv,\n withModelsTempHome as withTempHome,\n} from \"./models-config.e2e-harness.js\";\nimport type { ProviderConfig as ModelsProviderConfig } from \"./models-config.providers.secrets.js\";\n\nvi.mock(\"./auth-profiles/external-cli-sync.js\", () => ({\n resolveExternalCliAuthProfiles: () => [],\n syncExternalCliCredentials: () => false,\n}));\n\nvi.mock(\"./models-config.providers.js\", async () => {\n function createImplicitProvider(baseUrl: string): ModelsProviderConfig {\n return {\n baseUrl,\n api: \"openai-completions\",\n models: [\n {\n id: \"test-model\",\n name: \"test-model\",\n reasoning: false,\n input: [\"text\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 8192,\n maxTokens: 4096,\n },\n ],\n };\n }\n\n return {\n applyNativeStreamingUsageCompat: (providers: Record<string, ModelsProviderConfig>) => providers,\n enforceSourceManagedProviderSecrets: ({\n providers,\n }: {\n providers: Record<string, ModelsProviderConfig>;\n }) => providers,\n normalizeProviders: ({ providers }: { providers: Record<string, ModelsProviderConfig> }) =>\n providers,\n resolveImplicitProviders: async ({ env }: { env?: NodeJS.ProcessEnv }) => {\n const providers: Record<string, ModelsProviderConfig> = {\n chutes: {\n baseUrl: \"https://llm.chutes.ai/v1\",\n api: \"openai-completions\" as const,\n models: [],\n },\n deepseek: {\n ...createImplicitProvider(\"https://deepseek.example/v1\"),\n apiKey: \"DEEPSEEK_API_KEY\",\n },\n mistral: {\n ...createImplicitProvider(\"https://mistral.example/v1\"),\n apiKey: \"MISTRAL_API_KEY\",\n },\n xai: {\n ...createImplicitProvider(\"https://xai.example/v1\"),\n apiKey: \"XAI_API_KEY\",\n },\n };\n if (env?.MINIMAX_API_KEY) {\n providers[\"minimax\"] = {\n ...createImplicitProvider(\"https://minimax.example/v1\"),\n apiKey: \"MINIMAX_API_KEY\",\n };\n }\n if (env?.SYNTHETIC_API_KEY) {\n providers[\"synthetic\"] = {\n ...createImplicitProvider(\"https://synthetic.example/v1\"),\n apiKey: \"SYNTHETIC_API_KEY\",\n };\n }\n return providers;\n },\n };\n});\n\ninstallModelsConfigTestHooks();\n\nlet clearConfigCache: typeof import(\"../config/config.js\").clearConfigCache;\nlet clearRuntimeConfigSnapshot: typeof import(\"../config/config.js\").clearRuntimeConfigSnapshot;\nlet clearRuntimeAuthProfileStoreSnapshots: typeof import(\"./auth-profiles/store.js\").clearRuntimeAuthProfileStoreSnapshots;\nlet ensureOpenClawModelsJson: typeof import(\"./models-config.js\").ensureOpenClawModelsJson;\nlet resetModelsJsonReadyCacheForTest: typeof import(\"./models-config.js\").resetModelsJsonReadyCacheForTest;\n\ntype ParsedProviderConfig = {\n baseUrl?: string;\n apiKey?: string;\n models?: Array<{ id: string }>;\n};\n\nasync function runEnvProviderCase(params: {\n envVar: \"MINIMAX_API_KEY\" | \"SYNTHETIC_API_KEY\";\n envValue: string;\n providerKey: \"minimax\" | \"synthetic\";\n expectedApiKeyRef: string;\n}) {\n const previousValue = process.env[params.envVar];\n process.env[params.envVar] = params.envValue;\n try {\n await ensureOpenClawModelsJson({});\n\n const modelPath = path.join(resolveOpenClawAgentDir(), \"models.json\");\n const raw = await fs.readFile(modelPath, \"utf8\");\n const parsed = JSON.parse(raw) as { providers: Record<string, ParsedProviderConfig> };\n const provider = parsed.providers[params.providerKey];\n expect(provider).toBeDefined();\n expect(provider?.apiKey).toBe(params.expectedApiKeyRef);\n } finally {\n if (previousValue === undefined) {\n delete process.env[params.envVar];\n } else {\n process.env[params.envVar] = previousValue;\n }\n }\n}\n\ndescribe(\"models-config\", () => {\n beforeAll(async () => {\n ({ clearConfigCache, clearRuntimeConfigSnapshot } = await import(\"../config/config.js\"));\n ({ clearRuntimeAuthProfileStoreSnapshots } = await import(\"./auth-profiles/store.js\"));\n ({ ensureOpenClawModelsJson, resetModelsJsonReadyCacheForTest } =\n await import(\"./models-config.js\"));\n });\n\n beforeEach(() => {\n clearRuntimeAuthProfileStoreSnapshots();\n clearRuntimeConfigSnapshot();\n clearConfigCache();\n resetModelsJsonReadyCacheForTest();\n });\n\n afterEach(() => {\n clearRuntimeAuthProfileStoreSnapshots();\n clearRuntimeConfigSnapshot();\n clearConfigCache();\n resetModelsJsonReadyCacheForTest();\n });\n\n it(\"writes marker-backed defaults but skips env-gated providers when no env token or profile exists\", async () => {\n await withTempHome(async (home) => {\n await withTempEnv([...MODELS_CONFIG_IMPLICIT_ENV_VARS, \"KIMI_API_KEY\"], async () => {\n unsetEnv([...MODELS_CONFIG_IMPLICIT_ENV_VARS, \"KIMI_API_KEY\"]);\n\n const agentDir = path.join(home, \"agent-empty\");\n // ensureAuthProfileStore merges the main auth store into non-main dirs; point main at our temp dir.\n process.env.OPENCLAW_AGENT_DIR = agentDir;\n process.env.PI_CODING_AGENT_DIR = agentDir;\n\n const result = await ensureOpenClawModelsJson(\n {\n models: { providers: {} },\n },\n agentDir,\n );\n\n const raw = await fs.readFile(path.join(agentDir, \"models.json\"), \"utf8\");\n const parsed = JSON.parse(raw) as { providers: Record<string, ParsedProviderConfig> };\n\n expect(result.wrote).toBe(true);\n expect(Object.keys(parsed.providers).length).toBeGreaterThan(0);\n expect(parsed.providers[\"openai\"]).toBeUndefined();\n expect(parsed.providers[\"minimax\"]).toBeUndefined();\n expect(parsed.providers[\"synthetic\"]).toBeUndefined();\n });\n });\n });\n\n it(\"writes models.json for configured providers\", async () => {\n await withTempHome(async () => {\n await ensureOpenClawModelsJson(CUSTOM_PROXY_MODELS_CONFIG);\n\n const modelPath = path.join(resolveOpenClawAgentDir(), \"models.json\");\n const raw = await fs.readFile(modelPath, \"utf8\");\n const parsed = JSON.parse(raw) as {\n providers: Record<\n string,\n {\n baseUrl?: string;\n models?: Array<{\n id?: string;\n cost?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number };\n }>;\n }\n >;\n };\n\n expect(parsed.providers[\"custom-proxy\"]?.baseUrl).toBe(\"http://localhost:4000/v1\");\n expect(parsed.providers[\"custom-proxy\"]?.models?.[0]).toMatchObject({\n id: \"llama-3.1-8b\",\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n });\n });\n });\n\n it(\"adds minimax provider when MINIMAX_API_KEY is set\", async () => {\n await withTempHome(async () => {\n await runEnvProviderCase({\n envVar: \"MINIMAX_API_KEY\",\n envValue: \"sk-minimax-test\",\n providerKey: \"minimax\",\n expectedApiKeyRef: \"MINIMAX_API_KEY\", // pragma: allowlist secret\n });\n });\n });\n\n it(\"adds synthetic provider when SYNTHETIC_API_KEY is set\", async () => {\n await withTempHome(async () => {\n await runEnvProviderCase({\n envVar: \"SYNTHETIC_API_KEY\",\n envValue: \"sk-synthetic-test\",\n providerKey: \"synthetic\",\n expectedApiKeyRef: \"SYNTHETIC_API_KEY\", // pragma: allowlist secret\n });\n });\n });\n});\n"}}}}