ask-cli-ai 1.1.0 → 1.2.1

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.
@@ -0,0 +1,136 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Text, useInput } from 'ink';
4
+ import chalk from 'chalk';
5
+ export function TextInput({ value: originalValue, placeholder = '', focus = true, mask, highlightPastedText = false, showCursor = true, onChange, onSubmit, }) {
6
+ const [state, setState] = useState({
7
+ cursorOffset: (originalValue || '').length,
8
+ cursorWidth: 0,
9
+ });
10
+ const [internalValue] = useState({ value: originalValue });
11
+ const { cursorOffset, cursorWidth } = state;
12
+ useEffect(() => {
13
+ setState(previousState => {
14
+ if (!focus || !showCursor) {
15
+ return previousState;
16
+ }
17
+ const newValue = originalValue || '';
18
+ if (previousState.cursorOffset > newValue.length - 1) {
19
+ return {
20
+ cursorOffset: newValue.length,
21
+ cursorWidth: 0,
22
+ };
23
+ }
24
+ return previousState;
25
+ });
26
+ }, [originalValue, focus, showCursor]);
27
+ const cursorActualWidth = highlightPastedText ? cursorWidth : 0;
28
+ const value = mask ? mask.repeat(originalValue.length) : originalValue;
29
+ let renderedValue = value;
30
+ let renderedPlaceholder = placeholder ? chalk.dim(chalk.gray(placeholder)) : undefined;
31
+ // Fake mouse cursor, because it's too inconvenient to deal with actual cursor and ansi escapes
32
+ if (showCursor && focus) {
33
+ renderedPlaceholder =
34
+ placeholder.length > 0
35
+ ? chalk.inverse(placeholder[0]) + chalk.dim(chalk.grey(placeholder.slice(1)))
36
+ : chalk.inverse(' ');
37
+ renderedValue = value.length > 0 ? '' : chalk.inverse(' ');
38
+ let i = 0;
39
+ for (const char of value) {
40
+ renderedValue +=
41
+ i >= cursorOffset - cursorActualWidth && i <= cursorOffset
42
+ ? chalk.inverse(char)
43
+ : char;
44
+ i++;
45
+ }
46
+ if (value.length > 0 && cursorOffset === value.length) {
47
+ renderedValue += chalk.inverse(' ');
48
+ }
49
+ }
50
+ useInput((input, key) => {
51
+ if (key.upArrow ||
52
+ key.downArrow ||
53
+ key.ctrl ||
54
+ (key.ctrl && input === 'c') ||
55
+ key.tab ||
56
+ (key.shift && key.tab)) {
57
+ return;
58
+ }
59
+ if (key.return) {
60
+ if (onSubmit) {
61
+ onSubmit(originalValue);
62
+ }
63
+ return;
64
+ }
65
+ let nextCursorOffset = cursorOffset;
66
+ let nextValue = originalValue;
67
+ let nextCursorWidth = 0;
68
+ if (key.leftArrow) {
69
+ if (showCursor) {
70
+ nextCursorOffset--;
71
+ }
72
+ }
73
+ else if (key.rightArrow) {
74
+ if (showCursor) {
75
+ nextCursorOffset++;
76
+ }
77
+ }
78
+ else if (key.backspace || key.delete) {
79
+ if (cursorOffset > 0) {
80
+ nextValue =
81
+ originalValue.slice(0, cursorOffset - 1) +
82
+ originalValue.slice(cursorOffset, originalValue.length);
83
+ nextCursorOffset--;
84
+ }
85
+ }
86
+ else {
87
+ nextValue =
88
+ originalValue.slice(0, cursorOffset) +
89
+ input +
90
+ originalValue.slice(cursorOffset, originalValue.length);
91
+ nextCursorOffset += input.length;
92
+ if (input.length > 1) {
93
+ nextCursorWidth = input.length;
94
+ }
95
+ }
96
+ if (cursorOffset < 0) {
97
+ nextCursorOffset = 0;
98
+ }
99
+ if (cursorOffset > originalValue.length) {
100
+ nextCursorOffset = originalValue.length;
101
+ }
102
+ setState({
103
+ cursorOffset: nextCursorOffset,
104
+ cursorWidth: nextCursorWidth,
105
+ });
106
+ if (nextValue !== originalValue) {
107
+ handleChange(nextValue);
108
+ }
109
+ }, { isActive: focus });
110
+ function handleChange(input) {
111
+ // Workaround for paste detection in Linux terminals.
112
+ // When the user pastes a long text, it is split into multiple input events,
113
+ // which causes only a part of the text to be saved in the state.
114
+ // To fix this, we check if the user is pasting text and then append the value
115
+ // to the existing one. To detect when the user is pasting, we check the length
116
+ // of the input value. If the difference between the new value and the current
117
+ // state is greater than 1, we assume the user is pasting.
118
+ if (input.length - originalValue.length > 1 && originalValue.trim() === '') {
119
+ internalValue.value += input;
120
+ }
121
+ else {
122
+ internalValue.value = input;
123
+ }
124
+ onChange(internalValue.value);
125
+ }
126
+ return (_jsx(Text, { children: placeholder
127
+ ? value.length > 0
128
+ ? renderedValue
129
+ : renderedPlaceholder
130
+ : renderedValue }));
131
+ }
132
+ export function UncontrolledTextInput({ initialValue = '', ...props }) {
133
+ const [value, setValue] = useState(initialValue);
134
+ return _jsx(TextInput, { ...props, value: value, onChange: setValue });
135
+ }
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dElucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvdGV4dElucHV0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDckMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBOEMxQixNQUFNLFVBQVUsU0FBUyxDQUFDLEVBQ3hCLEtBQUssRUFBRSxhQUFhLEVBQ3BCLFdBQVcsR0FBRyxFQUFFLEVBQ2hCLEtBQUssR0FBRyxJQUFJLEVBQ1osSUFBSSxFQUNKLG1CQUFtQixHQUFHLEtBQUssRUFDM0IsVUFBVSxHQUFHLElBQUksRUFDakIsUUFBUSxFQUNSLFFBQVEsR0FDRjtJQUNOLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ2pDLFlBQVksRUFBRSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNO1FBQzFDLFdBQVcsRUFBRSxDQUFDO0tBQ2YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBRTNELE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRTVDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMxQixPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLEVBQUUsQ0FBQztZQUVyQyxJQUFJLGFBQWEsQ0FBQyxZQUFZLEdBQUcsUUFBUSxD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
@@ -1,18 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState } from 'react';
3
2
  import { Box, Static, Text } from 'ink';
4
3
  import { SelectModel } from "./selectModel.js";
5
4
  import { logo } from "../utils/logo.js";
6
5
  export function Welcome(props) {
7
6
  const { onSend } = props;
8
- const [closed, setClosed] = useState(false);
9
- function handleSend(model, apiKey) {
10
- setClosed(true);
11
- onSend(model.name, apiKey);
12
- }
13
- if (closed) {
14
- return null;
7
+ function handleSend() {
8
+ onSend();
15
9
  }
16
10
  return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(Static, { items: [''], children: item => _jsxs(Box, { flexDirection: 'column', marginBottom: 1, children: [_jsx(Text, { children: logo }), _jsxs(Box, { flexDirection: 'column', marginTop: 1, children: [_jsx(Text, { children: "Welcome to ASK CLI, your handy assistant to help you from the terminal!" }), _jsxs(Box, { flexDirection: 'column', marginTop: 1, paddingLeft: 1, children: [_jsx(Text, { children: "\uD83E\uDD16 Get help about commands, coding, apps, etc." }), _jsx(Text, { children: "\uD83D\uDCDD Short and precise answers, just the info you need, straight to the point." }), _jsx(Text, { children: "\uD83D\uDE80 Blazing fast speed, almost instant responses." }), _jsx(Text, { children: "\uD83D\uDEE1\uFE0F Safe by design, it cannot run commands or access your files without your explicit authorization." })] })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: "To get started, select a model." }) })] }, item) }), _jsx(SelectModel, { onSelect: handleSend })] }));
17
11
  }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VsY29tZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3dlbGNvbWUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQW1CLENBQUM7QUFFaEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBTXhDLE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBWTtJQUVsQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRXpCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVDLFNBQVMsVUFBVSxDQUFDLEtBQVksRUFBRSxNQUFjO1FBQzlDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sQ0FDTCxNQUFDLEdBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxhQUN6QixLQUFDLE1BQU0sSUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FDTixNQUFDLEdBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFZLFlBQVksRUFBRSxDQUFDLGFBQ3BELEtBQUMsSUFBSSxjQUFFLElBQUksR0FBUSxFQUNuQixNQUFDLEdBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFNBQVMsRUFBRSxDQUFDLGFBQ3RDLEtBQUMsSUFBSSwwRkFBK0UsRUFDcEYsTUFBQyxHQUFHLElBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLGFBQ3RELEtBQUMsSUFBSSw0RUFBdUQsRUFDNUQsS0FBQyxJQUFJLDBHQUFxRixFQUMxRixLQUFDLElBQUksOEVBQXlELEVBQzlELEtBQUMsSUFBSSx1SUFBNkcsSUFDOUcsSUFDRixFQUNOLEtBQUMsR0FBRyxJQUFDLFNBQVMsRUFBRSxDQUFDLFlBQ2YsS0FBQyxJQUFJLGtEQUF1QyxHQUN4QyxLQWJ5QixJQUFJLENBYy9CLEdBRUQsRUFDVCxLQUFDLFdBQVcsSUFBQyxRQUFRLEVBQUUsVUFBVSxHQUFHLElBQ2hDLENBQ1AsQ0FBQztBQUNKLENBQUMifQ==
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VsY29tZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3dlbGNvbWUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQU14QyxNQUFNLFVBQVUsT0FBTyxDQUFDLEtBQVk7SUFFbEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQztJQUV6QixTQUFTLFVBQVU7UUFDakIsTUFBTSxFQUFFLENBQUM7SUFDWCxDQUFDO0lBRUQsT0FBTyxDQUNMLE1BQUMsR0FBRyxJQUFDLGFBQWEsRUFBQyxRQUFRLGFBQ3pCLEtBQUMsTUFBTSxJQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUNoQixJQUFJLENBQUMsRUFBRSxDQUNOLE1BQUMsR0FBRyxJQUFDLGFBQWEsRUFBQyxRQUFRLEVBQVksWUFBWSxFQUFFLENBQUMsYUFDcEQsS0FBQyxJQUFJLGNBQUUsSUFBSSxHQUFRLEVBQ25CLE1BQUMsR0FBRyxJQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsU0FBUyxFQUFFLENBQUMsYUFDdEMsS0FBQyxJQUFJLDBGQUErRSxFQUNwRixNQUFDLEdBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsYUFDdEQsS0FBQyxJQUFJLDRFQUF1RCxFQUM1RCxLQUFDLElBQUksMEdBQXFGLEVBQzFGLEtBQUMsSUFBSSw4RUFBeUQsRUFDOUQsS0FBQyxJQUFJLHVJQUE2RyxJQUM5RyxJQUNGLEVBQ04sS0FBQyxHQUFHLElBQUMsU0FBUyxFQUFFLENBQUMsWUFDZixLQUFDLElBQUksa0RBQXVDLEdBQ3hDLEtBYnlCLElBQUksQ0FjL0IsR0FFRCxFQUNULEtBQUMsV0FBVyxJQUFDLFFBQVEsRUFBRSxVQUFVLEdBQUcsSUFDaEMsQ0FDUCxDQUFDO0FBQ0osQ0FBQyJ9
@@ -0,0 +1,17 @@
1
+ import { useEffect, useState } from 'react';
2
+ export function useExit() {
3
+ const state = useState(false);
4
+ useEffect(() => {
5
+ process.on('SIGINT', () => {
6
+ const set = state[1];
7
+ set(true);
8
+ });
9
+ }, []);
10
+ useEffect(() => {
11
+ if (state[0]) {
12
+ setTimeout(() => process.exit(0), 0);
13
+ }
14
+ }, [state[0]]);
15
+ return state;
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlRXhpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VFeGl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRTVDLE1BQU0sVUFBVSxPQUFPO0lBRXJCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU5QixTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ3hCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVQLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2IsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFZixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMifQ==
@@ -0,0 +1,20 @@
1
+ import { useState, useCallback, useMemo } from 'react';
2
+ export function useField(field = {}) {
3
+ const [state, setState] = useState(field);
4
+ const set = useCallback((field) => {
5
+ setState(state => ({ ...state, ...field }));
6
+ }, []);
7
+ return useMemo(() => ({
8
+ get label() { return state.label; },
9
+ get placeholder() { return state.placeholder; },
10
+ get value() { return state.value ?? ''; },
11
+ get error() { return state.error; },
12
+ get focus() { return state.focus; },
13
+ set value(value) { set({ value }); },
14
+ set focus(focus) { set({ focus }); },
15
+ set error(error) { set({ error }); },
16
+ change(value) { set({ value }); },
17
+ set
18
+ }), [state, set]);
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlRmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdXNlRmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBVXZELE1BQU0sVUFBVSxRQUFRLENBQUMsUUFBZSxFQUFFO0lBRXhDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTFDLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEtBQXFCLEVBQUUsRUFBRTtRQUNoRCxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNwQixJQUFJLEtBQUssS0FBSyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksV0FBVyxLQUFLLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxLQUFLLEtBQUssT0FBTyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBSSxLQUFLLEtBQUssT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLEtBQUssS0FBSyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksS0FBSyxDQUFDLEtBQWEsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLEtBQUssQ0FBQyxLQUEwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksS0FBSyxDQUFDLEtBQXlCLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLEtBQWEsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxHQUFHO0tBQ0osQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQyJ9
@@ -0,0 +1,63 @@
1
+ import { useCallback, useMemo, useState } from 'react';
2
+ import Anthropic from '@anthropic-ai/sdk';
3
+ import { GoogleGenAI } from '@google/genai';
4
+ import OpenAI from 'openai';
5
+ export function useTestProvider() {
6
+ const [testing, setTesting] = useState(false);
7
+ const [error, setError] = useState();
8
+ const test = useCallback(async (provider) => {
9
+ const timeoutId = setTimeout(() => {
10
+ setTesting(true);
11
+ }, 400);
12
+ try {
13
+ setError(undefined);
14
+ switch (provider.type) {
15
+ case 'gemini':
16
+ await testGemini(provider.key);
17
+ break;
18
+ case 'openai':
19
+ await testOpenAI(provider.key);
20
+ break;
21
+ case 'anthropic':
22
+ await testAnthropic(provider.key);
23
+ break;
24
+ case 'openai-compatible':
25
+ await testOpenAICompatibleAPI(provider.url, provider.key);
26
+ break;
27
+ default: throw new Error('Unknown provider');
28
+ }
29
+ clearTimeout(timeoutId);
30
+ setTesting(false);
31
+ return true;
32
+ }
33
+ catch (error) {
34
+ clearTimeout(timeoutId);
35
+ setTesting(false);
36
+ setError(error.message.replaceAll(/(\n|\r|\r\n)/g, ' '));
37
+ return false;
38
+ }
39
+ }, []);
40
+ async function testGemini(apiKey) {
41
+ const client = new GoogleGenAI({ apiKey });
42
+ await client.models.list();
43
+ }
44
+ async function testOpenAI(apiKey) {
45
+ const client = new OpenAI({ apiKey });
46
+ await client.models.list();
47
+ }
48
+ async function testAnthropic(apiKey) {
49
+ const client = new Anthropic({ apiKey });
50
+ await client.models.list();
51
+ }
52
+ async function testOpenAICompatibleAPI(baseURL, apiKey) {
53
+ const client = new OpenAI({ baseURL, apiKey });
54
+ await client.models.list();
55
+ }
56
+ return useMemo(() => ({
57
+ testing,
58
+ error,
59
+ test
60
+ }), [testing, error, test]);
61
+ }
62
+ ;
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlVGVzdFByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL3VzZVRlc3RQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFdkQsT0FBTyxTQUFTLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsTUFBTSxVQUFVLGVBQWU7SUFFN0IsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxRQUFRLEVBQVUsQ0FBQztJQUU3QyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQWdELEVBQUUsRUFBRTtRQUVsRixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFUixJQUFJLENBQUM7WUFFSCxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFcEIsUUFBUSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3RCLEtBQUssUUFBUTtvQkFBRSxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQUMsTUFBTTtnQkFDckQsS0FBSyxRQUFRO29CQUFFLE1BQU0sVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFBQyxNQUFNO2dCQUNyRCxLQUFLLFdBQVc7b0JBQUUsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUFDLE1BQU07Z0JBQzNELEtBQUssbUJBQW1CO29CQUFFLE1BQU0sdUJBQXVCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQUMsTUFBTTtnQkFDM0YsT0FBTyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFFRCxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWxCLE9BQU8sSUFBSSxDQUFDO1FBRWQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFFZixZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xCLFFBQVEsQ0FBRSxLQUFlLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVwRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxLQUFLLFVBQVUsVUFBVSxDQUFDLE1BQWU7UUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxVQUFVLFVBQVUsQ0FBQyxNQUFlO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssVUFBVSxhQUFhLENBQUMsTUFBZTtRQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDekMsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLFVBQVUsdUJBQXVCLENBQUMsT0FBZ0IsRUFBRSxNQUFlO1FBQ3RFLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDL0MsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLE9BQU87UUFDUCxLQUFLO1FBQ0wsSUFBSTtLQUNMLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBQUEsQ0FBQyJ9
package/dist/install.js CHANGED
@@ -1,2 +1,5 @@
1
- import "./migrations/settings-1.1.0.js";
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnN0YWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sZ0NBQWdDLENBQUMifQ==
1
+ import * as v1 from "./migrations/1-settings-1.1.0.js";
2
+ import * as v2 from "./migrations/2-add-providers-1.2.0.js";
3
+ await v1.run();
4
+ await v2.run();
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnN0YWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkQsT0FBTyxLQUFLLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUU1RCxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNmLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDIn0=
@@ -0,0 +1,56 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import { configPath, dataDir, historyDir } from "../utils/paths.js";
6
+ import { configStore } from "../stores/config.js";
7
+ export async function run() {
8
+ if (!fs.existsSync(dataDir)) {
9
+ fs.mkdirSync(dataDir, { recursive: true });
10
+ }
11
+ if (fs.existsSync(path.join(dataDir, 'chats'))) {
12
+ fs.renameSync(path.join(dataDir, 'chats'), path.join(dataDir, 'history'));
13
+ }
14
+ if (!fs.existsSync(historyDir)) {
15
+ fs.mkdirSync(historyDir, { recursive: true });
16
+ }
17
+ if (!fs.existsSync(configPath)) {
18
+ await configStore.save({
19
+ model: undefined,
20
+ providers: {
21
+ gemini: {
22
+ apiKey: undefined
23
+ },
24
+ openai: {
25
+ apiKey: undefined
26
+ },
27
+ anthropic: {
28
+ apiKey: undefined
29
+ }
30
+ },
31
+ });
32
+ }
33
+ const config = await configStore.get();
34
+ if (config.version === undefined) {
35
+ config.version = 1;
36
+ if (config.settings === undefined) {
37
+ config.settings = {
38
+ metadata: {
39
+ type: 'boolean',
40
+ title: 'Metadata',
41
+ description: 'Show metadata at the end of each response',
42
+ value: true
43
+ },
44
+ maxOutputTokens: {
45
+ type: 'number',
46
+ title: 'Max Output Tokens',
47
+ description: 'Max number of output tokens. Min 1,000, Max 10,000', value: 8000,
48
+ min: 1000,
49
+ max: 10000
50
+ }
51
+ };
52
+ }
53
+ await configStore.save(config);
54
+ }
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS1zZXR0aW5ncy0xLjEuMC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb25zLzEtc2V0dGluZ3MtMS4xLjAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMERBQTBEO0FBQzFELHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxNQUFNLENBQUMsS0FBSyxVQUFVLEdBQUc7SUFFdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM1QixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9DLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sV0FBVyxDQUFDLElBQUksQ0FBQztZQUNyQixLQUFLLEVBQUUsU0FBUztZQUNoQixTQUFTLEVBQUU7Z0JBQ1QsTUFBTSxFQUFFO29CQUNOLE1BQU0sRUFBRSxTQUFTO2lCQUNsQjtnQkFDRCxNQUFNLEVBQUU7b0JBQ04sTUFBTSxFQUFFLFNBQVM7aUJBQ2xCO2dCQUNELFNBQVMsRUFBRTtvQkFDVCxNQUFNLEVBQUUsU0FBUztpQkFDbEI7YUFDRjtTQUNLLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUV2QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFFakMsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFFbkIsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxRQUFRLEdBQUc7Z0JBQ2hCLFFBQVEsRUFBRTtvQkFDUixJQUFJLEVBQUUsU0FBUztvQkFDZixLQUFLLEVBQUUsVUFBVTtvQkFDakIsV0FBVyxFQUFFLDJDQUEyQztvQkFDeEQsS0FBSyxFQUFFLElBQUk7aUJBQ1o7Z0JBQ0QsZUFBZSxFQUFFO29CQUNmLElBQUksRUFBRSxRQUFRO29CQUNkLEtBQUssRUFBRSxtQkFBbUI7b0JBQzFCLFdBQVcsRUFBRSxvREFBb0QsRUFBRSxLQUFLLEVBQUUsSUFBSTtvQkFDOUUsR0FBRyxFQUFFLElBQUk7b0JBQ1QsR0FBRyxFQUFFLEtBQUs7aUJBQ1g7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0FBQ0gsQ0FBQyJ9
@@ -0,0 +1,60 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
4
+ import { configStore } from "../stores/config.js";
5
+ export async function run() {
6
+ const VERSION = 2;
7
+ const config = await configStore.get();
8
+ if (config.version < VERSION) {
9
+ config.version = VERSION;
10
+ config.isFirstExecution = true;
11
+ if (config.model) {
12
+ config.model = {
13
+ id: config.model.model,
14
+ providerId: config.model.provider
15
+ };
16
+ }
17
+ config.providers = {
18
+ gemini: {
19
+ id: 'gemini',
20
+ key: config.providers.gemini?.apiKey,
21
+ type: 'gemini',
22
+ name: 'Gemini',
23
+ models: [
24
+ { id: 'gemini-3-flash-preview', name: 'Gemini 3 Flash Preview', config: { thinkingConfig: { thinkingLevel: 'LOW' } } },
25
+ { id: 'gemini-3-pro-preview', name: 'Gemini 3 Pro Preview', config: { thinkingConfig: { thinkingLevel: 'LOW' } } },
26
+ { id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', config: { thinkingBudget: 500 } },
27
+ { id: 'gemini-2.5-flash-lite', name: 'Gemini 2.5 Flash Lite', config: { thinkingBudget: 512 } },
28
+ { id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', config: { thinkingBudget: 500 } }
29
+ ]
30
+ },
31
+ openai: {
32
+ id: 'openai',
33
+ key: config.providers.openai?.apiKey,
34
+ type: 'openai',
35
+ name: 'OpenAI',
36
+ models: [
37
+ { id: 'gpt-5-mini', name: 'GPT-5 Mini', config: { effort: 'low' } },
38
+ { id: 'gpt-5-nano', name: 'GPT-5 Nano', config: { effort: 'low' } },
39
+ { id: 'gpt-5', name: 'GPT-5', config: { effort: 'low' } },
40
+ { id: 'gpt-5.2', name: 'GPT-5.2', config: { effort: 'low' } },
41
+ { id: 'gpt-5.2-pro', name: 'GPT-5.2 Pro', config: { effort: 'low' } },
42
+ { id: 'gpt-4.1', name: 'GPT-4.1' },
43
+ ]
44
+ },
45
+ anthropic: {
46
+ id: 'anthropic',
47
+ key: config.providers.anthropic?.apiKey,
48
+ type: 'anthropic',
49
+ name: 'Anthropic',
50
+ models: [
51
+ { id: 'claude-haiku-4-5', name: 'Claude Haiku 4.5' },
52
+ { id: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5' },
53
+ { id: 'claude-opus-4-5', name: 'Claude Opus 4.5' }
54
+ ]
55
+ }
56
+ };
57
+ await configStore.save(config);
58
+ }
59
+ }
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi1hZGQtcHJvdmlkZXJzLTEuMi4wLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbnMvMi1hZGQtcHJvdmlkZXJzLTEuMi4wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCx1REFBdUQ7QUFDdkQsNERBQTREO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxNQUFNLENBQUMsS0FBSyxVQUFVLEdBQUc7SUFFdkIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBRWxCLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRXZDLElBQUksTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUU3QixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUV6QixNQUFNLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRS9CLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxLQUFLLEdBQUc7Z0JBQ2IsRUFBRSxFQUFHLE1BQU0sQ0FBQyxLQUFhLENBQUMsS0FBSztnQkFDL0IsVUFBVSxFQUFHLE1BQU0sQ0FBQyxLQUFhLENBQUMsUUFBUTthQUMzQyxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sQ0FBQyxTQUFTLEdBQUc7WUFDakIsTUFBTSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxRQUFRO2dCQUNaLEdBQUcsRUFBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQWMsRUFBRSxNQUFNO2dCQUM3QyxJQUFJLEVBQUUsUUFBUTtnQkFDZCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxNQUFNLEVBQUU7b0JBQ04sRUFBRSxFQUFFLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVB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
@@ -13,20 +13,49 @@ class ConfigStore {
13
13
  this.config = await this.store.get(defaultConfig);
14
14
  return this.config;
15
15
  }
16
- async setModel(provider, model) {
16
+ async addProvider(name, url, key, models) {
17
17
  const config = await this.get();
18
- config.model = { provider, model };
18
+ const time = Math.round(Date.now() / 1000);
19
+ const id = `${name.toLowerCase().replaceAll(' ', '-')}-${time}`;
20
+ config.providers[id] = {
21
+ id,
22
+ type: 'openai-compatible',
23
+ key,
24
+ name,
25
+ url,
26
+ models: models.map(model => ({
27
+ id: model,
28
+ name: model
29
+ }))
30
+ };
19
31
  await this.save(config);
20
32
  }
21
- async setProviderApiKey(providerId, apiKey) {
33
+ async updateProvider(id, provider) {
22
34
  const config = await this.get();
23
- config.providers[providerId].apiKey = apiKey;
35
+ config.providers[id] = { ...config.providers[id], ...provider };
36
+ await this.save(config);
37
+ }
38
+ async deleteProvider(id) {
39
+ const config = await this.get();
40
+ delete config.providers[id];
41
+ if (config.model?.providerId === id) {
42
+ config.model = undefined;
43
+ }
44
+ await this.save(config);
45
+ }
46
+ async setModel(providerId, modelId) {
47
+ const config = await this.get();
48
+ config.model = { providerId, id: modelId };
49
+ await this.save(config);
50
+ }
51
+ async setProviderApiKey(providerId, key) {
52
+ const config = await this.get();
53
+ config.providers[providerId].key = key;
24
54
  await this.save(config);
25
55
  }
26
56
  async save(config) {
27
- this.config = config;
28
57
  await this.store.save(config);
29
58
  }
30
59
  }
31
60
  export const configStore = new ConfigStore();
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3Jlcy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE1BQU0sV0FBVztJQUVQLEtBQUssQ0FBUTtJQUNiLE1BQU0sQ0FBVTtJQUV4QjtRQUNFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHO1FBQ1AsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQVMsYUFBYSxDQUFDLENBQUM7UUFDMUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQWdCLEVBQUUsS0FBYTtRQUM1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsS0FBSyxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFVBQWtCLEVBQUUsTUFBYztRQUN4RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDN0MsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQWM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyJ9
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3Jlcy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE1BQU0sV0FBVztJQUVQLEtBQUssQ0FBUTtJQUNiLE1BQU0sQ0FBVTtJQUV4QjtRQUNFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHO1FBQ1AsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQVMsYUFBYSxDQUFDLENBQUM7UUFDMUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQVksRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLE1BQWdCO1FBRXhFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFFaEUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRztZQUNyQixFQUFFO1lBQ0YsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixHQUFHO1lBQ0gsSUFBSTtZQUNKLEdBQUc7WUFDSCxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNCLEVBQUUsRUFBRSxLQUFLO2dCQUNULElBQUksRUFBRSxLQUFLO2FBQ1osQ0FBQyxDQUFDO1NBQ0osQ0FBQztRQUVGLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFVLEVBQUUsUUFBMkI7UUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFVO1FBRTdCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWhDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU1QixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsVUFBVSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQzNCLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBa0IsRUFBRSxPQUFlO1FBQ2hELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFVBQWtCLEVBQUUsR0FBVztRQUNyRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDdkMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQWM7UUFDdkIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyJ9
@@ -1,6 +1,6 @@
1
1
  export const instructions = `
2
2
  You are a CLI (command line tool).
3
- - Your name is Ask Cli
3
+ - Your name is Ask CLI
4
4
  - Your main job is to answer the user question in the best way possible. Your responses must be clear, exact and precise.
5
5
  - You must help the user with info about commands, programs, OS, coding, development, etc.
6
6
  - If the user doesn't specify the OS, assume they are using ${process.platform}.
@@ -25,11 +25,11 @@ Current path: ${process.cwd()}
25
25
 
26
26
  Current date: ${new Date().toString()}
27
27
 
28
- Ask Cli help:
28
+ Ask CLI help:
29
29
 
30
30
  AI CLI to help you with commands, coding, apps and more.
31
31
 
32
- Version: 1.1.0
32
+ Version: 1.2.1
33
33
 
34
34
  Usage: ask <prompt..>
35
35
 
@@ -38,6 +38,7 @@ Ask Cli help:
38
38
  ask /models Select a model
39
39
  ask /providers Setup providers
40
40
  ask /config Configuration
41
+ ask /connect Connect to an external provider using OpenAI-compatible API
41
42
  ask /history List the chat history
42
43
  ask /clear Clear the chat history
43
44
 
@@ -55,4 +56,4 @@ Ask Cli help:
55
56
  what is the chmod command
56
57
  ask what is using port 80 -c "netstat -ano"
57
58
  `;
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlcy9pbnN0cnVjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHOzs7OztnRUFLb0MsT0FBTyxDQUFDLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Y0FnQmxFLE9BQU8sQ0FBQyxRQUFROztnQkFFZCxPQUFPLENBQUMsR0FBRyxFQUFFOztnQkFFYixJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQStCcEMsQ0FBQyJ9
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlcy9pbnN0cnVjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHOzs7OztnRUFLb0MsT0FBTyxDQUFDLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Y0FnQmxFLE9BQU8sQ0FBQyxRQUFROztnQkFFZCxPQUFPLENBQUMsR0FBRyxFQUFFOztnQkFFYixJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FnQ3BDLENBQUMifQ==
@@ -1,16 +1,7 @@
1
1
  export const defaultConfig = {
2
+ version: 2,
3
+ isFirstExecution: true,
2
4
  model: undefined,
3
- providers: {
4
- gemini: {
5
- apiKey: undefined
6
- },
7
- anthropic: {
8
- apiKey: undefined
9
- },
10
- openai: {
11
- apiKey: undefined
12
- }
13
- },
14
5
  settings: {
15
6
  metadata: {
16
7
  type: 'boolean',
@@ -25,6 +16,43 @@ export const defaultConfig = {
25
16
  min: 1000,
26
17
  max: 10000
27
18
  }
28
- }
19
+ },
20
+ providers: {
21
+ gemini: {
22
+ id: 'gemini',
23
+ type: 'gemini',
24
+ name: 'Gemini',
25
+ models: [
26
+ { id: 'gemini-3-flash-preview', name: 'Gemini 3 Flash Preview', config: { thinkingConfig: { thinkingLevel: 'LOW' } } },
27
+ { id: 'gemini-3-pro-preview', name: 'Gemini 3 Pro Preview', config: { thinkingConfig: { thinkingLevel: 'LOW' } } },
28
+ { id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', config: { thinkingBudget: 500 } },
29
+ { id: 'gemini-2.5-flash-lite', name: 'Gemini 2.5 Flash Lite', config: { thinkingBudget: 512 } },
30
+ { id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', config: { thinkingBudget: 500 } }
31
+ ]
32
+ },
33
+ openai: {
34
+ id: 'openai',
35
+ type: 'openai',
36
+ name: 'OpenAI',
37
+ models: [
38
+ { id: 'gpt-5-mini', name: 'GPT-5 Mini', config: { effort: 'low' } },
39
+ { id: 'gpt-5-nano', name: 'GPT-5 Nano', config: { effort: 'low' } },
40
+ { id: 'gpt-5', name: 'GPT-5', config: { effort: 'low' } },
41
+ { id: 'gpt-5.2', name: 'GPT-5.2', config: { effort: 'low' } },
42
+ { id: 'gpt-5.2-pro', name: 'GPT-5.2 Pro', config: { effort: 'low' } },
43
+ { id: 'gpt-4.1', name: 'GPT-4.1' },
44
+ ]
45
+ },
46
+ anthropic: {
47
+ id: 'anthropic',
48
+ type: 'anthropic',
49
+ name: 'Anthropic',
50
+ models: [
51
+ { id: 'claude-haiku-4-5', name: 'Claude Haiku 4.5' },
52
+ { id: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5' },
53
+ { id: 'claude-opus-4-5', name: 'Claude Opus 4.5' }
54
+ ]
55
+ }
56
+ },
29
57
  };
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdENvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kZWZhdWx0Q29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBVztJQUNuQyxLQUFLLEVBQUUsU0FBUztJQUNoQixTQUFTLEVBQUU7UUFDVCxNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUsU0FBUztTQUNsQjtRQUNELFNBQVMsRUFBRTtZQUNULE1BQU0sRUFBRSxTQUFTO1NBQ2xCO1FBQ0QsTUFBTSxFQUFFO1lBQ04sTUFBTSxFQUFFLFNBQVM7U0FDbEI7S0FDRjtJQUNELFFBQVEsRUFBRTtRQUNSLFFBQVEsRUFBRTtZQUNSLElBQUksRUFBRSxTQUFTO1lBQ2YsS0FBSyxFQUFFLFVBQVU7WUFDakIsV0FBVyxFQUFFLDJDQUEyQztZQUN4RCxLQUFLLEVBQUUsSUFBSTtTQUNaO1FBQ0QsZUFBZSxFQUFFO1lBQ2YsSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsbUJBQW1CO1lBQzFCLFdBQVcsRUFBRSxvREFBb0QsRUFBRSxLQUFLLEVBQUUsSUFBSTtZQUM5RSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsRUFBRSxLQUFLO1NBQ1g7S0FDRjtDQUNGLENBQUMifQ==
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdENvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kZWZhdWx0Q29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBVztJQUNuQyxPQUFPLEVBQUUsQ0FBQztJQUNWLGdCQUFnQixFQUFFLElBQUk7SUFDdEIsS0FBSyxFQUFFLFNBQVM7SUFDaEIsUUFBUSxFQUFFO1FBQ1IsUUFBUSxFQUFFO1lBQ1IsSUFBSSxFQUFFLFNBQVM7WUFDZixLQUFLLEVBQUUsVUFBVTtZQUNqQixXQUFXLEVBQUUsMkNBQTJDO1lBQ3hELEtBQUssRUFBRSxJQUFJO1NBQ1o7UUFDRCxlQUFlLEVBQUU7WUFDZixJQUFJLEVBQUUsUUFBUTtZQUNkLEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsV0FBVyxFQUFFLG9EQUFvRCxFQUFFLEtBQUssRUFBRSxJQUFJO1lBQzlFLEdBQUcsRUFBRSxJQUFJO1lBQ1QsR0FBRyxFQUFFLEtBQUs7U0FDWDtLQUNGO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsTUFBTSxFQUFFO1lBQ04sRUFBRSxFQUFFLFFBQVE7WUFDWixJQUFJLEVBQUUsUUFBUTtZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsTUFBTSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxNQUFNLEVBQUUsRUFBRSxjQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtnQkFDdEgsRUFBRSxFQUFFLEVBQUUsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO2dCQUNsSCxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNyRixFQUFFLEVBQUUsRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUMvRixFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxFQUFFO2FBQ2xGO1NBQ0Y7UUFDRCxNQUFNLEVBQUU7WUFDTixFQUFFLEVBQUUsUUFBUTtZQUNaLElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxNQUFNLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNuRSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ25FLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDekQsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM3RCxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3JFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO2FBQ25DO1NBQ0Y7UUFDRCxTQUFTLEVBQUU7WUFDVCxFQUFFLEVBQUUsV0FBVztZQUNmLElBQUksRUFBRSxXQUFXO1lBQ2pCLElBQUksRUFBRSxXQUFXO1lBQ2pCLE1BQU0sRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQ3BELEVBQUUsRUFBRSxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRTtnQkFDdEQsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFO2FBQ25EO1NBQ0Y7S0FDRjtDQUNGLENBQUMifQ==
@@ -0,0 +1,10 @@
1
+ export function validateUrl(url) {
2
+ try {
3
+ new URL(url);
4
+ return true;
5
+ }
6
+ catch {
7
+ return false;
8
+ }
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVVcmwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdmFsaWRhdGVVcmwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLFdBQVcsQ0FBQyxHQUFXO0lBQ3JDLElBQUksQ0FBQztRQUNILElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyJ9