From b6df31fcbfa21eab2c6db27887f0eec016b817ca Mon Sep 17 00:00:00 2001 From: Joe Fleming Date: Fri, 13 Mar 2026 20:42:00 -0600 Subject: [PATCH] fix: require a model, default to empty value during onboarding and add a WORKSPACE_PATH constant to make tracking that path easier --- src/cli/onboard.ts | 10 ++++++++-- src/config/constants.ts | 1 + src/config/loader.ts | 1 + src/config/types.ts | 12 +++--------- 4 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 src/config/constants.ts diff --git a/src/cli/onboard.ts b/src/cli/onboard.ts index f90bd68..ef15c9a 100644 --- a/src/cli/onboard.ts +++ b/src/cli/onboard.ts @@ -3,6 +3,7 @@ import { join } from 'node:path'; import { Command } from 'commander'; import pc from 'picocolors'; import { ConfigSchema, type Config } from '../config/types.ts'; +import { WORKSPACE_PATH } from '../config/constants.ts' import { ensureWorkspace, resolvePath, checkWorkspaceEmpty, syncTemplates } from './utils.ts'; function logCreated(item: string) { @@ -15,9 +16,14 @@ export function onboardCommand(program: Command): void { .description('Initialize a new nanobot workspace with config and templates') .action(async (rawPath?: string) => { try { - const defaultConfig: Config = ConfigSchema.parse({}); + const defaultConfig: Config = ConfigSchema.parse({ + agent: { + provider: '', + model: '', + } + }); - const targetPath = resolvePath(rawPath ?? defaultConfig.agent.workspacePath); + const targetPath = resolvePath(rawPath ?? WORKSPACE_PATH); const configPath = join(targetPath, 'config.json'); console.info(pc.blue('Initializing nanobot workspace...')); diff --git a/src/config/constants.ts b/src/config/constants.ts new file mode 100644 index 0000000..62c6bf9 --- /dev/null +++ b/src/config/constants.ts @@ -0,0 +1 @@ +export const WORKSPACE_PATH = '~/.config/nanobot' diff --git a/src/config/loader.ts b/src/config/loader.ts index d491290..7bc8a05 100644 --- a/src/config/loader.ts +++ b/src/config/loader.ts @@ -3,6 +3,7 @@ import { homedir } from 'node:os'; import { dirname, resolve } from 'node:path'; import pc from 'picocolors' import { type Config, ConfigSchema } from './types.ts'; +import { WORKSPACE_PATH } from './constants.ts' const DEFAULT_CONFIG_PATH = resolve(homedir(), '.config', 'nanobot', 'config.json'); diff --git a/src/config/types.ts b/src/config/types.ts index efa51d3..b440464 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { WORKSPACE_PATH } from './constants.ts' // --------------------------------------------------------------------------- // Mattermost @@ -41,7 +42,7 @@ export type ChannelsConfig = z.infer; export const AgentConfigSchema = z.object({ model: z.string().default('anthropic/claude-sonnet-4-5'), - workspacePath: z.string().default('~/.config/nanobot'), + workspacePath: z.string().default(WORKSPACE_PATH), maxTokens: z.number().int().default(4096), contextWindowTokens: z.number().int().default(65536), temperature: z.number().default(0.7), @@ -113,14 +114,7 @@ export type HeartbeatConfig = z.infer; export const ConfigSchema = z.object({ providers: ProvidersConfigSchema.default(() => ({})), - agent: AgentConfigSchema.default(() => ({ - model: 'anthropic/claude-sonnet-4-5', - workspacePath: '~/.config/nanobot', - maxTokens: 4096, - contextWindowTokens: 65536, - temperature: 0.7, - maxToolIterations: 40, - })), + agent: AgentConfigSchema, heartbeat: HeartbeatConfigSchema.default(() => ({ enabled: false, intervalMinutes: 30 })), channels: ChannelsConfigSchema.default(() => ({ sendProgress: true, sendToolHints: true })), tools: ToolsConfigSchema.default(() => ({