ask-cli-ai 1.0.12 → 1.2.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.
@@ -1,106 +1,144 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { measureElement, useInput, Box, Text } from 'ink';
2
+ import { measureElement, Box, Text } from 'ink';
3
3
  import { useState, useRef, useMemo, useEffect } from 'react';
4
4
  import { ScrollView } from 'ink-scroll-view';
5
5
  import { Fragment } from 'react/jsx-runtime';
6
- import { providers } from "../providers.js";
7
6
  import { configStore } from "../stores/config.js";
8
- import { ApiKeyField } from "./apiKeyField.js";
7
+ import { Commands } from "./commands.js";
8
+ import { Command } from "./command.js";
9
+ import { OpenAIClient } from '@langchain/openai';
10
+ import { TextField } from "./textField.js";
11
+ import { useExit } from "../hooks/useExit.js";
12
+ import { useTestProvider } from "../hooks/useTestProvider.js";
13
+ import { TestProvider } from "./testProvider.js";
9
14
  const config = await configStore.get();
10
15
  export function SelectModel(props) {
11
16
  const { onSelect } = props;
17
+ const [providers, setProviders] = useState(Object.values(config.providers));
12
18
  const [view, setView] = useState('select-model');
13
19
  const [currentPosition, setCurrentPosition] = useState(0);
14
20
  const [scrollViewHeight, setScrollViewHeight] = useState(0);
15
21
  const [model, setModel] = useState();
16
22
  const [provider, setProvider] = useState();
23
+ const [apiKey, setApiKey] = useState('');
17
24
  const [startPosition, setStartPosition] = useState(0);
18
25
  const [endPosition, setEndPosition] = useState(0);
26
+ const [exit, setExit] = useExit();
27
+ const testProvider = useTestProvider();
19
28
  const scrollRef = useRef(null);
20
29
  const contentRef = useRef(null);
21
30
  const items = useMemo(() => {
22
31
  const items = [];
23
- const selectedModel = providers.flatMap(provider => provider.models).find(m => m.name === config.model?.model);
24
- if (selectedModel) {
32
+ const provider = providers.find(provider => config.model?.providerId === provider.id);
33
+ const selectedModel = provider?.models.find(m => m.id === config.model?.id);
34
+ if (provider && selectedModel) {
25
35
  items.push({ type: 'provider', key: 'selected-model-title', provider: 'Selected model' });
26
- items.push({ type: 'model', key: 'selected-model', model: selectedModel });
36
+ items.push({ type: 'model', key: 'selected-model', provider, model: selectedModel });
27
37
  items.push({ type: 'new-line', key: 'selected-model-newline' });
28
38
  }
29
39
  for (const provider of providers) {
30
- items.push({ type: 'provider', key: provider.name, provider: provider.name });
40
+ items.push({ type: 'provider', key: provider.id, provider: provider.name });
41
+ if (provider.models.length === 0) {
42
+ items.push({ type: 'models-not-found', key: `${provider.id}-no-models`, title: 'No models available' });
43
+ }
31
44
  for (const model of provider.models) {
32
- items.push({ type: 'model', key: model.name, model: model });
45
+ items.push({ type: 'model', key: `${provider.id}-${model.id}`, provider, model: model });
33
46
  }
34
- items.push({ type: 'new-line', key: `${provider.name}-newline` });
47
+ items.push({ type: 'new-line', key: `${provider.id}-newline` });
35
48
  }
36
49
  return items;
37
- }, []);
50
+ }, [providers]);
38
51
  useEffect(() => {
39
52
  const height = process.stdout.rows - 2;
40
53
  const contentSize = measureElement(contentRef.current);
41
- const scrollViewHeight = height - contentSize.height;
54
+ const scrollViewHeight = Math.min(height - contentSize.height, 20);
42
55
  setScrollViewHeight(scrollViewHeight);
43
56
  setEndPosition(scrollViewHeight - 1);
44
57
  }, []);
45
58
  useEffect(() => {
46
59
  setCurrentPosition(items.findIndex(item => item.type === 'model'));
47
60
  }, [items]);
48
- useInput((_, key) => {
49
- if (key.upArrow) {
50
- const previousModelItemIndex = items.findLastIndex((item, index) => item.type === 'model' && index < currentPosition);
51
- const position = previousModelItemIndex === -1 ? currentPosition : previousModelItemIndex;
52
- setCurrentPosition(position);
53
- if (position < startPosition) {
54
- scrollRef.current?.scrollBy(position - startPosition);
55
- setStartPosition(position);
56
- setEndPosition(position + (scrollViewHeight - 1));
57
- return;
58
- }
59
- if (items.findIndex(item => item.type === 'model') === position) {
60
- scrollRef.current?.scrollToTop();
61
- setStartPosition(0);
62
- setEndPosition(scrollViewHeight - 1);
63
- }
61
+ useEffect(() => {
62
+ void (async () => {
63
+ const providers = Object
64
+ .values(config.providers)
65
+ .filter(provider => provider.type === 'openai-compatible');
66
+ await Promise.allSettled(providers.map(async (provider) => {
67
+ const client = new OpenAIClient({
68
+ baseURL: provider.url,
69
+ apiKey: provider.key,
70
+ });
71
+ const models = await client.models.list();
72
+ await configStore.updateProvider(provider.id, {
73
+ models: models.data.map(model => ({
74
+ id: model.id,
75
+ name: model.id
76
+ }))
77
+ });
78
+ }));
79
+ const configUpdated = await configStore.get();
80
+ setProviders(Object.values(configUpdated.providers));
81
+ })();
82
+ }, []);
83
+ function handleExit() {
84
+ setExit(true);
85
+ }
86
+ function handleUp() {
87
+ const previousModelItemIndex = items.findLastIndex((item, index) => item.type === 'model' && index < currentPosition);
88
+ const position = previousModelItemIndex === -1 ? currentPosition : previousModelItemIndex;
89
+ setCurrentPosition(position);
90
+ if (position < startPosition) {
91
+ scrollRef.current?.scrollBy(position - startPosition);
92
+ setStartPosition(position);
93
+ setEndPosition(position + (scrollViewHeight - 1));
94
+ return;
64
95
  }
65
- if (key.downArrow) {
66
- const nextModelItemIndex = items.findIndex((item, index) => item.type === 'model' && index > currentPosition);
67
- const position = nextModelItemIndex === -1 ? currentPosition : nextModelItemIndex;
68
- setCurrentPosition(position);
69
- if (position > endPosition && position < items.length - 1) {
70
- scrollRef.current?.scrollBy(position - endPosition);
71
- setStartPosition(position - (scrollViewHeight - 1));
72
- setEndPosition(position);
73
- }
96
+ if (items.findIndex(item => item.type === 'model') === position) {
97
+ scrollRef.current?.scrollToTop();
98
+ setStartPosition(0);
99
+ setEndPosition(scrollViewHeight - 1);
74
100
  }
75
- if (key.return) {
76
- void handleSelectModel(items[currentPosition].model);
101
+ }
102
+ function handleDown() {
103
+ const nextModelItemIndex = items.findIndex((item, index) => item.type === 'model' && index > currentPosition);
104
+ const position = nextModelItemIndex === -1 ? currentPosition : nextModelItemIndex;
105
+ setCurrentPosition(position);
106
+ if (position > endPosition && position < items.length - 1) {
107
+ scrollRef.current?.scrollBy(position - endPosition);
108
+ setStartPosition(position - (scrollViewHeight - 1));
109
+ setEndPosition(position);
77
110
  }
78
- });
79
- async function handleSelectModel(model) {
80
- const provider = providers.find(provider => provider.models.some(item => item.name === model.name));
81
- const config = await configStore.get();
82
- const apikey = config.providers[provider.id].apiKey;
111
+ }
112
+ function handleSelectModel() {
113
+ const { provider, model } = items[currentPosition];
83
114
  setProvider(provider);
84
115
  setModel(model);
85
- if (!apikey) {
116
+ if (provider.type !== 'openai-compatible' && !provider.key) {
86
117
  setView('set-api-key');
87
118
  return;
88
119
  }
89
- void save(provider, model, apikey);
120
+ void save(provider, model, provider.key ?? '');
90
121
  }
91
- function handleApiKeyChange(apiKey) {
92
- void save(provider, model, apiKey);
122
+ async function handleSaveApiKey() {
123
+ const isValid = await testProvider.test({ ...provider, key: apiKey });
124
+ if (isValid) {
125
+ void save(provider, model, apiKey);
126
+ }
93
127
  }
94
128
  async function save(provider, model, apikey) {
95
129
  await configStore.setProviderApiKey(provider.id, apikey);
96
- await configStore.setModel(provider.id, model.name);
97
- onSelect(model, apikey);
130
+ await configStore.setModel(provider.id, model.id);
131
+ onSelect(provider, model);
98
132
  }
133
+ if (exit)
134
+ return null;
99
135
  return (_jsxs(Box, { children: [view === 'select-model' &&
100
- _jsxs(Box, { ref: contentRef, flexDirection: 'column', children: [_jsx(Text, { bold: true, children: "Select a model" }), _jsx(Box, { flexDirection: 'column', height: scrollViewHeight < items.length ? scrollViewHeight : undefined, borderStyle: 'single', borderLeftColor: 'cyan', borderLeft: true, borderRight: false, borderTop: false, borderBottom: false, marginTop: 1, paddingLeft: 1, children: _jsx(ScrollView, { ref: scrollRef, children: items.map((item, index) => _jsxs(Fragment, { children: [item.type === 'provider' &&
136
+ _jsxs(Box, { ref: contentRef, flexDirection: 'column', children: [_jsx(Text, { color: 'whiteBright', bold: true, children: "Select Model" }), _jsx(Box, { flexDirection: 'column', height: scrollViewHeight < items.length ? scrollViewHeight : undefined, borderStyle: 'single', borderLeftColor: 'cyan', borderLeft: true, borderRight: false, borderTop: false, borderBottom: false, marginTop: 1, paddingLeft: 1, children: _jsx(ScrollView, { ref: scrollRef, children: items.map((item, index) => _jsxs(Fragment, { children: [item.type === 'provider' &&
101
137
  _jsx(Text, { bold: true, color: 'blue', children: item.provider }, item.provider), item.type === 'model' &&
102
- _jsx(Text, { color: index === currentPosition ? 'cyanBright' : undefined, inverse: index === currentPosition, children: item.model.title }, item.model.name), item.type === 'new-line' &&
103
- _jsx(Text, { children: " " })] }, item.key)) }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: 'gray', children: 'Esc (Exit), Enter (Select)' }) })] }), view === 'set-api-key' &&
104
- _jsx(ApiKeyField, { title: `${provider?.name} Api Key`, commands: 'Esc (Exit), Ctrl+V (Paste), Enter (Save)', onChange: handleApiKeyChange })] }));
138
+ _jsxs(Text, { color: index === currentPosition ? 'cyanBright' : undefined, inverse: index === currentPosition, children: [item.key === 'selected-model' && `(${item.provider.name}) `, item.model.name] }, item.model.id), item.type === 'models-not-found' &&
139
+ _jsx(Text, { dimColor: true, color: 'gray', children: item.title }), item.type === 'new-line' &&
140
+ _jsx(Text, { children: " " })] }, item.key)) }) }), _jsxs(Commands, { children: [_jsx(Command, { title: 'Esc (Exit)', esc: true, onPress: handleExit }), _jsx(Command, { title: 'Enter (Select)', enter: true, onPress: handleSelectModel }), _jsx(Command, { up: true, onPress: handleUp }), _jsx(Command, { down: true, onPress: handleDown })] })] }), view === 'set-api-key' &&
141
+ _jsxs(Box, { flexDirection: 'column', children: [_jsxs(Text, { color: 'whiteBright', bold: true, children: ["Enter ", provider?.name, " api key"] }), _jsx(Box, { marginTop: 1, children: _jsx(TextField, { label: 'Api key', focus: true, value: apiKey, placeholder: 'Enter api key', onChange: setApiKey }) }), provider &&
142
+ _jsx(TestProvider, { type: provider.type, testing: testProvider.testing, error: testProvider.error }), _jsxs(Commands, { children: [_jsx(Command, { title: 'Esc (Exit)', esc: true, onPress: handleExit }), _jsx(Command, { title: 'Ctrl+V (Paste)', ctrl: true, inputKey: 'v' }), _jsx(Command, { title: 'Enter (Save)', enter: true, onPress: handleSaveApiKey }), _jsx(Command, { ctrl: true, inputKey: 's', onPress: handleSaveApiKey })] })] })] }));
105
143
  }
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0TW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9zZWxlY3RNb2RlbC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQWMsTUFBTSxLQUFLLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBTyxNQUFNLE9BQU8sQ0FBQztBQUNsRSxPQUFPLEVBQWlCLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBbUIsQ0FBQztBQU9oRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQU12QyxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQVk7SUFFdEMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQztJQUUzQixNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBaUMsY0FBYyxDQUFDLENBQUM7SUFDakYsTUFBTSxDQUFDLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxRQUFRLEVBQVMsQ0FBQztJQUM1QyxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcs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
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0TW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9zZWxlY3RNb2RlbC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBYyxNQUFNLEtBQUssQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFPLE1BQU0sT0FBTyxDQUFDO0FBQ2xFLE9BQU8sRUFBaUIsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW9CLENBQUM7QUFRbEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7QUFNdkMsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFZO0lBRXRDLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFFM0IsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsR0FBRyxRQUFRLENBQWEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFD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
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ export function TestProvider(props) {
5
+ const { type, testing, error } = props;
6
+ return (_jsxs(Box, { children: [testing &&
7
+ _jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: [_jsx(Text, { children: type === 'openai-compatible'
8
+ ? 'Connecting'
9
+ : 'Validating API key' }), _jsx(Spinner, { type: 'simpleDots' })] }) }), error &&
10
+ _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: 'red', children: [_jsx(Text, { children: type === 'openai-compatible'
11
+ ? 'Incorrect url or API key: '
12
+ : 'Invalid API key: ' }), _jsxs(Text, { color: 'redBright', children: [_jsx(Text, { children: error.slice(0, 500) }), error.length > 500 && _jsx(Text, { children: "..." })] })] }) })] }));
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdFByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvdGVzdFByb3ZpZGVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDaEMsT0FBTyxPQUFPLE1BQU0sYUFBYSxDQUFDO0FBU2xDLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBWTtJQUV2QyxNQUFNLEVBQ0osSUFBSSxFQUNKLE9BQU8sRUFDUCxLQUFLLEVBQ04sR0FBRyxLQUFLLENBQUM7SUFFVixPQUFPLENBQ0wsTUFBQyxHQUFHLGVBQ0QsT0FBTztnQkFDTixLQUFDLEdBQUcsSUFBQyxTQUFTLEVBQUUsQ0FBQyxZQUNmLE1BQUMsSUFBSSxlQUNILEtBQUMsSUFBSSxjQUNGLElBQUksS0FBSyxtQkFBbUI7b0NBQzNCLENBQUMsQ0FBQyxZQUFZO29DQUNkLENBQUMsQ0FBQyxvQkFBb0IsR0FFbkIsRUFDUCxLQUFDLE9BQU8sSUFBQyxJQUFJLEVBQUMsWUFBWSxHQUFFLElBQ3ZCLEdBQ0gsRUFFUCxLQUFLO2dCQUNKLEtBQUMsR0FBRyxJQUFDLFNBQVMsRUFBRSxDQUFDLFlBQ2YsTUFBQyxJQUFJLElBQUMsS0FBSyxFQUFDLEtBQUssYUFDZixLQUFDLElBQUksY0FDRixJQUFJLEtBQUssbUJBQW1CO29DQUMzQixDQUFDLENBQUMsNEJBQTRCO29DQUM5QixDQUFDLENBQUMsbUJBQW1CLEdBRWxCLEVBQ1AsTUFBQyxJQUFJLElBQUMsS0FBSyxFQUFDLFdBQVcsYUFDckIsS0FBQyxJQUFJLGNBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQVEsRUFDakMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBQyxJQUFJLHNCQUFXLElBQ2xDLElBQU8sR0FDWixJQUVKLENBQ1AsQ0FBQztBQUNKLENBQUMifQ==
@@ -1,29 +1,9 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Box, Text } from 'ink';
3
- import TextInput from 'ink-text-input';
4
- import { useEffect, useState } from 'react';
3
+ import { TextInput } from "./textInput.js";
5
4
  export function TextField(props) {
6
- const { label, value: initialValue, placeholder = 'Enter text, paste (Ctrl+V)', marginTop, onChange, onSubmit } = props;
7
- const [value, setValue] = useState(initialValue);
8
- useEffect(() => {
9
- onChange(value);
10
- }, [value]);
11
- function handleChange(input) {
12
- // Workaround for paste detection in Linux terminals.
13
- // When the user pastes a long text, it is split into multiple input events,
14
- // which causes only a part of the text to be saved in the state.
15
- // To fix this, we check if the user is pasting text and then append the value
16
- // to the existing one. To detect when the user is pasting, we check the length
17
- // of the input value. If the difference between the new value and the current
18
- // state is greater than 1, we assume the user is pasting.
19
- if (input.length - value.length > 1) {
20
- setValue(value => value + input);
21
- }
22
- else {
23
- setValue(input);
24
- }
25
- }
26
- return (_jsxs(Box, { flexDirection: 'row', marginTop: marginTop, borderStyle: 'single', borderLeftColor: 'cyan', borderLeft: true, borderRight: false, borderTop: false, borderBottom: false, paddingLeft: 1, children: [label &&
27
- _jsx(Box, { flexShrink: 0, children: _jsxs(Text, { children: [label, " "] }) }), _jsx(TextInput, { value: value, onChange: handleChange, onSubmit: () => onSubmit?.(value), placeholder: placeholder })] }));
5
+ const { label, focus = true, value, placeholder, color, inverse, error, onChange, onSubmit } = props;
6
+ return (_jsxs(Box, { gap: 1, borderStyle: 'single', borderColor: focus ? 'cyan' : 'white', borderTop: false, borderRight: false, borderBottom: false, paddingLeft: 1, children: [_jsxs(Box, { flexShrink: 0, children: [_jsx(Text, { color: focus ? 'cyan' : 'whiteBright', children: label }), error &&
7
+ _jsxs(Text, { color: 'gray', children: [" (", error, ")"] }), _jsx(Text, { children: ":" })] }), _jsx(Text, { color: color, inverse: inverse, children: _jsx(TextInput, { placeholder: placeholder, focus: focus, value: value, onChange: onChange, onSubmit: () => onSubmit?.(value) }) })] }));
28
8
  }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dEZpZWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvdGV4dEZpZWxkLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDaEMsT0FBTyxTQUFTLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFXNUMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFZO0lBRXBDLE1BQU0sRUFDSixLQUFLLEVBQ0wsS0FBSyxFQUFFLFlBQVksRUFDbkIsV0FBVyxHQUFHLDRCQUE0QixFQUMxQyxTQUFTLEVBQ1QsUUFBUSxFQUNSLFFBQVEsRUFDVCxHQUFHLEtBQUssQ0FBQztJQUVWLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRWxELFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUVaLFNBQVMsWUFBWSxDQUFDLEtBQWE7UUFDakMscURBQXFEO1FBQ3JELDRFQUE0RTtRQUM1RSxpRUFBaUU7UUFDakUsOEVBQThFO1FBQzlFLCtFQUErRTtRQUMvRSw4RUFBOEU7UUFDOUUsMERBQTBEO1FBQzFELElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FDTCxNQUFDLEdBQUcsSUFDRixhQUFhLEVBQUMsS0FBSyxFQUNuQixTQUFTLEVBQUUsU0FBUyxFQUNwQixXQUFXLEVBQUMsUUFBUSxFQUNwQixlQUFlLEVBQUMsTUFBTSxFQUN0QixVQUFVLEVBQUUsSUFBSSxFQUNoQixXQUFXLEVBQUUsS0FBSyxFQUNsQixTQUFTLEVBQUUsS0FBSyxFQUNoQixZQUFZLEVBQUUsS0FBSyxFQUNuQixXQUFXLEVBQUUsQ0FBQyxhQUNiLEtBQUs7Z0JBQ0osS0FBQyxHQUFHLElBQUMsVUFBVSxFQUFFLENBQUMsWUFDaEIsTUFBQyxJQUFJLGVBQUUsS0FBSyxTQUFTLEdBQ2pCLEVBRVIsS0FBQyxTQUFTLElBQ1IsS0FBSyxFQUFFLEtBQUssRUFDWixRQUFRLEVBQUUsWUFBWSxFQUN0QixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQ2pDLFdBQVcsRUFBRSxXQUFXLEdBQ3hCLElBQ0UsQ0FDUCxDQUFDO0FBQ0osQ0FBQyJ9
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dEZpZWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvdGV4dEZpZWxkLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQWEsTUFBTSxLQUFLLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFpQixDQUFDO0FBYzVDLE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBWTtJQUVwQyxNQUFNLEVBQ0osS0FBSyxFQUNMLEtBQUssR0FBRyxJQUFJLEVBQ1osS0FBSyxFQUNMLFdBQVcsRUFDWCxLQUFLLEVBQ0wsT0FBTyxFQUNQLEtBQUssRUFDTCxRQUFRLEVBQ1IsUUFBUSxFQUNULEdBQUcsS0FBSyxDQUFDO0lBRVYsT0FBTyxDQUNMLE1BQUMsR0FBRyxJQUNGLEdBQUcsRUFBRSxDQUFDLEVBQ04sV0FBVyxFQUFDLFFBQVEsRUFDcEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQ3JDLFNBQVMsRUFBRSxLQUFLLEVBQ2hCLFdBQVcsRUFBRSxLQUFLLEVBQ2xCLFlBQVksRUFBRSxLQUFLLEVBQ25CLFdBQVcsRUFBRSxDQUFDLGFBQ2QsTUFBQyxHQUFHLElBQUMsVUFBVSxFQUFFLENBQUMsYUFDaEIsS0FBQyxJQUFJLElBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLFlBQ3hDLEtBQUssR0FDRCxFQUNOLEtBQUs7d0JBQ0osTUFBQyxJQUFJLElBQUMsS0FBSyxFQUFDLE1BQU0sbUJBQUksS0FBSyxTQUFTLEVBRXRDLEtBQUMsSUFBSSxvQkFBUyxJQUNWLEVBQ04sS0FBQyxJQUFJLElBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxZQUNsQyxLQUFDLFNBQVMsSUFDUixXQUFXLEVBQUUsV0FBVyxFQUN4QixLQUFLLEVBQUUsS0FBSyxFQUNaLEtBQUssRUFBRSxLQUFLLEVBQ1osUUFBUSxFQUFFLFFBQVEsRUFDbEIsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQ2pDLElBQ0gsQ0FDUCxDQUFDO0FBQ0osQ0FBQyJ9
@@ -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,23 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState } from 'react';
3
- import { Box, Static, Text, useInput } from 'ink';
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
- useInput((_, key) => {
10
- if (key.escape) {
11
- process.exit(0);
12
- }
13
- });
14
- function handleSend(model, apiKey) {
15
- setClosed(true);
16
- onSend(model.name, apiKey);
17
- }
18
- if (closed) {
19
- return null;
7
+ function handleSend() {
8
+ onSend();
20
9
  }
21
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 })] }));
22
11
  }
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VsY29tZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3dlbGNvbWUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFtQixDQUFDO0FBRWhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQU14QyxNQUFNLFVBQVUsT0FBTyxDQUFDLEtBQVk7SUFFbEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQztJQUV6QixNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU1QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbEIsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsVUFBVSxDQUFDLEtBQVksRUFBRSxNQUFjO1FBQzlDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sQ0FDTCxNQUFDLEdBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxhQUN6QixLQUFDLE1BQU0sSUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FDTixNQUFDLEdBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFZLFlBQVksRUFBRSxDQUFDLGFBQ3BELEtBQUMsSUFBSSxjQUFFLElBQUksR0FBUSxFQUNuQixNQUFDLEdBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFNBQVMsRUFBRSxDQUFDLGFBQ3RDLEtBQUMsSUFBSSwwRkFBK0UsRUFDcEYsTUFBQyxHQUFHLElBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLGFBQ3RELEtBQUMsSUFBSSw0RUFBdUQsRUFDNUQsS0FBQyxJQUFJLDBHQUFxRixFQUMxRixLQUFDLElBQUksOEVBQXlELEVBQzlELEtBQUMsSUFBSSx1SUFBNkcsSUFDOUcsSUFDRixFQUNOLEtBQUMsR0FBRyxJQUFDLFNBQVMsRUFBRSxDQUFDLFlBQ2YsS0FBQyxJQUFJLGtEQUF1QyxHQUN4QyxLQWJ5QixJQUFJLENBYy9CLEdBRUQsRUFDVCxLQUFDLFdBQVcsSUFBQyxRQUFRLEVBQUUsVUFBVSxHQUFHLElBQ2hDLENBQ1AsQ0FBQztBQUNKLENBQUMifQ==
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
@@ -0,0 +1,5 @@
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=