govuk-rewrite-cli 0.1.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.
Files changed (57) hide show
  1. package/dist/chat-commands.d.ts +31 -0
  2. package/dist/chat-commands.d.ts.map +1 -0
  3. package/dist/chat-commands.js +240 -0
  4. package/dist/chat-commands.js.map +1 -0
  5. package/dist/chat-ink.d.ts +9 -0
  6. package/dist/chat-ink.d.ts.map +1 -0
  7. package/dist/chat-ink.js +17 -0
  8. package/dist/chat-ink.js.map +1 -0
  9. package/dist/chat-session.d.ts +64 -0
  10. package/dist/chat-session.d.ts.map +1 -0
  11. package/dist/chat-session.js +195 -0
  12. package/dist/chat-session.js.map +1 -0
  13. package/dist/chat-ui.d.ts +8 -0
  14. package/dist/chat-ui.d.ts.map +1 -0
  15. package/dist/chat-ui.js +342 -0
  16. package/dist/chat-ui.js.map +1 -0
  17. package/dist/chat.d.ts +14 -0
  18. package/dist/chat.d.ts.map +1 -0
  19. package/dist/chat.js +24 -0
  20. package/dist/chat.js.map +1 -0
  21. package/dist/config.d.ts +28 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +107 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/constants.d.ts +4 -0
  26. package/dist/constants.d.ts.map +1 -0
  27. package/dist/constants.js +9 -0
  28. package/dist/constants.js.map +1 -0
  29. package/dist/errors.d.ts +5 -0
  30. package/dist/errors.d.ts.map +1 -0
  31. package/dist/errors.js +35 -0
  32. package/dist/errors.js.map +1 -0
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +129 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/io.d.ts +5 -0
  38. package/dist/io.d.ts.map +1 -0
  39. package/dist/io.js +51 -0
  40. package/dist/io.js.map +1 -0
  41. package/dist/oneshot.d.ts +21 -0
  42. package/dist/oneshot.d.ts.map +1 -0
  43. package/dist/oneshot.js +86 -0
  44. package/dist/oneshot.js.map +1 -0
  45. package/dist/output.d.ts +21 -0
  46. package/dist/output.d.ts.map +1 -0
  47. package/dist/output.js +89 -0
  48. package/dist/output.js.map +1 -0
  49. package/dist/session-config.d.ts +8 -0
  50. package/dist/session-config.d.ts.map +1 -0
  51. package/dist/session-config.js +18 -0
  52. package/dist/session-config.js.map +1 -0
  53. package/dist/setup.d.ts +42 -0
  54. package/dist/setup.d.ts.map +1 -0
  55. package/dist/setup.js +214 -0
  56. package/dist/setup.js.map +1 -0
  57. package/package.json +54 -0
@@ -0,0 +1,342 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
+ import { Box, Text, useApp, useInput } from "ink";
4
+ import Spinner from "ink-spinner";
5
+ import TextInput from "ink-text-input";
6
+ import { isKnownChatCommand, listChatCommandSuggestions, } from "./chat-commands.js";
7
+ import { bootstrapChatSession, handleSubmittedInput } from "./chat-session.js";
8
+ import { ChatRuntimeError, ChatUsageError } from "./chat-session.js";
9
+ const DEFAULT_TRANSCRIPT_LIMIT = 20;
10
+ function truncateForPreview(text, limit = 140) {
11
+ const compact = text.replace(/\s+/g, " ").trim();
12
+ if (compact.length <= limit)
13
+ return compact;
14
+ return `${compact.slice(0, limit - 1)}…`;
15
+ }
16
+ function getSlashCommandQuery(value) {
17
+ const match = value.match(/^\/([^\s]*)$/);
18
+ if (!match)
19
+ return null;
20
+ return match[1].toLowerCase();
21
+ }
22
+ function eventToTurns(event) {
23
+ if (event.kind === "assistant") {
24
+ return [{ kind: "assistant", text: event.text }];
25
+ }
26
+ if (event.kind === "error") {
27
+ return [{ kind: "error", text: event.text }];
28
+ }
29
+ if (event.kind === "success") {
30
+ return [{ kind: "success", text: event.text }];
31
+ }
32
+ return [{ kind: "system", text: event.text }];
33
+ }
34
+ function helpFooterLines() {
35
+ return [
36
+ "Shortcuts: Ctrl+C clear input (or exit if empty) · ? toggle shortcuts",
37
+ "Use /help for commands",
38
+ ];
39
+ }
40
+ function splitMultiline(kind, text) {
41
+ return text
42
+ .split("\n")
43
+ .filter((line) => line.length > 0)
44
+ .map((line) => ({ kind, text: line }));
45
+ }
46
+ export function ChatUI(props) {
47
+ const { opts } = props;
48
+ const transcriptLimit = props.transcriptLimit ?? DEFAULT_TRANSCRIPT_LIMIT;
49
+ const { exit } = useApp();
50
+ const [session, setSession] = useState(null);
51
+ const [transcript, setTranscript] = useState([]);
52
+ const [inputValue, setInputValue] = useState("");
53
+ const [busy, setBusy] = useState(false);
54
+ const [showHelp, setShowHelp] = useState(false);
55
+ const [promptRequest, setPromptRequest] = useState(null);
56
+ const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);
57
+ const [inputHistory, setInputHistory] = useState([]);
58
+ const [historyIndex, setHistoryIndex] = useState(null);
59
+ const savedInputRef = useRef("");
60
+ const promptRequestRef = useRef(null);
61
+ useEffect(() => {
62
+ promptRequestRef.current = promptRequest;
63
+ }, [promptRequest]);
64
+ const appendTurns = useCallback((turns) => {
65
+ setTranscript((prev) => [...prev, ...turns].slice(-transcriptLimit));
66
+ }, [transcriptLimit]);
67
+ const appendSystemLine = useCallback((line) => {
68
+ const trimmed = line.trim();
69
+ if (!trimmed)
70
+ return;
71
+ appendTurns(splitMultiline("system", trimmed));
72
+ }, [appendTurns]);
73
+ const setExitCodeAndExit = useCallback((code) => {
74
+ process.exitCode = code;
75
+ exit();
76
+ }, [exit]);
77
+ const requestPromptAnswer = useCallback((question) => {
78
+ return new Promise((resolve) => {
79
+ setPromptRequest({ question, resolve });
80
+ });
81
+ }, []);
82
+ useEffect(() => {
83
+ let cancelled = false;
84
+ const bootstrap = async () => {
85
+ try {
86
+ const boot = await bootstrapChatSession(props.opts, {
87
+ prompt: requestPromptAnswer,
88
+ writeLine: appendSystemLine,
89
+ });
90
+ if (cancelled)
91
+ return;
92
+ setSession(boot);
93
+ appendTurns([
94
+ {
95
+ kind: "system",
96
+ text: "Interactive mode. Enter text to rewrite, or run /help for commands.",
97
+ },
98
+ ]);
99
+ }
100
+ catch (err) {
101
+ if (cancelled)
102
+ return;
103
+ if (err instanceof ChatUsageError || err instanceof ChatRuntimeError) {
104
+ process.stderr.write(`${err.message}\n`);
105
+ setExitCodeAndExit(err.exitCode);
106
+ return;
107
+ }
108
+ const message = err instanceof Error ? err.message : String(err);
109
+ process.stderr.write(`Error: ${message}\n`);
110
+ setExitCodeAndExit(1);
111
+ }
112
+ };
113
+ void bootstrap();
114
+ return () => {
115
+ cancelled = true;
116
+ const pending = promptRequestRef.current;
117
+ if (pending) {
118
+ pending.resolve("");
119
+ }
120
+ };
121
+ }, [appendSystemLine, appendTurns, props.opts, requestPromptAnswer, setExitCodeAndExit]);
122
+ const headerText = useMemo(() => {
123
+ if (!session) {
124
+ return "govuk-rewrite chat | loading session…";
125
+ }
126
+ const state = session.state;
127
+ return [
128
+ "govuk-rewrite chat",
129
+ `provider=${state.provider}`,
130
+ `model=${state.model}`,
131
+ `mode=${state.mode}`,
132
+ `explain=${state.explain ? "on" : "off"}`,
133
+ `check=${state.check ? "on" : "off"}`,
134
+ `diff=${state.diff ? "on" : "off"}`,
135
+ `json=${state.json ? "on" : "off"}`,
136
+ `copy=${state.copy ? "on" : "off"}`,
137
+ `tokens=${state.tokens ? "on" : "off"}`,
138
+ ].join(" | ");
139
+ }, [session]);
140
+ const slashCommandQuery = useMemo(() => {
141
+ if (promptRequest)
142
+ return null;
143
+ return getSlashCommandQuery(inputValue);
144
+ }, [inputValue, promptRequest]);
145
+ const slashCommandItems = useMemo(() => {
146
+ if (slashCommandQuery === null)
147
+ return [];
148
+ return listChatCommandSuggestions(slashCommandQuery);
149
+ }, [slashCommandQuery]);
150
+ const showSlashCommandMenu = slashCommandQuery !== null && slashCommandItems.length > 0;
151
+ const selectedCommand = showSlashCommandMenu
152
+ ? (slashCommandItems[selectedCommandIndex] ?? slashCommandItems[0])
153
+ : null;
154
+ const slashCommandLabelWidth = useMemo(() => {
155
+ if (slashCommandItems.length === 0)
156
+ return 0;
157
+ return slashCommandItems.reduce((maxWidth, item) => {
158
+ return Math.max(maxWidth, item.command.length);
159
+ }, 0);
160
+ }, [slashCommandItems]);
161
+ useEffect(() => {
162
+ setSelectedCommandIndex(0);
163
+ }, [slashCommandQuery]);
164
+ useEffect(() => {
165
+ setSelectedCommandIndex((index) => {
166
+ if (slashCommandItems.length === 0)
167
+ return 0;
168
+ return Math.min(index, slashCommandItems.length - 1);
169
+ });
170
+ }, [slashCommandItems.length]);
171
+ useEffect(() => {
172
+ if (historyIndex === null) {
173
+ setInputValue(savedInputRef.current);
174
+ }
175
+ else {
176
+ setInputValue(inputHistory[historyIndex] ?? "");
177
+ }
178
+ }, [historyIndex, inputHistory]);
179
+ const applySelectedSlashCommand = useCallback(() => {
180
+ if (slashCommandItems.length === 0)
181
+ return false;
182
+ const command = slashCommandItems[selectedCommandIndex] ?? slashCommandItems[0];
183
+ const nextValue = `${command.command}${command.expectsArgument ? " " : ""}`;
184
+ setInputValue(nextValue);
185
+ return true;
186
+ }, [selectedCommandIndex, slashCommandItems]);
187
+ useInput((input, key) => {
188
+ if (!showSlashCommandMenu && key.upArrow) {
189
+ setHistoryIndex((prev) => {
190
+ if (inputHistory.length === 0)
191
+ return null;
192
+ if (prev === null) {
193
+ savedInputRef.current = inputValue;
194
+ return inputHistory.length - 1;
195
+ }
196
+ return Math.max(0, prev - 1);
197
+ });
198
+ return;
199
+ }
200
+ if (!showSlashCommandMenu && key.downArrow) {
201
+ setHistoryIndex((prev) => {
202
+ if (prev === null)
203
+ return null;
204
+ if (prev === inputHistory.length - 1)
205
+ return null;
206
+ return prev + 1;
207
+ });
208
+ return;
209
+ }
210
+ if (showSlashCommandMenu && key.upArrow) {
211
+ setSelectedCommandIndex((index) => {
212
+ if (slashCommandItems.length === 0)
213
+ return 0;
214
+ return (index - 1 + slashCommandItems.length) % slashCommandItems.length;
215
+ });
216
+ return;
217
+ }
218
+ if (showSlashCommandMenu && key.downArrow) {
219
+ setSelectedCommandIndex((index) => {
220
+ if (slashCommandItems.length === 0)
221
+ return 0;
222
+ return (index + 1) % slashCommandItems.length;
223
+ });
224
+ return;
225
+ }
226
+ if (showSlashCommandMenu && key.tab) {
227
+ applySelectedSlashCommand();
228
+ return;
229
+ }
230
+ if (key.ctrl && input === "c") {
231
+ if (inputValue.length > 0) {
232
+ setInputValue("");
233
+ setHistoryIndex(null);
234
+ savedInputRef.current = "";
235
+ }
236
+ else {
237
+ setExitCodeAndExit(0);
238
+ }
239
+ return;
240
+ }
241
+ if (input === "?" && inputValue.trim().length === 0 && !promptRequest && !busy) {
242
+ setShowHelp((prev) => !prev);
243
+ setInputValue("");
244
+ }
245
+ });
246
+ const handleSubmit = useCallback(async (rawValue) => {
247
+ const value = rawValue.trim();
248
+ if (promptRequest) {
249
+ const resolver = promptRequest.resolve;
250
+ setPromptRequest(null);
251
+ setInputValue("");
252
+ resolver(rawValue);
253
+ return;
254
+ }
255
+ if (!session || busy) {
256
+ setInputValue("");
257
+ return;
258
+ }
259
+ if (!value) {
260
+ setInputValue("");
261
+ return;
262
+ }
263
+ if (value === "?") {
264
+ setShowHelp((prev) => !prev);
265
+ setInputValue("");
266
+ return;
267
+ }
268
+ appendTurns([{ kind: "user", text: value }]);
269
+ setInputHistory((prev) => [...prev, value]);
270
+ setHistoryIndex(null);
271
+ savedInputRef.current = "";
272
+ setInputValue("");
273
+ setBusy(true);
274
+ const deps = {
275
+ prompt: requestPromptAnswer,
276
+ writeLine: appendSystemLine,
277
+ };
278
+ try {
279
+ const result = await handleSubmittedInput(value, session.state, {
280
+ overrides: session.overrides,
281
+ deps,
282
+ });
283
+ setSession((current) => {
284
+ if (!current)
285
+ return current;
286
+ return {
287
+ ...current,
288
+ state: result.state,
289
+ };
290
+ });
291
+ const turns = result.events.flatMap(eventToTurns);
292
+ if (turns.length > 0) {
293
+ appendTurns(turns);
294
+ }
295
+ if (result.shouldExit) {
296
+ setExitCodeAndExit(0);
297
+ }
298
+ }
299
+ catch (err) {
300
+ const message = err instanceof Error ? err.message : String(err);
301
+ appendTurns([{ kind: "error", text: `Error: ${message}` }]);
302
+ }
303
+ finally {
304
+ setBusy(false);
305
+ }
306
+ }, [appendSystemLine, appendTurns, busy, promptRequest, requestPromptAnswer, session, setExitCodeAndExit]);
307
+ const handleInputSubmit = useCallback((rawValue) => {
308
+ const trimmed = rawValue.trim();
309
+ const query = getSlashCommandQuery(trimmed);
310
+ if (query !== null &&
311
+ slashCommandItems.length > 0 &&
312
+ !isKnownChatCommand(query)) {
313
+ applySelectedSlashCommand();
314
+ return;
315
+ }
316
+ void handleSubmit(rawValue);
317
+ }, [applySelectedSlashCommand, handleSubmit, slashCommandItems.length]);
318
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "cyan", children: headerText }) }), _jsx(Box, { flexDirection: "column", marginTop: 1, paddingX: 1, children: transcript.map((turn, index) => {
319
+ const key = `${index}-${turn.kind}`;
320
+ if (turn.kind === "user") {
321
+ return (_jsx(Text, { dimColor: true, children: `> ${truncateForPreview(turn.text)}` }, key));
322
+ }
323
+ if (turn.kind === "assistant") {
324
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Rewritten:" }), _jsx(Text, { children: turn.text })] }, key));
325
+ }
326
+ if (turn.kind === "error") {
327
+ return _jsx(Text, { color: "red", children: turn.text }, key);
328
+ }
329
+ if (turn.kind === "success") {
330
+ return _jsx(Text, { color: "green", children: turn.text }, key);
331
+ }
332
+ // system
333
+ return _jsx(Text, { dimColor: true, children: turn.text }, key);
334
+ }) }), _jsxs(Box, { flexDirection: "column", marginTop: 1, paddingX: 1, children: [busy && !promptRequest && (_jsxs(Text, { color: "cyan", children: [_jsx(Spinner, { type: "dots" }), " Rewriting\u2026"] })), promptRequest && (_jsx(Text, { color: "yellow", children: promptRequest.question })), !busy && !promptRequest && (_jsx(Text, { dimColor: true, children: selectedCommand
335
+ ? `${selectedCommand.command} ${selectedCommand.description}`
336
+ : "Run /help for commands" })), _jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "> " }), _jsx(TextInput, { value: inputValue, onChange: (val) => setInputValue(val.replace(/[\r\n]+/g, " ").replace(/\s{2,}/g, " ")), onSubmit: handleInputSubmit, placeholder: promptRequest ? "" : "Paste text to rewrite" })] }), showSlashCommandMenu && (_jsx(Box, { flexDirection: "column", children: slashCommandItems.map((item, index) => {
337
+ const isSelected = index === selectedCommandIndex;
338
+ const commandLabel = item.command.padEnd(slashCommandLabelWidth + 2);
339
+ return (_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? "cyanBright" : "white", children: commandLabel }), _jsx(Text, { dimColor: !isSelected, color: isSelected ? "cyan" : undefined, children: item.description })] }, item.command));
340
+ }) })), _jsx(Text, { dimColor: true, children: "? for shortcuts" }), showHelp && (_jsx(Box, { flexDirection: "column", children: helpFooterLines().map((line, index) => (_jsx(Text, { dimColor: true, children: line }, `help-${index}`))) }))] })] }));
341
+ }
342
+ //# sourceMappingURL=chat-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-ui.js","sourceRoot":"","sources":["../src/chat-ui.tsx"],"names":[],"mappings":"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"}
package/dist/chat.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { ChatState } from "./chat-commands.js";
2
+ import { bootstrapChatSession, handleSubmittedInput, resolveConfigForChat, supportsInteractiveSession } from "./chat-session.js";
3
+ import type { ChatOptions, ChatSessionDeps } from "./chat-session.js";
4
+ export type { ChatOptions };
5
+ export { resolveConfigForChat, supportsInteractiveSession, bootstrapChatSession, handleSubmittedInput, };
6
+ export declare function processChatInput(line: string, state: ChatState, deps?: ChatSessionDeps): Promise<{
7
+ state: ChatState;
8
+ quit: boolean;
9
+ output?: string;
10
+ rewrittenText?: string;
11
+ messages: string[];
12
+ }>;
13
+ export declare function runChat(opts: ChatOptions): Promise<void>;
14
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEtE,YAAY,EAAE,WAAW,EAAE,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,GACrB,CAAC;AAEF,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,eAAe,GACrB,OAAO,CAAC;IACT,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC,CAkBD;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D"}
package/dist/chat.js ADDED
@@ -0,0 +1,24 @@
1
+ import { runChatInk } from "./chat-ink.js";
2
+ import { bootstrapChatSession, handleSubmittedInput, resolveConfigForChat, supportsInteractiveSession, } from "./chat-session.js";
3
+ export { resolveConfigForChat, supportsInteractiveSession, bootstrapChatSession, handleSubmittedInput, };
4
+ export async function processChatInput(line, state, deps) {
5
+ const result = await handleSubmittedInput(line, state, {
6
+ overrides: {},
7
+ deps,
8
+ });
9
+ const assistantOutput = result.events.find((event) => event.kind === "assistant")?.text;
10
+ const messages = result.events
11
+ .filter((event) => event.kind !== "assistant")
12
+ .map((event) => event.text);
13
+ return {
14
+ state: result.state,
15
+ quit: result.shouldExit,
16
+ output: assistantOutput,
17
+ rewrittenText: undefined,
18
+ messages,
19
+ };
20
+ }
21
+ export async function runChat(opts) {
22
+ await runChatInk(opts);
23
+ }
24
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,GACrB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,KAAgB,EAChB,IAAsB;IAQtB,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE;QACrD,SAAS,EAAE,EAAE;QACb,IAAI;KACL,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,IAAI,CAAC;IACxF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM;SAC3B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC;SAC7C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,UAAU;QACvB,MAAM,EAAE,eAAe;QACvB,aAAa,EAAE,SAAS;QACxB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Provider } from "govuk-rewrite";
2
+ export interface ResolvedConfig {
3
+ provider: Provider;
4
+ model: string;
5
+ timeoutMs: number;
6
+ baseUrl?: string;
7
+ apiKey?: string;
8
+ }
9
+ export interface ConfigFileData {
10
+ provider?: Provider;
11
+ model?: string;
12
+ timeoutMs?: number;
13
+ baseUrl?: string;
14
+ }
15
+ export interface CliOverrides {
16
+ provider?: string;
17
+ model?: string;
18
+ timeout?: number;
19
+ config?: string;
20
+ }
21
+ export declare const PROVIDER_API_KEY_ENV_VARS: Record<Provider, string>;
22
+ export declare function getApiKeyEnvVarForProvider(provider: Provider): string;
23
+ export declare function getDefaultConfigFilePath(): string;
24
+ export declare function readConfigFile(customPath?: string): ConfigFileData;
25
+ export declare function writeConfigFile(config: ConfigFileData, customPath?: string): void;
26
+ export declare function resolveConfig(cliOverrides?: CliOverrides): ResolvedConfig;
27
+ export declare function resolveApiKeyForProvider(provider: Provider): string | undefined;
28
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAI9D,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAErE;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAKjD;AA8BD,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CASlE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAMjF;AAuBD,wBAAgB,aAAa,CAAC,YAAY,GAAE,YAAiB,GAAG,cAAc,CA6B7E;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAE/E"}
package/dist/config.js ADDED
@@ -0,0 +1,107 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { DEFAULT_MODELS, DEFAULT_TIMEOUT_MS } from "govuk-rewrite";
5
+ export const PROVIDER_API_KEY_ENV_VARS = {
6
+ openai: "OPENAI_API_KEY",
7
+ anthropic: "ANTHROPIC_API_KEY",
8
+ openrouter: "OPENROUTER_API_KEY",
9
+ };
10
+ export function getApiKeyEnvVarForProvider(provider) {
11
+ return PROVIDER_API_KEY_ENV_VARS[provider];
12
+ }
13
+ export function getDefaultConfigFilePath() {
14
+ if (process.platform === "win32") {
15
+ return join(process.env["APPDATA"] ?? homedir(), "govuk-rewrite", "config.json");
16
+ }
17
+ return join(homedir(), ".config", "govuk-rewrite", "config.json");
18
+ }
19
+ function toProvider(value) {
20
+ if (value === "openai" || value === "anthropic" || value === "openrouter") {
21
+ return value;
22
+ }
23
+ return undefined;
24
+ }
25
+ function sanitiseConfigFileData(input) {
26
+ const result = {};
27
+ const provider = toProvider(input.provider);
28
+ if (provider)
29
+ result.provider = provider;
30
+ if (typeof input.model === "string" && input.model.trim()) {
31
+ result.model = input.model.trim();
32
+ }
33
+ if (typeof input.timeoutMs === "number" && Number.isFinite(input.timeoutMs)) {
34
+ result.timeoutMs = Math.trunc(input.timeoutMs);
35
+ }
36
+ if (typeof input.baseUrl === "string" && input.baseUrl.trim()) {
37
+ result.baseUrl = input.baseUrl.trim();
38
+ }
39
+ return result;
40
+ }
41
+ export function readConfigFile(customPath) {
42
+ const filePath = customPath ?? getDefaultConfigFilePath();
43
+ try {
44
+ const raw = readFileSync(filePath, "utf8");
45
+ const parsed = JSON.parse(raw);
46
+ return sanitiseConfigFileData(parsed);
47
+ }
48
+ catch {
49
+ return {};
50
+ }
51
+ }
52
+ export function writeConfigFile(config, customPath) {
53
+ const filePath = customPath ?? getDefaultConfigFilePath();
54
+ const sanitized = sanitiseConfigFileData(config);
55
+ mkdirSync(dirname(filePath), { recursive: true });
56
+ writeFileSync(filePath, `${JSON.stringify(sanitized, null, 2)}\n`, "utf8");
57
+ }
58
+ function loadEnvVars() {
59
+ const result = {};
60
+ const provider = toProvider(process.env["GOVUK_REWRITE_PROVIDER"]);
61
+ if (provider)
62
+ result.provider = provider;
63
+ const model = process.env["GOVUK_REWRITE_MODEL"];
64
+ if (model)
65
+ result.model = model;
66
+ const timeoutRaw = process.env["GOVUK_REWRITE_TIMEOUT_MS"];
67
+ if (timeoutRaw) {
68
+ const parsed = parseInt(timeoutRaw, 10);
69
+ if (!isNaN(parsed))
70
+ result.timeoutMs = parsed;
71
+ }
72
+ const baseUrl = process.env["GOVUK_REWRITE_BASE_URL"];
73
+ if (baseUrl)
74
+ result.baseUrl = baseUrl;
75
+ return result;
76
+ }
77
+ export function resolveConfig(cliOverrides = {}) {
78
+ const defaults = {
79
+ provider: "openai",
80
+ model: DEFAULT_MODELS.openai,
81
+ timeoutMs: DEFAULT_TIMEOUT_MS,
82
+ };
83
+ const fileConfig = readConfigFile(cliOverrides.config);
84
+ const envConfig = loadEnvVars();
85
+ const merged = {
86
+ ...defaults,
87
+ ...fileConfig,
88
+ ...envConfig,
89
+ };
90
+ const cliProvider = toProvider(cliOverrides.provider);
91
+ if (cliProvider)
92
+ merged.provider = cliProvider;
93
+ if (cliOverrides.model)
94
+ merged.model = cliOverrides.model;
95
+ if (cliOverrides.timeout != null)
96
+ merged.timeoutMs = cliOverrides.timeout;
97
+ const modelExplicitlySet = fileConfig.model ?? envConfig.model ?? cliOverrides.model;
98
+ if (!modelExplicitlySet) {
99
+ merged.model = DEFAULT_MODELS[merged.provider];
100
+ }
101
+ merged.apiKey = resolveApiKeyForProvider(merged.provider);
102
+ return merged;
103
+ }
104
+ export function resolveApiKeyForProvider(provider) {
105
+ return process.env[getApiKeyEnvVarForProvider(provider)];
106
+ }
107
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ContentMode, Provider } from "govuk-rewrite";
2
+ export declare const VALID_MODES: ContentMode[];
3
+ export declare const VALID_PROVIDERS: Provider[];
4
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE3D,eAAO,MAAM,WAAW,EAAE,WAAW,EAMpC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,QAAQ,EAA0C,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const VALID_MODES = [
2
+ "page-body",
3
+ "error-message",
4
+ "hint-text",
5
+ "notification",
6
+ "button",
7
+ ];
8
+ export const VALID_PROVIDERS = ["openai", "anthropic", "openrouter"];
9
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,WAAW;IACX,eAAe;IACf,WAAW;IACX,cAAc;IACd,QAAQ;CACT,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Provider } from "govuk-rewrite";
2
+ export declare function buildMissingApiKeyErrorLines(provider: Provider): string[];
3
+ export declare function buildMissingApiKeyErrorMessage(provider: Provider): string;
4
+ export declare function writeMissingApiKeyError(provider: Provider): void;
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAiB9C,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CAazE;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAEzE;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAEhE"}
package/dist/errors.js ADDED
@@ -0,0 +1,35 @@
1
+ const KEY_INFO = {
2
+ openai: {
3
+ envVar: "OPENAI_API_KEY",
4
+ link: "https://platform.openai.com/api-keys",
5
+ },
6
+ anthropic: {
7
+ envVar: "ANTHROPIC_API_KEY",
8
+ link: "https://console.anthropic.com/settings/keys",
9
+ },
10
+ openrouter: {
11
+ envVar: "OPENROUTER_API_KEY",
12
+ link: "https://openrouter.ai/keys",
13
+ },
14
+ };
15
+ export function buildMissingApiKeyErrorLines(provider) {
16
+ const info = KEY_INFO[provider];
17
+ return [
18
+ `Error: no API key found for provider \"${provider}\".`,
19
+ "",
20
+ `Set the ${info.envVar} environment variable:`,
21
+ ` export ${info.envVar}=your-key-here`,
22
+ "",
23
+ `Get a key at: ${info.link}`,
24
+ "",
25
+ "Using a different provider? Pass --provider openai | anthropic | openrouter",
26
+ "",
27
+ ];
28
+ }
29
+ export function buildMissingApiKeyErrorMessage(provider) {
30
+ return buildMissingApiKeyErrorLines(provider).join("\n");
31
+ }
32
+ export function writeMissingApiKeyError(provider) {
33
+ process.stderr.write(buildMissingApiKeyErrorMessage(provider));
34
+ }
35
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAuD;IACnE,MAAM,EAAE;QACN,MAAM,EAAE,gBAAgB;QACxB,IAAI,EAAE,sCAAsC;KAC7C;IACD,SAAS,EAAE;QACT,MAAM,EAAE,mBAAmB;QAC3B,IAAI,EAAE,6CAA6C;KACpD;IACD,UAAU,EAAE;QACV,MAAM,EAAE,oBAAoB;QAC5B,IAAI,EAAE,4BAA4B;KACnC;CACF,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAAC,QAAkB;IAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO;QACL,0CAA0C,QAAQ,KAAK;QACvD,EAAE;QACF,WAAW,IAAI,CAAC,MAAM,wBAAwB;QAC9C,YAAY,IAAI,CAAC,MAAM,gBAAgB;QACvC,EAAE;QACF,iBAAiB,IAAI,CAAC,IAAI,EAAE;QAC5B,EAAE;QACF,6EAA6E;QAC7E,EAAE;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,QAAkB;IAC/D,OAAO,4BAA4B,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}