ask-cli-ai 1.0.12 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -18
- package/dist/app.js +9 -3
- package/dist/commands/ask.js +25 -24
- package/dist/commands/clearHistory.js +1 -1
- package/dist/commands/config.js +91 -0
- package/dist/components/apiKeyField.js +3 -8
- package/dist/components/command.js +55 -0
- package/dist/components/commands.js +14 -0
- package/dist/components/provider.js +21 -14
- package/dist/components/providers.js +18 -18
- package/dist/components/selectModel.js +36 -34
- package/dist/components/textField.js +9 -7
- package/dist/components/welcome.js +2 -7
- package/dist/install.js +2 -0
- package/dist/migrations/settings-1.1.0.js +23 -0
- package/dist/stores/config.js +31 -41
- package/dist/stores/history.js +43 -28
- package/dist/stores/store.js +16 -22
- package/dist/templates/instructions.js +3 -2
- package/dist/types/setting.js +3 -0
- package/dist/utils/defaultConfig.js +30 -0
- package/dist/utils/getDataDir.js +17 -0
- package/dist/utils/paths.js +7 -0
- package/package.json +11 -9
- package/dist/utils/dataDir.js +0 -19
- package/dist/utils/root.js +0 -3
package/README.md
CHANGED
|
@@ -17,7 +17,6 @@ Forget about switching between applications to know how to use a command or fix
|
|
|
17
17
|
## Content
|
|
18
18
|
|
|
19
19
|
- [Why use Ask CLI?](#why-use-ask-cli)
|
|
20
|
-
- [For whom is Ask CLI?](#for-whom-is-ask-cli)
|
|
21
20
|
- [Installation](#installation)
|
|
22
21
|
- [Usage](#usage)
|
|
23
22
|
- [Select model](#select-model)
|
|
@@ -31,15 +30,8 @@ Why use Ask CLI and not an AI agent like Claude or Gemini?
|
|
|
31
30
|
- Ask CLI was created to do one thing and do it well: help you with commands, coding, apps and more from your terminal.
|
|
32
31
|
- The AI models it uses are optimized to generate short, precise and fast answers.
|
|
33
32
|
- No risk of prompt injection, Ask CLI cannot run commands or access your files by default.
|
|
34
|
-
- No risk of running dangerous commands on your computer
|
|
35
|
-
|
|
36
|
-
## For whom is Ask CLI?
|
|
37
|
-
|
|
38
|
-
- Students who want to learn how to use commands and the terminal.
|
|
39
|
-
- Developers who want to be more productive and avoid context switching.
|
|
40
|
-
- Sysadmins who need quick help with commands and troubleshooting.
|
|
41
|
-
- DevOps engineers who want to automate tasks and get help with commands.
|
|
42
|
-
- Anyone working in production environments where security is critical.
|
|
33
|
+
- No risk of running dangerous commands on your computer. See [Running commands](#running-commands) for more details.
|
|
34
|
+
- Designed for anyone who wants fast, secure, and precise help directly in the terminal.
|
|
43
35
|
|
|
44
36
|
## Installation
|
|
45
37
|
|
|
@@ -49,7 +41,7 @@ npm install -g ask-cli-ai
|
|
|
49
41
|
|
|
50
42
|
## Usage
|
|
51
43
|
|
|
52
|
-
> To use Ask CLI, you first need to set up the API key. See
|
|
44
|
+
> To use Ask CLI, you first need to set up the API key. See [Select model](#select-model) to learn how.
|
|
53
45
|
|
|
54
46
|
### Ask questions
|
|
55
47
|
|
|
@@ -58,9 +50,9 @@ npm install -g ask-cli-ai
|
|
|
58
50
|
ask <your question>
|
|
59
51
|
|
|
60
52
|
# Examples
|
|
61
|
-
ask how to
|
|
62
|
-
ask what is a promise
|
|
63
|
-
ask how to create a
|
|
53
|
+
ask how to terminate a linux process
|
|
54
|
+
ask what is a javascript promise
|
|
55
|
+
ask how to create a git branch
|
|
64
56
|
|
|
65
57
|
# Using quotes
|
|
66
58
|
ask 'What does this command do: git config user.name "Ask CLI"?'
|
|
@@ -68,7 +60,7 @@ ask 'What does this command do: git config user.name "Ask CLI"?'
|
|
|
68
60
|
|
|
69
61
|
### Aliases
|
|
70
62
|
|
|
71
|
-
You can use
|
|
63
|
+
You can use **`how`** and **`what`** as aliases for the **`ask`** command:
|
|
72
64
|
|
|
73
65
|
```bash
|
|
74
66
|
# Using 'how' alias
|
|
@@ -80,7 +72,7 @@ what is the difference between git merge and rebase
|
|
|
80
72
|
|
|
81
73
|
### Running commands
|
|
82
74
|
|
|
83
|
-
By default, Ask CLI cannot run commands on your computer. However, you can use the
|
|
75
|
+
By default, Ask CLI cannot run commands on your computer. However, you can use the **`-c`** or **`--command`** option to execute a command and include its output in your question. This allows Ask CLI to analyze errors, logs, or any command output and provide context-aware answers.
|
|
84
76
|
|
|
85
77
|
```bash
|
|
86
78
|
# Analyze an error
|
|
@@ -95,7 +87,7 @@ ask what is wrong here -c "git status"
|
|
|
95
87
|
|
|
96
88
|
## Select model
|
|
97
89
|
|
|
98
|
-
You can select a model using the
|
|
90
|
+
You can select a model using the **`ask /models`** command. This will list all the available models and let you select the model you want to use.
|
|
99
91
|
|
|
100
92
|

|
|
101
93
|
|
|
@@ -131,7 +123,7 @@ You can select a model using the `ask /models` command. This will list all the a
|
|
|
131
123
|
```
|
|
132
124
|
AI CLI to help you with commands, coding, apps and more.
|
|
133
125
|
|
|
134
|
-
Version: 1.0
|
|
126
|
+
Version: 1.1.0
|
|
135
127
|
|
|
136
128
|
Usage: ask <prompt..>
|
|
137
129
|
|
|
@@ -139,6 +131,7 @@ Commands:
|
|
|
139
131
|
ask <prompt..> Ask something. Alias: what, how [default]
|
|
140
132
|
ask /models Select a model
|
|
141
133
|
ask /providers Setup providers
|
|
134
|
+
ask /config Configuration
|
|
142
135
|
ask /history List the chat history
|
|
143
136
|
ask /clear Clear the chat history
|
|
144
137
|
|
package/dist/app.js
CHANGED
|
@@ -7,10 +7,11 @@ import { listHistory } from "./commands/listHistory.js";
|
|
|
7
7
|
import { clearHistory } from "./commands/clearHistory.js";
|
|
8
8
|
import { providers } from "./commands/providers.js";
|
|
9
9
|
import { logo } from "./utils/logo.js";
|
|
10
|
+
import { config } from "./commands/config.js";
|
|
10
11
|
void yargs(hideBin(process.argv))
|
|
11
12
|
.scriptName('ask')
|
|
12
|
-
.usage(`${logo}\nAI CLI to help you with commands, coding, apps and more.\n\nVersion: 1.0
|
|
13
|
-
.version('1.0
|
|
13
|
+
.usage(`${logo}\nAI CLI to help you with commands, coding, apps and more.\n\nVersion: 1.1.0\n\nUsage: $0 <prompt..>`)
|
|
14
|
+
.version('1.1.0')
|
|
14
15
|
.locale('en')
|
|
15
16
|
.example('$0 how to run a docker container', '')
|
|
16
17
|
.example('how to setup my git account', '')
|
|
@@ -39,6 +40,11 @@ void yargs(hideBin(process.argv))
|
|
|
39
40
|
command: '/providers',
|
|
40
41
|
describe: 'Setup providers',
|
|
41
42
|
handler: () => providers()
|
|
43
|
+
})
|
|
44
|
+
.command({
|
|
45
|
+
command: '/config',
|
|
46
|
+
describe: 'Configuration',
|
|
47
|
+
handler: () => config()
|
|
42
48
|
})
|
|
43
49
|
.command({
|
|
44
50
|
command: '/history',
|
|
@@ -51,4 +57,4 @@ void yargs(hideBin(process.argv))
|
|
|
51
57
|
handler: () => clearHistory()
|
|
52
58
|
})
|
|
53
59
|
.parse();
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG1CQUFvQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUF1QixDQUFDO0FBRS9DLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDOUIsVUFBVSxDQUFDLEtBQUssQ0FBQztLQUNqQixLQUFLLENBQUMsR0FBRyxJQUFJLHNHQUFzRyxDQUFDO0tBQ3BILE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDaEIsTUFBTSxDQUFDLElBQUksQ0FBQztLQUNaLE9BQU8sQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLENBQUM7S0FDL0MsT0FBTyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsQ0FBQztLQUMxQyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxDQUFDO0tBQ3hDLE9BQU8sQ0FBQyw0Q0FBNEMsRUFBRSxFQUFFLENBQUM7S0FDekQsSUFBSSxFQUFFO0tBQ04sT0FBTyxDQUFDO0lBQ1AsT0FBTyxFQUFFLGVBQWU7SUFDeEIsUUFBUSxFQUFFLGlDQUFpQztJQUMzQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLO1NBQ3BCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3pFLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDakIsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1osSUFBSSxFQUFFLFFBQVE7UUFDZCxXQUFXLEVBQUUsb0JBQW9CO1FBQ2pDLFdBQVcsRUFBRSxJQUFJO0tBQ2xCLENBQUM7SUFDSixPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO0NBQzVELENBQUM7S0FDRCxPQUFPLENBQUM7SUFDUCxPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsZ0JBQWdCO0lBQzFCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLEVBQUU7Q0FDN0IsQ0FBQztLQUNELE9BQU8sQ0FBQztJQUNQLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLFFBQVEsRUFBRSxpQkFBaUI7SUFDM0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRTtDQUMzQixDQUFDO0tBQ0QsT0FBTyxDQUFDO0lBQ1AsT0FBTyxFQUFFLFNBQVM7SUFDbEIsUUFBUSxFQUFFLGVBQWU7SUFDekIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRTtDQUN4QixDQUFDO0tBQ0QsT0FBTyxDQUFDO0lBQ1AsT0FBTyxFQUFFLFVBQVU7SUFDbkIsUUFBUSxFQUFFLHVCQUF1QjtJQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxFQUFFO0NBQzdCLENBQUM7S0FDRCxPQUFPLENBQUM7SUFDUCxPQUFPLEVBQUUsUUFBUTtJQUNqQixRQUFRLEVBQUUsd0JBQXdCO0lBQ2xDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUU7Q0FDOUIsQ0FBQztLQUNELEtBQUssRUFBRSxDQUFDIn0=
|
package/dist/commands/ask.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import util from 'node:util';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import fs from 'node:fs/promises';
|
|
5
|
-
import { exec as execCb } from 'node:child_process';
|
|
6
3
|
import findProcess from 'find-process';
|
|
7
4
|
import chalk from 'chalk';
|
|
5
|
+
import { exec as execCb } from 'node:child_process';
|
|
8
6
|
import { useEffect, useState } from 'react';
|
|
9
7
|
import { Box, render, Static, Text, useApp } from 'ink';
|
|
10
8
|
import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
|
|
@@ -12,7 +10,6 @@ import { configStore } from "../stores/config.js";
|
|
|
12
10
|
import { historyStore } from "../stores/history.js";
|
|
13
11
|
import { Welcome } from "../components/welcome.js";
|
|
14
12
|
import { Loading } from "../components/loading.js";
|
|
15
|
-
import { root } from "../utils/root.js";
|
|
16
13
|
import { ChatAnthropic } from '@langchain/anthropic';
|
|
17
14
|
import { ChatOpenAI } from '@langchain/openai';
|
|
18
15
|
import { instructions } from "../templates/instructions.js";
|
|
@@ -29,6 +26,7 @@ function Ask(props) {
|
|
|
29
26
|
const [view, setView] = useState('ask');
|
|
30
27
|
const [sending, setSending] = useState(false);
|
|
31
28
|
const [response, setResponse] = useState('');
|
|
29
|
+
const [meta, setMeta] = useState();
|
|
32
30
|
const [exitCode, setExitCode] = useState();
|
|
33
31
|
const [isFirstRun, setIsFirstRun] = useState(false);
|
|
34
32
|
useEffect(() => {
|
|
@@ -47,19 +45,7 @@ function Ask(props) {
|
|
|
47
45
|
}
|
|
48
46
|
}, [exitCode]);
|
|
49
47
|
useEffect(() => {
|
|
50
|
-
|
|
51
|
-
const dirPath = path.join(root, '/data/chats');
|
|
52
|
-
const fileNames = await fs.readdir(dirPath);
|
|
53
|
-
const files = await Promise.all(fileNames.map(async (name) => {
|
|
54
|
-
const filePath = path.join(dirPath, name);
|
|
55
|
-
const stats = await fs.stat(filePath);
|
|
56
|
-
return { path: filePath, time: stats.ctimeMs };
|
|
57
|
-
}));
|
|
58
|
-
const sortedFiles = files
|
|
59
|
-
.sort((a, b) => b.time - a.time)
|
|
60
|
-
.slice(10);
|
|
61
|
-
await Promise.all(sortedFiles.map(file => fs.unlink(file.path)));
|
|
62
|
-
})().catch(() => { });
|
|
48
|
+
void historyStore.deleteOldHistory();
|
|
63
49
|
}, []);
|
|
64
50
|
async function handleSend() {
|
|
65
51
|
setIsFirstRun(true);
|
|
@@ -82,17 +68,25 @@ function Ask(props) {
|
|
|
82
68
|
try {
|
|
83
69
|
setSending(true);
|
|
84
70
|
const prompt = await getPrompt();
|
|
85
|
-
const
|
|
86
|
-
const
|
|
71
|
+
const modelClient = getModel(providerId, modelId, apikey);
|
|
72
|
+
const startTime = Date.now();
|
|
73
|
+
const response = await modelClient.invoke([
|
|
87
74
|
{ role: 'system', content: instructions },
|
|
88
75
|
...history.map(item => ({ ...item })),
|
|
89
76
|
{ role: 'human', content: prompt }
|
|
90
77
|
]);
|
|
78
|
+
const endTime = Date.now();
|
|
91
79
|
await historyStore.add([
|
|
92
80
|
{ role: 'human', content: prompt },
|
|
93
81
|
{ role: 'ai', content: response.text }
|
|
94
82
|
]);
|
|
95
83
|
setResponse(response.text.replaceAll('\\x1b', '\x1b').replaceAll('\\n', '\n').concat('\x1b[0m'));
|
|
84
|
+
setMeta({
|
|
85
|
+
model: model.title,
|
|
86
|
+
time: endTime - startTime,
|
|
87
|
+
inputTokens: response.usage_metadata?.input_tokens || 0,
|
|
88
|
+
outputTokens: response.usage_metadata?.output_tokens || 0
|
|
89
|
+
});
|
|
96
90
|
setSending(false);
|
|
97
91
|
setExitCode(0);
|
|
98
92
|
}
|
|
@@ -113,10 +107,11 @@ function Ask(props) {
|
|
|
113
107
|
function getModel(providerId, modelId, apiKey) {
|
|
114
108
|
const provider = providers.find(provider => provider.id === providerId);
|
|
115
109
|
const model = provider?.models.find(model => model.name === modelId);
|
|
110
|
+
const maxOutputTokens = config.settings.maxOutputTokens.value;
|
|
116
111
|
switch (providerId) {
|
|
117
|
-
case 'openai': return new ChatOpenAI({ model: modelId, apiKey, ...model?.config });
|
|
118
|
-
case 'gemini': return new ChatGoogleGenerativeAI({ model: modelId, apiKey, ...model?.config });
|
|
119
|
-
case 'anthropic': return new ChatAnthropic({ model: modelId, apiKey, ...model?.config });
|
|
112
|
+
case 'openai': return new ChatOpenAI({ model: modelId, apiKey, ...model?.config, maxTokens: maxOutputTokens });
|
|
113
|
+
case 'gemini': return new ChatGoogleGenerativeAI({ model: modelId, apiKey, ...model?.config, maxOutputTokens });
|
|
114
|
+
case 'anthropic': return new ChatAnthropic({ model: modelId, apiKey, ...model?.config, maxTokens: maxOutputTokens });
|
|
120
115
|
default: throw new Error('Model not found');
|
|
121
116
|
}
|
|
122
117
|
}
|
|
@@ -131,11 +126,17 @@ function Ask(props) {
|
|
|
131
126
|
return `Error executing command: \n\n${stdout}\n\n${stderr}`;
|
|
132
127
|
}
|
|
133
128
|
}
|
|
129
|
+
function formatTime(time) {
|
|
130
|
+
return time < 1000 * 60
|
|
131
|
+
? `${(time / 1000).toFixed(1)}s`
|
|
132
|
+
: `${(time / (1000 * 60)).toFixed(1)}m`;
|
|
133
|
+
}
|
|
134
134
|
return (_jsxs(Box, { children: [view === 'welcome' &&
|
|
135
135
|
_jsx(Welcome, { onSend: handleSend }), view === 'ask' &&
|
|
136
136
|
_jsxs(Box, { children: [isFirstRun &&
|
|
137
137
|
_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
138
|
_jsx(Loading, {}), !sending && response &&
|
|
139
|
-
_jsx(Static, { items: [''], children: item => _jsx(Text, { children: response },
|
|
139
|
+
_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.inputTokens + meta.outputTokens] }) })] }, item) })] })] }));
|
|
140
141
|
}
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2Fzay50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEyQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXBDLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLE1BQU0sT0FBTyxH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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { historyStore } from "../stores/history.js";
|
|
2
2
|
export async function clearHistory() {
|
|
3
3
|
await historyStore.clear();
|
|
4
|
-
console.log('Conversation history
|
|
4
|
+
console.log('Conversation history deleted.');
|
|
5
5
|
}
|
|
6
6
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXJIaXN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2NsZWFySGlzdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFcEQsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZO0lBQ2hDLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUMvQyxDQUFDIn0=
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import TextInput from 'ink-text-input';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { Box, render, Text } from 'ink';
|
|
5
|
+
import { ScrollView } from 'ink-scroll-view';
|
|
6
|
+
import { configStore } from "../stores/config.js";
|
|
7
|
+
import { Commands } from "../components/commands.js";
|
|
8
|
+
import { Command } from "../components/command.js";
|
|
9
|
+
const height = process.stdout.rows - 4;
|
|
10
|
+
const initialConfig = await configStore.get();
|
|
11
|
+
const initialSettings = Object.entries(initialConfig.settings).map(([key, setting]) => ({
|
|
12
|
+
key,
|
|
13
|
+
edit: false,
|
|
14
|
+
setting
|
|
15
|
+
}));
|
|
16
|
+
export function config() {
|
|
17
|
+
render(_jsx(Config, {}));
|
|
18
|
+
}
|
|
19
|
+
export function Config() {
|
|
20
|
+
const [currentIndex, setCurrentIndex] = useState(0);
|
|
21
|
+
const [settingItems, setSettingItems] = useState(initialSettings);
|
|
22
|
+
const [saved, setSaved] = useState(false);
|
|
23
|
+
const [exit, setExit] = useState(false);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (exit) {
|
|
26
|
+
setTimeout(() => process.exit(), 0);
|
|
27
|
+
}
|
|
28
|
+
}, [exit]);
|
|
29
|
+
function handleUp() {
|
|
30
|
+
unselect();
|
|
31
|
+
setCurrentIndex(index => Math.max(0, index - 1));
|
|
32
|
+
}
|
|
33
|
+
function handleDown() {
|
|
34
|
+
unselect();
|
|
35
|
+
setCurrentIndex(index => Math.min(settingItems.length - 1, index + 1));
|
|
36
|
+
}
|
|
37
|
+
function handleEnter() {
|
|
38
|
+
for (const settingItem of settingItems) {
|
|
39
|
+
settingItem.edit = false;
|
|
40
|
+
}
|
|
41
|
+
const settingItem = settingItems[currentIndex];
|
|
42
|
+
settingItem.edit = true;
|
|
43
|
+
if (settingItem.setting.type === 'boolean') {
|
|
44
|
+
settingItem.setting.value = !settingItem.setting.value;
|
|
45
|
+
}
|
|
46
|
+
setSettingItems([...settingItems]);
|
|
47
|
+
}
|
|
48
|
+
function handleInputChange(key, value) {
|
|
49
|
+
const setting = settingItems.find(setting => setting.key === key).setting;
|
|
50
|
+
if (value === '') {
|
|
51
|
+
setting.value = '';
|
|
52
|
+
}
|
|
53
|
+
else if (!isNaN(parseInt(value)) && parseInt(value) < setting.max) {
|
|
54
|
+
setting.value = parseInt(value);
|
|
55
|
+
}
|
|
56
|
+
setSettingItems([...settingItems]);
|
|
57
|
+
}
|
|
58
|
+
async function handleSave() {
|
|
59
|
+
const config = await configStore.get();
|
|
60
|
+
config.settings = settingItems.reduce((obj, item) => ({
|
|
61
|
+
...obj,
|
|
62
|
+
[item.key]: item.setting
|
|
63
|
+
}), {});
|
|
64
|
+
await configStore.save(config);
|
|
65
|
+
setSaved(true);
|
|
66
|
+
setTimeout(() => setSaved(false), 500);
|
|
67
|
+
}
|
|
68
|
+
function handleExit() {
|
|
69
|
+
setExit(true);
|
|
70
|
+
}
|
|
71
|
+
function unselect() {
|
|
72
|
+
for (const item of settingItems) {
|
|
73
|
+
item.edit = false;
|
|
74
|
+
if (item.setting.type === 'number') {
|
|
75
|
+
if (!item.setting.value || (typeof item.setting.value === 'number' && item.setting.value < item.setting.min)) {
|
|
76
|
+
item.setting.value = item.setting.min;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
setSettingItems([...settingItems]);
|
|
81
|
+
}
|
|
82
|
+
if (exit)
|
|
83
|
+
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' &&
|
|
85
|
+
_jsx(Text, { color: 'cyan', inverse: item.edit, children: item.setting.value ? 'true' : 'false' }), item.setting.type === 'number' &&
|
|
86
|
+
_jsxs(Box, { children: [item.edit &&
|
|
87
|
+
_jsx(Text, { inverse: true, color: 'cyan', children: _jsx(TextInput, { value: item.setting.value.toString(), onChange: value => handleInputChange(item.key, value) }) }), !item.edit &&
|
|
88
|
+
_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
|
+
_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: 'cyan', bold: true, children: "Saved!" }) })] })] }));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2NvbmZpZy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sU0FBUyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTJCLENBQUM7QUFHcEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLE1BQU0sYUFBYSxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBRTlDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLEdBQUc7SUFDSCxJQUFJLEVBQUUsS0FBSztJQUNYLE9BQU87Q0FDUixDQUFDLENBQUMsQ0FBQztBQUVKLE1BQU0sVUFBVSxNQUFNO0lBQ3BCLE1BQU0sQ0FBQyxLQUFDLE1BQU0sS0FBRyxDQUFDLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sVUFBVSxNQUFNO0lBRXBCLE1BQU0sQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0s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
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
|
-
import { useEffect, useState } from 'react';
|
|
4
3
|
import { TextField } from "./textField.js";
|
|
5
4
|
export function ApiKeyField(props) {
|
|
6
|
-
const { title,
|
|
7
|
-
|
|
8
|
-
useEffect(() => {
|
|
9
|
-
setApiKey(initialApiKey);
|
|
10
|
-
}, [initialApiKey]);
|
|
11
|
-
return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(Text, { bold: true, children: title }), _jsx(TextField, { label: 'Api key:', value: apiKey, placeholder: 'Enter api key', marginTop: 1, onChange: setApiKey, onSubmit: value => onChange(value.trim()) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: 'grey', dimColor: true, children: commands }) })] }));
|
|
5
|
+
const { title, value, onChange } = props;
|
|
6
|
+
return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(Text, { bold: true, children: title }), _jsx(Box, { flexShrink: 0 }), _jsxs(Box, { flexDirection: 'row', gap: 1, borderStyle: 'single', borderLeftColor: 'cyan', borderLeft: true, borderRight: false, borderTop: false, borderBottom: false, paddingLeft: 1, marginTop: 1, children: [_jsx(Box, { flexShrink: 0, children: _jsx(Text, { children: "Api key:" }) }), _jsx(TextField, { value: value, placeholder: 'Enter api key', onChange: onChange })] })] }));
|
|
12
7
|
}
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpS2V5RmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9hcGlLZXlGaWVsZC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBaUIsQ0FBQztBQVE1QyxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQVk7SUFFdEMsTUFBTSxFQUNKLEtBQUssRUFDTCxLQUFLLEVBQ0wsUUFBUSxFQUNULEdBQUcsS0FBSyxDQUFDO0lBRVYsT0FBTyxDQUNMLE1BQUMsR0FBRyxJQUFDLGFBQWEsRUFBQyxRQUFRLGFBQ3pCLEtBQUMsSUFBSSxJQUFDLElBQUksa0JBQUUsS0FBSyxHQUFRLEVBQ3pCLEtBQUMsR0FBRyxJQUFDLFVBQVUsRUFBRSxDQUFDLEdBQ1osRUFDTixNQUFDLEdBQUcsSUFDRixhQUFhLEVBQUMsS0FBSyxFQUNuQixHQUFHLEVBQUUsQ0FBQyxFQUNOLFdBQVcsRUFBQyxRQUFRLEVBQ3BCLGVBQWUsRUFBQyxNQUFNLEVBQ3RCLFVBQVUsRUFBRSxJQUFJLEVBQ2hCLFdBQVcsRUFBRSxLQUFLLEVBQ2xCLFNBQVMsRUFBRSxLQUFLLEVBQ2hCLFlBQVksRUFBRSxLQUFLLEVBQ25CLFdBQVcsRUFBRSxDQUFDLEVBQ2QsU0FBUyxFQUFFLENBQUMsYUFDWixLQUFDLEdBQUcsSUFBQyxVQUFVLEVBQUUsQ0FBQyxZQUNoQixLQUFDLElBQUksMkJBQWdCLEdBQ2pCLEVBQ04sS0FBQyxTQUFTLElBQ1IsS0FBSyxFQUFFLEtBQUssRUFDWixXQUFXLEVBQUMsZUFBZSxFQUMzQixRQUFRLEVBQUUsUUFBUSxHQUFHLElBQ25CLElBQ0YsQ0FDUCxDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { useContext, useEffect, useState } from 'react';
|
|
4
|
+
import { CommandContext } from "./commands.js";
|
|
5
|
+
export function Command(props) {
|
|
6
|
+
const { title, ctrl, esc, enter, up, down, inputKey, onPress } = props;
|
|
7
|
+
const [active, setActive] = useState(false);
|
|
8
|
+
const inputEvent = useContext(CommandContext);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
if (!inputEvent)
|
|
11
|
+
return;
|
|
12
|
+
const keyMap = {
|
|
13
|
+
ctrl,
|
|
14
|
+
escape: esc,
|
|
15
|
+
return: enter,
|
|
16
|
+
upArrow: up,
|
|
17
|
+
downArrow: down
|
|
18
|
+
};
|
|
19
|
+
const keys = Object
|
|
20
|
+
.entries(keyMap)
|
|
21
|
+
.filter(item => item[1] !== undefined)
|
|
22
|
+
.map(([key]) => key);
|
|
23
|
+
const validateKey = keys.length > 0;
|
|
24
|
+
const validateInput = inputKey !== undefined;
|
|
25
|
+
const isKeyActive = keys.every(key => inputEvent.key[key]);
|
|
26
|
+
const isInputActive = inputEvent.input === inputKey;
|
|
27
|
+
const active = isActive(validateKey, validateInput, isKeyActive, isInputActive);
|
|
28
|
+
if (active) {
|
|
29
|
+
onPress?.();
|
|
30
|
+
setActive(true);
|
|
31
|
+
setTimeout(() => setActive(false), 200);
|
|
32
|
+
}
|
|
33
|
+
}, [inputEvent]);
|
|
34
|
+
function isActive(validateKey, validateInput, isKeyActive, isInputActive) {
|
|
35
|
+
if (ctrl && inputKey === 'v' && inputEvent && inputEvent.input.length > 1) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
else if (validateKey && validateInput) {
|
|
39
|
+
return isKeyActive && isInputActive;
|
|
40
|
+
}
|
|
41
|
+
else if (validateKey) {
|
|
42
|
+
return isKeyActive;
|
|
43
|
+
}
|
|
44
|
+
else if (validateInput) {
|
|
45
|
+
return isInputActive;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (!title)
|
|
52
|
+
return null;
|
|
53
|
+
return (_jsx(Box, { children: _jsx(Text, { bold: active, color: active ? 'cyan' : 'gray', children: title }) }));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1hbmQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFPLElBQUksRUFBRSxNQUFNLEtBQUssQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWdCLENBQUM7QUFhaEQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFtQjtJQUV6QyxNQUFNLEVBQ0osS0FBSyxFQUNMLElBQUksRUFDSixHQUFHLEVBQ0gsS0FBSyxFQUNMLEVBQUUsRUFDRixJQUFJLEVBQ0osUUFBUSxFQUNSLE9BQU8sRUFDUixHQUFHLEtBQUssQ0FBQztJQUVWLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUU5QyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBRWIsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBRXhCLE1BQU0sTUFBTSxHQUFpQjtZQUMzQixJQUFJO1lBQ0osTUFBTSxFQUFFLEdBQUc7WUFDWCxNQUFNLEVBQUUsS0FBSztZQUNiLE9BQU8sRUFBRSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLE1BQU07YUFDaEIsT0FBTyxDQUFDLE1BQU0sQ0FBQzthQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7YUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBZ0IsQ0FBQyxDQUFDO1FBRXBDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUM7UUFDN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQztRQUVwRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFaEYsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDWixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUVqQixTQUFTLFFBQVEsQ0FBQyxXQUFvQixFQUFFLGFBQXNCLEVBQUUsV0FBb0IsRUFBRSxhQUFzQjtRQUMxRyxJQUFJLElBQUksSUFBSSxRQUFRLEtBQUssR0FBRyxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUFJLFdBQVcsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUN4QyxPQUFPLFdBQVcsSUFBSSxhQUFhLENBQUM7UUFDdEMsQ0FBQzthQUFNLElBQUksV0FBVyxFQUFFLENBQUM7WUFDdkIsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQzthQUFNLElBQUksYUFBYSxFQUFFLENBQUM7WUFDekIsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV4QixPQUFPLENBQ0wsS0FBQyxHQUFHLGNBQ0YsS0FBQyxJQUFJLElBQ0gsSUFBSSxFQUFFLE1BQU0sRUFDWixLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sWUFDOUIsS0FBSyxHQUNELEdBQ0gsQ0FDUCxDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput } from 'ink';
|
|
3
|
+
import { Children, createContext, useState } from 'react';
|
|
4
|
+
export const CommandContext = createContext(undefined);
|
|
5
|
+
export function Commands(props) {
|
|
6
|
+
const [inputEvent, setInputEvent] = useState();
|
|
7
|
+
useInput((input, key) => {
|
|
8
|
+
setInputEvent({ input, key });
|
|
9
|
+
});
|
|
10
|
+
const children = Children.map(props.children, child => child);
|
|
11
|
+
return (_jsx(CommandContext.Provider, { value: inputEvent, children: _jsxs(Box, { marginTop: 1, gap: 1, children: [children.filter(child => child.props.title).map((child, index, children) => _jsxs(Box, { children: [child, index !== children.length - 1 &&
|
|
12
|
+
_jsx(Text, { color: 'gray', children: "," })] }, index)), children.filter(child => !child.props.title).map((child) => child)] }) }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9jb21tYW5kcy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxHQUFHLEVBQU8sSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBZ0IsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBS3hFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQXlCLFNBQVMsQ0FBQyxDQUFDO0FBTS9FLE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBWTtJQUVuQyxNQUFNLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxHQUFHLFFBQVEsRUFBYyxDQUFDO0lBRTNELFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUN0QixhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlELE9BQU8sQ0FDTCxLQUFDLGNBQWMsQ0FBQyxRQUFRLElBQUMsS0FBSyxFQUFFLFVBQVUsWUFDeEMsTUFBQyxHQUFHLElBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUN0QixRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQzFFLE1BQUMsR0FBRyxlQUNELEtBQUssRUFDTCxLQUFLLEtBQUssUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDOzRCQUM1QixLQUFDLElBQUksSUFBQyxLQUFLLEVBQUMsTUFBTSxrQkFBUyxLQUhyQixLQUFLLENBS1QsQ0FDUCxFQUNBLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDMUQsS0FBSyxDQUNOLElBQ0csR0FDa0IsQ0FDM0IsQ0FBQztBQUNKLENBQUMifQ==
|
|
@@ -1,34 +1,41 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
3
|
import { useEffect, useState } from 'react';
|
|
4
4
|
import { configStore } from "../stores/config.js";
|
|
5
5
|
import { ApiKeyField } from "./apiKeyField.js";
|
|
6
|
+
import { Commands } from "./commands.js";
|
|
7
|
+
import { Command } from "./command.js";
|
|
6
8
|
const config = await configStore.get();
|
|
7
9
|
export function Provider(props) {
|
|
8
10
|
const { provider, onClose } = props;
|
|
9
|
-
const [apiKey, setApiKey] = useState(config?.providers[provider.id]?.apiKey);
|
|
11
|
+
const [apiKey, setApiKey] = useState(config?.providers[provider.id]?.apiKey ?? '');
|
|
10
12
|
const [exit, setExit] = useState(false);
|
|
11
13
|
const [saved, setSaved] = useState(false);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
void (async () => {
|
|
16
|
+
const config = await configStore.get();
|
|
17
|
+
setApiKey(config?.providers[provider.id]?.apiKey ?? '');
|
|
18
|
+
})();
|
|
19
|
+
}, []);
|
|
12
20
|
useEffect(() => {
|
|
13
21
|
if (exit) {
|
|
14
22
|
setTimeout(() => process.exit(), 0);
|
|
15
23
|
}
|
|
16
24
|
}, [exit]);
|
|
17
|
-
|
|
18
|
-
if (key.escape)
|
|
19
|
-
setExit(true);
|
|
20
|
-
if (input.toLowerCase() === 'q')
|
|
21
|
-
onClose();
|
|
22
|
-
});
|
|
23
|
-
async function handleSave(apiKey) {
|
|
25
|
+
async function handleSave() {
|
|
24
26
|
await configStore.setProviderApiKey(provider.id, apiKey);
|
|
25
|
-
setApiKey(apiKey);
|
|
26
27
|
setSaved(true);
|
|
27
|
-
setTimeout(() => setSaved(false),
|
|
28
|
+
setTimeout(() => setSaved(false), 800);
|
|
29
|
+
}
|
|
30
|
+
function handleExit() {
|
|
31
|
+
setExit(true);
|
|
32
|
+
}
|
|
33
|
+
function handleGoBack() {
|
|
34
|
+
onClose();
|
|
28
35
|
}
|
|
29
36
|
if (exit)
|
|
30
37
|
return null;
|
|
31
|
-
return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(ApiKeyField, { title: provider.name,
|
|
32
|
-
|
|
38
|
+
return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(ApiKeyField, { title: provider.name, value: apiKey, onChange: setApiKey }), _jsxs(Box, { flexDirection: 'row', gap: 1, children: [_jsxs(Commands, { children: [_jsx(Command, { title: 'Esc (Exit)', esc: true, onPress: handleExit }), _jsx(Command, { title: 'Ctrl+B (Go Back)', ctrl: true, inputKey: 'b', onPress: handleGoBack }), _jsx(Command, { title: 'Ctrl+V (Paste)', ctrl: true, inputKey: 'v' }), _jsx(Command, { title: 'Enter (Save)', enter: true, onPress: handleSave })] }), saved &&
|
|
39
|
+
_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: 'cyan', bold: true, children: "\u00A1Saved!" }) })] })] }));
|
|
33
40
|
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9wcm92aWRlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRTVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWUsQ0FBQztBQU94QyxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUV2QyxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQVk7SUFFbkMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFFcEMsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDZixNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QyxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFWCxLQUFLLFVBQVUsVUFBVTtRQUN2QixNQUFNLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNmLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFNBQVMsVUFBVTtRQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELFNBQVMsWUFBWTtRQUNuQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxJQUFJLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV0QixPQUFPLENBQ0wsTUFBQyxHQUFHLElBQUMsYUFBYSxFQUFDLFFBQVEsYUFDekIsS0FBQyxXQUFXLElBQ1YsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQ3BCLEtBQUssRUFBRSxNQUFNLEVBQ2IsUUFBUSxFQUFFLFNBQVMsR0FBRyxFQUN4QixNQUFDLEdBQUcsSUFBQyxhQUFhLEVBQUMsS0FBSyxFQUFDLEdBQUcsRUFBRSxDQUFDLGFBQzdCLE1BQUMsUUFBUSxlQUNQLEtBQUMsT0FBTyxJQUFDLEtBQUssRUFBQyxZQUFZLEVBQUMsR0FBRyxRQUFDLE9BQU8sRUFBRSxVQUFVLEdBQUcsRUFDdEQsS0FBQyxPQUFPLElBQUMsS0FBSyxFQUFDLGtCQUFrQixFQUFDLElBQUksUUFBQyxRQUFRLEVBQUMsR0FBRyxFQUFDLE9BQU8sRUFBRSxZQUFZLEdBQUcsRUFDNUUsS0FBQyxPQUFPLElBQUMsS0FBSyxFQUFDLGdCQUFnQixFQUFDLElBQUksUUFBQyxRQUFRLEVBQUMsR0FBRyxHQUFFLEVBQ25ELEtBQUMsT0FBTyxJQUFDLEtBQUssRUFBQyxjQUFjLEVBQUMsS0FBSyxRQUFDLE9BQU8sRUFBRSxVQUFVLEdBQUcsSUFDakQsRUFDVixLQUFLO3dCQUNKLEtBQUMsR0FBRyxJQUFDLFNBQVMsRUFBRSxDQUFDLFlBQ2YsS0FBQyxJQUFJLElBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxJQUFJLG1DQUFlLEdBQ2xDLElBRUosSUFDRixDQUNQLENBQUM7QUFDSixDQUFDIn0=
|