refactor(agent): Move data path from ~/.tabby/agent to ~/.tabby-client/agent. Add config.toml template. (#420)

release-0.2
Zhiming Ma 2023-09-10 10:25:23 +08:00 committed by GitHub
parent f0ed366420
commit 12a37e2330
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 63 additions and 8 deletions

View File

@ -62,7 +62,7 @@ export interface AgentFunction {
/** /**
* The agent configuration has the following levels, will be deep merged in the order: * The agent configuration has the following levels, will be deep merged in the order:
* 1. Default config * 1. Default config
* 2. User config file `~/.tabby/agent/config.toml` (not available in browser) * 2. User config file `~/.tabby-client/agent/config.toml` (not available in browser)
* 3. Agent `initialize` and `updateConfig` methods * 3. Agent `initialize` and `updateConfig` methods
* *
* This method will update the 3rd level config. * This method will update the 3rd level config.

View File

@ -66,6 +66,49 @@ export const defaultAgentConfig: AgentConfig = {
}, },
}; };
const configTomlTemplate = `## Tabby agent configuration file
## You can uncomment any block to enable settings.
## Configurations in this file has lower priority than in IDE settings.
## Server
## You can set the server endpoint and request timeout here.
# [server]
# endpoint = "http://localhost:8080" # http or https URL
# requestTimeout = 30000 # ms
## You can add custom request headers, e.g. for authentication.
# [server.requestHeaders]
# Authorization = "Bearer eyJhbGciOiJ..........."
## Completion
## You can set the prompt context to send to the server for completion.
# [completion.prompt]
# maxPrefixLines = 20
# maxSuffixLines = 20
## You can set the debounce mode for auto completion requests when typing.
# [completion.debounce]
# mode = "adaptive" # or "fixed"
# interval = 250 # ms, only used when mode is "fixed"
## You can set the timeout for completion requests.
# [completion.timeout]
# auto = 5000 # ms, for auto completion when typing
# manually = 30000 # ms, for manually triggered completion
## Logs
## You can set the log level here. The log file is located at ~/.tabby-client/agent/logs/.
# [logs]
# level = "silent" # or "error" or "debug"
## Anonymous usage tracking
## You can disable anonymous usage tracking here.
# [anonymousUsageTracking]
# disable = false # set to true to disable
`;
export const userAgentConfig = isBrowser export const userAgentConfig = isBrowser
? null ? null
: (() => { : (() => {
@ -95,9 +138,21 @@ export const userAgentConfig = isBrowser
this.data = toml.parse(fileContent); this.data = toml.parse(fileContent);
super.emit("updated", this.data); super.emit("updated", this.data);
} catch (error) { } catch (error) {
if (error.code === "ENOENT") {
await this.createTemplate();
} else {
this.logger.error({ error }, "Failed to load config file"); this.logger.error({ error }, "Failed to load config file");
} }
} }
}
async createTemplate() {
try {
await fs.outputFile(this.filepath, configTomlTemplate);
} catch (error) {
this.logger.error({ error }, "Failed to create config template file");
}
}
watch() { watch() {
this.watcher = chokidar.watch(this.filepath, { this.watcher = chokidar.watch(this.filepath, {
@ -108,6 +163,6 @@ export const userAgentConfig = isBrowser
} }
} }
const configFile = require("path").join(require("os").homedir(), ".tabby", "agent", "config.toml"); const configFile = require("path").join(require("os").homedir(), ".tabby-client", "agent", "config.toml");
return new ConfigFile(configFile); return new ConfigFile(configFile);
})(); })();

View File

@ -38,7 +38,7 @@ export class TabbyAgent extends EventEmitter implements Agent {
private readonly logger = rootLogger.child({ component: "TabbyAgent" }); private readonly logger = rootLogger.child({ component: "TabbyAgent" });
private anonymousUsageLogger: AnonymousUsageLogger; private anonymousUsageLogger: AnonymousUsageLogger;
private config: AgentConfig = defaultAgentConfig; private config: AgentConfig = defaultAgentConfig;
private userConfig: PartialAgentConfig = {}; // config from `~/.tabby/agent/config.toml` private userConfig: PartialAgentConfig = {}; // config from `~/.tabby-client/agent/config.toml`
private clientConfig: PartialAgentConfig = {}; // config from `initialize` and `updateConfig` method private clientConfig: PartialAgentConfig = {}; // config from `initialize` and `updateConfig` method
private status: AgentStatus = "notInitialized"; private status: AgentStatus = "notInitialized";
private issues: AgentIssue["name"][] = []; private issues: AgentIssue["name"][] = [];

View File

@ -14,7 +14,7 @@ export interface DataStore {
export const dataStore: DataStore = isBrowser export const dataStore: DataStore = isBrowser
? null ? null
: (() => { : (() => {
const dataFile = require("path").join(require("os").homedir(), ".tabby", "agent", "data.json"); const dataFile = require("path").join(require("os").homedir(), ".tabby-client", "agent", "data.json");
const fs = require("fs-extra"); const fs = require("fs-extra");
return { return {
data: {}, data: {},

View File

@ -8,10 +8,10 @@ const stream =
isBrowser || isTest isBrowser || isTest
? null ? null
: /** : /**
* Default rotating file locate at `~/.tabby/agent/logs/`. * Default rotating file locate at `~/.tabby-client/agent/logs/`.
*/ */
require("rotating-file-stream").createStream("tabby-agent.log", { require("rotating-file-stream").createStream("tabby-agent.log", {
path: require("path").join(require("os").homedir(), ".tabby", "agent", "logs"), path: require("path").join(require("os").homedir(), ".tabby-client", "agent", "logs"),
size: "10M", size: "10M",
interval: "1d", interval: "1d",
}); });

View File

@ -75,7 +75,7 @@ const openTabbyAgentSettings: Command = {
window.showWarningMessage("Tabby Agent config file is not supported on web.", { modal: true }); window.showWarningMessage("Tabby Agent config file is not supported on web.", { modal: true });
return; return;
} }
const agentUserConfig = Uri.joinPath(Uri.file(require("os").homedir()), ".tabby", "agent", "config.toml"); const agentUserConfig = Uri.joinPath(Uri.file(require("os").homedir()), ".tabby-client", "agent", "config.toml");
workspace.fs.stat(agentUserConfig).then( workspace.fs.stat(agentUserConfig).then(
() => { () => {
workspace.openTextDocument(agentUserConfig).then((document) => { workspace.openTextDocument(agentUserConfig).then((document) => {