| 76 | } |
| 77 | |
| 78 | static async create(options: TestHarnessOptions = {}): Promise<TestHarness> { |
| 79 | const mock = new MockProvider(); |
| 80 | const { baseURL } = await mock.start(); |
| 81 | |
| 82 | // Always install a default so unexpected extra requests don't 500. |
| 83 | mock.setDefault(options.mockDefault ?? DEFAULT_MOCK_RESPONSE); |
| 84 | |
| 85 | const spawnOpts: SpawnOptions = { |
| 86 | mockProviderURL: baseURL, |
| 87 | magicContextConfig: options.magicContextConfig, |
| 88 | openCodeConfigExtra: options.openCodeConfigExtra, |
| 89 | modelContextLimit: options.modelContextLimit, |
| 90 | }; |
| 91 | const opencode = await spawnOpencode(spawnOpts); |
| 92 | |
| 93 | const sdk = await import("@opencode-ai/sdk"); |
| 94 | const client = sdk.createOpencodeClient({ baseUrl: opencode.url }) as unknown as SdkClient; |
| 95 | |
| 96 | return new TestHarness(mock, opencode, client); |
| 97 | } |
| 98 | |
| 99 | /** Create a session bound to the isolated workdir. Throws on failure. */ |
| 100 | async createSession(): Promise<string> { |