miii-cli 0.1.3 → 0.1.5

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
@@ -12,6 +12,8 @@
12
12
  [![license](https://img.shields.io/npm/l/miii-cli)](LICENSE)
13
13
  [![node](https://img.shields.io/node/v/miii-cli)](https://nodejs.org)
14
14
 
15
+ ![miii demo](mii-cli.gif)
16
+
15
17
  ---
16
18
 
17
19
  ## What is miii?
@@ -183,6 +185,23 @@ Works with LM Studio, vLLM, Groq, Together, and any other OpenAI-compatible serv
183
185
 
184
186
  ---
185
187
 
188
+ ## Security
189
+
190
+ miii **0.1.5** addresses the following OWASP issues:
191
+
192
+ | Issue | Fix |
193
+ |---|---|
194
+ | Path traversal (A01) | All file tool operations are now restricted to the current working directory via `guardPath()` |
195
+ | Path traversal (A01) | `@filename` references validated against `cwd` before reading |
196
+ | Path traversal (A01) | `/mv`, `/mkdir`, `/touch` commands restricted to `cwd` |
197
+ | Path traversal (A01) | Session names sanitized to alphanumeric + hyphens only |
198
+ | Injection (A03) | `run_command` tool enforces a 30-second execution timeout |
199
+ | Insecure deserialization (A08) | Config loading whitelists allowed keys; session data validated as array |
200
+ | XML injection | File paths in context XML attributes are properly escaped |
201
+ | Configurable API key | OpenAI-compatible provider token now configurable via `apiKey` in config (no longer hardcoded) |
202
+
203
+ ---
204
+
186
205
  ## Source
187
206
 
188
207
  ```bash
package/dist/config.js CHANGED
@@ -6,6 +6,7 @@ const defaults = {
6
6
  provider: 'ollama',
7
7
  baseUrl: 'http://localhost:11434',
8
8
  };
9
+ const ALLOWED_KEYS = new Set(['model', 'provider', 'baseUrl', 'systemPrompt', 'apiKey']);
9
10
  export function loadConfig() {
10
11
  const candidates = [
11
12
  join(process.cwd(), '.miii.json'),
@@ -14,7 +15,13 @@ export function loadConfig() {
14
15
  for (const p of candidates) {
15
16
  if (existsSync(p)) {
16
17
  try {
17
- return { ...defaults, ...JSON.parse(readFileSync(p, 'utf-8')) };
18
+ const raw = JSON.parse(readFileSync(p, 'utf-8'));
19
+ const safe = {};
20
+ for (const key of ALLOWED_KEYS) {
21
+ if (key in raw)
22
+ safe[key] = raw[key];
23
+ }
24
+ return { ...defaults, ...safe };
18
25
  }
19
26
  catch { }
20
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,MAAM,QAAQ,GAAW;IACvB,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,wBAAwB;CAClC,CAAA;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC;QACjC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC;KAClD,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAA;YACjE,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAA;AACxB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,MAAM,QAAQ,GAAW;IACvB,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,wBAAwB;CAClC,CAAA;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAe,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAA;AAEtG,MAAM,UAAU,UAAU;IACxB,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC;QACjC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC;KAClD,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,GAAG,GAA4B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;gBACzE,MAAM,IAAI,GAAoB,EAAE,CAAA;gBAChC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;oBAC/B,IAAI,GAAG,IAAI,GAAG;wBAAG,IAAgC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;gBACnE,CAAC;gBACD,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAA;YACjC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAA;AACxB,CAAC"}
@@ -1,3 +1,4 @@
1
+ export declare function guardPath(p: string, base?: string): string;
1
2
  export declare function readFile(p: string): string;
2
3
  export declare function writeFile(p: string, content: string): void;
3
4
  export declare function deleteFile(p: string): void;
package/dist/files/ops.js CHANGED
@@ -1,5 +1,13 @@
1
1
  import { readFileSync, writeFileSync, unlinkSync, mkdirSync, readdirSync, statSync, existsSync, renameSync, } from 'fs';
2
- import { join, dirname, relative, extname } from 'path';
2
+ import { join, dirname, relative, extname, resolve, sep } from 'path';
3
+ export function guardPath(p, base = process.cwd()) {
4
+ const abs = resolve(base, p);
5
+ const root = resolve(base);
6
+ if (abs !== root && !abs.startsWith(root + sep)) {
7
+ throw new Error(`path outside working directory: ${p}`);
8
+ }
9
+ return abs;
10
+ }
3
11
  const SKIP_DIRS = new Set([
4
12
  'node_modules', 'dist', 'build', '.git', '.next', '.nuxt', '.svelte-kit',
5
13
  'out', '__pycache__', '.cache', 'coverage', '.nyc_output', 'vendor',
@@ -1 +1 @@
1
- {"version":3,"file":"ops.js","sourceRoot":"","sources":["../../src/files/ops.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ops.js","sourceRoot":"","sources":["../../src/files/ops.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ export interface StreamConfig {
3
3
  provider: 'ollama' | 'openai-compat';
4
4
  model: string;
5
5
  baseUrl: string;
6
+ apiKey?: string;
6
7
  messages: ChatMessage[];
7
8
  signal?: AbortSignal;
8
9
  onToken: (token: string) => void;
@@ -64,12 +64,12 @@ async function streamOllama(cfg) {
64
64
  }
65
65
  }
66
66
  async function streamOpenAI(cfg) {
67
- const { model, messages, baseUrl, signal, onToken, onDone, onError } = cfg;
67
+ const { model, messages, baseUrl, apiKey, signal, onToken, onDone, onError } = cfg;
68
68
  let res;
69
69
  try {
70
70
  res = await fetch(`${baseUrl}/v1/chat/completions`, {
71
71
  method: 'POST',
72
- headers: { 'Content-Type': 'application/json', Authorization: 'Bearer local' },
72
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${apiKey ?? 'local'}` },
73
73
  body: JSON.stringify({ model, messages, stream: true }),
74
74
  signal,
75
75
  });
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/llm/stream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/llm/stream.ts"],"names":[],"mappings":"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"}
package/dist/sessions.js CHANGED
@@ -5,6 +5,11 @@ const SESSIONS_DIR = join(homedir(), '.config', 'miii', 'sessions');
5
5
  function ensureDir() {
6
6
  mkdirSync(SESSIONS_DIR, { recursive: true });
7
7
  }
8
+ function sanitizeName(name) {
9
+ if (!/^[\w-]+$/.test(name))
10
+ throw new Error(`invalid session name: ${name}`);
11
+ return name;
12
+ }
8
13
  export function listSessions() {
9
14
  ensureDir();
10
15
  return readdirSync(SESSIONS_DIR)
@@ -26,11 +31,12 @@ export function listSessions() {
26
31
  }
27
32
  export function loadSession(name) {
28
33
  ensureDir();
29
- const p = join(SESSIONS_DIR, `${name}.json`);
34
+ const p = join(SESSIONS_DIR, `${sanitizeName(name)}.json`);
30
35
  if (!existsSync(p))
31
36
  return [];
32
37
  try {
33
- return JSON.parse(readFileSync(p, 'utf-8'));
38
+ const parsed = JSON.parse(readFileSync(p, 'utf-8'));
39
+ return Array.isArray(parsed) ? parsed : [];
34
40
  }
35
41
  catch {
36
42
  return [];
@@ -38,10 +44,10 @@ export function loadSession(name) {
38
44
  }
39
45
  export function saveSession(name, messages) {
40
46
  ensureDir();
41
- writeFileSync(join(SESSIONS_DIR, `${name}.json`), JSON.stringify(messages));
47
+ writeFileSync(join(SESSIONS_DIR, `${sanitizeName(name)}.json`), JSON.stringify(messages));
42
48
  }
43
49
  export function deleteSession(name) {
44
- const p = join(SESSIONS_DIR, `${name}.json`);
50
+ const p = join(SESSIONS_DIR, `${sanitizeName(name)}.json`);
45
51
  if (existsSync(p))
46
52
  unlinkSync(p);
47
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC1G,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAG5B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;AAEnE,SAAS,SAAS;IAChB,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,SAAS,EAAE,CAAA;IACX,OAAO,WAAW,CAAC,YAAY,CAAC;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;QAC/B,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,IAAI,CAAC;YACH,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;YACjD,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACtD,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAA;IAC1C,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,SAAS,EAAE,CAAA;IACX,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,OAAO,CAAC,CAAA;IAC5C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IAC7B,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAA;IAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAAuB;IAC/D,SAAS,EAAE,CAAA;IACX,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;AAC7E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,OAAO,CAAC,CAAA;IAC5C,IAAI,UAAU,CAAC,CAAC,CAAC;QAAE,UAAU,CAAC,CAAC,CAAC,CAAA;AAClC,CAAC"}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { readFileSync, existsSync, readdirSync } from 'fs';
2
2
  import { join, basename } from 'path';
3
3
  import { homedir } from 'os';
4
- import { createDir, moveFile, writeFile } from '../files/ops.js';
4
+ import { createDir, moveFile, writeFile, guardPath } from '../files/ops.js';
5
5
  const builtin = [
6
6
  {
7
7
  name: 'caveman',
@@ -57,7 +57,7 @@ const builtin = [
57
57
  const p = args.trim();
58
58
  if (!p)
59
59
  return 'Usage: /mkdir <path>';
60
- createDir(p);
60
+ createDir(guardPath(p));
61
61
  return `created: ${p}`;
62
62
  },
63
63
  },
@@ -70,7 +70,7 @@ const builtin = [
70
70
  if (parts.length < 2)
71
71
  return 'Usage: /mv <from> <to>';
72
72
  const [from, to] = parts;
73
- moveFile(from, to);
73
+ moveFile(guardPath(from), guardPath(to));
74
74
  return `moved: ${from} → ${to}`;
75
75
  },
76
76
  },
@@ -82,7 +82,7 @@ const builtin = [
82
82
  const p = args.trim();
83
83
  if (!p)
84
84
  return 'Usage: /touch <path>';
85
- writeFile(p, '');
85
+ writeFile(guardPath(p), '');
86
86
  return `created: ${p}`;
87
87
  },
88
88
  },
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import { readFile, writeFile, deleteFile, listFiles, createDir, moveFile } from '../files/ops.js';
1
+ import { readFile, writeFile, deleteFile, listFiles, createDir, moveFile, guardPath } from '../files/ops.js';
2
2
  import { exec } from 'child_process';
3
3
  import { promisify } from 'util';
4
4
  const run = promisify(exec);
5
+ const EXEC_TIMEOUT_MS = 30_000;
5
6
  export const tools = [
6
7
  {
7
8
  name: 'read_file',
@@ -9,7 +10,7 @@ export const tools = [
9
10
  params: '{"path": "string"}',
10
11
  execute: async ({ path }) => {
11
12
  try {
12
- return readFile(path);
13
+ return readFile(guardPath(path));
13
14
  }
14
15
  catch (e) {
15
16
  throw new Error(`read_file: ${e}`);
@@ -21,7 +22,7 @@ export const tools = [
21
22
  description: 'List directory contents',
22
23
  params: '{"path": "string", "recursive": "boolean (optional)"}',
23
24
  execute: async ({ path, recursive = false }) => {
24
- const entries = listFiles(path, recursive);
25
+ const entries = listFiles(guardPath(path), recursive);
25
26
  if (!entries.length)
26
27
  return '(empty)';
27
28
  return entries.map(e => `${e.type === 'dir' ? 'd' : 'f'} ${e.rel}`).join('\n');
@@ -32,7 +33,7 @@ export const tools = [
32
33
  description: 'Write/overwrite file content',
33
34
  params: '{"path": "string", "content": "string"}',
34
35
  execute: async ({ path, content }) => {
35
- writeFile(path, content);
36
+ writeFile(guardPath(path), content);
36
37
  return `written: ${path}`;
37
38
  },
38
39
  },
@@ -41,7 +42,7 @@ export const tools = [
41
42
  description: 'Delete a file',
42
43
  params: '{"path": "string"}',
43
44
  execute: async ({ path }) => {
44
- deleteFile(path);
45
+ deleteFile(guardPath(path));
45
46
  return `deleted: ${path}`;
46
47
  },
47
48
  },
@@ -50,7 +51,7 @@ export const tools = [
50
51
  description: 'Run a shell command in cwd',
51
52
  params: '{"command": "string"}',
52
53
  execute: async ({ command }) => {
53
- const { stdout, stderr } = await run(command, { cwd: process.cwd() });
54
+ const { stdout, stderr } = await run(command, { cwd: process.cwd(), timeout: EXEC_TIMEOUT_MS });
54
55
  return [stdout, stderr ? `stderr: ${stderr}` : ''].filter(Boolean).join('\n').trim();
55
56
  },
56
57
  },
@@ -59,7 +60,7 @@ export const tools = [
59
60
  description: 'Create a directory (and any missing parents)',
60
61
  params: '{"path": "string"}',
61
62
  execute: async ({ path }) => {
62
- createDir(path);
63
+ createDir(guardPath(path));
63
64
  return `created: ${path}`;
64
65
  },
65
66
  },
@@ -68,7 +69,7 @@ export const tools = [
68
69
  description: 'Move or rename a file or directory',
69
70
  params: '{"from": "string", "to": "string"}',
70
71
  execute: async ({ from, to }) => {
71
- moveFile(from, to);
72
+ moveFile(guardPath(from), guardPath(to));
72
73
  return `moved: ${from} → ${to}`;
73
74
  },
74
75
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
package/dist/tui/App.js CHANGED
@@ -9,18 +9,19 @@ import { stream } from '../llm/stream.js';
9
9
  import { listModels, pullModel } from '../llm/ollama.js';
10
10
  import { StreamParser } from '../parser/stream-parser.js';
11
11
  import { tools, getSystemPrompt } from '../tools/index.js';
12
- import { readFile } from '../files/ops.js';
12
+ import { readFile, guardPath } from '../files/ops.js';
13
13
  import { generateId } from '../types.js';
14
14
  const MAX_TOOL_DEPTH = 6;
15
15
  const RENDER_THROTTLE_MS = 40;
16
- function expandAtRefs(text) {
16
+ function expandAtRefs(text, cwd) {
17
17
  const refs = [...text.matchAll(/@([\w./\-]+)/g)];
18
18
  if (!refs.length)
19
19
  return { displayText: text, contextPrefix: '' };
20
20
  const parts = [];
21
21
  for (const m of refs) {
22
22
  try {
23
- const content = readFile(m[1]);
23
+ const safePath = guardPath(m[1], cwd);
24
+ const content = readFile(safePath);
24
25
  parts.push(`<file path="${m[1]}">\n${content}\n</file>`);
25
26
  }
26
27
  catch { }
@@ -109,6 +110,7 @@ export function App({ config, skills, cwd }) {
109
110
  provider: config.provider,
110
111
  model: currentModelRef.current,
111
112
  baseUrl: config.baseUrl,
113
+ apiKey: config.apiKey,
112
114
  messages: contextMsgs,
113
115
  signal: abortRef.current.signal,
114
116
  onToken(token) {
@@ -243,7 +245,7 @@ export function App({ config, skills, cwd }) {
243
245
  return;
244
246
  }
245
247
  // Expand @file references
246
- const { displayText, contextPrefix } = expandAtRefs(text);
248
+ const { displayText, contextPrefix } = expandAtRefs(text, cwd);
247
249
  addMsg('user', displayText);
248
250
  const llmContent = contextPrefix + text;
249
251
  await runLoop(buildContext({ role: 'user', content: llmContent }));
@@ -1 +1 @@
1
- {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -11,6 +11,7 @@ export interface Config {
11
11
  provider: 'ollama' | 'openai-compat';
12
12
  baseUrl: string;
13
13
  systemPrompt?: string;
14
+ apiKey?: string;
14
15
  }
15
16
  export interface ChatMessage {
16
17
  role: 'system' | 'user' | 'assistant';
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAChD,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAuBA,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAChD,CAAC"}
@@ -42,6 +42,9 @@ function walk(dir, out, cwd, depth = 0) {
42
42
  catch { }
43
43
  }
44
44
  }
45
+ function xmlAttr(s) {
46
+ return s.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
47
+ }
45
48
  function build(input) {
46
49
  const parts = [];
47
50
  for (const p of input.paths) {
@@ -51,7 +54,7 @@ function build(input) {
51
54
  if (s.isFile()) {
52
55
  const content = safe(p);
53
56
  if (content !== null)
54
- parts.push(`<file path="${relative(input.cwd, p)}">\n${content}\n</file>`);
57
+ parts.push(`<file path="${xmlAttr(relative(input.cwd, p))}">\n${content}\n</file>`);
55
58
  }
56
59
  else if (s.isDirectory()) {
57
60
  const files = [];
@@ -59,7 +62,7 @@ function build(input) {
59
62
  for (const f of files.slice(0, 100)) {
60
63
  const content = safe(f);
61
64
  if (content !== null)
62
- parts.push(`<file path="${relative(input.cwd, f)}">\n${content}\n</file>`);
65
+ parts.push(`<file path="${xmlAttr(relative(input.cwd, f))}">\n${content}\n</file>`);
63
66
  }
64
67
  }
65
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.worker.js","sourceRoot":"","sources":["../../src/workers/context.worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.worker.js","sourceRoot":"","sources":["../../src/workers/context.worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AACpE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa;IACxE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ;IACnE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO;IAC9D,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;CACpC,CAAC,CAAA;AACF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;AAOpO,SAAS,IAAI,CAAC,CAAS;IACrB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI;YAAE,OAAO,IAAI,CAAA;QACpC,OAAO,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;AACzB,CAAC;AAED,SAAS,IAAI,CAAC,GAAW,EAAE,GAAa,EAAE,GAAW,EAAE,KAAK,GAAG,CAAC;IAC9D,IAAI,KAAK,GAAG,CAAC;QAAE,OAAM;IACrB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAClC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAQ;QACjC,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAAE,SAAQ;QAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,SAAQ;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC5B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;YACxB,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;;gBAC/C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACrG,CAAC;AAED,SAAS,KAAK,CAAC,KAAY;IACzB,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,SAAQ;QAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACvB,IAAI,OAAO,KAAK,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,OAAO,WAAW,CAAC,CAAA;QAC3G,CAAC;aAAM,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAa,EAAE,CAAA;YAC1B,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;YACzB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;gBACvB,IAAI,OAAO,KAAK,IAAI;oBAAE,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,OAAO,WAAW,CAAC,CAAA;YAC3G,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC;AAED,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,UAAmB,CAAC,EAAE,CAAC,CAAA"}
package/mii-cli.gif ADDED
Binary file
package/package.json CHANGED
@@ -1,11 +1,29 @@
1
1
  {
2
2
  "name": "miii-cli",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "type": "module",
5
+ "description": "Local AI coding assistant for your terminal. No cloud. No API keys.",
5
6
  "license": "MIT",
6
7
  "engines": {
7
8
  "node": ">=18"
8
9
  },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/maruakshay/miii-cli.git"
13
+ },
14
+ "homepage": "https://github.com/maruakshay/miii-cli#readme",
15
+ "bugs": {
16
+ "url": "https://github.com/maruakshay/miii-cli/issues"
17
+ },
18
+ "keywords": [
19
+ "ai",
20
+ "cli",
21
+ "ollama",
22
+ "llm",
23
+ "coding-assistant",
24
+ "terminal",
25
+ "local-ai"
26
+ ],
9
27
  "bin": {
10
28
  "miii": "dist/index.js"
11
29
  },
package/src/config.ts CHANGED
@@ -9,6 +9,8 @@ const defaults: Config = {
9
9
  baseUrl: 'http://localhost:11434',
10
10
  }
11
11
 
12
+ const ALLOWED_KEYS = new Set<keyof Config>(['model', 'provider', 'baseUrl', 'systemPrompt', 'apiKey'])
13
+
12
14
  export function loadConfig(): Config {
13
15
  const candidates = [
14
16
  join(process.cwd(), '.miii.json'),
@@ -17,7 +19,12 @@ export function loadConfig(): Config {
17
19
  for (const p of candidates) {
18
20
  if (existsSync(p)) {
19
21
  try {
20
- return { ...defaults, ...JSON.parse(readFileSync(p, 'utf-8')) }
22
+ const raw: Record<string, unknown> = JSON.parse(readFileSync(p, 'utf-8'))
23
+ const safe: Partial<Config> = {}
24
+ for (const key of ALLOWED_KEYS) {
25
+ if (key in raw) (safe as Record<string, unknown>)[key] = raw[key]
26
+ }
27
+ return { ...defaults, ...safe }
21
28
  } catch {}
22
29
  }
23
30
  }
package/src/files/ops.ts CHANGED
@@ -2,7 +2,16 @@ import {
2
2
  readFileSync, writeFileSync, unlinkSync,
3
3
  mkdirSync, readdirSync, statSync, existsSync, renameSync,
4
4
  } from 'fs'
5
- import { join, dirname, relative, extname } from 'path'
5
+ import { join, dirname, relative, extname, resolve, sep } from 'path'
6
+
7
+ export function guardPath(p: string, base = process.cwd()): string {
8
+ const abs = resolve(base, p)
9
+ const root = resolve(base)
10
+ if (abs !== root && !abs.startsWith(root + sep)) {
11
+ throw new Error(`path outside working directory: ${p}`)
12
+ }
13
+ return abs
14
+ }
6
15
 
7
16
  const SKIP_DIRS = new Set([
8
17
  'node_modules', 'dist', 'build', '.git', '.next', '.nuxt', '.svelte-kit',
package/src/init.ts CHANGED
@@ -23,9 +23,6 @@ export async function lazyInit(): Promise<void> {
23
23
  // Print welcome banner to scrollback BEFORE Ink starts
24
24
  welcome(config.provider, config.model, process.cwd())
25
25
 
26
- // Move cursor to last terminal row so Ink renders at absolute bottom
27
- process.stdout.write(`\x1b[${process.stdout.rows ?? 24};1H`)
28
-
29
26
  // Ink renders ONLY the input bar (small footprint at bottom)
30
27
  // patchConsole: true (default) ensures console.log output appears above Ink
31
28
  const sessionName = (argv.session as string) || 'default'
package/src/llm/stream.ts CHANGED
@@ -4,6 +4,7 @@ export interface StreamConfig {
4
4
  provider: 'ollama' | 'openai-compat'
5
5
  model: string
6
6
  baseUrl: string
7
+ apiKey?: string
7
8
  messages: ChatMessage[]
8
9
  signal?: AbortSignal
9
10
  onToken: (token: string) => void
@@ -66,12 +67,12 @@ async function streamOllama(cfg: StreamConfig): Promise<void> {
66
67
  }
67
68
 
68
69
  async function streamOpenAI(cfg: StreamConfig): Promise<void> {
69
- const { model, messages, baseUrl, signal, onToken, onDone, onError } = cfg
70
+ const { model, messages, baseUrl, apiKey, signal, onToken, onDone, onError } = cfg
70
71
  let res: Response
71
72
  try {
72
73
  res = await fetch(`${baseUrl}/v1/chat/completions`, {
73
74
  method: 'POST',
74
- headers: { 'Content-Type': 'application/json', Authorization: 'Bearer local' },
75
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${apiKey ?? 'local'}` },
75
76
  body: JSON.stringify({ model, messages, stream: true }),
76
77
  signal,
77
78
  })
package/src/sessions.ts CHANGED
@@ -9,6 +9,11 @@ function ensureDir() {
9
9
  mkdirSync(SESSIONS_DIR, { recursive: true })
10
10
  }
11
11
 
12
+ function sanitizeName(name: string): string {
13
+ if (!/^[\w-]+$/.test(name)) throw new Error(`invalid session name: ${name}`)
14
+ return name
15
+ }
16
+
12
17
  export function listSessions(): Array<{ name: string; messageCount: number; updatedAt: number }> {
13
18
  ensureDir()
14
19
  return readdirSync(SESSIONS_DIR)
@@ -30,17 +35,20 @@ export function listSessions(): Array<{ name: string; messageCount: number; upda
30
35
 
31
36
  export function loadSession(name: string): ChatMessage[] {
32
37
  ensureDir()
33
- const p = join(SESSIONS_DIR, `${name}.json`)
38
+ const p = join(SESSIONS_DIR, `${sanitizeName(name)}.json`)
34
39
  if (!existsSync(p)) return []
35
- try { return JSON.parse(readFileSync(p, 'utf-8')) } catch { return [] }
40
+ try {
41
+ const parsed = JSON.parse(readFileSync(p, 'utf-8'))
42
+ return Array.isArray(parsed) ? parsed : []
43
+ } catch { return [] }
36
44
  }
37
45
 
38
46
  export function saveSession(name: string, messages: ChatMessage[]) {
39
47
  ensureDir()
40
- writeFileSync(join(SESSIONS_DIR, `${name}.json`), JSON.stringify(messages))
48
+ writeFileSync(join(SESSIONS_DIR, `${sanitizeName(name)}.json`), JSON.stringify(messages))
41
49
  }
42
50
 
43
51
  export function deleteSession(name: string) {
44
- const p = join(SESSIONS_DIR, `${name}.json`)
52
+ const p = join(SESSIONS_DIR, `${sanitizeName(name)}.json`)
45
53
  if (existsSync(p)) unlinkSync(p)
46
54
  }
@@ -1,7 +1,7 @@
1
1
  import { readFileSync, existsSync, readdirSync } from 'fs'
2
2
  import { join, basename } from 'path'
3
3
  import { homedir } from 'os'
4
- import { createDir, moveFile, writeFile } from '../files/ops.js'
4
+ import { createDir, moveFile, writeFile, guardPath } from '../files/ops.js'
5
5
 
6
6
  export interface SkillContext {
7
7
  messages: Array<{ role: string; content: string }>
@@ -72,7 +72,7 @@ const builtin: Skill[] = [
72
72
  execute: (args) => {
73
73
  const p = args.trim()
74
74
  if (!p) return 'Usage: /mkdir <path>'
75
- createDir(p)
75
+ createDir(guardPath(p))
76
76
  return `created: ${p}`
77
77
  },
78
78
  },
@@ -84,7 +84,7 @@ const builtin: Skill[] = [
84
84
  const parts = args.trim().split(/\s+/)
85
85
  if (parts.length < 2) return 'Usage: /mv <from> <to>'
86
86
  const [from, to] = parts
87
- moveFile(from, to)
87
+ moveFile(guardPath(from), guardPath(to))
88
88
  return `moved: ${from} → ${to}`
89
89
  },
90
90
  },
@@ -95,7 +95,7 @@ const builtin: Skill[] = [
95
95
  execute: (args) => {
96
96
  const p = args.trim()
97
97
  if (!p) return 'Usage: /touch <path>'
98
- writeFile(p, '')
98
+ writeFile(guardPath(p), '')
99
99
  return `created: ${p}`
100
100
  },
101
101
  },
@@ -1,8 +1,9 @@
1
- import { readFile, writeFile, deleteFile, listFiles, createDir, moveFile } from '../files/ops.js'
1
+ import { readFile, writeFile, deleteFile, listFiles, createDir, moveFile, guardPath } from '../files/ops.js'
2
2
  import { exec } from 'child_process'
3
3
  import { promisify } from 'util'
4
4
 
5
5
  const run = promisify(exec)
6
+ const EXEC_TIMEOUT_MS = 30_000
6
7
 
7
8
  export interface Tool {
8
9
  name: string
@@ -17,7 +18,7 @@ export const tools: Tool[] = [
17
18
  description: 'Read file contents',
18
19
  params: '{"path": "string"}',
19
20
  execute: async ({ path }) => {
20
- try { return readFile(path as string) }
21
+ try { return readFile(guardPath(path as string)) }
21
22
  catch (e) { throw new Error(`read_file: ${e}`) }
22
23
  },
23
24
  },
@@ -26,7 +27,7 @@ export const tools: Tool[] = [
26
27
  description: 'List directory contents',
27
28
  params: '{"path": "string", "recursive": "boolean (optional)"}',
28
29
  execute: async ({ path, recursive = false }) => {
29
- const entries = listFiles(path as string, recursive as boolean)
30
+ const entries = listFiles(guardPath(path as string), recursive as boolean)
30
31
  if (!entries.length) return '(empty)'
31
32
  return entries.map(e => `${e.type === 'dir' ? 'd' : 'f'} ${e.rel}`).join('\n')
32
33
  },
@@ -36,7 +37,7 @@ export const tools: Tool[] = [
36
37
  description: 'Write/overwrite file content',
37
38
  params: '{"path": "string", "content": "string"}',
38
39
  execute: async ({ path, content }) => {
39
- writeFile(path as string, content as string)
40
+ writeFile(guardPath(path as string), content as string)
40
41
  return `written: ${path}`
41
42
  },
42
43
  },
@@ -45,7 +46,7 @@ export const tools: Tool[] = [
45
46
  description: 'Delete a file',
46
47
  params: '{"path": "string"}',
47
48
  execute: async ({ path }) => {
48
- deleteFile(path as string)
49
+ deleteFile(guardPath(path as string))
49
50
  return `deleted: ${path}`
50
51
  },
51
52
  },
@@ -54,7 +55,7 @@ export const tools: Tool[] = [
54
55
  description: 'Run a shell command in cwd',
55
56
  params: '{"command": "string"}',
56
57
  execute: async ({ command }) => {
57
- const { stdout, stderr } = await run(command as string, { cwd: process.cwd() })
58
+ const { stdout, stderr } = await run(command as string, { cwd: process.cwd(), timeout: EXEC_TIMEOUT_MS })
58
59
  return [stdout, stderr ? `stderr: ${stderr}` : ''].filter(Boolean).join('\n').trim()
59
60
  },
60
61
  },
@@ -63,7 +64,7 @@ export const tools: Tool[] = [
63
64
  description: 'Create a directory (and any missing parents)',
64
65
  params: '{"path": "string"}',
65
66
  execute: async ({ path }) => {
66
- createDir(path as string)
67
+ createDir(guardPath(path as string))
67
68
  return `created: ${path}`
68
69
  },
69
70
  },
@@ -72,7 +73,7 @@ export const tools: Tool[] = [
72
73
  description: 'Move or rename a file or directory',
73
74
  params: '{"from": "string", "to": "string"}',
74
75
  execute: async ({ from, to }) => {
75
- moveFile(from as string, to as string)
76
+ moveFile(guardPath(from as string), guardPath(to as string))
76
77
  return `moved: ${from} → ${to}`
77
78
  },
78
79
  },
package/src/tui/App.tsx CHANGED
@@ -9,7 +9,7 @@ import { listModels, pullModel } from '../llm/ollama.js'
9
9
  import type { OllamaModel } from '../llm/ollama.js'
10
10
  import { StreamParser } from '../parser/stream-parser.js'
11
11
  import { tools, getSystemPrompt } from '../tools/index.js'
12
- import { readFile } from '../files/ops.js'
12
+ import { readFile, guardPath } from '../files/ops.js'
13
13
  import type { SkillLoader } from '../skills/loader.js'
14
14
  import type { Message, Status, ChatMessage, Config } from '../types.js'
15
15
  import { generateId } from '../types.js'
@@ -23,13 +23,14 @@ interface Props {
23
23
  const MAX_TOOL_DEPTH = 6
24
24
  const RENDER_THROTTLE_MS = 40
25
25
 
26
- function expandAtRefs(text: string): { displayText: string; contextPrefix: string } {
26
+ function expandAtRefs(text: string, cwd: string): { displayText: string; contextPrefix: string } {
27
27
  const refs = [...text.matchAll(/@([\w./\-]+)/g)]
28
28
  if (!refs.length) return { displayText: text, contextPrefix: '' }
29
29
  const parts: string[] = []
30
30
  for (const m of refs) {
31
31
  try {
32
- const content = readFile(m[1])
32
+ const safePath = guardPath(m[1], cwd)
33
+ const content = readFile(safePath)
33
34
  parts.push(`<file path="${m[1]}">\n${content}\n</file>`)
34
35
  } catch {}
35
36
  }
@@ -124,6 +125,7 @@ export function App({ config, skills, cwd }: Props) {
124
125
  provider: config.provider,
125
126
  model: currentModelRef.current,
126
127
  baseUrl: config.baseUrl,
128
+ apiKey: config.apiKey,
127
129
  messages: contextMsgs,
128
130
  signal: abortRef.current.signal,
129
131
 
@@ -257,7 +259,7 @@ export function App({ config, skills, cwd }: Props) {
257
259
  }
258
260
 
259
261
  // Expand @file references
260
- const { displayText, contextPrefix } = expandAtRefs(text)
262
+ const { displayText, contextPrefix } = expandAtRefs(text, cwd)
261
263
  addMsg('user', displayText)
262
264
  const llmContent = contextPrefix + text
263
265
  await runLoop(buildContext({ role: 'user', content: llmContent }))
@@ -72,7 +72,7 @@ export function ModelPicker({ models, current, loading, error, pull, onSelect, o
72
72
  })
73
73
 
74
74
  return (
75
- <Box flexDirection="column" borderStyle="round" borderColor="cyan" paddingX={1}>
75
+ <Box flexDirection="column" flexGrow={1} borderStyle="round" borderColor="cyan" paddingX={1}>
76
76
  <Box marginBottom={1}>
77
77
  <Text bold color="cyan"> models </Text>
78
78
  {loading && <Text color="yellow"> loading...</Text>}
package/src/types.ts CHANGED
@@ -13,6 +13,7 @@ export interface Config {
13
13
  provider: 'ollama' | 'openai-compat'
14
14
  baseUrl: string
15
15
  systemPrompt?: string
16
+ apiKey?: string
16
17
  }
17
18
 
18
19
  export interface ChatMessage {
@@ -39,6 +39,10 @@ function walk(dir: string, out: string[], cwd: string, depth = 0): void {
39
39
  }
40
40
  }
41
41
 
42
+ function xmlAttr(s: string): string {
43
+ return s.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
44
+ }
45
+
42
46
  function build(input: Input): string {
43
47
  const parts: string[] = []
44
48
  for (const p of input.paths) {
@@ -46,13 +50,13 @@ function build(input: Input): string {
46
50
  const s = statSync(p)
47
51
  if (s.isFile()) {
48
52
  const content = safe(p)
49
- if (content !== null) parts.push(`<file path="${relative(input.cwd, p)}">\n${content}\n</file>`)
53
+ if (content !== null) parts.push(`<file path="${xmlAttr(relative(input.cwd, p))}">\n${content}\n</file>`)
50
54
  } else if (s.isDirectory()) {
51
55
  const files: string[] = []
52
56
  walk(p, files, input.cwd)
53
57
  for (const f of files.slice(0, 100)) {
54
58
  const content = safe(f)
55
- if (content !== null) parts.push(`<file path="${relative(input.cwd, f)}">\n${content}\n</file>`)
59
+ if (content !== null) parts.push(`<file path="${xmlAttr(relative(input.cwd, f))}">\n${content}\n</file>`)
56
60
  }
57
61
  }
58
62
  }