ask-cli-ai 1.0.10 → 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 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, you have to explicitly authorize it using the `--command` option. See [Running commands](#running-commands) for more details.
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 the [Select model](#select-model) section to learn how.
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 find files by name in linux
62
- ask what is a promise in javascript
63
- ask how to create a new branch in git
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 `how` and `what` as aliases for the `ask` command:
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 `-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.
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 `ask /models` command. This will list all the available models and let you select the model you want to use.
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
  ![Model selection screen](https://github.com/david-minaya/ask/blob/main/images/select-model.png)
101
93
 
@@ -131,12 +123,15 @@ 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
 
126
+ Version: 1.1.0
127
+
134
128
  Usage: ask <prompt..>
135
129
 
136
130
  Commands:
137
131
  ask <prompt..> Ask something. Alias: what, how [default]
138
132
  ask /models Select a model
139
133
  ask /providers Setup providers
134
+ ask /config Configuration
140
135
  ask /history List the chat history
141
136
  ask /clear Clear the chat history
142
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.10\n\nUsage: $0 <prompt..>`)
13
- .version('1.0.10')
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG1CQUFvQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM5QixVQUFVLENBQUMsS0FBSyxDQUFDO0tBQ2pCLEtBQUssQ0FBQyxHQUFHLElBQUksdUdBQXVHLENBQUM7S0FDckgsT0FBTyxDQUFDLFFBQVEsQ0FBQztLQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDO0tBQ1osT0FBTyxDQUFDLGtDQUFrQyxFQUFFLEVBQUUsQ0FBQztLQUMvQyxPQUFPLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxDQUFDO0tBQzFDLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxFQUFFLENBQUM7S0FDeEMsT0FBTyxDQUFDLDRDQUE0QyxFQUFFLEVBQUUsQ0FBQztLQUV6RCxJQUFJLEVBQUU7S0FDTixPQUFPLENBQUM7SUFDUCxPQUFPLEVBQUUsZUFBZTtJQUN4QixRQUFRLEVBQUUsaUNBQWlDO0lBQzNDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUs7U0FDcEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDekUsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNqQixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDWixJQUFJLEVBQUUsUUFBUTtRQUNkLFdBQVcsRUFBRSxvQkFBb0I7UUFDakMsV0FBVyxFQUFFLElBQUk7S0FDbEIsQ0FBQztJQUNKLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7Q0FDNUQsQ0FBQztLQUNELE9BQU8sQ0FBQztJQUNQLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFFBQVEsRUFBRSxnQkFBZ0I7SUFDMUIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRTtDQUM3QixDQUFDO0tBQ0QsT0FBTyxDQUFDO0lBQ1AsT0FBTyxFQUFFLFlBQVk7SUFDckIsUUFBUSxFQUFFLGlCQUFpQjtJQUMzQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFO0NBQzNCLENBQUM7S0FDRCxPQUFPLENBQUM7SUFDUCxPQUFPLEVBQUUsVUFBVTtJQUNuQixRQUFRLEVBQUUsdUJBQXVCO0lBQ2pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLEVBQUU7Q0FDN0IsQ0FBQztLQUNELE9BQU8sQ0FBQztJQUNQLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFFBQVEsRUFBRSx3QkFBd0I7SUFDbEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRTtDQUM5QixDQUFDO0tBQ0QsS0FBSyxFQUFFLENBQUMifQ==
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG1CQUFvQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUF1QixDQUFDO0FBRS9DLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDOUIsVUFBVSxDQUFDLEtBQUssQ0FBQztLQUNqQixLQUFLLENBQUMsR0FBRyxJQUFJLHNHQUFzRyxDQUFDO0tBQ3BILE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDaEIsTUFBTSxDQUFDLElBQUksQ0FBQztLQUNaLE9BQU8sQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLENBQUM7S0FDL0MsT0FBTyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsQ0FBQztLQUMxQyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxDQUFDO0tBQ3hDLE9BQU8sQ0FBQyw0Q0FBNEMsRUFBRSxFQUFFLENBQUM7S0FDekQsSUFBSSxFQUFFO0tBQ04sT0FBTyxDQUFDO0lBQ1AsT0FBTyxFQUFFLGVBQWU7SUFDeEIsUUFBUSxFQUFFLGlDQUFpQztJQUMzQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLO1NBQ3BCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3pFLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDakIsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1osSUFBSSxFQUFFLFFBQVE7UUFDZCxXQUFXLEVBQUUsb0JBQW9CO1FBQ2pDLFdBQVcsRUFBRSxJQUFJO0tBQ2xCLENBQUM7SUFDSixPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO0NBQzVELENBQUM7S0FDRCxPQUFPLENBQUM7SUFDUCxPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsZ0JBQWdCO0lBQzFCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLEVBQUU7Q0FDN0IsQ0FBQztLQUNELE9BQU8sQ0FBQztJQUNQLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLFFBQVEsRUFBRSxpQkFBaUI7SUFDM0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRTtDQUMzQixDQUFDO0tBQ0QsT0FBTyxDQUFDO0lBQ1AsT0FBTyxFQUFFLFNBQVM7SUFDbEIsUUFBUSxFQUFFLGVBQWU7SUFDekIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRTtDQUN4QixDQUFDO0tBQ0QsT0FBTyxDQUFDO0lBQ1AsT0FBTyxFQUFFLFVBQVU7SUFDbkIsUUFBUSxFQUFFLHVCQUF1QjtJQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxFQUFFO0NBQzdCLENBQUM7S0FDRCxPQUFPLENBQUM7SUFDUCxPQUFPLEVBQUUsUUFBUTtJQUNqQixRQUFRLEVBQUUsd0JBQXdCO0lBQ2xDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUU7Q0FDOUIsQ0FBQztLQUNELEtBQUssRUFBRSxDQUFDIn0=
@@ -1,9 +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';
4
+ import chalk from 'chalk';
5
+ import { exec as execCb } from 'node:child_process';
7
6
  import { useEffect, useState } from 'react';
8
7
  import { Box, render, Static, Text, useApp } from 'ink';
9
8
  import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
@@ -11,7 +10,6 @@ import { configStore } from "../stores/config.js";
11
10
  import { historyStore } from "../stores/history.js";
12
11
  import { Welcome } from "../components/welcome.js";
13
12
  import { Loading } from "../components/loading.js";
14
- import { root } from "../utils/root.js";
15
13
  import { ChatAnthropic } from '@langchain/anthropic';
16
14
  import { ChatOpenAI } from '@langchain/openai';
17
15
  import { instructions } from "../templates/instructions.js";
@@ -28,13 +26,17 @@ function Ask(props) {
28
26
  const [view, setView] = useState('ask');
29
27
  const [sending, setSending] = useState(false);
30
28
  const [response, setResponse] = useState('');
29
+ const [meta, setMeta] = useState();
31
30
  const [exitCode, setExitCode] = useState();
32
31
  const [isFirstRun, setIsFirstRun] = useState(false);
33
32
  useEffect(() => {
34
33
  void (async () => {
35
- if (!config.model)
36
- return setView('welcome');
37
- await send(config.model.provider, config.model.model, config.model.apiKey);
34
+ if (config.model) {
35
+ await send(config);
36
+ }
37
+ else {
38
+ setView('welcome');
39
+ }
38
40
  })();
39
41
  }, []);
40
42
  useEffect(() => {
@@ -43,46 +45,54 @@ function Ask(props) {
43
45
  }
44
46
  }, [exitCode]);
45
47
  useEffect(() => {
46
- (async () => {
47
- const dirPath = path.join(root, '/data/chats');
48
- const fileNames = await fs.readdir(dirPath);
49
- const files = await Promise.all(fileNames.map(async (name) => {
50
- const filePath = path.join(dirPath, name);
51
- const stats = await fs.stat(filePath);
52
- return { path: filePath, time: stats.ctimeMs };
53
- }));
54
- const sortedFiles = files
55
- .sort((a, b) => b.time - a.time)
56
- .slice(10);
57
- await Promise.all(sortedFiles.map(file => fs.unlink(file.path)));
58
- })().catch(() => { });
48
+ void historyStore.deleteOldHistory();
59
49
  }, []);
60
- async function handleSend(modelId, apiKey) {
50
+ async function handleSend() {
61
51
  setIsFirstRun(true);
62
52
  setView('ask');
63
53
  const config = await configStore.get();
64
- await send(config.model.provider, modelId, apiKey);
54
+ await send(config);
65
55
  }
66
- async function send(providerId, modelId, apiKey) {
56
+ async function send(config) {
57
+ const modelId = config.model.model;
58
+ const providerId = config.model.provider;
59
+ const apikey = config.providers[providerId].apiKey;
60
+ const provider = providers.find(provider => provider.id === providerId);
61
+ const model = provider?.models.find(model => model.name === modelId);
62
+ if (!apikey) {
63
+ console.error(`No API key found for the model ${chalk.bold(`${model.title} (${provider.name})`)}.\n`);
64
+ console.error(`Use the command ${chalk.cyan(chalk.bold('ask /providers'))} to set the API key for the provider ${chalk.bold(provider.name)}.`);
65
+ setExitCode(1);
66
+ return;
67
+ }
67
68
  try {
68
69
  setSending(true);
69
70
  const prompt = await getPrompt();
70
- const model = getModel(providerId, modelId, apiKey);
71
- const response = await model.invoke([
71
+ const modelClient = getModel(providerId, modelId, apikey);
72
+ const startTime = Date.now();
73
+ const response = await modelClient.invoke([
72
74
  { role: 'system', content: instructions },
73
75
  ...history.map(item => ({ ...item })),
74
76
  { role: 'human', content: prompt }
75
77
  ]);
78
+ const endTime = Date.now();
76
79
  await historyStore.add([
77
80
  { role: 'human', content: prompt },
78
81
  { role: 'ai', content: response.text }
79
82
  ]);
80
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
+ });
81
90
  setSending(false);
82
91
  setExitCode(0);
83
92
  }
84
93
  catch (err) {
85
- console.error('Error running model:', err.message);
94
+ console.error(`Error running model ${chalk.bold(`${model.title} (${provider.name})`)}:\n\n${err.message}`);
95
+ setSending(false);
86
96
  setExitCode(1);
87
97
  }
88
98
  }
@@ -97,10 +107,11 @@ function Ask(props) {
97
107
  function getModel(providerId, modelId, apiKey) {
98
108
  const provider = providers.find(provider => provider.id === providerId);
99
109
  const model = provider?.models.find(model => model.name === modelId);
110
+ const maxOutputTokens = config.settings.maxOutputTokens.value;
100
111
  switch (providerId) {
101
- case 'openai': return new ChatOpenAI({ model: modelId, apiKey, ...model?.config });
102
- case 'gemini': return new ChatGoogleGenerativeAI({ model: modelId, apiKey, ...model?.config });
103
- 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 });
104
115
  default: throw new Error('Model not found');
105
116
  }
106
117
  }
@@ -115,11 +126,17 @@ function Ask(props) {
115
126
  return `Error executing command: \n\n${stdout}\n\n${stderr}`;
116
127
  }
117
128
  }
129
+ function formatTime(time) {
130
+ return time < 1000 * 60
131
+ ? `${(time / 1000).toFixed(1)}s`
132
+ : `${(time / (1000 * 60)).toFixed(1)}m`;
133
+ }
118
134
  return (_jsxs(Box, { children: [view === 'welcome' &&
119
135
  _jsx(Welcome, { onSend: handleSend }), view === 'ask' &&
120
136
  _jsxs(Box, { children: [isFirstRun &&
121
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 &&
122
138
  _jsx(Loading, {}), !sending && response &&
123
- _jsx(Static, { items: [''], children: item => _jsx(Text, { children: response }, item) })] })] }));
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) })] })] }));
124
141
  }
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2Fzay50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEMsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEyQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFNUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENB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
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 cleared.');
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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
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { TextField } from "./textField.js";
4
+ export function ApiKeyField(props) {
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 })] })] }));
7
+ }
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,35 +1,41 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { measureElement, useInput, Box, Text } from 'ink';
3
- import { useState, useRef, useMemo, useEffect } from 'react';
4
- import { providers as providerList } from "../providers.js";
2
+ import { Box, Text } from 'ink';
3
+ import { useEffect, useState } from 'react';
5
4
  import { configStore } from "../stores/config.js";
6
- import TextInput from 'ink-text-input';
5
+ import { ApiKeyField } from "./apiKeyField.js";
6
+ import { Commands } from "./commands.js";
7
+ import { Command } from "./command.js";
7
8
  const config = await configStore.get();
8
9
  export function Provider(props) {
9
10
  const { provider, onClose } = props;
10
- const [enableEdit, setEnableEdit] = useState(false);
11
- const [apiKey, setApiKey] = useState(config.providers[provider.id]?.apiKey ?? '');
12
- const [apiKeyInput, setApiKeyInput] = useState(apiKey);
13
- const [contentHeight, setContentHeight] = useState();
14
- const contentRef = useRef(null);
15
- const height = useMemo(() => process.stdout.rows - 2, []);
11
+ const [apiKey, setApiKey] = useState(config?.providers[provider.id]?.apiKey ?? '');
12
+ const [exit, setExit] = useState(false);
13
+ const [saved, setSaved] = useState(false);
16
14
  useEffect(() => {
17
- const contentSize = measureElement(contentRef.current);
18
- const contentHeight = height - contentSize.height;
19
- setContentHeight(providerList.length > contentHeight ? contentHeight : undefined);
20
- }, [height]);
21
- useInput((input, key) => {
22
- if (key.escape)
23
- onClose();
24
- if (input === 'e')
25
- setEnableEdit(true);
26
- });
15
+ void (async () => {
16
+ const config = await configStore.get();
17
+ setApiKey(config?.providers[provider.id]?.apiKey ?? '');
18
+ })();
19
+ }, []);
20
+ useEffect(() => {
21
+ if (exit) {
22
+ setTimeout(() => process.exit(), 0);
23
+ }
24
+ }, [exit]);
27
25
  async function handleSave() {
28
- await configStore.setProviderApiKey(provider.id, apiKeyInput);
29
- setApiKey(apiKeyInput);
30
- setEnableEdit(false);
26
+ await configStore.setProviderApiKey(provider.id, apiKey);
27
+ setSaved(true);
28
+ setTimeout(() => setSaved(false), 800);
29
+ }
30
+ function handleExit() {
31
+ setExit(true);
32
+ }
33
+ function handleGoBack() {
34
+ onClose();
31
35
  }
32
- return (_jsx(Box, { flexDirection: 'column', children: _jsxs(Box, { flexDirection: 'column', ref: contentRef, children: [_jsx(Text, { bold: true, children: provider.name }), _jsx(Box, { height: contentHeight, marginTop: 1, children: _jsxs(Text, { children: [_jsx(Text, { color: 'gray', bold: true, children: "Api key:" }), " ", apiKey || 'none'] }) }), enableEdit &&
33
- _jsxs(Box, { marginTop: 1, borderStyle: 'single', borderLeftColor: 'cyan', borderLeft: true, borderRight: false, borderTop: false, borderBottom: false, paddingLeft: 1, children: [_jsx(Text, { color: 'gray', children: "Key: " }), _jsx(TextInput, { value: apiKeyInput, onChange: setApiKeyInput, onSubmit: handleSave, placeholder: "Enter api key, paste (Ctrl + V)" })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: 'gray', children: 'Esc (Back) E (Edit api key)' }) })] }) }));
36
+ if (exit)
37
+ return null;
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!" }) })] })] }));
34
40
  }
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9wcm92aWRlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQWMsTUFBTSxLQUFLLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxJQUFJLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLFNBQVMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQU92QyxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQVk7SUFFbkMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFFcEMsTUFBTSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxRQUFRLEVBQVUsQ0FBQztJQUU3RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQWEsSUFBSSxDQUFDLENBQUM7SUFFNUMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUUxRCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFRLENBQUMsQ0FBQztRQUN4RCxNQUFNLGFBQWEsR0FBRyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUNsRCxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRixDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRWIsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3RCLElBQUksR0FBRyxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMxQixJQUFJLEtBQUssS0FBSyxHQUFHO1lBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBRUgsS0FBSyxVQUFVLFVBQVU7UUFDdkIsTUFBTSxXQUFXLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM5RCxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkIsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPLENBQ0wsS0FBQyxHQUFHLElBQUMsYUFBYSxFQUFDLFFBQVEsWUFDekIsTUFBQyxHQUFHLElBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxHQUFHLEVBQUUsVUFBVSxhQUN6QyxLQUFDLElBQUksSUFBQyxJQUFJLGtCQUFFLFFBQVEsQ0FBQyxJQUFJLEdBQVEsRUFDakMsS0FBQyxHQUFHLElBQ0YsTUFBTSxFQUFFLGFBQWEsRUFDckIsU0FBUyxFQUFFLENBQUMsWUFDWixNQUFDLElBQUksZUFBQyxLQUFDLElBQUksSUFBQyxLQUFLLEVBQUMsTUFBTSxFQUFDLElBQUksK0JBQWdCLE9BQUUsTUFBTSxJQUFJLE1BQU0sSUFBUSxHQUNuRSxFQUNMLFVBQVU7b0JBQ1QsTUFBQyxHQUFHLElBQ0YsU0FBUyxFQUFFLENBQUMsRUFDWixXQUFXLEVBQUMsUUFBUSxFQUNwQixlQUFlLEVBQUMsTUFBTSxFQUN0QixVQUFVLEVBQUUsSUFBSSxFQUNoQixXQUFXLEVBQUUsS0FBSyxFQUNsQixTQUFTLEVBQUUsS0FBSyxFQUNoQixZQUFZLEVBQUUsS0FBSyxFQUNuQixXQUFXLEVBQUUsQ0FBQyxhQUNkLEtBQUMsSUFBSSxJQUFDLEtBQUssRUFBQyxNQUFNLHNCQUFhLEVBQy9CLEtBQUMsU0FBUyxJQUNSLEtBQUssRUFBRSxXQUFXLEVBQ2xCLFFBQVEsRUFBRSxjQUFjLEVBQ3hCLFFBQVEsRUFBRSxVQUFVLEVBQ3BCLFdBQVcsRUFBQyxpQ0FBaUMsR0FDN0MsSUFDRSxFQUVSLEtBQUMsR0FBRyxJQUFDLFNBQVMsRUFBRSxDQUFDLFlBQ2YsS0FBQyxJQUFJLElBQUMsS0FBSyxFQUFDLE1BQU0sWUFBRSw4QkFBOEIsR0FBUSxHQUN0RCxJQUNGLEdBQ0YsQ0FDUCxDQUFDO0FBQ0osQ0FBQyJ9
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9wcm92aWRlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRTVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWUsQ0FBQztBQU94QyxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUV2QyxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQVk7SUFFbkMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFFcEMsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDZixNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QyxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFWCxLQUFLLFVBQVUsVUFBVTtRQUN2QixNQUFNLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNmLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFNBQVMsVUFBVTtRQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELFNBQVMsWUFBWTtRQUNuQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxJQUFJLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV0QixPQUFPLENBQ0wsTUFBQyxHQUFHLElBQUMsYUFBYSxFQUFDLFFBQVEsYUFDekIsS0FBQyxXQUFXLElBQ1YsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQ3BCLEtBQUssRUFBRSxNQUFNLEVBQ2IsUUFBUSxFQUFFLFNBQVMsR0FBRyxFQUN4QixNQUFDLEdBQUcsSUFBQyxhQUFhLEVBQUMsS0FBSyxFQUFDLEdBQUcsRUFBRSxDQUFDLGFBQzdCLE1BQUMsUUFBUSxlQUNQLEtBQUMsT0FBTyxJQUFDLEtBQUssRUFBQyxZQUFZLEVBQUMsR0FBRyxRQUFDLE9BQU8sRUFBRSxVQUFVLEdBQUcsRUFDdEQsS0FBQyxPQUFPLElBQUMsS0FBSyxFQUFDLGtCQUFrQixFQUFDLElBQUksUUFBQyxRQUFRLEVBQUMsR0FBRyxFQUFDLE9BQU8sRUFBRSxZQUFZLEdBQUcsRUFDNUUsS0FBQyxPQUFPLElBQUMsS0FBSyxFQUFDLGdCQUFnQixFQUFDLElBQUksUUFBQyxRQUFRLEVBQUMsR0FBRyxHQUFFLEVBQ25ELEtBQUMsT0FBTyxJQUFDLEtBQUssRUFBQyxjQUFjLEVBQUMsS0FBSyxRQUFDLE9BQU8sRUFBRSxVQUFVLEdBQUcsSUFDakQsRUFDVixLQUFLO3dCQUNKLEtBQUMsR0FBRyxJQUFDLFNBQVMsRUFBRSxDQUFDLFlBQ2YsS0FBQyxJQUFJLElBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxJQUFJLG1DQUFlLEdBQ2xDLElBRUosSUFDRixDQUNQLENBQUM7QUFDSixDQUFDIn0=