@nanocollective/nanocoder 1.13.1 → 1.13.3

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
@@ -164,6 +164,15 @@ Nanocoder supports any OpenAI-compatible API through a unified provider configur
164
164
  - `apiKey`: API key (optional, may not be required)
165
165
  - `models`: Available model list for `/model` command
166
166
 
167
+ **Environment Variables:**
168
+
169
+ Keep API keys out of version control using environment variables. Variables are loaded from shell environment (`.bashrc`, `.zshrc`) or `.env` file in your working directory.
170
+
171
+ **Syntax:** `$VAR_NAME`, `${VAR_NAME}`, or `${VAR_NAME:-default}`
172
+ **Supported in:** `baseUrl`, `apiKey`, `models`, MCP server `command`, `args`, `env`
173
+
174
+ See `.env.example` for setup instructions
175
+
167
176
  **Timeout Configuration:**
168
177
 
169
178
  Nanocoder allows you to configure timeouts for your AI providers to handle long-running requests.
@@ -236,6 +245,13 @@ Nanocoder supports connecting to MCP servers to extend its capabilities with add
236
245
  }
237
246
  ```
238
247
 
248
+ **MCP Server Configuration:**
249
+
250
+ - `name`: Display name for the MCP server
251
+ - `command`: Executable command to start the server
252
+ - `args`: Array of command-line arguments
253
+ - `env`: Environment variables for the server process
254
+
239
255
  When MCP servers are configured, Nanocoder will:
240
256
 
241
257
  - Automatically connect to all configured servers on startup
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-message.d.ts","sourceRoot":"","sources":["../../source/components/assistant-message.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;;AAkE7D,wBA0BG"}
1
+ {"version":3,"file":"assistant-message.d.ts","sourceRoot":"","sources":["../../source/components/assistant-message.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;;AA6E7D,wBA0BG"}
@@ -3,12 +3,24 @@ import { Text, Box } from 'ink';
3
3
  import { memo, useMemo } from 'react';
4
4
  import { useTheme } from '../hooks/useTheme.js';
5
5
  import chalk from 'chalk';
6
+ import { highlight } from 'cli-highlight';
6
7
  // Basic markdown parser for terminal
7
8
  function parseMarkdown(text, themeColors) {
8
9
  let result = text;
9
10
  // Code blocks (```language\ncode\n```)
10
- result = result.replace(/```(\w+)?\n([\s\S]*?)```/g, (_match, _lang, code) => {
11
- return chalk.hex(themeColors.tool)(code.trim());
11
+ result = result.replace(/```(\w+)?\n([\s\S]*?)```/g, (_match, lang, code) => {
12
+ try {
13
+ // Apply syntax highlighting with detected language
14
+ const highlighted = highlight(code.trim(), {
15
+ language: lang || 'plaintext',
16
+ theme: 'default',
17
+ });
18
+ return highlighted;
19
+ }
20
+ catch {
21
+ // Fallback to plain colored text if highlighting fails
22
+ return chalk.hex(themeColors.tool)(code.trim());
23
+ }
12
24
  });
13
25
  // Inline code (`code`)
14
26
  result = result.replace(/`([^`]+)`/g, (_match, code) => {
@@ -29,7 +41,7 @@ function parseMarkdown(text, themeColors) {
29
41
  return chalk.hex(themeColors.white).italic(text);
30
42
  });
31
43
  // Headings (# Heading)
32
- result = result.replace(/^(#{1,6})\s+(.+)$/gm, (_match, hashes, text) => {
44
+ result = result.replace(/^(#{1,6})\s+(.+)$/gm, (_match, _hashes, text) => {
33
45
  return chalk.hex(themeColors.primary).bold(text);
34
46
  });
35
47
  // Links [text](url)
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-message.js","sourceRoot":"","sources":["../../source/components/assistant-message.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assistant-message.js","sourceRoot":"","sources":["../../source/components/assistant-message.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function isEnvVarReference(str: string): boolean;
2
+ export declare function expandEnvVar(str: string): string;
3
+ export declare function substituteEnvVars(value: any): any;
4
+ //# sourceMappingURL=env-substitution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-substitution.d.ts","sourceRoot":"","sources":["../../source/config/env-substitution.ts"],"names":[],"mappings":"AAIA,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMtD;AAGD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA8BhD;AAGD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,CAuBjD"}
@@ -0,0 +1,51 @@
1
+ import { shouldLog } from './logging.js';
2
+ import { logError } from '../utils/message-queue.js';
3
+ // Check if a string contains environment variable references
4
+ export function isEnvVarReference(str) {
5
+ if (typeof str !== 'string') {
6
+ return false;
7
+ }
8
+ return /\$\{[A-Z_][A-Z0-9_]*(?::-[^}]*)?\}|\$[A-Z_][A-Z0-9_]*/g.test(str);
9
+ }
10
+ // Expand environment variable references in a string
11
+ export function expandEnvVar(str) {
12
+ if (typeof str !== 'string') {
13
+ return str;
14
+ }
15
+ const regex = /\$\{([A-Z_][A-Z0-9_]*)(?::-(.*?))?\}|\$([A-Z_][A-Z0-9_]*)/g;
16
+ return str.replace(regex, (match, bracedVarName, defaultValue, unbracedVarName) => {
17
+ const varName = bracedVarName || unbracedVarName;
18
+ const envValue = process.env[varName];
19
+ if (envValue !== undefined) {
20
+ return envValue;
21
+ }
22
+ if (defaultValue !== undefined) {
23
+ return defaultValue;
24
+ }
25
+ if (shouldLog('warn')) {
26
+ logError(`Environment variable ${varName} not found in config, using empty string`);
27
+ }
28
+ return '';
29
+ });
30
+ }
31
+ // Recursively substitute environment variables in objects, arrays, and strings
32
+ export function substituteEnvVars(value) {
33
+ if (value === null || value === undefined) {
34
+ return value;
35
+ }
36
+ if (typeof value === 'string') {
37
+ return expandEnvVar(value);
38
+ }
39
+ if (Array.isArray(value)) {
40
+ return value.map(item => substituteEnvVars(item));
41
+ }
42
+ if (typeof value === 'object') {
43
+ const result = {};
44
+ for (const [key, val] of Object.entries(value)) {
45
+ result[key] = substituteEnvVars(val);
46
+ }
47
+ return result;
48
+ }
49
+ return value;
50
+ }
51
+ //# sourceMappingURL=env-substitution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-substitution.js","sourceRoot":"","sources":["../../source/config/env-substitution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AAEnD,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,wDAAwD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,YAAY,CAAC,GAAW;IACvC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,4DAA4D,CAAC;IAE3E,OAAO,GAAG,CAAC,OAAO,CACjB,KAAK,EACL,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE;QACvD,MAAM,OAAO,GAAG,aAAa,IAAI,eAAe,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC;QACjB,CAAC;QAED,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,QAAQ,CACP,wBAAwB,OAAO,0CAA0C,CACzE,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC;IACX,CAAC,CACD,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,KAAU;IAC3C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAE,MAAM,EAAC,MAAM,mBAAmB,CAAC;AA8BzD,eAAO,MAAM,SAAS,WAAkB,CAAC;AAGzC,eAAO,MAAM,YAAY;;;CAGxB,CAAC;AAEF,wBAAgB,SAAS,IAAI,MAAM,CAIlC;AAGD,eAAO,MAAM,MAAM,EAAE,MAAoB,CAAC;AAM1C,eAAO,MAAM,UAAU,QAGtB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAE,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAuCzD,eAAO,MAAM,SAAS,WAAkB,CAAC;AAGzC,eAAO,MAAM,YAAY;;;CAGxB,CAAC;AAEF,wBAAgB,SAAS,IAAI,MAAM,CAIlC;AAGD,eAAO,MAAM,MAAM,EAAE,MAAoB,CAAC;AAM1C,eAAO,MAAM,UAAU,QAGtB,CAAC"}
@@ -1,19 +1,26 @@
1
1
  import { existsSync, readFileSync } from 'fs';
2
2
  import { join, dirname } from 'path';
3
3
  import { fileURLToPath } from 'url';
4
+ import { config as loadEnv } from 'dotenv';
4
5
  import { logError } from '../utils/message-queue.js';
5
6
  import { loadPreferences } from './preferences.js';
6
7
  import { getThemeColors, defaultTheme } from './themes.js';
8
+ import { substituteEnvVars } from './env-substitution.js';
9
+ // Load .env file from working directory (shell environment takes precedence)
10
+ loadEnv({ path: join(process.cwd(), '.env') });
7
11
  // Function to load app configuration from agents.config.json if it exists
8
12
  function loadAppConfig() {
9
13
  const agentsJsonPath = join(process.cwd(), 'agents.config.json');
10
14
  if (existsSync(agentsJsonPath)) {
11
15
  try {
12
- const agentsData = JSON.parse(readFileSync(agentsJsonPath, 'utf-8'));
13
- if (agentsData.nanocoder) {
16
+ const rawData = readFileSync(agentsJsonPath, 'utf-8');
17
+ const agentsData = JSON.parse(rawData);
18
+ // Apply environment variable substitution
19
+ const processedData = substituteEnvVars(agentsData);
20
+ if (processedData.nanocoder) {
14
21
  return {
15
- providers: agentsData.nanocoder.providers,
16
- mcpServers: agentsData.nanocoder.mcpServers,
22
+ providers: processedData.nanocoder.providers,
23
+ mcpServers: processedData.nanocoder.mcpServers,
17
24
  };
18
25
  }
19
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAE,YAAY,EAAC,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAC,IAAI,EAAE,OAAO,EAAC,MAAM,MAAM,CAAC;AACnC,OAAO,EAAC,aAAa,EAAC,MAAM,KAAK,CAAC;AAClC,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAC,cAAc,EAAE,YAAY,EAAC,MAAM,aAAa,CAAC;AAEzD,0EAA0E;AAC1E,SAAS,aAAa;IACrB,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAEjE,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACJ,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;YAErE,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBAC1B,OAAO;oBACN,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,SAAS;oBACzC,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,UAAU;iBAC3C,CAAC;YACH,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,QAAQ,CAAC,uCAAuC,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;IACF,CAAC;IAED,OAAO,EAAE,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;AAEzC,iFAAiF;AACjF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,IAAI;CACjB,CAAC;AAEF,MAAM,UAAU,SAAS;IACxB,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,aAAa,GAAG,WAAW,CAAC,aAAa,IAAI,YAAY,CAAC;IAChE,OAAO,cAAc,CAAC,aAAa,CAAC,CAAC;AACtC,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,MAAM,GAAW,SAAS,EAAE,CAAC;AAE1C,kEAAkE;AAClE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,oFAAoF;AACpF,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAC7B,SAAS,EACT,yCAAyC,CACzC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAE,YAAY,EAAC,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAC,IAAI,EAAE,OAAO,EAAC,MAAM,MAAM,CAAC;AACnC,OAAO,EAAC,aAAa,EAAC,MAAM,KAAK,CAAC;AAClC,OAAO,EAAC,MAAM,IAAI,OAAO,EAAC,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAC,cAAc,EAAE,YAAY,EAAC,MAAM,aAAa,CAAC;AACzD,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAExD,6EAA6E;AAC7E,OAAO,CAAC,EAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAC,CAAC,CAAC;AAE7C,0EAA0E;AAC1E,SAAS,aAAa;IACrB,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAEjE,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEvC,0CAA0C;YAC1C,MAAM,aAAa,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEpD,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;gBAC7B,OAAO;oBACN,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,SAAS;oBAC5C,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,UAAU;iBAC9C,CAAC;YACH,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,QAAQ,CAAC,uCAAuC,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;IACF,CAAC;IAED,OAAO,EAAE,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;AAEzC,iFAAiF;AACjF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,IAAI;CACjB,CAAC;AAEF,MAAM,UAAU,SAAS;IACxB,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,aAAa,GAAG,WAAW,CAAC,aAAa,IAAI,YAAY,CAAC;IAChE,OAAO,cAAc,CAAC,aAAa,CAAC,CAAC;AACtC,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,MAAM,GAAW,SAAS,EAAE,CAAC;AAE1C,kEAAkE;AAClE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,oFAAoF;AACpF,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAC7B,SAAS,EACT,yCAAyC,CACzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/tools/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,WAAW,EAAE,IAAI,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAEzE,eAAO,MAAM,eAAe,EAAE,cAAc,EAU3C,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAEpD,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,IAAI,EAA2C,CAAC;AAGpE,eAAO,MAAM,cAAc,EAAE,MAAM,CAClC,MAAM,EACN,CACC,IAAI,EAAE,GAAG,KAEP,MAAM,GACN,OAAO,CAAC,MAAM,CAAC,GACf,KAAK,CAAC,YAAY,GAClB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAK9B,CAAC;AAGF,eAAO,MAAM,cAAc,EAAE,MAAM,CAClC,MAAM,EACN,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAC,GAAG;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAC,CAKrE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/tools/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,WAAW,EAAE,IAAI,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAEzE,eAAO,MAAM,eAAe,EAAE,cAAc,EAW3C,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAEpD,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,IAAI,EAA2C,CAAC;AAGpE,eAAO,MAAM,cAAc,EAAE,MAAM,CAClC,MAAM,EACN,CACC,IAAI,EAAE,GAAG,KAEP,MAAM,GACN,OAAO,CAAC,MAAM,CAAC,GACf,KAAK,CAAC,YAAY,GAClB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAK9B,CAAC;AAGF,eAAO,MAAM,cAAc,EAAE,MAAM,CAClC,MAAM,EACN,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAC,GAAG;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAC,CAKrE,CAAC"}
@@ -7,6 +7,7 @@ import { readManyFilesTool } from './read-many-files.js';
7
7
  import { executeBashTool } from './execute-bash.js';
8
8
  import { webSearchTool } from './web-search.js';
9
9
  import { fetchUrlTool } from './fetch-url.js';
10
+ import { searchFilesTool } from './search-files.js';
10
11
  export const toolDefinitions = [
11
12
  readFileTool,
12
13
  createFileTool,
@@ -17,6 +18,7 @@ export const toolDefinitions = [
17
18
  executeBashTool,
18
19
  webSearchTool,
19
20
  fetchUrlTool,
21
+ searchFilesTool,
20
22
  ];
21
23
  export const toolRegistry = Object.fromEntries(toolDefinitions.map(def => [def.config.function.name, def.handler]));
22
24
  export const tools = toolDefinitions.map(def => def.config);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAI5C,MAAM,CAAC,MAAM,eAAe,GAAqB;IAChD,YAAY;IACZ,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,iBAAiB;IACjB,eAAe;IACf,aAAa;IACb,YAAY;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAgC,MAAM,CAAC,WAAW,CAC1E,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CACnE,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAW,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAEpE,uCAAuC;AACvC,MAAM,CAAC,MAAM,cAAc,GASvB,MAAM,CAAC,WAAW,CACrB,eAAe;KACb,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;KAC5B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,SAAU,CAAC,CAAC,CACxD,CAAC;AAEF,4BAA4B;AAC5B,MAAM,CAAC,MAAM,cAAc,GAGvB,MAAM,CAAC,WAAW,CACrB,eAAe;KACb,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;KAC5B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,SAAU,CAAC,CAAC,CACxD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAIlD,MAAM,CAAC,MAAM,eAAe,GAAqB;IAChD,YAAY;IACZ,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,iBAAiB;IACjB,eAAe;IACf,aAAa;IACb,YAAY;IACZ,eAAe;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAgC,MAAM,CAAC,WAAW,CAC1E,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CACnE,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAW,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAEpE,uCAAuC;AACvC,MAAM,CAAC,MAAM,cAAc,GASvB,MAAM,CAAC,WAAW,CACrB,eAAe;KACb,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;KAC5B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,SAAU,CAAC,CAAC,CACxD,CAAC;AAEF,4BAA4B;AAC5B,MAAM,CAAC,MAAM,cAAc,GAGvB,MAAM,CAAC,WAAW,CACrB,eAAe;KACb,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;KAC5B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,SAAU,CAAC,CAAC,CACxD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from '../types/index.js';
2
+ export declare const searchFilesTool: ToolDefinition;
3
+ //# sourceMappingURL=search-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-files.d.ts","sourceRoot":"","sources":["../../source/tools/search-files.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAc,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAqOnE,eAAO,MAAM,eAAe,EAAE,cAqC7B,CAAC"}
@@ -0,0 +1,185 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { exec } from 'node:child_process';
3
+ import { promisify } from 'node:util';
4
+ import React from 'react';
5
+ const execAsync = promisify(exec);
6
+ import { Text, Box } from 'ink';
7
+ import { ThemeContext } from '../hooks/useTheme.js';
8
+ import ToolMessage from '../components/tool-message.js';
9
+ /**
10
+ * Search file contents using grep
11
+ */
12
+ async function searchFiles(query, cwd, maxResults, contextLines) {
13
+ try {
14
+ // Use grep for content search
15
+ const { stdout } = await execAsync(`grep -rn -i --include="*" --exclude-dir={node_modules,dist,.git,build,coverage} "${query.replace(/"/g, '\\"')}" . | head -n ${maxResults}`, { cwd, maxBuffer: 1024 * 1024 });
16
+ const matches = [];
17
+ const lines = stdout.trim().split('\n').filter(Boolean);
18
+ for (const line of lines) {
19
+ const match = line.match(/^\.\/(.+?):(\d+):(.*)$/);
20
+ if (match) {
21
+ matches.push({
22
+ file: match[1],
23
+ line: parseInt(match[2], 10),
24
+ content: match[3].trim(),
25
+ });
26
+ }
27
+ }
28
+ return {
29
+ matches,
30
+ truncated: lines.length >= maxResults,
31
+ totalMatches: matches.length,
32
+ };
33
+ }
34
+ catch (error) {
35
+ // grep returns exit code 1 when no matches found
36
+ if (error.code === 1) {
37
+ return { matches: [], truncated: false, totalMatches: 0 };
38
+ }
39
+ throw error;
40
+ }
41
+ }
42
+ /**
43
+ * List files matching a glob pattern using find
44
+ */
45
+ async function listFiles(pattern, cwd, maxResults) {
46
+ try {
47
+ // Convert glob pattern to find-compatible pattern
48
+ // **/*.ts -> -name "*.ts"
49
+ // **/*.{ts,tsx} -> \( -name "*.ts" -o -name "*.tsx" \)
50
+ let findPattern = '';
51
+ if (pattern.includes('{') && pattern.includes('}')) {
52
+ // Handle brace expansion
53
+ const braceMatch = pattern.match(/\{([^}]+)\}/);
54
+ if (braceMatch) {
55
+ const extensions = braceMatch[1].split(',');
56
+ const patterns = extensions.map(ext => `-name "*.${ext}"`).join(' -o ');
57
+ findPattern = `\\( ${patterns} \\)`;
58
+ }
59
+ }
60
+ else {
61
+ // Simple pattern like **/*.ts
62
+ const ext = pattern.split('*').pop();
63
+ findPattern = `-name "*${ext}"`;
64
+ }
65
+ const { stdout } = await execAsync(`find . -type f ${findPattern} -not -path "*/node_modules/*" -not -path "*/dist/*" -not -path "*/.git/*" | head -n ${maxResults}`, { cwd, maxBuffer: 1024 * 1024 });
66
+ const matches = stdout
67
+ .trim()
68
+ .split('\n')
69
+ .filter(Boolean)
70
+ .map(line => ({ file: line.replace(/^\.\//, '') }));
71
+ return {
72
+ matches,
73
+ truncated: matches.length >= maxResults,
74
+ totalMatches: matches.length,
75
+ };
76
+ }
77
+ catch (error) {
78
+ if (error.code === 1) {
79
+ return { matches: [], truncated: false, totalMatches: 0 };
80
+ }
81
+ throw error;
82
+ }
83
+ }
84
+ const handler = async (args) => {
85
+ const cwd = process.cwd();
86
+ const maxResults = args.maxResults || 50;
87
+ const contextLines = args.contextLines || 2;
88
+ try {
89
+ let result;
90
+ if (args.query) {
91
+ // Content search
92
+ result = await searchFiles(args.query, cwd, maxResults, contextLines);
93
+ if (result.matches.length === 0) {
94
+ return `No matches found for "${args.query}"`;
95
+ }
96
+ // Format results
97
+ let output = `Found ${result.totalMatches} matches${result.truncated ? ` (showing first ${maxResults})` : ''}:\n\n`;
98
+ for (const match of result.matches) {
99
+ output += `${match.file}:${match.line}\n`;
100
+ if (match.content) {
101
+ output += ` ${match.content}\n`;
102
+ }
103
+ if (match.context && match.context.length > 1) {
104
+ output += ` Context:\n`;
105
+ for (const line of match.context.slice(0, 3)) {
106
+ output += ` ${line.trim()}\n`;
107
+ }
108
+ }
109
+ output += '\n';
110
+ }
111
+ return output.trim();
112
+ }
113
+ else if (args.pattern) {
114
+ // File pattern search
115
+ result = await listFiles(args.pattern, cwd, maxResults);
116
+ if (result.matches.length === 0) {
117
+ return `No files found matching pattern "${args.pattern}"`;
118
+ }
119
+ let output = `Found ${result.totalMatches} files${result.truncated ? ` (showing first ${maxResults})` : ''}:\n\n`;
120
+ output += result.matches.map(m => m.file).join('\n');
121
+ return output;
122
+ }
123
+ else {
124
+ throw new Error('Either "query" or "pattern" must be provided');
125
+ }
126
+ }
127
+ catch (error) {
128
+ throw new Error(`Search failed: ${error.message}`);
129
+ }
130
+ };
131
+ const SearchFilesFormatter = React.memo(({ args, result }) => {
132
+ const { colors } = React.useContext(ThemeContext);
133
+ // Parse result to get match count
134
+ let matchCount = 0;
135
+ if (result && !result.startsWith('Error:')) {
136
+ const firstLine = result.split('\n')[0];
137
+ const matchFound = firstLine.match(/Found (\d+)/);
138
+ if (matchFound) {
139
+ matchCount = parseInt(matchFound[1], 10);
140
+ }
141
+ }
142
+ const messageContent = (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: colors.tool, children: "\u2692 search_files" }), args.query && (_jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "Query: " }), _jsx(Text, { color: colors.white, children: args.query })] })), args.pattern && (_jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "Pattern: " }), _jsx(Text, { color: colors.white, children: args.pattern })] })), _jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "Results: " }), _jsx(Text, { color: colors.white, children: matchCount })] })] }));
143
+ return _jsx(ToolMessage, { message: messageContent, hideBox: true });
144
+ });
145
+ const formatter = async (args, result) => {
146
+ if (result && result.startsWith('Error:')) {
147
+ return _jsx(_Fragment, {});
148
+ }
149
+ return _jsx(SearchFilesFormatter, { args: args, result: result });
150
+ };
151
+ export const searchFilesTool = {
152
+ handler,
153
+ formatter,
154
+ requiresConfirmation: false,
155
+ config: {
156
+ type: 'function',
157
+ function: {
158
+ name: 'search_files',
159
+ description: 'Search for files by pattern (glob) or search file contents for a query string. Returns file paths and optionally content matches with context. Uses ripgrep if available for fast content search.',
160
+ parameters: {
161
+ type: 'object',
162
+ properties: {
163
+ query: {
164
+ type: 'string',
165
+ description: 'Search query to find in file contents (case-insensitive). Either query or pattern must be provided.',
166
+ },
167
+ pattern: {
168
+ type: 'string',
169
+ description: 'Glob pattern to match file names (e.g., "**/*.ts", "src/**/*.tsx"). Either query or pattern must be provided.',
170
+ },
171
+ maxResults: {
172
+ type: 'number',
173
+ description: 'Maximum number of results to return (default: 50)',
174
+ },
175
+ contextLines: {
176
+ type: 'number',
177
+ description: 'Number of context lines to include around matches (default: 2)',
178
+ },
179
+ },
180
+ required: [],
181
+ },
182
+ },
183
+ },
184
+ };
185
+ //# sourceMappingURL=search-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-files.js","sourceRoot":"","sources":["../../source/tools/search-files.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export const DEVELOPMENT_MODE_LABELS = {
2
- normal: '▶ normal model on',
2
+ normal: '▶ normal mode on',
3
3
  'auto-accept': '⏵⏵ auto-accept mode on',
4
4
  plan: '⏸ plan mode on',
5
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../../source/types/core.ts"],"names":[],"mappings":"AA0EA,MAAM,CAAC,MAAM,uBAAuB,GAAoC;IACvE,MAAM,EAAE,mBAAmB;IAC3B,aAAa,EAAE,wBAAwB;IACvC,IAAI,EAAE,gBAAgB;CACtB,CAAC"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../source/types/core.ts"],"names":[],"mappings":"AA0EA,MAAM,CAAC,MAAM,uBAAuB,GAAoC;IACvE,MAAM,EAAE,kBAAkB;IAC1B,aAAa,EAAE,wBAAwB;IACvC,IAAI,EAAE,gBAAgB;CACtB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nanocollective/nanocoder",
3
3
  "main": "dist/cli.js",
4
- "version": "1.13.1",
4
+ "version": "1.13.3",
5
5
  "description": "A local-first CLI coding agent that brings the power of agentic coding tools like Claude Code and Gemini CLI to local models or controlled APIs like OpenRouter",
6
6
  "keywords": [
7
7
  "cli",
@@ -50,6 +50,7 @@
50
50
  "@nanostores/react": "^1.0.0",
51
51
  "cheerio": "^1.1.2",
52
52
  "cli-highlight": "^2.1.11",
53
+ "dotenv": "^17.2.3",
53
54
  "ink": "^6.3.1",
54
55
  "ink-big-text": "^2.0.0",
55
56
  "ink-gradient": "^3.0.0",