ask-cli-ai 1.1.0 → 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.
- package/README.md +9 -1
- package/dist/app.js +9 -3
- package/dist/commands/ask.js +68 -40
- package/dist/commands/config.js +6 -10
- package/dist/commands/connect.js +112 -0
- package/dist/commands/selectModel.js +11 -17
- package/dist/components/command.js +9 -6
- package/dist/components/commands.js +3 -3
- package/dist/components/provider.js +81 -22
- package/dist/components/providers.js +21 -19
- package/dist/components/selectModel.js +62 -26
- package/dist/components/testProvider.js +14 -0
- package/dist/components/textField.js +7 -29
- package/dist/components/textInput.js +136 -0
- package/dist/components/welcome.js +3 -9
- package/dist/hooks/useExit.js +17 -0
- package/dist/hooks/useField.js +20 -0
- package/dist/hooks/useTestProvider.js +63 -0
- package/dist/install.js +5 -2
- package/dist/migrations/1-settings-1.1.0.js +56 -0
- package/dist/migrations/2-add-providers-1.2.0.js +60 -0
- package/dist/stores/config.js +35 -6
- package/dist/templates/instructions.js +5 -4
- package/dist/utils/defaultConfig.js +41 -13
- package/dist/utils/validateUrl.js +10 -0
- package/package.json +74 -72
- package/dist/components/apiKeyField.js +0 -8
- package/dist/migrations/settings-1.1.0.js +0 -23
- package/dist/providers.js +0 -35
package/README.md
CHANGED
|
@@ -21,6 +21,7 @@ Forget about switching between applications to know how to use a command or fix
|
|
|
21
21
|
- [Usage](#usage)
|
|
22
22
|
- [Select model](#select-model)
|
|
23
23
|
- [Supported models](#supported-models)
|
|
24
|
+
- [Connect to local or external providers](#connect-to-local-or-external-providers)
|
|
24
25
|
- [Reference](#reference)
|
|
25
26
|
|
|
26
27
|
## Why use Ask CLI?
|
|
@@ -118,12 +119,18 @@ You can select a model using the **`ask /models`** command. This will list all t
|
|
|
118
119
|
- Claude Sonnet 4.5
|
|
119
120
|
- Claude Opus 4.5
|
|
120
121
|
|
|
122
|
+
## Connect to local or external providers
|
|
123
|
+
|
|
124
|
+
You can use the **`ask /connect`** command to connect to local models or external providers, using an **OpenAI-compatible API**, like llama.cpp, Ollama, Hugging Face, etc.
|
|
125
|
+
|
|
126
|
+

|
|
127
|
+
|
|
121
128
|
## Reference
|
|
122
129
|
|
|
123
130
|
```
|
|
124
131
|
AI CLI to help you with commands, coding, apps and more.
|
|
125
132
|
|
|
126
|
-
Version: 1.
|
|
133
|
+
Version: 1.2.0
|
|
127
134
|
|
|
128
135
|
Usage: ask <prompt..>
|
|
129
136
|
|
|
@@ -132,6 +139,7 @@ Commands:
|
|
|
132
139
|
ask /models Select a model
|
|
133
140
|
ask /providers Setup providers
|
|
134
141
|
ask /config Configuration
|
|
142
|
+
ask /connect Connect to an external provider using OpenAI-compatible API
|
|
135
143
|
ask /history List the chat history
|
|
136
144
|
ask /clear Clear the chat history
|
|
137
145
|
|
package/dist/app.js
CHANGED
|
@@ -8,10 +8,11 @@ import { clearHistory } from "./commands/clearHistory.js";
|
|
|
8
8
|
import { providers } from "./commands/providers.js";
|
|
9
9
|
import { logo } from "./utils/logo.js";
|
|
10
10
|
import { config } from "./commands/config.js";
|
|
11
|
+
import { connect } from "./commands/connect.js";
|
|
11
12
|
void yargs(hideBin(process.argv))
|
|
12
13
|
.scriptName('ask')
|
|
13
|
-
.usage(`${logo}\nAI CLI to help you with commands, coding, apps and more.\n\nVersion: 1.
|
|
14
|
-
.version('1.
|
|
14
|
+
.usage(`${logo}\nAI CLI to help you with commands, coding, apps and more.\n\nVersion: 1.2.0\n\nUsage: $0 <prompt..>`)
|
|
15
|
+
.version('1.2.0')
|
|
15
16
|
.locale('en')
|
|
16
17
|
.example('$0 how to run a docker container', '')
|
|
17
18
|
.example('how to setup my git account', '')
|
|
@@ -45,6 +46,11 @@ void yargs(hideBin(process.argv))
|
|
|
45
46
|
command: '/config',
|
|
46
47
|
describe: 'Configuration',
|
|
47
48
|
handler: () => config()
|
|
49
|
+
})
|
|
50
|
+
.command({
|
|
51
|
+
command: '/connect',
|
|
52
|
+
describe: 'Connect to an external provider using OpenAI-compatible API',
|
|
53
|
+
handler: () => connect()
|
|
48
54
|
})
|
|
49
55
|
.command({
|
|
50
56
|
command: '/history',
|
|
@@ -57,4 +63,4 @@ void yargs(hideBin(process.argv))
|
|
|
57
63
|
handler: () => clearHistory()
|
|
58
64
|
})
|
|
59
65
|
.parse();
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG1CQUFvQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBd0IsQ0FBQztBQUVqRCxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzlCLFVBQVUsQ0FBQyxLQUFLLENBQUM7S0FDakIsS0FBSyxDQUFDLEdBQUcsSUFBSSxzR0FBc0csQ0FBQztLQUNwSCxPQUFPLENBQUMsT0FBTyxDQUFDO0tBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUM7S0FDWixPQUFPLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxDQUFDO0tBQy9DLE9BQU8sQ0FBQyw2QkFBNkIsRUFBRSxFQUFFLENBQUM7S0FDMUMsT0FBTyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsQ0FBQztLQUN4QyxPQUFPLENBQUMsNENBQTRDLEVBQUUsRUFBRSxDQUFDO0tBQ3pELElBQUksRUFBRTtLQUNOLE9BQU8sQ0FBQztJQUNQLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLFFBQVEsRUFBRSxpQ0FBaUM7SUFDM0MsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSztTQUNwQixVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUN6RSxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ2pCLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUNaLElBQUksRUFBRSxRQUFRO1FBQ2QsV0FBVyxFQUFFLG9CQUFvQjtRQUNqQyxXQUFXLEVBQUUsSUFBSTtLQUNsQixDQUFDO0lBQ0osT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQztDQUM1RCxDQUFDO0tBQ0QsT0FBTyxDQUFDO0lBQ1AsT0FBTyxFQUFFLFNBQVM7SUFDbEIsUUFBUSxFQUFFLGdCQUFnQjtJQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxFQUFFO0NBQzdCLENBQUM7S0FDRCxPQUFPLENBQUM7SUFDUCxPQUFPLEVBQUUsWUFBWTtJQUNyQixRQUFRLEVBQUUsaUJBQWlCO0lBQzNCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUU7Q0FDM0IsQ0FBQztLQUNELE9BQU8sQ0FBQztJQUNQLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFFBQVEsRUFBRSxlQUFlO0lBQ3pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Q0FDeEIsQ0FBQztLQUNELE9BQU8sQ0FBQztJQUNQLE9BQU8sRUFBRSxVQUFVO0lBQ25CLFFBQVEsRUFBRSw2REFBNkQ7SUFDdkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRTtDQUN6QixDQUFDO0tBQ0QsT0FBTyxDQUFDO0lBQ1AsT0FBTyxFQUFFLFVBQVU7SUFDbkIsUUFBUSxFQUFFLHVCQUF1QjtJQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxFQUFFO0NBQzdCLENBQUM7S0FDRCxPQUFPLENBQUM7SUFDUCxPQUFPLEVBQUUsUUFBUTtJQUNqQixRQUFRLEVBQUUsd0JBQXdCO0lBQ2xDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUU7Q0FDOUIsQ0FBQztLQUNELEtBQUssRUFBRSxDQUFDIn0=
|
package/dist/commands/ask.js
CHANGED
|
@@ -4,7 +4,7 @@ import findProcess from 'find-process';
|
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import { exec as execCb } from 'node:child_process';
|
|
6
6
|
import { useEffect, useState } from 'react';
|
|
7
|
-
import { Box, render, Static, Text
|
|
7
|
+
import { Box, render, Static, Text } from 'ink';
|
|
8
8
|
import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
|
|
9
9
|
import { configStore } from "../stores/config.js";
|
|
10
10
|
import { historyStore } from "../stores/history.js";
|
|
@@ -13,7 +13,8 @@ import { Loading } from "../components/loading.js";
|
|
|
13
13
|
import { ChatAnthropic } from '@langchain/anthropic';
|
|
14
14
|
import { ChatOpenAI } from '@langchain/openai';
|
|
15
15
|
import { instructions } from "../templates/instructions.js";
|
|
16
|
-
import {
|
|
16
|
+
import { useExit } from "../hooks/useExit.js";
|
|
17
|
+
import { SelectModel } from "../components/selectModel.js";
|
|
17
18
|
const exec = util.promisify(execCb);
|
|
18
19
|
const config = await configStore.get();
|
|
19
20
|
const history = await historyStore.get();
|
|
@@ -22,53 +23,56 @@ export function ask(prompt, command) {
|
|
|
22
23
|
}
|
|
23
24
|
function Ask(props) {
|
|
24
25
|
const { prompt, command } = props;
|
|
25
|
-
const { exit } = useApp();
|
|
26
26
|
const [view, setView] = useState('ask');
|
|
27
27
|
const [sending, setSending] = useState(false);
|
|
28
28
|
const [response, setResponse] = useState('');
|
|
29
29
|
const [meta, setMeta] = useState();
|
|
30
|
-
const [
|
|
30
|
+
const [_, setExit] = useExit();
|
|
31
31
|
const [isFirstRun, setIsFirstRun] = useState(false);
|
|
32
32
|
useEffect(() => {
|
|
33
33
|
void (async () => {
|
|
34
|
-
if (config.
|
|
35
|
-
|
|
34
|
+
if (config.isFirstExecution) {
|
|
35
|
+
setView('welcome');
|
|
36
|
+
setIsFirstRun(true);
|
|
37
|
+
}
|
|
38
|
+
else if (!config.model) {
|
|
39
|
+
setView('select-model');
|
|
36
40
|
}
|
|
37
41
|
else {
|
|
38
|
-
|
|
42
|
+
await send(config);
|
|
39
43
|
}
|
|
40
44
|
})();
|
|
41
45
|
}, []);
|
|
42
|
-
useEffect(() => {
|
|
43
|
-
if (exitCode !== undefined) {
|
|
44
|
-
setTimeout(() => exit(), 0);
|
|
45
|
-
}
|
|
46
|
-
}, [exitCode]);
|
|
47
46
|
useEffect(() => {
|
|
48
47
|
void historyStore.deleteOldHistory();
|
|
49
48
|
}, []);
|
|
50
49
|
async function handleSend() {
|
|
51
|
-
setIsFirstRun(true);
|
|
52
50
|
setView('ask');
|
|
53
51
|
const config = await configStore.get();
|
|
52
|
+
config.isFirstExecution = false;
|
|
53
|
+
await configStore.save(config);
|
|
54
54
|
await send(config);
|
|
55
55
|
}
|
|
56
56
|
async function send(config) {
|
|
57
|
-
const modelId = config.model.
|
|
58
|
-
const providerId = config.model.
|
|
59
|
-
const
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
const modelId = config.model.id;
|
|
58
|
+
const providerId = config.model.providerId;
|
|
59
|
+
const provider = config.providers[providerId];
|
|
60
|
+
const model = provider?.models.find(model => model.id === modelId);
|
|
61
|
+
if (!model) {
|
|
62
|
+
console.error(`Error: model ${chalk.bold(modelId)} not found`);
|
|
63
|
+
setExit(true);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (provider.type !== 'openai-compatible' && !provider.key) {
|
|
67
|
+
console.error(`No API key found for the model ${chalk.bold(`(${provider.name}) ${model.name}`)}.\n`);
|
|
64
68
|
console.error(`Use the command ${chalk.cyan(chalk.bold('ask /providers'))} to set the API key for the provider ${chalk.bold(provider.name)}.`);
|
|
65
|
-
|
|
69
|
+
setExit(true);
|
|
66
70
|
return;
|
|
67
71
|
}
|
|
68
72
|
try {
|
|
69
73
|
setSending(true);
|
|
70
74
|
const prompt = await getPrompt();
|
|
71
|
-
const modelClient = getModel(
|
|
75
|
+
const modelClient = getModel(provider, model);
|
|
72
76
|
const startTime = Date.now();
|
|
73
77
|
const response = await modelClient.invoke([
|
|
74
78
|
{ role: 'system', content: instructions },
|
|
@@ -82,18 +86,17 @@ function Ask(props) {
|
|
|
82
86
|
]);
|
|
83
87
|
setResponse(response.text.replaceAll('\\x1b', '\x1b').replaceAll('\\n', '\n').concat('\x1b[0m'));
|
|
84
88
|
setMeta({
|
|
85
|
-
model: model.
|
|
89
|
+
model: model.name,
|
|
86
90
|
time: endTime - startTime,
|
|
87
|
-
|
|
88
|
-
outputTokens: response.usage_metadata?.output_tokens || 0
|
|
91
|
+
tokens: (response.usage_metadata?.input_tokens || 0) + (response.usage_metadata?.output_tokens || 0)
|
|
89
92
|
});
|
|
90
93
|
setSending(false);
|
|
91
|
-
|
|
94
|
+
setExit(true);
|
|
92
95
|
}
|
|
93
96
|
catch (err) {
|
|
94
|
-
console.error(`Error running model ${chalk.bold(
|
|
97
|
+
console.error(`Error running model ${chalk.bold(`(${provider.name}) ${model.name}`)}:\n\n${err.message}`);
|
|
95
98
|
setSending(false);
|
|
96
|
-
|
|
99
|
+
setExit(true);
|
|
97
100
|
}
|
|
98
101
|
}
|
|
99
102
|
async function getPrompt() {
|
|
@@ -104,15 +107,39 @@ function Ask(props) {
|
|
|
104
107
|
}
|
|
105
108
|
return result;
|
|
106
109
|
}
|
|
107
|
-
function getModel(
|
|
108
|
-
const provider = providers.find(provider => provider.id === providerId);
|
|
109
|
-
const model = provider?.models.find(model => model.name === modelId);
|
|
110
|
+
function getModel(provider, model) {
|
|
110
111
|
const maxOutputTokens = config.settings.maxOutputTokens.value;
|
|
111
|
-
switch (
|
|
112
|
-
case 'openai':
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
112
|
+
switch (provider.type) {
|
|
113
|
+
case 'openai':
|
|
114
|
+
return new ChatOpenAI({
|
|
115
|
+
model: model.id,
|
|
116
|
+
apiKey: provider.key,
|
|
117
|
+
maxTokens: maxOutputTokens,
|
|
118
|
+
...model?.config
|
|
119
|
+
});
|
|
120
|
+
case 'gemini':
|
|
121
|
+
return new ChatGoogleGenerativeAI({
|
|
122
|
+
model: model.id,
|
|
123
|
+
apiKey: provider.key,
|
|
124
|
+
maxOutputTokens,
|
|
125
|
+
...model?.config
|
|
126
|
+
});
|
|
127
|
+
case 'anthropic':
|
|
128
|
+
return new ChatAnthropic({
|
|
129
|
+
model: model.id,
|
|
130
|
+
apiKey: provider.key,
|
|
131
|
+
maxTokens: maxOutputTokens,
|
|
132
|
+
...model?.config
|
|
133
|
+
});
|
|
134
|
+
case 'openai-compatible':
|
|
135
|
+
return new ChatOpenAI({
|
|
136
|
+
model: model.id,
|
|
137
|
+
apiKey: provider.key,
|
|
138
|
+
configuration: { baseURL: provider.url },
|
|
139
|
+
maxTokens: maxOutputTokens
|
|
140
|
+
});
|
|
141
|
+
default:
|
|
142
|
+
throw new Error('Model not found');
|
|
116
143
|
}
|
|
117
144
|
}
|
|
118
145
|
async function runCommand(command) {
|
|
@@ -123,7 +150,7 @@ function Ask(props) {
|
|
|
123
150
|
}
|
|
124
151
|
catch (err) {
|
|
125
152
|
const { stdout, stderr } = err;
|
|
126
|
-
return `Error executing command
|
|
153
|
+
return `Error executing command:\n\n${stdout}\n\n${stderr}`;
|
|
127
154
|
}
|
|
128
155
|
}
|
|
129
156
|
function formatTime(time) {
|
|
@@ -132,11 +159,12 @@ function Ask(props) {
|
|
|
132
159
|
: `${(time / (1000 * 60)).toFixed(1)}m`;
|
|
133
160
|
}
|
|
134
161
|
return (_jsxs(Box, { children: [view === 'welcome' &&
|
|
135
|
-
_jsx(Welcome, { onSend: handleSend }), view === '
|
|
162
|
+
_jsx(Welcome, { onSend: handleSend }), view === 'select-model' &&
|
|
163
|
+
_jsx(SelectModel, { onSelect: handleSend }), view === 'ask' &&
|
|
136
164
|
_jsxs(Box, { children: [isFirstRun &&
|
|
137
165
|
_jsx(Static, { items: [''], children: item => _jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: [_jsx(Text, { color: 'cyan', bold: true, children: "Prompt:" }), " ", prompt] }) }, item) }), sending &&
|
|
138
166
|
_jsx(Loading, {}), !sending && response &&
|
|
139
167
|
_jsx(Static, { items: [''], children: item => _jsxs(Box, { flexDirection: 'column', children: [_jsx(Text, { children: response }), config.settings.metadata.value && meta &&
|
|
140
|
-
_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: 'gray', dimColor: true, children: ["Model: ", meta.model, ", Time: ", formatTime(meta.time), ", Tokens: ", meta.
|
|
168
|
+
_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: 'gray', dimColor: true, children: ["Model: ", meta.model, ", Time: ", formatTime(meta.time), ", Tokens: ", meta.tokens] }) })] }, item) })] })] }));
|
|
141
169
|
}
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2Fzay50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEtBQUssQ0FBQztBQUNoRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFJNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBK0IsQ0FBQztBQUU1RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXBDLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBRXpDLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBYyxFQUFFLE9BQWdCO0lBQ2xELE1BQU0sQ0FBQyxLQUFDLEdBQUcsSUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFPRCxTQUFTLEdBQUcsQ0FBQyxLQUFZO0lBRXZCLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRWxDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFxQyxLQUFLLENBQUMsQ0FBQztJQUM1RSxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLFFBQVEsRUFBbUQsQ0FBQztJQUNwRixNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXBELFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDZixJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM1QixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ25CLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixDQUFDO2lCQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN2QyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxLQUFLLFVBQVUsVUFBVTtRQUN2QixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDZixNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLE1BQU0sV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxVQUFVLElBQUksQ0FBQyxNQUFjO1FBRWhDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFNLENBQUMsVUFBVSxDQUFDO1FBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQy9ELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNkLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLG1CQUFtQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzNELE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRyxPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyx3Q0FBd0MsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9JLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNkLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBRUgsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWpCLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxFQUFFLENBQUM7WUFFakMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUU5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFN0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxXQUFXLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRTtnQkFDekMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDckMsRUFBRyxJQUFJLEVBQUUsT0FBTyxFQUFHLE9BQU8sRUFBRSxNQUFNLEVBQUU7YUFDckMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBRTNCLE1BQU0sWUFBWSxDQUFDLEdBQUcsQ0FBQztnQkFDckIsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQ2xDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRTthQUN2QyxDQUFDLENBQUM7WUFFSCxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFFakcsT0FBTyxDQUFDO2dCQUNOLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDakIsSUFBSSxFQUFFLE9BQU8sR0FBRyxTQUFTO2dCQUN6QixNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsYUFBYSxJQUFJLENBQUMsQ0FBQzthQUNyRyxDQUFDLENBQUM7WUFFSCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBRWIsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVMsR0FBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFFckgsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssVUFBVSxTQUFTO1FBRXRCLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVwQixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osTUFBTSxhQUFhLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsTUFBTSxJQUFJLGdCQUFnQixPQUFPLDBCQUEwQixhQUFhLEVBQUUsQ0FBQztRQUM3RSxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELFNBQVMsUUFBUSxDQUFDLFFBQWtCLEVBQUUsS0FBWTtRQUVoRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFlLENBQUM7UUFFeEUsUUFBUSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxVQUFVLENBQUM7b0JBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtvQkFDZixNQUFNLEVBQUUsUUFBUSxDQUFDLEdBQUc7b0JBQ3BCLFNBQVMsRUFBRSxlQUFlO29CQUMxQixHQUFHLEtBQUssRUFBRSxNQUFNO2lCQUNqQixDQUFDLENBQUM7WUFDTCxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLHNCQUFzQixDQUFDO29CQUNoQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ2YsTUFBTSxFQUFFLFFBQVEsQ0FBQyxHQUFHO29CQUNwQixlQUFlO29CQUNmLEdBQUcsS0FBSyxFQUFFLE1BQU07aUJBQ2pCLENBQUMsQ0FBQztZQUNMLEtBQUssV0FBVztnQkFDZCxPQUFPLElBQUksYUFBYSxDQUFDO29CQUN2QixLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ2YsTUFBTSxFQUFFLFFBQVEsQ0FBQyxHQUFHO29CQUNwQixTQUFTLEVBQUUsZUFBZTtvQkFDMUIsR0FBRyxLQUFLLEVBQUUsTUFBTTtpQkFDakIsQ0FBQyxDQUFDO1lBQ0wsS0FBSyxtQkFBbUI7Z0JBQ3RCLE9BQU8sSUFBSSxVQUFVLENBQUM7b0JBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtvQkFDZixNQUFNLEVBQUUsUUFBUSxDQUFDLEdBQUc7b0JBQ3BCLGFBQWEsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFO29CQUN4QyxTQUFTLEVBQUUsZUFBZTtpQkFDM0IsQ0FBQyxDQUFDO1lBQ0w7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxVQUFVLFVBQVUsQ0FBQyxPQUFlO1FBQ3ZDLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxNQUFNLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDaEUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUF5QyxDQUFDO1lBQ3JFLE9BQU8sK0JBQStCLE1BQU0sT0FBTyxNQUFNLEVBQUUsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUVELFNBQVMsVUFBVSxDQUFDLElBQVk7UUFDOUIsT0FBTyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7WUFDckIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHO1lBQ2hDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDNUMsQ0FBQztJQUVELE9BQU8sQ0FDTCxNQUFDLEdBQUcsZUFDRCxJQUFJLEtBQUssU0FBUztnQkFDakIsS0FBQyxPQUFPLElBQUMsTUFBTSxFQUFFLFVBQVUsR0FBRyxFQUUvQixJQUFJLEtBQUssY0FBYztnQkFDdEIsS0FBQyxXQUFXLElBQUMsUUFBUSxFQUFFLFVBQVUsR0FBRyxFQUVyQyxJQUFJLEtBQUssS0FBSztnQkFDYixNQUFDLEdBQUcsZUFDRCxVQUFVOzRCQUNULEtBQUMsTUFBTSxJQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUNoQixJQUFJLENBQUMsRUFBRSxDQUNOLEtBQUMsR0FBRyxJQUFZLFlBQVksRUFBRSxDQUFDLFlBQzdCLE1BQUMsSUFBSSxlQUFDLEtBQUMsSUFBSSxJQUFDLEtBQUssRUFBQyxNQUFNLEVBQUMsSUFBSSw4QkFBZSxPQUFFLE1BQU0sSUFBUSxJQURwRCxJQUFJLENBRVIsR0FFRCxFQUVWLE9BQU87NEJBQ04sS0FBQyxPQUFPLEtBQUUsRUFFWCxDQUFDLE9BQU8sSUFBSSxRQUFROzRCQUNuQixLQUFDLE1BQU0sSUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FDTixNQUFDLEdBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxhQUN6QixLQUFDLElBQUksY0FBRSxRQUFRLEdBQVEsRUFDdEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUk7NENBQ3JDLEtBQUMsR0FBRyxJQUFDLFNBQVMsRUFBRSxDQUFDLFlBQ2YsTUFBQyxJQUFJLElBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxRQUFRLDhCQUNqQixJQUFJLENBQUMsS0FBSyxjQUFVLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFZLElBQUksQ0FBQyxNQUFNLElBQ25FLEdBQ0gsS0FQdUIsSUFBSSxDQVMvQixHQUVELElBRVAsSUFFSixDQUNQLENBQUM7QUFDSixDQUFDIn0=
|
package/dist/commands/config.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import
|
|
3
|
-
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useState } from 'react';
|
|
4
3
|
import { Box, render, Text } from 'ink';
|
|
5
4
|
import { ScrollView } from 'ink-scroll-view';
|
|
6
5
|
import { configStore } from "../stores/config.js";
|
|
6
|
+
import { TextInput } from "../components/textInput.js";
|
|
7
7
|
import { Commands } from "../components/commands.js";
|
|
8
8
|
import { Command } from "../components/command.js";
|
|
9
|
+
import { useExit } from "../hooks/useExit.js";
|
|
9
10
|
const height = process.stdout.rows - 4;
|
|
10
11
|
const initialConfig = await configStore.get();
|
|
11
12
|
const initialSettings = Object.entries(initialConfig.settings).map(([key, setting]) => ({
|
|
@@ -20,12 +21,7 @@ export function Config() {
|
|
|
20
21
|
const [currentIndex, setCurrentIndex] = useState(0);
|
|
21
22
|
const [settingItems, setSettingItems] = useState(initialSettings);
|
|
22
23
|
const [saved, setSaved] = useState(false);
|
|
23
|
-
const [exit, setExit] =
|
|
24
|
-
useEffect(() => {
|
|
25
|
-
if (exit) {
|
|
26
|
-
setTimeout(() => process.exit(), 0);
|
|
27
|
-
}
|
|
28
|
-
}, [exit]);
|
|
24
|
+
const [exit, setExit] = useExit();
|
|
29
25
|
function handleUp() {
|
|
30
26
|
unselect();
|
|
31
27
|
setCurrentIndex(index => Math.max(0, index - 1));
|
|
@@ -81,11 +77,11 @@ export function Config() {
|
|
|
81
77
|
}
|
|
82
78
|
if (exit)
|
|
83
79
|
return null;
|
|
84
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Configuration" }), _jsx(Box, { height: settingItems.length > height ? height : undefined, borderStyle: 'single', borderColor: 'cyan', borderTop: false, borderRight: false, borderBottom: false, marginTop: 1, paddingLeft: 1, children: _jsx(ScrollView, { children: settingItems.map((item, index) => (_jsxs(Box, { width: 80, gap: 1, backgroundColor: index === currentIndex ? 'black' : undefined, children: [_jsx(Box, { minWidth: 20, children: _jsxs(Text, { children: [item.setting.title, ":"] }) }), _jsxs(Box, { minWidth: 6, children: [item.setting.type === 'boolean' &&
|
|
80
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: 'whiteBright', bold: true, children: "Configuration" }), _jsx(Box, { height: settingItems.length > height ? height : undefined, borderStyle: 'single', borderColor: 'cyan', borderTop: false, borderRight: false, borderBottom: false, marginTop: 1, paddingLeft: 1, children: _jsx(ScrollView, { children: settingItems.map((item, index) => (_jsxs(Box, { width: 80, gap: 1, backgroundColor: index === currentIndex ? 'black' : undefined, children: [_jsx(Box, { minWidth: 20, children: _jsxs(Text, { children: [item.setting.title, ":"] }) }), _jsxs(Box, { minWidth: 6, children: [item.setting.type === 'boolean' &&
|
|
85
81
|
_jsx(Text, { color: 'cyan', inverse: item.edit, children: item.setting.value ? 'true' : 'false' }), item.setting.type === 'number' &&
|
|
86
82
|
_jsxs(Box, { children: [item.edit &&
|
|
87
83
|
_jsx(Text, { inverse: true, color: 'cyan', children: _jsx(TextInput, { value: item.setting.value.toString(), onChange: value => handleInputChange(item.key, value) }) }), !item.edit &&
|
|
88
84
|
_jsx(Text, { color: 'cyan', inverse: item.edit, children: item.setting.value })] })] }), _jsx(Box, { children: _jsx(Text, { color: 'gray', dimColor: index !== currentIndex, children: item.setting.description }) })] }, item.key))) }) }), _jsxs(Box, { flexDirection: 'row', gap: 1, children: [_jsxs(Commands, { children: [_jsx(Command, { title: 'Esc (Exit)', esc: true, onPress: handleExit }), _jsx(Command, { title: 'Enter (Select)', enter: true, onPress: handleEnter }), _jsx(Command, { title: 'Ctrl+S (Save)', ctrl: true, inputKey: 's', onPress: handleSave }), _jsx(Command, { up: true, onPress: handleUp }), _jsx(Command, { down: true, onPress: handleDown })] }), saved &&
|
|
89
85
|
_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: 'cyan', bold: true, children: "Saved!" }) })] })] }));
|
|
90
86
|
}
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2NvbmZpZy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTJCLENBQUM7QUFFcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN2QyxNQUFNLGFBQWEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUU5QyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RixHQUFHO0lBQ0gsSUFBSSxFQUFFLEtBQUs7SUFDWCxPQUFPO0NBQ1IsQ0FBQyxDQUFDLENBQUM7QUFFSixNQUFNLFVBQVUsTUFBTTtJQUNwQixNQUFNLENBQUMsS0FBQyxNQUFNLEtBQUcsQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLFVBQVUsTUFBTTtJQUVwQixNQUFNLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FB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
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import OpenAI from 'openai';
|
|
3
|
+
import Spinner from 'ink-spinner';
|
|
4
|
+
import { useEffect, useState } from 'react';
|
|
5
|
+
import { render, Box, Text } from 'ink';
|
|
6
|
+
import { TextField } from "../components/textField.js";
|
|
7
|
+
import { Commands } from "../components/commands.js";
|
|
8
|
+
import { Command } from "../components/command.js";
|
|
9
|
+
import { configStore } from "../stores/config.js";
|
|
10
|
+
import { useField } from "../hooks/useField.js";
|
|
11
|
+
import { useExit } from "../hooks/useExit.js";
|
|
12
|
+
import { useTestProvider } from "../hooks/useTestProvider.js";
|
|
13
|
+
import { TestProvider } from "../components/testProvider.js";
|
|
14
|
+
export function connect() {
|
|
15
|
+
render(_jsx(Connect, {}));
|
|
16
|
+
}
|
|
17
|
+
function Connect() {
|
|
18
|
+
const [view, setView] = useState('connect');
|
|
19
|
+
const [focusIndex, setFocusIndex] = useState(0);
|
|
20
|
+
const [models, setModels] = useState([]);
|
|
21
|
+
const [testSuccessful, setTestSuccessful] = useState(false);
|
|
22
|
+
const [saving, setSaving] = useState(false);
|
|
23
|
+
const [saved, setSaved] = useState(false);
|
|
24
|
+
const [saveFailed, setSaveFailed] = useState(false);
|
|
25
|
+
const [saveError, setSaveError] = useState();
|
|
26
|
+
const [exit, setExit] = useExit();
|
|
27
|
+
const nameField = useField({ focus: false });
|
|
28
|
+
const urlField = useField({ focus: false });
|
|
29
|
+
const apiKeyField = useField({ focus: false });
|
|
30
|
+
const testProvider = useTestProvider();
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
setTimeout(() => { }, 1000 * 60 * 60 * 24);
|
|
33
|
+
updateFocus(0);
|
|
34
|
+
}, []);
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (saved || saveFailed) {
|
|
37
|
+
setTimeout(() => process.exit(), 0);
|
|
38
|
+
}
|
|
39
|
+
}, [saved, saveFailed]);
|
|
40
|
+
function handleExit() {
|
|
41
|
+
setExit(true);
|
|
42
|
+
}
|
|
43
|
+
function handleUp() {
|
|
44
|
+
updateFocus(focusIndex - 1);
|
|
45
|
+
}
|
|
46
|
+
function handleDown() {
|
|
47
|
+
updateFocus(focusIndex + 1);
|
|
48
|
+
}
|
|
49
|
+
async function handleTest() {
|
|
50
|
+
setTestSuccessful(false);
|
|
51
|
+
if (!validate())
|
|
52
|
+
return;
|
|
53
|
+
if (await test()) {
|
|
54
|
+
setTestSuccessful(true);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function handleSave() {
|
|
58
|
+
setTestSuccessful(false);
|
|
59
|
+
if (!validate() || !await test())
|
|
60
|
+
return;
|
|
61
|
+
setView('save');
|
|
62
|
+
setSaving(true);
|
|
63
|
+
try {
|
|
64
|
+
const client = new OpenAI({ baseURL: urlField.value, apiKey: apiKeyField.value });
|
|
65
|
+
const models = await client.models.list();
|
|
66
|
+
setModels(models.data.map(model => model.id));
|
|
67
|
+
await configStore.addProvider(nameField.value, urlField.value, apiKeyField.value, models.data.map(model => model.id));
|
|
68
|
+
setSaving(false);
|
|
69
|
+
setSaved(true);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
setSaving(false);
|
|
73
|
+
setSaveError(error.message.replaceAll(/(\n|\r|\r\n)/g, ' '));
|
|
74
|
+
setSaveFailed(true);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function validate() {
|
|
78
|
+
let valid = true;
|
|
79
|
+
nameField.error = undefined;
|
|
80
|
+
urlField.error = undefined;
|
|
81
|
+
if (!nameField.value.trim()) {
|
|
82
|
+
nameField.error = 'Required';
|
|
83
|
+
valid = false;
|
|
84
|
+
}
|
|
85
|
+
if (!urlField.value.trim()) {
|
|
86
|
+
urlField.error = 'Required';
|
|
87
|
+
valid = false;
|
|
88
|
+
}
|
|
89
|
+
return valid;
|
|
90
|
+
}
|
|
91
|
+
async function test() {
|
|
92
|
+
return testProvider.test({ type: 'openai-compatible', url: urlField.value, key: apiKeyField.value });
|
|
93
|
+
}
|
|
94
|
+
function updateFocus(index) {
|
|
95
|
+
const fields = [nameField, urlField, apiKeyField];
|
|
96
|
+
const focusIndex = Math.min(Math.max(index, 0), fields.length - 1);
|
|
97
|
+
for (let i = 0; i < fields.length; i++) {
|
|
98
|
+
fields[i].focus = i === focusIndex;
|
|
99
|
+
}
|
|
100
|
+
setFocusIndex(focusIndex);
|
|
101
|
+
}
|
|
102
|
+
if (exit)
|
|
103
|
+
return null;
|
|
104
|
+
return (_jsxs(Box, { children: [view === 'connect' &&
|
|
105
|
+
_jsxs(Box, { flexDirection: 'column', children: [_jsx(Text, { color: 'whiteBright', bold: true, children: "Connect" }), _jsx(Box, { width: 80, flexDirection: 'column', borderColor: 'gray', borderTop: false, borderRight: false, borderBottom: false, marginTop: 1, children: _jsxs(Text, { color: 'gray', children: ["Connect to local models or external providers using an ", _jsx(Text, { bold: true, children: "OpenAI-compatible API" }), ", e.g., llama.cpp, Ollama, Hugging Face, etc."] }) }), _jsxs(Box, { flexDirection: 'column', gap: 1, marginTop: 1, children: [_jsx(TextField, { label: 'Name', placeholder: 'Provider name', focus: nameField.focus, value: nameField.value, error: nameField.error, onChange: value => nameField.change(value) }), _jsx(TextField, { label: 'API url', placeholder: 'OpenAI-compatible API URL', focus: urlField.focus, value: urlField.value, error: urlField.error, onChange: value => urlField.change(value) }), _jsx(TextField, { label: 'API key', placeholder: 'API key (Optional)', focus: apiKeyField.focus, value: apiKeyField.value, error: apiKeyField.error, onChange: value => apiKeyField.change(value) })] }), _jsx(TestProvider, { type: 'openai-compatible', testing: testProvider.testing, error: testProvider.error }), testSuccessful &&
|
|
106
|
+
_jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, color: 'green', children: "\u00A1Connected!" }) }), _jsxs(Commands, { children: [_jsx(Command, { title: 'Esc (Exit)', esc: true, onPress: handleExit }), _jsx(Command, { title: 'Up/Down (Navigation)', up: true, down: true, anyKey: true }), _jsx(Command, { title: 'Ctrl+T (Test connection)', ctrl: true, inputKey: 't', onPress: handleTest }), _jsx(Command, { title: 'Ctrl+S (Save)', ctrl: true, inputKey: 's', onPress: handleSave }), _jsx(Command, { tab: true, onPress: handleDown }), _jsx(Command, { up: true, onPress: handleUp }), _jsx(Command, { down: true, onPress: handleDown })] })] }), view === 'save' &&
|
|
107
|
+
_jsxs(Box, { children: [saving &&
|
|
108
|
+
_jsx(Box, { children: _jsxs(Text, { color: 'yellow', children: ["Saving provider", _jsx(Spinner, { type: 'simpleDots' })] }) }), saved &&
|
|
109
|
+
_jsxs(Box, { flexDirection: 'column', children: [_jsx(Text, { children: "Provider saved!" }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, children: "Provider:" }) }), _jsx(Box, { children: _jsx(Text, { children: nameField.value }) }), _jsxs(Box, { flexDirection: 'column', marginTop: 1, children: [_jsx(Text, { bold: true, children: "Models:" }), _jsx(Box, { flexDirection: 'column', paddingLeft: 1, children: models.map(model => _jsxs(Text, { children: ["\u25CF ", model] }, model)) })] }), _jsxs(Box, { flexDirection: 'column', marginTop: 1, children: [_jsxs(Text, { children: ["To see the models of the provider, use the ", _jsx(Text, { color: 'cyan', bold: true, children: "ask /models" }), " command."] }), _jsxs(Text, { children: ["To update the provider, use the ", _jsx(Text, { color: 'cyan', bold: true, children: "ask /providers" }), " command."] })] })] }), saveFailed &&
|
|
110
|
+
_jsxs(Box, { flexDirection: 'column', marginTop: 1, gap: 1, children: [_jsx(Text, { children: "Error saving provider:" }), _jsx(Text, { color: 'red', children: saveError })] })] })] }));
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9jb25uZWN0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sT0FBTyxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBZ0MsQ0FBQztBQUU5RCxNQUFNLFVBQVUsT0FBTztJQUNyQixNQUFNLENBQUMsS0FBQyxPQUFPLEtBQUUsQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxTQUFTLE9BQU87SUFFZCxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFDaEUsTUFBTSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEQsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFR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
|
|
@@ -1,30 +1,24 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useState } from 'react';
|
|
3
|
-
import { Box, render, Text
|
|
3
|
+
import { Box, render, Text } from 'ink';
|
|
4
4
|
import { SelectModel } from "../components/selectModel.js";
|
|
5
5
|
export function selectModel() {
|
|
6
6
|
render(_jsx(Select, {}));
|
|
7
7
|
}
|
|
8
8
|
function Select() {
|
|
9
|
-
const
|
|
10
|
-
const [view, setView] = useState('select-model');
|
|
9
|
+
const [provider, setProvider] = useState();
|
|
11
10
|
const [model, setModel] = useState();
|
|
12
|
-
useInput((_, key) => {
|
|
13
|
-
if (key.escape) {
|
|
14
|
-
setView('none');
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
11
|
useEffect(() => {
|
|
18
|
-
if (
|
|
19
|
-
exit();
|
|
12
|
+
if (model) {
|
|
13
|
+
setTimeout(() => process.exit(), 0);
|
|
20
14
|
}
|
|
21
|
-
}, [
|
|
22
|
-
function handleSelect(model) {
|
|
15
|
+
}, [model]);
|
|
16
|
+
function handleSelect(provider, model) {
|
|
17
|
+
setProvider(provider);
|
|
23
18
|
setModel(model);
|
|
24
|
-
setView('selected-model');
|
|
25
19
|
}
|
|
26
|
-
return (_jsxs(Box, { flexDirection: 'column', children: [
|
|
27
|
-
_jsx(SelectModel, { onSelect: handleSelect }),
|
|
28
|
-
_jsxs(Text, { children: ["Selected model: ",
|
|
20
|
+
return (_jsxs(Box, { flexDirection: 'column', children: [!model &&
|
|
21
|
+
_jsx(SelectModel, { onSelect: handleSelect }), model &&
|
|
22
|
+
_jsxs(Text, { children: ["Selected model: ", _jsxs(Text, { bold: true, color: 'cyanBright', children: ["(", provider?.name, ") ", model?.name] })] })] }));
|
|
29
23
|
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0TW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc2VsZWN0TW9kZWwudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM1QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUErQixDQUFDO0FBSTVELE1BQU0sVUFBVSxXQUFXO0lBQ3pCLE1BQU0sQ0FBQyxLQUFDLE1BQU0sS0FBRSxDQUFDLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQVMsTUFBTTtJQUViLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUcsUUFBUSxFQUFZLENBQUM7SUFDckQsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxRQUFRLEVBQVMsQ0FBQztJQUU1QyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFWixTQUFTLFlBQVksQ0FBQyxRQUFrQixFQUFFLEtBQVk7UUFDcEQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RCLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsT0FBTyxDQUNMLE1BQUMsR0FBRyxJQUFDLGFBQWEsRUFBQyxRQUFRLGFBQ3hCLENBQUMsS0FBSztnQkFDTCxLQUFDLFdBQVcsSUFBQyxRQUFRLEVBQUUsWUFBWSxHQUFHLEVBRXZDLEtBQUs7Z0JBQ0osTUFBQyxJQUFJLG1DQUFpQixNQUFDLElBQUksSUFBQyxJQUFJLFFBQUMsS0FBSyxFQUFDLFlBQVksa0JBQUcsUUFBUSxFQUFFLElBQUksUUFBSSxLQUFLLEVBQUUsSUFBSSxJQUFRLElBQU8sSUFFaEcsQ0FDUCxDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -3,13 +3,14 @@ import { Box, Text } from 'ink';
|
|
|
3
3
|
import { useContext, useEffect, useState } from 'react';
|
|
4
4
|
import { CommandContext } from "./commands.js";
|
|
5
5
|
export function Command(props) {
|
|
6
|
-
const { title, ctrl, esc, enter, up, down, inputKey, onPress } = props;
|
|
6
|
+
const { title, hidden, tab, ctrl, esc, enter, up, down, inputKey, anyKey, onPress } = props;
|
|
7
7
|
const [active, setActive] = useState(false);
|
|
8
8
|
const inputEvent = useContext(CommandContext);
|
|
9
9
|
useEffect(() => {
|
|
10
|
-
if (!inputEvent)
|
|
10
|
+
if (!inputEvent || hidden)
|
|
11
11
|
return;
|
|
12
12
|
const keyMap = {
|
|
13
|
+
tab,
|
|
13
14
|
ctrl,
|
|
14
15
|
escape: esc,
|
|
15
16
|
return: enter,
|
|
@@ -22,8 +23,10 @@ export function Command(props) {
|
|
|
22
23
|
.map(([key]) => key);
|
|
23
24
|
const validateKey = keys.length > 0;
|
|
24
25
|
const validateInput = inputKey !== undefined;
|
|
25
|
-
const isKeyActive = keys.every(key => inputEvent.key[key]);
|
|
26
26
|
const isInputActive = inputEvent.input === inputKey;
|
|
27
|
+
const isKeyActive = anyKey
|
|
28
|
+
? keys.some(key => inputEvent.key[key])
|
|
29
|
+
: keys.every(key => inputEvent.key[key]);
|
|
27
30
|
const active = isActive(validateKey, validateInput, isKeyActive, isInputActive);
|
|
28
31
|
if (active) {
|
|
29
32
|
onPress?.();
|
|
@@ -48,8 +51,8 @@ export function Command(props) {
|
|
|
48
51
|
return false;
|
|
49
52
|
}
|
|
50
53
|
}
|
|
51
|
-
if (!title)
|
|
54
|
+
if (!title || hidden)
|
|
52
55
|
return null;
|
|
53
|
-
return (_jsx(Box, { children: _jsx(Text, {
|
|
56
|
+
return (_jsx(Box, { children: _jsx(Text, { color: active ? 'cyan' : 'gray', children: title }) }));
|
|
54
57
|
}
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1hbmQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFPLElBQUksRUFBRSxNQUFNLEtBQUssQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWdCLENBQUM7QUFnQmhELE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBbUI7SUFFekMsTUFBTSxFQUNKLEtBQUssRUFDTCxNQUFNLEVBQ04sR0FBRyxFQUNILElBQUksRUFDSixHQUFHLEVBQ0gsS0FBSyxFQUNMLEVBQUUsRUFDRixJQUFJLEVBQ0osUUFBUSxFQUNSLE1BQU0sRUFDTixPQUFPLEVBQ1IsR0FBRyxLQUFLLENBQUM7SUFFVixNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU1QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFOUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUViLElBQUksQ0FBQyxVQUFVLElBQUksTUFBTTtZQUFFLE9BQU87UUFFbEMsTUFBTSxNQUFNLEdBQWlCO1lBQzNCLEdBQUc7WUFDSCxJQUFJO1lBQ0osTUFBTSxFQUFFLEdBQUc7WUFDWCxNQUFNLEVBQUUsS0FBSztZQUNiLE9BQU8sRUFBRSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLE1BQU07YUFDaEIsT0FBTyxDQUFDLE1BQU0sQ0FBQzthQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7YUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBZ0IsQ0FBQyxDQUFDO1FBRXBDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUM7UUFDN0MsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUM7UUFFcEQsTUFBTSxXQUFXLEdBQUcsTUFBTTtZQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRWhGLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ1osU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFakIsU0FBUyxRQUFRLENBQUMsV0FBb0IsRUFBRSxhQUFzQixFQUFFLFdBQW9CLEVBQUUsYUFBc0I7UUFDMUcsSUFBSSxJQUFJLElBQUksUUFBUSxLQUFLLEdBQUcsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxXQUFXLElBQUksYUFBYSxFQUFFLENBQUM7WUFDeEMsT0FBTyxXQUFXLElBQUksYUFBYSxDQUFDO1FBQ3RDLENBQUM7YUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7YUFBTSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxLQUFLLElBQUksTUFBTTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWxDLE9BQU8sQ0FDTCxLQUFDLEdBQUcsY0FDRixLQUFDLElBQUksSUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sWUFDbEMsS0FBSyxHQUNELEdBQ0gsQ0FDUCxDQUFDO0FBQ0osQ0FBQyJ9
|