Implement Task 8.0 — Manual Export Provider with full provider abstraction:
Source files:
- src/providers/manual-export.js (104 lines) — new provider that wraps
pre-built prompts in copy-ready format for ChatGPT Web/Business use
- src/providers/factory.js — register 'manual' provider in whitelist
- src/providers/openai.js — update JSDoc for ProviderRequest parameter
All 5 handlers updated with ReviewRequest pattern:
- src/tools/ask-chatgpt.js
- src/tools/debug-issue.js
- src/tools/review-code.js
- src/tools/review-plan.js
- src/tools/architecture-review.js
Each handler now packages shared data as { prompt, input } between step 5
and 6 of the orchestration flow.
Tests:
- test/providers/manual-export.test.js (56 tests) — covers structure,
copy-ready box formatting, tool name detection, long prompts, Unicode,
edge cases, provider contract compliance, idempotency
- test/providers/factory.test.js (+9 tests) — manual provider whitelist,
factory routing, send delegation
Docs:
- ARCHITECTURE.md — provider selection table with openai/manual values
- README.md — provider comparison table and manual workflow description
30 lines
991 B
JavaScript
30 lines
991 B
JavaScript
// OpenAI chat provider adapter.
|
|
// Wraps src/openai/client.js + src/openai/responses.js into the provider interface.
|
|
|
|
import { createOpenAIClient } from "../openai/client.js";
|
|
import { sendOpenAIResponse } from "../openai/responses.js";
|
|
|
|
/**
|
|
* Chat provider backed by OpenAI Responses API.
|
|
* Implements { send(input, config) => Promise<{ content: string }> }.
|
|
*/
|
|
export const openaiProvider = {
|
|
/**
|
|
* @param {{ prompt?: string, input?: object }} request - ProviderRequest (prompt is unused by OpenAI provider).
|
|
* @param {object} config - full config from loadConfig().
|
|
* @returns {Promise<{ content: string }>}
|
|
*/
|
|
async send(input, config) {
|
|
const client = createOpenAIClient(config);
|
|
|
|
const result = await sendOpenAIResponse(client, {
|
|
input: [{ role: "system", content: input }],
|
|
model: config.openaiModel,
|
|
temperature: config.temperature,
|
|
maxOutputTokens: config.maxOutputTokens,
|
|
});
|
|
|
|
return { content: result.content };
|
|
},
|
|
};
|